ZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBlNmQ5ZWJmLi5iOGE5NzExIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00Nyw2ICs0NywxMSBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzL3N5c3RlbS9saWIvbGlibWVkaWFfbmF0aXZlLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb2ZsaW5nZXJfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9mbGluZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3kuc28pCisKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLm1rIGIvY2FtZXJhL0FuZHJvaWQubWsKaW5kZXggNWNlZGFiMC4uNTc3NGI2ZiAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL0FuZHJvaWQubWsKQEAgLTEsMyArMSwxNyBAQAorIyBDb3B5cmlnaHQgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCiBDQU1FUkFfQ0xJRU5UX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKQEAgLTgsNyArMjIsNyBAQAogCUNhbWVyYS5jcHAgXAogCUNhbWVyYU1ldGFkYXRhLmNwcCBcCiAJQ2FtZXJhUGFyYW1ldGVycy5jcHAgXAotCUNhbWVyYVBhcmFtZXRlcnMyLmNwcCBcCisJQ2FwdHVyZVJlc3VsdC5jcHAgXAogCUlDYW1lcmEuY3BwIFwKIAlJQ2FtZXJhQ2xpZW50LmNwcCBcCiAJSUNhbWVyYVNlcnZpY2UuY3BwIFwKQEAgLTIyLDYgKzM2LDcgQEAKIAljYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCBcCiAJUHJvQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhQmFzZS5jcHAgXAorCVZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscyBcCkBAIC0zNSw2ICs1MCw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogCXN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSBcCisJc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUKIAogTE9DQUxfTU9EVUxFOj0gbGliY2FtZXJhX2NsaWVudAogCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCA3NzY1OTE0Li4xNTY3Y2QxIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTI1LDYgKzI1LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisjZGVmaW5lIEFMSUdOX1RPKHZhbCwgYWxpZ25tZW50KSBcCisgICAgKCgodWludHB0cl90KSh2YWwpICsgKChhbGlnbm1lbnQpIC0gMSkpICYgfigoYWxpZ25tZW50KSAtIDEpKQorCiB0eXBlZGVmIFBhcmNlbDo6V3JpdGFibGVCbG9iIFdyaXRhYmxlQmxvYjsKIHR5cGVkZWYgUGFyY2VsOjpSZWFkYWJsZUJsb2IgUmVhZGFibGVCbG9iOwogCkBAIC0yNzAsNyArMjczLDggQEAKICAgICBpZiAoIChyZXMgPSBjaGVja1R5cGUodGFnLCBUWVBFX0JZVEUpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KLSAgICByZXR1cm4gdXBkYXRlSW1wbCh0YWcsIChjb25zdCB2b2lkKilzdHJpbmcuc3RyaW5nKCksIHN0cmluZy5zaXplKCkpOworICAgIC8vIHN0cmluZy5zaXplKCkgZG9lc24ndCBjb3VudCB0aGUgbnVsbCB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuCisgICAgcmV0dXJuIHVwZGF0ZUltcGwodGFnLCAoY29uc3Qgdm9pZCopc3RyaW5nLnN0cmluZygpLCBzdHJpbmcuc2l6ZSgpICsgMSk7CiB9CiAKIHN0YXR1c190IENhbWVyYU1ldGFkYXRhOjp1cGRhdGVJbXBsKHVpbnQzMl90IHRhZywgY29uc3Qgdm9pZCAqZGF0YSwKQEAgLTQzMSw0MCArNDM1LDcwIEBACiAgICAgICAgICpvdXQgPSBOVUxMOwogICAgIH0KIAotICAgIC8vIGFyZzAgPSBtZXRhZGF0YVNpemUgKGludDMyKQotICAgIGludDMyX3QgbWV0YWRhdGFTaXplVG1wID0gLTE7Ci0gICAgaWYgKChlcnIgPSBkYXRhLnJlYWRJbnQzMigmbWV0YWRhdGFTaXplVG1wKSkgIT0gT0spIHsKKyAgICAvLyBTZWUgQ2FtZXJhTWV0YWRhdGE6OndyaXRlVG9QYXJjZWwgZm9yIHBhcmNlbCBkYXRhIGxheW91dCBkaWFncmFtIGFuZCBleHBsYW5hdGlvbi4KKyAgICAvLyBhcmcwID0gYmxvYlNpemUgKGludDMyKQorICAgIGludDMyX3QgYmxvYlNpemVUbXAgPSAtMTsKKyAgICBpZiAoKGVyciA9IGRhdGEucmVhZEludDMyKCZibG9iU2l6ZVRtcCkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgc2l6ZSAoZXJyb3IgJWQgJXMpIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IG1ldGFkYXRhU2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4obWV0YWRhdGFTaXplVG1wKTsKKyAgICBjb25zdCBzaXplX3QgYmxvYlNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJsb2JTaXplVG1wKTsKKyAgICBjb25zdCBzaXplX3QgYWxpZ25tZW50ID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9hbGlnbm1lbnQoKTsKIAotICAgIGlmIChtZXRhZGF0YVNpemUgPT0gMCkgeworICAgIC8vIFNwZWNpYWwgY2FzZTogemVybyBibG9iIHNpemUgbWVhbnMgemVybyBzaXplZCAoTlVMTCkgbWV0YWRhdGEuCisgICAgaWYgKGJsb2JTaXplID09IDApIHsKICAgICAgICAgQUxPR1YoIiVzOiBSZWFkIDAtc2l6ZWQgbWV0YWRhdGEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gTk9URTogdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gbWUuIHNob3VsZG50IHRoZSBibG9iCisgICAgaWYgKGJsb2JTaXplIDw9IGFsaWdubWVudCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGJsb2IgaXMgbWFsZm9ybWVkLCBibG9iU2l6ZSglenUpIHNob3VsZCBiZSBsYXJnZXIgdGhhbiBhbGlnbm1lbnQoJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iU2l6ZSwgYWxpZ25tZW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgbWV0YWRhdGFTaXplID0gYmxvYlNpemUgLSBhbGlnbm1lbnQ7CisKKyAgICAvLyBOT1RFOiB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBtZS4gc2hvdWxkbid0IHRoZSBibG9iCiAgICAgLy8ga25vdyBob3cgYmlnIGl0IGlzPyB3aHkgZG8gd2UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBzaXplCiAgICAgLy8gdG8gUGFyY2VsOjpyZWFkQmxvYiA/Ci0KICAgICBSZWFkYWJsZUJsb2IgYmxvYjsKICAgICAvLyBhcmcxID0gbWV0YWRhdGEgKGJsb2IpCiAgICAgZG8gewotICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEJsb2IobWV0YWRhdGFTaXplLCAmYmxvYikpICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1ldGFkYXRhIGJsb2IgKHNpemVkICVkKS4gUG9zc2libGUgIgorICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEJsb2IoYmxvYlNpemUsICZibG9iKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgYmxvYiAoc2l6ZWQgJXp1KS4gUG9zc2libGUgIgogICAgICAgICAgICAgICAgICAgIiBzZXJpYWxpemF0aW9uIGJ1Zy4gRXJyb3IgJWQgJXMiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtZXRhZGF0YVNpemUsIGVyciwgc3RyZXJyb3IoLWVycikpOworICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iU2l6ZSwgZXJyLCBzdHJlcnJvcigtZXJyKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogdG1wID0KLSAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KGJsb2IuZGF0YSgpKTsKIAorICAgICAgICAvLyBhcmcyID0gb2Zmc2V0IChibG9iKQorICAgICAgICAvLyBNdXN0IGJlIGFmdGVyIGJsb2Igc2luY2Ugd2UgZG9uJ3Qga25vdyBvZmZzZXQgdW50aWwgYWZ0ZXIgd3JpdGVCbG9iLgorICAgICAgICBpbnQzMl90IG9mZnNldFRtcDsKKyAgICAgICAgaWYgKChlcnIgPSBkYXRhLnJlYWRJbnQzMigmb2Zmc2V0VG1wKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgb2Zmc2V0VG1wIChlcnJvciAlZCAlcykiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldFRtcCk7CisgICAgICAgIGlmIChvZmZzZXQgPj0gYWxpZ25tZW50KSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIG9mZnNldCglenUpIHNob3VsZCBiZSBsZXNzIHRoYW4gYWxpZ25tZW50KCV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJsb2JTaXplLCBhbGlnbm1lbnQpOworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50cHRyX3QgbWV0YWRhdGFTdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihibG9iLmRhdGEoKSkgKyBvZmZzZXQ7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiB0bXAgPQorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGFTdGFydCk7CisgICAgICAgIEFMT0dWKCIlczogYWxpZ25tZW50IGlzOiAlenUsIG1ldGFkYXRhIHN0YXJ0OiAlcCwgb2Zmc2V0OiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWxpZ25tZW50LCB0bXAsIG9mZnNldCk7CiAgICAgICAgIG1ldGFkYXRhID0gYWxsb2NhdGVfY29weV9jYW1lcmFfbWV0YWRhdGFfY2hlY2tlZCh0bXAsIG1ldGFkYXRhU2l6ZSk7CiAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBXZSBjb25zaWRlciB0aGF0IGFsbG9jYXRpb24gb25seSBmYWlscyBpZiB0aGUgdmFsaWRhdGlvbgogICAgICAgICAgICAgLy8gYWxzbyBmYWlsZWQsIHRoZXJlZm9yZSB0aGUgcmVhZEZyb21QYXJjZWwgd2FzIGEgZmFpbHVyZS4KKyAgICAgICAgICAgIEFMT0dFKCIlczogbWV0YWRhdGEgYWxsb2NhdGlvbiBhbmQgY29weSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfSB3aGlsZSgwKTsKQEAgLTQ4NSwzOCArNTE5LDc5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogbWV0YWRhdGEpIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIC8vIGFyZzAgPSBtZXRhZGF0YVNpemUgKGludDMyKQorICAgIC8qKgorICAgICAqIEJlbG93IGlzIHRoZSBjYW1lcmEgbWV0YWRhdGEgcGFyY2VsIGxheW91dDoKKyAgICAgKgorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiB8ICAgICAgICAgICAgIGFyZzA6IGJsb2JTaXplICAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAgICAgICAgKGxlbmd0aCA9IDQpICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS1Ta2lwIHRoZSByZXN0IGlmIGJsb2JTaXplID09IDAuCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICBhcmcxOiBibG9iICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfCAobGVuZ3RoID0gdmFyaWFibGUsIHNlZSBhcmcxIGxheW91dCBiZWxvdykgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqIHwgICAgICAgICAgICAgIGFyZzI6IG9mZnNldCAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAobGVuZ3RoID0gNCkgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqLwogCisgICAgLy8gYXJnMCA9IGJsb2JTaXplIChpbnQzMikKICAgICBpZiAobWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICAvLyBXcml0ZSB6ZXJvIGJsb2JTaXplIGZvciBudWxsIG1ldGFkYXRhLgogICAgICAgICByZXR1cm4gZGF0YS53cml0ZUludDMyKDApOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFsd2F5cyBtYWtlIHRoZSBibG9iIHNpemUgc3VmZmljaWVudGx5IGxhcmdlciwgYXMgd2UgbmVlZCBwdXQgYWxpZ25tZW50CisgICAgICogcGFkZGluZyBhbmQgbWV0YWRhdGEgaW50byB0aGUgYmxvYi4gU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgYWxpZ25tZW50CisgICAgICogb2Zmc2V0IGJlZm9yZSB3cml0ZUJsb2IuIFRoZW4gd3JpdGUgdGhlIG1ldGFkYXRhIHRvIGFsaWduZWQgb2Zmc2V0LgorICAgICAqLwogICAgIGNvbnN0IHNpemVfdCBtZXRhZGF0YVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2NvbXBhY3Rfc2l6ZShtZXRhZGF0YSk7Ci0gICAgcmVzID0gZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1ldGFkYXRhU2l6ZSkpOworICAgIGNvbnN0IHNpemVfdCBhbGlnbm1lbnQgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2FsaWdubWVudCgpOworICAgIGNvbnN0IHNpemVfdCBibG9iU2l6ZSA9IG1ldGFkYXRhU2l6ZSArIGFsaWdubWVudDsKKyAgICByZXMgPSBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oYmxvYlNpemUpKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgLy8gYXJnMSA9IG1ldGFkYXRhIChibG9iKQorICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIC8qKgorICAgICAqIGFyZzEgPSBtZXRhZGF0YSAoYmxvYikuCisgICAgICoKKyAgICAgKiBUaGUgYmxvYiBzaXplIGlzIHRoZSBzdW0gb2YgZnJvbnQgcGFkZGluZyBzaXplLCBtZXRhZGF0YSBzaXplIGFuZCBiYWNrIHBhZGRpbmcKKyAgICAgKiBzaXplLCB3aGljaCBpcyBlcXVhbCB0byBtZXRhZGF0YVNpemUgKyBhbGlnbm1lbnQuCisgICAgICoKKyAgICAgKiBUaGUgYmxvYiBsYXlvdXQgaXM6CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLVN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGJsb2IgKHVuYWxpZ25lZCkuCisgICAgICogfCAgICAgICAgICAgZnJvbnQgcGFkZGluZyAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgIChzaXplID0gb2Zmc2V0KSAgICAgICAgICAgfAorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18PC0tLS1BbGlnbmVkIHN0YXJ0IGFkZHJlc3Mgb2YgbWV0YWRhdGEuCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICBtZXRhZGF0YSAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAoc2l6ZSA9IG1ldGFkYXRhU2l6ZSkgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiB8ICAgICAgICAgICBiYWNrIHBhZGRpbmcgICAgICAgICAgICAgfAorICAgICAqIHwgICAgIChzaXplID0gYWxpZ25tZW50IC0gb2Zmc2V0KSAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLUVuZCBhZGRyZXNzIG9mIGJsb2IuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCbG9iIHN0YXJ0IGFkZHJlc3MgKyBibG9iIHNpemUpLgorICAgICAqLwogICAgIFdyaXRhYmxlQmxvYiBibG9iOwogICAgIGRvIHsKLSAgICAgICAgcmVzID0gZGF0YS53cml0ZUJsb2IobWV0YWRhdGFTaXplLCAmYmxvYik7CisgICAgICAgIHJlcyA9IGRhdGEud3JpdGVCbG9iKGJsb2JTaXplLCAmYmxvYik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvcHlfY2FtZXJhX21ldGFkYXRhKGJsb2IuZGF0YSgpLCBtZXRhZGF0YVNpemUsIG1ldGFkYXRhKTsKLQotICAgICAgICBJRl9BTE9HVigpIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KilibG9iLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZtZXRhZGF0YVNpemUpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBGYWlsZWQgdG8gdmFsaWRhdGUgbWV0YWRhdGEgJXAgYWZ0ZXIgd3JpdGluZyBibG9iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iLmRhdGEoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogTWV0YWRhdGEgd3JpdHRlbiB0byBibG9iLiBWYWxpZGF0aW9uIHN1Y2Nlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjb25zdCB1aW50cHRyX3QgbWV0YWRhdGFTdGFydCA9IEFMSUdOX1RPKGJsb2IuZGF0YSgpLCBhbGlnbm1lbnQpOworICAgICAgICBvZmZzZXQgPSBtZXRhZGF0YVN0YXJ0IC0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGJsb2IuZGF0YSgpKTsKKyAgICAgICAgQUxPR1YoIiVzOiBhbGlnbm1lbnQgaXM6ICV6dSwgbWV0YWRhdGEgc3RhcnQ6ICVwLCBvZmZzZXQ6ICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhbGlnbm1lbnQsIG1ldGFkYXRhU3RhcnQsIG9mZnNldCk7CisgICAgICAgIGNvcHlfY2FtZXJhX21ldGFkYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KG1ldGFkYXRhU3RhcnQpLCBtZXRhZGF0YVNpemUsIG1ldGFkYXRhKTsKIAogICAgICAgICAvLyBOb3QgdG9vIGJpZyBvZiBhIHByb2JsZW0gc2luY2UgcmVjZWl2aW5nIHNpZGUgZG9lcyBoYXJkIHZhbGlkYXRpb24KICAgICAgICAgLy8gRG9uJ3QgY2hlY2sgdGhlIHNpemUgc2luY2UgdGhlIGNvbXBhY3Qgc2l6ZSBjb3VsZCBiZSBsYXJnZXIKQEAgLTUyOCw2ICs2MDMsOSBAQAogICAgIH0gd2hpbGUoZmFsc2UpOwogICAgIGJsb2IucmVsZWFzZSgpOwogCisgICAgLy8gYXJnMiA9IG9mZnNldCAoaW50MzIpCisgICAgcmVzID0gZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG9mZnNldCkpOworCiAgICAgcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzc5ZTEuLjAwMDAwMDAKLS0tIGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIkNhbWVyYVBhcmFtczIiCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQ2FtZXJhUGFyYW1ldGVyczI6OkNhbWVyYVBhcmFtZXRlcnMyKCkKLSAgICAgICAgICAgICAgICA6IG1NYXAoKQotewotfQotCi1DYW1lcmFQYXJhbWV0ZXJzMjo6fkNhbWVyYVBhcmFtZXRlcnMyKCkKLXsKLX0KLQotU3RyaW5nOCBDYW1lcmFQYXJhbWV0ZXJzMjo6ZmxhdHRlbigpIGNvbnN0Ci17Ci0gICAgU3RyaW5nOCBmbGF0dGVuZWQoIiIpOwotICAgIHNpemVfdCBzaXplID0gbU1hcC5zaXplKCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBTdHJpbmc4IGssIHY7Ci0gICAgICAgIGsgPSBtTWFwLmtleUF0KGkpOwotICAgICAgICB2ID0gbU1hcC52YWx1ZUF0KGkpOwotCi0gICAgICAgIGZsYXR0ZW5lZCArPSBrOwotICAgICAgICBmbGF0dGVuZWQgKz0gIj0iOwotICAgICAgICBmbGF0dGVuZWQgKz0gdjsKLSAgICAgICAgaWYgKGkgIT0gc2l6ZS0xKQotICAgICAgICAgICAgZmxhdHRlbmVkICs9ICI7IjsKLSAgICB9Ci0KLSAgICBBTE9HVigiJXM6IEZsYXR0ZW5lZCBwYXJhbXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgZmxhdHRlbmVkLnN0cmluZygpKTsKLQotICAgIHJldHVybiBmbGF0dGVuZWQ7Ci19Ci0KLXZvaWQgQ2FtZXJhUGFyYW1ldGVyczI6OnVuZmxhdHRlbihjb25zdCBTdHJpbmc4ICZwYXJhbXMpCi17Ci0gICAgY29uc3QgY2hhciAqYSA9IHBhcmFtcy5zdHJpbmcoKTsKLSAgICBjb25zdCBjaGFyICpiOwotCi0gICAgbU1hcC5jbGVhcigpOwotCi0gICAgZm9yICg7OykgewotICAgICAgICAvLyBGaW5kIHRoZSBib3VuZHMgb2YgdGhlIGtleSBuYW1lLgotICAgICAgICBiID0gc3RyY2hyKGEsICc9Jyk7Ci0gICAgICAgIGlmIChiID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIGtleSBzdHJpbmcuCi0gICAgICAgIFN0cmluZzggayhhLCAoc2l6ZV90KShiLWEpKTsKLQotICAgICAgICAvLyBGaW5kIHRoZSB2YWx1ZS4KLSAgICAgICAgYSA9IGIrMTsKLSAgICAgICAgYiA9IHN0cmNocihhLCAnOycpOwotICAgICAgICBpZiAoYiA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHNlbWljb2xvbiwgdGhpcyBpcyB0aGUgbGFzdCBpdGVtLgotICAgICAgICAgICAgU3RyaW5nOCB2KGEpOwotICAgICAgICAgICAgbU1hcC5hZGQoaywgdik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZzggdihhLCAoc2l6ZV90KShiLWEpKTsKLSAgICAgICAgbU1hcC5hZGQoaywgdik7Ci0gICAgICAgIGEgPSBiKzE7Ci0gICAgfQotfQotCi0KLXZvaWQgQ2FtZXJhUGFyYW1ldGVyczI6OnNldChjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICAgIC8vIFhYWCBpIHRoaW5rIGkgY2FuIGRvIHRoaXMgd2l0aCBzdHJzcG4oKQotICAgIGlmIChzdHJjaHIoa2V5LCAnPScpIHx8IHN0cmNocihrZXksICc7JykpIHsKLSAgICAgICAgLy9YWFggQUxPR0UoIktleSBcIiVzXCJjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciAoPSBvciA7KSIsIGtleSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc3RyY2hyKHZhbHVlLCAnPScpIHx8IHN0cmNocih2YWx1ZSwgJzsnKSkgewotICAgICAgICAvL1hYWCBBTE9HRSgiVmFsdWUgXCIlc1wiY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIgKD0gb3IgOykiLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBSZXBsYWNpbmcgYSB2YWx1ZSB1cGRhdGVzIHRoZSBrZXkncyBvcmRlciB0byBiZSB0aGUgbmV3IGxhcmdlc3Qgb3JkZXIKLSAgICBzc2l6ZV90IHJlcyA9IG1NYXAucmVwbGFjZVZhbHVlRm9yKFN0cmluZzgoa2V5KSwgU3RyaW5nOCh2YWx1ZSkpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzIDwgMCwgInJlcGxhY2VWYWx1ZUZvciglcywlcykgZmFpbGVkIiwga2V5LCB2YWx1ZSk7Ci19Ci0KLXZvaWQgQ2FtZXJhUGFyYW1ldGVyczI6OnNldChjb25zdCBjaGFyICprZXksIGludCB2YWx1ZSkKLXsKLSAgICBjaGFyIHN0clsxNl07Ci0gICAgc3ByaW50ZihzdHIsICIlZCIsIHZhbHVlKTsKLSAgICBzZXQoa2V5LCBzdHIpOwotfQotCi12b2lkIENhbWVyYVBhcmFtZXRlcnMyOjpzZXRGbG9hdChjb25zdCBjaGFyICprZXksIGZsb2F0IHZhbHVlKQotewotICAgIGNoYXIgc3RyWzE2XTsgIC8vIDE0IHNob3VsZCBiZSBlbm91Z2guIFdlIG92ZXJlc3RpbWF0ZSB0byBiZSBzYWZlLgotICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlZyIsIHZhbHVlKTsKLSAgICBzZXQoa2V5LCBzdHIpOwotfQotCi1jb25zdCBjaGFyICpDYW1lcmFQYXJhbWV0ZXJzMjo6Z2V0KGNvbnN0IGNoYXIgKmtleSkgY29uc3QKLXsKLSAgICBzc2l6ZV90IGlkeCA9IG1NYXAuaW5kZXhPZktleShTdHJpbmc4KGtleSkpOwotICAgIGlmIChpZHggPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtTWFwLnZhbHVlQXQoaWR4KS5zdHJpbmcoKTsKLSAgICB9Ci19Ci0KLWludCBDYW1lcmFQYXJhbWV0ZXJzMjo6Z2V0SW50KGNvbnN0IGNoYXIgKmtleSkgY29uc3QKLXsKLSAgICBjb25zdCBjaGFyICp2ID0gZ2V0KGtleSk7Ci0gICAgaWYgKHYgPT0gMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHJldHVybiBzdHJ0b2wodiwgMCwgMCk7Ci19Ci0KLWZsb2F0IENhbWVyYVBhcmFtZXRlcnMyOjpnZXRGbG9hdChjb25zdCBjaGFyICprZXkpIGNvbnN0Ci17Ci0gICAgY29uc3QgY2hhciAqdiA9IGdldChrZXkpOwotICAgIGlmICh2ID09IDApIHJldHVybiAtMTsKLSAgICByZXR1cm4gc3RydG9mKHYsIDApOwotfQotCi1zdGF0dXNfdCBDYW1lcmFQYXJhbWV0ZXJzMjo6Y29tcGFyZVNldE9yZGVyKGNvbnN0IGNoYXIgKmtleTEsIGNvbnN0IGNoYXIgKmtleTIsCi0gICAgICAgIGludCAqb3JkZXIpIGNvbnN0IHsKLSAgICBpZiAoa2V5MSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczoga2V5MSBtdXN0IG5vdCBiZSBOVUxMIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKGtleTIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IGtleTIgbXVzdCBub3QgYmUgTlVMTCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmIChvcmRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogb3JkZXIgbXVzdCBub3QgYmUgTlVMTCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3NpemVfdCBpbmRleDEgPSBtTWFwLmluZGV4T2ZLZXkoU3RyaW5nOChrZXkxKSk7Ci0gICAgc3NpemVfdCBpbmRleDIgPSBtTWFwLmluZGV4T2ZLZXkoU3RyaW5nOChrZXkyKSk7Ci0gICAgaWYgKGluZGV4MSA8IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBLZXkxICglcykgd2FzIG5vdCBzZXQiLCBfX0ZVTkNUSU9OX18sIGtleTEpOwotICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgfSBlbHNlIGlmIChpbmRleDIgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogS2V5MiAoJXMpIHdhcyBub3Qgc2V0IiwgX19GVU5DVElPTl9fLCBrZXkyKTsKLSAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgICpvcmRlciA9IChpbmRleDEgPT0gaW5kZXgyKSA/IDAgIDoKLSAgICAgICAgICAgICAoaW5kZXgxIDwgaW5kZXgyKSAgPyAtMSA6Ci0gICAgICAgICAgICAgMTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBDYW1lcmFQYXJhbWV0ZXJzMjo6cmVtb3ZlKGNvbnN0IGNoYXIgKmtleSkKLXsKLSAgICBtTWFwLnJlbW92ZUl0ZW0oU3RyaW5nOChrZXkpKTsKLX0KLQotLy8gUGFyc2Ugc3RyaW5nIGxpa2UgIjY0MHg0ODAiIG9yICIxMDAwMCwyMDAwMCIKLXN0YXRpYyBpbnQgcGFyc2VfcGFpcihjb25zdCBjaGFyICpzdHIsIGludCAqZmlyc3QsIGludCAqc2Vjb25kLCBjaGFyIGRlbGltLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplbmRwdHIgPSBOVUxMKQotewotICAgIC8vIEZpbmQgdGhlIGZpcnN0IGludGVnZXIuCi0gICAgY2hhciAqZW5kOwotICAgIGludCB3ID0gKGludClzdHJ0b2woc3RyLCAmZW5kLCAxMCk7Ci0gICAgLy8gSWYgYSBkZWxpbWV0ZXIgZG9lcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93LCBnaXZlIHVwLgotICAgIGlmICgqZW5kICE9IGRlbGltKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCBkZWxpbWV0ZXIgKCVjKSBpbiBzdHI9JXMiLCBkZWxpbSwgc3RyKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8vIEZpbmQgdGhlIHNlY29uZCBpbnRlZ2VyLCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZGVsaW1ldGVyLgotICAgIGludCBoID0gKGludClzdHJ0b2woZW5kKzEsICZlbmQsIDEwKTsKLQotICAgICpmaXJzdCA9IHc7Ci0gICAgKnNlY29uZCA9IGg7Ci0KLSAgICBpZiAoZW5kcHRyKSB7Ci0gICAgICAgICplbmRwdHIgPSBlbmQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlU2l6ZXNMaXN0KGNvbnN0IGNoYXIgKnNpemVzU3RyLCBWZWN0b3I8U2l6ZT4gJnNpemVzKQotewotICAgIGlmIChzaXplc1N0ciA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjaGFyICpzaXplU3RhcnRQdHIgPSAoY2hhciAqKXNpemVzU3RyOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIGludCBzdWNjZXNzID0gcGFyc2VfcGFpcihzaXplU3RhcnRQdHIsICZ3aWR0aCwgJmhlaWdodCwgJ3gnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemVTdGFydFB0cik7Ci0gICAgICAgIGlmIChzdWNjZXNzID09IC0xIHx8ICgqc2l6ZVN0YXJ0UHRyICE9ICcsJyAmJiAqc2l6ZVN0YXJ0UHRyICE9ICdcMCcpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUGljdHVyZSBzaXplcyBzdHJpbmcgXCIlc1wiIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyLiIsIHNpemVzU3RyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzaXplcy5wdXNoKFNpemUod2lkdGgsIGhlaWdodCkpOwotCi0gICAgICAgIGlmICgqc2l6ZVN0YXJ0UHRyID09ICdcMCcpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzaXplU3RhcnRQdHIrKzsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FtZXJhUGFyYW1ldGVyczI6OnNldFByZXZpZXdTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLSAgICBjaGFyIHN0clszMl07Ci0gICAgc3ByaW50ZihzdHIsICIlZHglZCIsIHdpZHRoLCBoZWlnaHQpOwotICAgIHNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19TSVpFLCBzdHIpOwotfQotCi12b2lkIENhbWVyYVBhcmFtZXRlcnMyOjpnZXRQcmV2aWV3U2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3QKLXsKLSAgICAqd2lkdGggPSAqaGVpZ2h0ID0gLTE7Ci0gICAgLy8gR2V0IHRoZSBjdXJyZW50IHN0cmluZywgaWYgaXQgZG9lc24ndCBleGlzdCwgbGVhdmUgdGhlIC0xeC0xCi0gICAgY29uc3QgY2hhciAqcCA9IGdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19TSVpFKTsKLSAgICBpZiAocCA9PSAwKSAgcmV0dXJuOwotICAgIHBhcnNlX3BhaXIocCwgd2lkdGgsIGhlaWdodCwgJ3gnKTsKLX0KLQotdm9pZCBDYW1lcmFQYXJhbWV0ZXJzMjo6Z2V0UHJlZmVycmVkUHJldmlld1NpemVGb3JWaWRlbyhpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3QKLXsKLSAgICAqd2lkdGggPSAqaGVpZ2h0ID0gLTE7Ci0gICAgY29uc3QgY2hhciAqcCA9IGdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFRkVSUkVEX1BSRVZJRVdfU0laRV9GT1JfVklERU8pOwotICAgIGlmIChwID09IDApICByZXR1cm47Ci0gICAgcGFyc2VfcGFpcihwLCB3aWR0aCwgaGVpZ2h0LCAneCcpOwotfQotCi12b2lkIENhbWVyYVBhcmFtZXRlcnMyOjpnZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoVmVjdG9yPFNpemU+ICZzaXplcykgY29uc3QKLXsKLSAgICBjb25zdCBjaGFyICpwcmV2aWV3U2l6ZXNTdHIgPSBnZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QUkVWSUVXX1NJWkVTKTsKLSAgICBwYXJzZVNpemVzTGlzdChwcmV2aWV3U2l6ZXNTdHIsIHNpemVzKTsKLX0KLQotdm9pZCBDYW1lcmFQYXJhbWV0ZXJzMjo6c2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLSAgICBjaGFyIHN0clszMl07Ci0gICAgc3ByaW50ZihzdHIsICIlZHglZCIsIHdpZHRoLCBoZWlnaHQpOwotICAgIHNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVklERU9fU0laRSwgc3RyKTsKLX0KLQotdm9pZCBDYW1lcmFQYXJhbWV0ZXJzMjo6Z2V0VmlkZW9TaXplKGludCAqd2lkdGgsIGludCAqaGVpZ2h0KSBjb25zdAotewotICAgICp3aWR0aCA9ICpoZWlnaHQgPSAtMTsKLSAgICBjb25zdCBjaGFyICpwID0gZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9WSURFT19TSVpFKTsKLSAgICBpZiAocCA9PSAwKSByZXR1cm47Ci0gICAgcGFyc2VfcGFpcihwLCB3aWR0aCwgaGVpZ2h0LCAneCcpOwotfQotCi12b2lkIENhbWVyYVBhcmFtZXRlcnMyOjpnZXRTdXBwb3J0ZWRWaWRlb1NpemVzKFZlY3RvcjxTaXplPiAmc2l6ZXMpIGNvbnN0Ci17Ci0gICAgY29uc3QgY2hhciAqdmlkZW9TaXplc1N0ciA9IGdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1ZJREVPX1NJWkVTKTsKLSAgICBwYXJzZVNpemVzTGlzdCh2aWRlb1NpemVzU3RyLCBzaXplcyk7Ci19Ci0KLXZvaWQgQ2FtZXJhUGFyYW1ldGVyczI6OnNldFByZXZpZXdGcmFtZVJhdGUoaW50IGZwcykKLXsKLSAgICBzZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlJBTUVfUkFURSwgZnBzKTsKLX0KLQotaW50IENhbWVyYVBhcmFtZXRlcnMyOjpnZXRQcmV2aWV3RnJhbWVSYXRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0SW50KENhbWVyYVBhcmFtZXRlcnM6OktFWV9QUkVWSUVXX0ZSQU1FX1JBVEUpOwotfQotCi12b2lkIENhbWVyYVBhcmFtZXRlcnMyOjpnZXRQcmV2aWV3RnBzUmFuZ2UoaW50ICptaW5fZnBzLCBpbnQgKm1heF9mcHMpIGNvbnN0Ci17Ci0gICAgKm1pbl9mcHMgPSAqbWF4X2ZwcyA9IC0xOwotICAgIGNvbnN0IGNoYXIgKnAgPSBnZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlBTX1JBTkdFKTsKLSAgICBpZiAocCA9PSAwKSByZXR1cm47Ci0gICAgcGFyc2VfcGFpcihwLCBtaW5fZnBzLCBtYXhfZnBzLCAnLCcpOwotfQotCi12b2lkIENhbWVyYVBhcmFtZXRlcnMyOjpzZXRQcmV2aWV3RnBzUmFuZ2UoaW50IG1pbl9mcHMsIGludCBtYXhfZnBzKQotewotICAgIFN0cmluZzggc3RyID0gU3RyaW5nODo6Zm9ybWF0KCIlZCwlZCIsIG1pbl9mcHMsIG1heF9mcHMpOwotICAgIHNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19GUFNfUkFOR0UsIHN0ci5zdHJpbmcoKSk7Ci19Ci0KLXZvaWQgQ2FtZXJhUGFyYW1ldGVyczI6OnNldFByZXZpZXdGb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KQotewotICAgIHNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19GT1JNQVQsIGZvcm1hdCk7Ci19Ci0KLWNvbnN0IGNoYXIgKkNhbWVyYVBhcmFtZXRlcnMyOjpnZXRQcmV2aWV3Rm9ybWF0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9QUkVWSUVXX0ZPUk1BVCk7Ci19Ci0KLXZvaWQgQ2FtZXJhUGFyYW1ldGVyczI6OnNldFBpY3R1cmVTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLSAgICBjaGFyIHN0clszMl07Ci0gICAgc3ByaW50ZihzdHIsICIlZHglZCIsIHdpZHRoLCBoZWlnaHQpOwotICAgIHNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUElDVFVSRV9TSVpFLCBzdHIpOwotfQotCi12b2lkIENhbWVyYVBhcmFtZXRlcnMyOjpnZXRQaWN0dXJlU2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3QKLXsKLSAgICAqd2lkdGggPSAqaGVpZ2h0ID0gLTE7Ci0gICAgLy8gR2V0IHRoZSBjdXJyZW50IHN0cmluZywgaWYgaXQgZG9lc24ndCBleGlzdCwgbGVhdmUgdGhlIC0xeC0xCi0gICAgY29uc3QgY2hhciAqcCA9IGdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUElDVFVSRV9TSVpFKTsKLSAgICBpZiAocCA9PSAwKSByZXR1cm47Ci0gICAgcGFyc2VfcGFpcihwLCB3aWR0aCwgaGVpZ2h0LCAneCcpOwotfQotCi12b2lkIENhbWVyYVBhcmFtZXRlcnMyOjpnZXRTdXBwb3J0ZWRQaWN0dXJlU2l6ZXMoVmVjdG9yPFNpemU+ICZzaXplcykgY29uc3QKLXsKLSAgICBjb25zdCBjaGFyICpwaWN0dXJlU2l6ZXNTdHIgPSBnZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QSUNUVVJFX1NJWkVTKTsKLSAgICBwYXJzZVNpemVzTGlzdChwaWN0dXJlU2l6ZXNTdHIsIHNpemVzKTsKLX0KLQotdm9pZCBDYW1lcmFQYXJhbWV0ZXJzMjo6c2V0UGljdHVyZUZvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpCi17Ci0gICAgc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9QSUNUVVJFX0ZPUk1BVCwgZm9ybWF0KTsKLX0KLQotY29uc3QgY2hhciAqQ2FtZXJhUGFyYW1ldGVyczI6OmdldFBpY3R1cmVGb3JtYXQoKSBjb25zdAotewotICAgIHJldHVybiBnZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BJQ1RVUkVfRk9STUFUKTsKLX0KLQotdm9pZCBDYW1lcmFQYXJhbWV0ZXJzMjo6ZHVtcCgpIGNvbnN0Ci17Ci0gICAgQUxPR0QoImR1bXA6IG1NYXAuc2l6ZSA9ICVkIiwgbU1hcC5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7IGkrKykgewotICAgICAgICBTdHJpbmc4IGssIHY7Ci0gICAgICAgIGsgPSBtTWFwLmtleUF0KGkpOwotICAgICAgICB2ID0gbU1hcC52YWx1ZUF0KGkpOwotICAgICAgICBBTE9HRCgiJXM6ICVzXG4iLCBrLnN0cmluZygpLCB2LnN0cmluZygpKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENhbWVyYVBhcmFtZXRlcnMyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIkNhbWVyYVBhcmFtZXRlcnMyOjpkdW1wOiBtTWFwLnNpemUgPSAlenVcbiIsIG1NYXAuc2l6ZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWFwLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIFN0cmluZzggaywgdjsKLSAgICAgICAgayA9IG1NYXAua2V5QXQoaSk7Ci0gICAgICAgIHYgPSBtTWFwLnZhbHVlQXQoaSk7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiXHQlczogJXNcbiIsIGsuc3RyaW5nKCksIHYuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcCBiL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE2ZTUyCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEtQ2FwdHVyZVJlc3VsdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgQ2FwdHVyZVJlc3VsdEV4dHJhczo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gcmVxdWVzdElkID49IDA7Cit9CisKK3N0YXR1c190IENhcHR1cmVSZXN1bHRFeHRyYXM6OnJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHBhcmNlbC0+cmVhZEludDMyKCZyZXF1ZXN0SWQpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZidXJzdElkKTsKKyAgICBwYXJjZWwtPnJlYWRJbnQzMigmYWZUcmlnZ2VySWQpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZwcmVjYXB0dXJlVHJpZ2dlcklkKTsKKyAgICBwYXJjZWwtPnJlYWRJbnQ2NCgmZnJhbWVOdW1iZXIpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYXB0dXJlUmVzdWx0RXh0cmFzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihyZXF1ZXN0SWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihidXJzdElkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoYWZUcmlnZ2VySWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihwcmVjYXB0dXJlVHJpZ2dlcklkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVOdW1iZXIpOworCisgICAgcmV0dXJuIE9LOworfQorCitDYXB0dXJlUmVzdWx0OjpDYXB0dXJlUmVzdWx0KCkgOgorICAgICAgICBtTWV0YWRhdGEoKSwgbVJlc3VsdEV4dHJhcygpIHsKK30KKworQ2FwdHVyZVJlc3VsdDo6Q2FwdHVyZVJlc3VsdChjb25zdCBDYXB0dXJlUmVzdWx0ICZvdGhlclJlc3VsdCkgeworICAgIG1SZXN1bHRFeHRyYXMgPSBvdGhlclJlc3VsdC5tUmVzdWx0RXh0cmFzOworICAgIG1NZXRhZGF0YSA9IG90aGVyUmVzdWx0Lm1NZXRhZGF0YTsKK30KKworc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6cmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpIHsKKworICAgIEFMT0dWKCIlczogcGFyY2VsID0gJXAiLCBfX0ZVTkNUSU9OX18sIHBhcmNlbCk7CisKKyAgICBpZiAocGFyY2VsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJjZWwgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbU1ldGFkYXRhLmNsZWFyKCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICByZXMgPSBtTWV0YWRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWwuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBSZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJlcyA9IG1SZXN1bHRFeHRyYXMucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgcmVzdWx0IGV4dHJhcyBmcm9tIHBhcmNlbC4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEFMT0dWKCIlczogUmVhZCByZXN1bHQgZXh0cmFzIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworCisgICAgQUxPR1YoIiVzOiBwYXJjZWwgPSAlcCIsIF9fRlVOQ1RJT05fXywgcGFyY2VsKTsKKworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICByZXMgPSBtTWV0YWRhdGEud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgbWV0YWRhdGEgdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBXcm90ZSBtZXRhZGF0YSB0byBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmVzID0gbVJlc3VsdEV4dHJhcy53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSByZXN1bHQgZXh0cmFzIHRvIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEFMT0dWKCIlczogV3JvdGUgcmVzdWx0IGV4dHJhcyB0byBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIE9LOworfQorCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA1ZmM4OWZiLi5iODY2NTFmIDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJCcENhbWVyYVNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTM0LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE0Myw2ICsxNDUsMjQgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICAvLyBHZXQgZW51bWVyYXRpb24gYW5kIGRlc2NyaXB0aW9uIG9mIHZlbmRvciB0YWdzIGZvciBjYW1lcmEKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoLypvdXQqL3NwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpHRVRfQ0FNRVJBX1ZFTkRPUl9UQUdfREVTQ1JJUFRPUiwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVwbHkucmVhZEludDMyKCk7CisKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGQ7CisgICAgICAgICAgICBpZiAoVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRnJvbVBhcmNlbCgmcmVwbHksIC8qb3V0Ki9kKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGRlc2MgPSBkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCiAgICAgLy8gY29ubmVjdCB0byBjYW1lcmEgc2VydmljZSAoYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEpCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYgJmNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLApAQCAtMjc1LDYgKzI5NSwyMiBAQAogICAgICAgICAgICAgaW5mby53cml0ZVRvUGFyY2VsKHJlcGx5KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfQ0FNRVJBX1ZFTkRPUl9UQUdfREVTQ1JJUFRPUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcihkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworCisgICAgICAgICAgICAvLyBvdXQtdmFyaWFibGVzIGFyZSBhZnRlciBleGNlcHRpb24gYW5kIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsgLy8gbWVhbnMgdGhlIHBhcmNlbGFibGUgaXMgaW5jbHVkZWQKKyAgICAgICAgICAgICAgICBkLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDT05ORUNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IGNhbWVyYUNsaWVudCA9CkBAIC0yODQsNyArMzIwLDcgQEAKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3QoY2FtZXJhQ2xpZW50LCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovIGNhbWVyYSk7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqL2NhbWVyYSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChjYW1lcmEgIT0gTlVMTCkgewpAQCAtMzA0LDcgKzM0MCw3IEBACiAgICAgICAgICAgICBpbnQzMl90IGNsaWVudFVpZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxJUHJvQ2FtZXJhVXNlcj4gY2FtZXJhOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdFBybyhjYW1lcmFDbGllbnQsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIC8qb3V0Ki8gY2FtZXJhKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovY2FtZXJhKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKGNhbWVyYSAhPSBOVUxMKSB7CkBAIC0zMjQsNyArMzYwLDcgQEAKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBjYW1lcmE7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RGV2aWNlKGNhbWVyYUNsaWVudCwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqLyBjYW1lcmEpOworICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIC8qb3V0Ki9jYW1lcmEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoY2FtZXJhICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9Qcm9DYW1lcmEuY3BwIGIvY2FtZXJhL1Byb0NhbWVyYS5jcHAKaW5kZXggYmE1YTQ4Yy4uNDhmOGU4ZSAxMDA2NDQKLS0tIGEvY2FtZXJhL1Byb0NhbWVyYS5jcHAKKysrIGIvY2FtZXJhL1Byb0NhbWVyYS5jcHAKQEAgLTI0OSwxMSArMjQ5LDE0IEBACiAgICAgc3AgPElQcm9DYW1lcmFVc2VyPiBjID0gbUNhbWVyYTsKICAgICBpZiAoYyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKIAotICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgIHNwPENwdUNvbnN1bWVyPiBjYyA9IG5ldyBDcHVDb25zdW1lcihicSwgaGVhcENvdW50LyosIHN5bmNocm9ub3VzTW9kZSovKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIHNwPENwdUNvbnN1bWVyPiBjYyA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgaGVhcENvdW50CisgICAgICAgICAgICAvKiwgc3luY2hyb25vdXNNb2RlKi8pOwogICAgIGNjLT5zZXROYW1lKFN0cmluZzgoIlByb0NhbWVyYTo6bUNwdUNvbnN1bWVyIikpOwogCi0gICAgc3A8U3VyZmFjZT4gc3RjID0gbmV3IFN1cmZhY2UoYnEpOworICAgIHNwPFN1cmZhY2U+IHN0YyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKIAogICAgIHN0YXR1c190IHMgPSBjcmVhdGVTdHJlYW0od2lkdGgsIGhlaWdodCwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RjLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCksCmRpZmYgLS1naXQgYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhNmE1MQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVmVuZGVyVGFnRGVzY3JpcHRvciIKKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKKyNpbmNsdWRlICJjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdik7CitzdGF0aWMgdm9pZCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X2FsbF90YWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90KiB0YWdBcnJheSk7CitzdGF0aWMgY29uc3QgY2hhciogdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF9zZWN0aW9uX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QgdGFnKTsKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X3RhZ19uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90IHRhZyk7CitzdGF0aWMgaW50IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX3R5cGUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QgdGFnKTsKKworfSAvKiBleHRlcm4gIkMiICovCisKKworc3RhdGljIE11dGV4IHNMb2NrOworc3RhdGljIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yOworCitWZW5kb3JUYWdEZXNjcmlwdG9yOjpWZW5kb3JUYWdEZXNjcmlwdG9yKCkge30KK1ZlbmRvclRhZ0Rlc2NyaXB0b3I6On5WZW5kb3JUYWdEZXNjcmlwdG9yKCkge30KKworc3RhdHVzX3QgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21PcHMoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKSB7CisgICAgaWYgKHZPcHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHZlbmRvcl90YWdfb3BzIGFyZ3VtZW50IHdhcyBOVUxMLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50IHRhZ0NvdW50ID0gdk9wcy0+Z2V0X3RhZ19jb3VudCh2T3BzKTsKKyAgICBpZiAodGFnQ291bnQgPCAwIHx8IHRhZ0NvdW50ID4gSU5UMzJfTUFYKSB7CisgICAgICAgIEFMT0dFKCIlczogdGFnIGNvdW50ICVkIGZyb20gdmVuZG9yIG9wcyBpcyBpbnZhbGlkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50MzJfdD4gdGFnQXJyYXk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRih0YWdBcnJheS5yZXNpemUodGFnQ291bnQpICE9IHRhZ0NvdW50LAorICAgICAgICAgICAgIiVzOiB0b28gbWFueSAoJXUpIHZlbmRvciB0YWdzIGRlZmluZWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisKKyAgICB2T3BzLT5nZXRfYWxsX3RhZ3Modk9wcywgLypvdXQqL3RhZ0FycmF5LmVkaXRBcnJheSgpKTsKKworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIGRlc2MtPm1UYWdDb3VudCA9IHRhZ0NvdW50OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHZPcHMtPmdldF90YWdfbmFtZSh2T3BzLCB0YWcpOworICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHRhZyBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9OYW1lTWFwLmFkZCh0YWcsIFN0cmluZzgodGFnTmFtZSkpOworICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHZPcHMtPmdldF9zZWN0aW9uX25hbWUodk9wcywgdGFnKTsKKyAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIFN0cmluZzgoc2VjdGlvbk5hbWUpKTsKKyAgICAgICAgaW50IHRhZ1R5cGUgPSB2T3BzLT5nZXRfdGFnX3R5cGUodk9wcywgdGFnKTsKKyAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9UeXBlTWFwLmFkZCh0YWcsIHRhZ1R5cGUpOworICAgIH0KKyAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDMyX3QgdGFnQ291bnQgPSAwOworICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRhZ0NvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCB0YWcgY291bnQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICh0YWdDb3VudCA8IDAgfHwgdGFnQ291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0YWcgY291bnQgJWQgZnJvbSB2ZW5kb3Igb3BzIGlzIGludmFsaWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICB1aW50MzJfdCB0YWc7CisgICAgaW50MzJfdCB0YWdUeXBlOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHRhZ0NvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKChyZXMgPSBwYXJjZWwtPnJlYWRJbnQzMihyZWludGVycHJldF9jYXN0PGludDMyX3QqPigmdGFnKSkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCByZWFkIHRhZyBpZCBmcm9tIHBhcmNlbCBmb3IgaW5kZXggJWQiLCBfX0ZVTkNUSU9OX18sIGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhZyA8IENBTUVSQV9NRVRBREFUQV9WRU5ET1JfVEFHX0JPVU5EQVJZKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHZlbmRvciB0YWcgJWQgbm90IGluIHZlbmRvciB0YWcgc2VjdGlvbi4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICByZXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0YWdUeXBlKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHJlYWQgdGFnIHR5cGUgZnJvbSBwYXJjZWwgZm9yIHRhZyAlZCIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh0YWdUeXBlIDwgMCB8fCB0YWdUeXBlID49IE5VTV9UWVBFUykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiB0YWcgdHlwZSAlZCBmcm9tIHZlbmRvciBvcHMgZG9lcyBub3QgZXhpc3QuIiwgX19GVU5DVElPTl9fLCB0YWdUeXBlKTsKKyAgICAgICAgICAgIHJlcyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFN0cmluZzggdGFnTmFtZSA9IHBhcmNlbC0+cmVhZFN0cmluZzgoKTsKKyAgICAgICAgaWYgKHRhZ05hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCB0YWcgbmFtZSB3YXMgTlVMTCBmb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJlcyA9IE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFN0cmluZzggc2VjdGlvbk5hbWUgPSBwYXJjZWwtPnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGlmIChzZWN0aW9uTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGFyY2VsIHNlY3Rpb24gbmFtZSB3YXMgTlVMTCBmb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJlcyA9IE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVzYy0+bVRhZ1RvTmFtZU1hcC5hZGQodGFnLCB0YWdOYW1lKTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzZWN0aW9uTmFtZSk7CisgICAgICAgIGRlc2MtPm1UYWdUb1R5cGVNYXAuYWRkKHRhZywgdGFnVHlwZSk7CisgICAgfQorCisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGRlc2NyaXB0b3IgPSBkZXNjOworICAgIHJldHVybiByZXM7Cit9CisKK2ludCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRUYWdDb3VudCgpIGNvbnN0IHsKKyAgICBzaXplX3Qgc2l6ZSA9IG1UYWdUb05hbWVNYXAuc2l6ZSgpOworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfQ09VTlRfRVJSOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKwordm9pZCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRUYWdBcnJheSh1aW50MzJfdCogdGFnQXJyYXkpIGNvbnN0IHsKKyAgICBzaXplX3Qgc2l6ZSA9IG1UYWdUb05hbWVNYXAuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIHRhZ0FycmF5W2ldID0gbVRhZ1RvTmFtZU1hcC5rZXlBdChpKTsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIqIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldFNlY3Rpb25OYW1lKHVpbnQzMl90IHRhZykgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSBtVGFnVG9TZWN0aW9uTWFwLmluZGV4T2ZLZXkodGFnKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBWRU5ET1JfU0VDVElPTl9OQU1FX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIG1UYWdUb1NlY3Rpb25NYXAudmFsdWVBdChpbmRleCkuc3RyaW5nKCk7Cit9CisKK2NvbnN0IGNoYXIqIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldFRhZ05hbWUodWludDMyX3QgdGFnKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IG1UYWdUb05hbWVNYXAuaW5kZXhPZktleSh0YWcpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBtVGFnVG9OYW1lTWFwLnZhbHVlQXQoaW5kZXgpLnN0cmluZygpOworfQorCitpbnQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnVHlwZSh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRhZ1RvTmFtZU1hcC5pbmRleE9mS2V5KHRhZyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19UWVBFX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIG1UYWdUb1R5cGVNYXAudmFsdWVGb3IodGFnKTsKK30KKworc3RhdHVzX3QgVmVuZG9yVGFnRGVzY3JpcHRvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZUludDMyKG1UYWdDb3VudCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICB1aW50MzJfdCB0YWc7CisgICAgaW50MzJfdCB0YWdUeXBlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIHRhZyA9IG1UYWdUb05hbWVNYXAua2V5QXQoaSk7CisgICAgICAgIFN0cmluZzggdGFnTmFtZSA9IG1UYWdUb05hbWVNYXBbaV07CisgICAgICAgIFN0cmluZzggc2VjdGlvbk5hbWUgPSBtVGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7CisgICAgICAgIHRhZ1R5cGUgPSBtVGFnVG9UeXBlTWFwLnZhbHVlRm9yKHRhZyk7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZUludDMyKHRhZykpICE9IE9LKSBicmVhazsKKyAgICAgICAgaWYgKChyZXMgPSBwYXJjZWwtPndyaXRlSW50MzIodGFnVHlwZSkpICE9IE9LKSBicmVhazsKKyAgICAgICAgaWYgKChyZXMgPSBwYXJjZWwtPndyaXRlU3RyaW5nOCh0YWdOYW1lKSkgIT0gT0spIGJyZWFrOworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVTdHJpbmc4KHNlY3Rpb25OYW1lKSkgIT0gT0spIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OnNldEFzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcihjb25zdCBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPSBkZXNjOworCisgICAgdmVuZG9yX3RhZ19vcHNfdCogb3BzUHRyID0gTlVMTDsKKyAgICBpZiAoZGVzYyAhPSBOVUxMKSB7CisgICAgICAgIG9wc1B0ciA9ICYoZGVzYy0+bVZlbmRvck9wcyk7CisgICAgICAgIG9wc1B0ci0+Z2V0X3RhZ19jb3VudCA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX2NvdW50OworICAgICAgICBvcHNQdHItPmdldF9hbGxfdGFncyA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfYWxsX3RhZ3M7CisgICAgICAgIG9wc1B0ci0+Z2V0X3NlY3Rpb25fbmFtZSA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfc2VjdGlvbl9uYW1lOworICAgICAgICBvcHNQdHItPmdldF90YWdfbmFtZSA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX25hbWU7CisgICAgICAgIG9wc1B0ci0+Z2V0X3RhZ190eXBlID0gdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfdHlwZTsKKyAgICB9CisgICAgaWYoKHJlcyA9IHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX29wcyhvcHNQdHIpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBzZXQgdmVuZG9yIHRhZyBkZXNjcmlwdG9yLCByZWNlaXZlZCBlcnJvciAlcyAoJWQpLiIKKyAgICAgICAgICAgICAgICAsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3Jfb3BzKE5VTEwpOworICAgIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLmNsZWFyKCk7Cit9CisKK3NwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICByZXR1cm4gc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3I7Cit9CisKK2V4dGVybiAiQyIgeworCitpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdikgeworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgaWYgKHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBWZW5kb3IgdGFnIGRlc2NyaXB0b3Igbm90IGluaXRpYWxpemVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWRU5ET1JfVEFHX0NPVU5UX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLT5nZXRUYWdDb3VudCgpOworfQorCit2b2lkIHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfYWxsX3RhZ3MoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QqIHRhZ0FycmF5KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICBpZiAoc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgZGVzY3JpcHRvciBub3QgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnQXJyYXkodGFnQXJyYXkpOworfQorCitjb25zdCBjaGFyKiB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X3NlY3Rpb25fbmFtZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiB2LCB1aW50MzJfdCB0YWcpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVkVORE9SX1NFQ1RJT05fTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0U2VjdGlvbk5hbWUodGFnKTsKK30KKworY29uc3QgY2hhciogdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfbmFtZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiB2LCB1aW50MzJfdCB0YWcpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19OQU1FX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLT5nZXRUYWdOYW1lKHRhZyk7Cit9CisKK2ludCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X3RhZ190eXBlKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90IHRhZykgeworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgaWYgKHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBWZW5kb3IgdGFnIGRlc2NyaXB0b3Igbm90IGluaXRpYWxpemVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWRU5ET1JfVEFHX1RZUEVfRVJSOworICAgIH0KKyAgICByZXR1cm4gc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3ItPmdldFRhZ1R5cGUodGFnKTsKK30KKworfSAvKiBleHRlcm4gIkMiICovCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCBiL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCmluZGV4IDYxMzM1OGEuLjRjYzdiNWQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NiwxMiArNDcsMTQgQEAKICAgICB7CiAgICAgfQogCi0gICAgdm9pZCBvbkRldmljZUVycm9yKENhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUpCisgICAgdm9pZCBvbkRldmljZUVycm9yKENhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykKICAgICB7CiAgICAgICAgIEFMT0dWKCJvbkRldmljZUVycm9yIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihlcnJvckNvZGUpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyB0byBtYXJrIHByZXNlbmNlIG9mIENhcHR1cmVSZXN1bHRFeHRyYXMgb2JqZWN0CisgICAgICAgIHJlc3VsdEV4dHJhcy53cml0ZVRvUGFyY2VsKCZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENBTUVSQV9FUlJPUiwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KQEAgLTY1LDI1ICs2OCwyOCBAQAogICAgICAgICBkYXRhLndyaXRlTm9FeGNlcHRpb24oKTsKICAgICB9CiAKLSAgICB2b2lkIG9uQ2FwdHVyZVN0YXJ0ZWQoaW50MzJfdCByZXF1ZXN0SWQsIGludDY0X3QgdGltZXN0YW1wKQorICAgIHZvaWQgb25DYXB0dXJlU3RhcnRlZChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHQsIGludDY0X3QgdGltZXN0YW1wKQogICAgIHsKICAgICAgICAgQUxPR1YoIm9uQ2FwdHVyZVN0YXJ0ZWQiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcXVlc3RJZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsgLy8gdG8gbWFyayBwcmVzZW5jZSBvZiBDYXB0dXJlUmVzdWx0RXh0cmFzIG9iamVjdAorICAgICAgICByZXN1bHQud3JpdGVUb1BhcmNlbCgmZGF0YSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NCh0aW1lc3RhbXApOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0FQVFVSRV9TVEFSVEVELCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICAgICAgZGF0YS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgfQogCiAKLSAgICB2b2lkIG9uUmVzdWx0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiByZXN1bHQpIHsKKyAgICB2b2lkIG9uUmVzdWx0UmVjZWl2ZWQoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CiAgICAgICAgIEFMT0dWKCJvblJlc3VsdFJlY2VpdmVkIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihyZXF1ZXN0SWQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7IC8vIHRvIG1hcmsgcHJlc2VuY2Ugb2YgbWV0YWRhdGEgb2JqZWN0Ci0gICAgICAgIHJlc3VsdC53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgbWV0YWRhdGEud3JpdGVUb1BhcmNlbCgmZGF0YSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsgLy8gdG8gbWFyayBwcmVzZW5jZSBvZiBDYXB0dXJlUmVzdWx0IG9iamVjdAorICAgICAgICByZXN1bHRFeHRyYXMud3JpdGVUb1BhcmNlbCgmZGF0YSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRVNVTFRfUkVDRUlWRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgICAgICBkYXRhLndyaXRlTm9FeGNlcHRpb24oKTsKICAgICB9CkBAIC0xMDQsNyArMTEwLDEzIEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZUNhbGxiYWNrcywgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSA9CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUVycm9yQ29kZT4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBvbkRldmljZUVycm9yKGVycm9yQ29kZSk7CisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTm8gQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QgaXMgcHJlc2VudCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9uRGV2aWNlRXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOwogICAgICAgICAgICAgZGF0YS5yZWFkRXhjZXB0aW9uQ29kZSgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMTE4LDIzICsxMzAsMzMgQEAKICAgICAgICAgY2FzZSBDQVBUVVJFX1NUQVJURUQ6IHsKICAgICAgICAgICAgIEFMT0dWKCJvbkNhcHR1cmVTdGFydGVkIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZUNhbGxiYWNrcywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHQ7CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LnJlYWRGcm9tUGFyY2VsKGNvbnN0X2Nhc3Q8UGFyY2VsKj4oJmRhdGEpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk5vIENhcHR1cmVSZXN1bHRFeHRyYXMgb2JqZWN0IGlzIHByZXNlbnQgaW4gcmVzdWx0ISIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgb25DYXB0dXJlU3RhcnRlZChyZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CisgICAgICAgICAgICBvbkNhcHR1cmVTdGFydGVkKHJlc3VsdCwgdGltZXN0YW1wKTsKICAgICAgICAgICAgIGRhdGEucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBSRVNVTFRfUkVDRUlWRUQ6IHsKICAgICAgICAgICAgIEFMT0dWKCJvblJlc3VsdFJlY2VpdmVkIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZUNhbGxiYWNrcywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcmVzdWx0OworICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CiAgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnJlYWRGcm9tUGFyY2VsKGNvbnN0X2Nhc3Q8UGFyY2VsKj4oJmRhdGEpKTsKKyAgICAgICAgICAgICAgICBtZXRhZGF0YS5yZWFkRnJvbVBhcmNlbChjb25zdF9jYXN0PFBhcmNlbCo+KCZkYXRhKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFMT0dXKCJObyBtZXRhZGF0YSBvYmplY3QgaXMgcHJlc2VudCBpbiByZXN1bHQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9uUmVzdWx0UmVjZWl2ZWQocmVxdWVzdElkLCByZXN1bHQpOworICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzLnJlYWRGcm9tUGFyY2VsKGNvbnN0X2Nhc3Q8UGFyY2VsKj4oJmRhdGEpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk5vIGNhcHR1cmUgcmVzdWx0IGV4dHJhcyBvYmplY3QgaXMgcHJlc2VudCBpbiByZXN1bHQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9uUmVzdWx0UmVjZWl2ZWQobWV0YWRhdGEsIHJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICBkYXRhLnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAgYi9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAKaW5kZXggMWU1ODIyZi4uYWQ2NTk1NSAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogZW51bSB7CiAgICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU1VCTUlUX1JFUVVFU1QsCisgICAgU1VCTUlUX1JFUVVFU1RfTElTVCwKICAgICBDQU5DRUxfUkVRVUVTVCwKICAgICBERUxFVEVfU1RSRUFNLAogICAgIENSRUFURV9TVFJFQU0sCkBAIC03NSw3ICs3Niw4IEBACiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBpbnQgc3VibWl0UmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwgYm9vbCBzdHJlYW1pbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LCBib29sIHJlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtODksMTUgKzkxLDY3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBhcmcxID0gc3RyZWFtaW5nIChib29sKQotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtaW5nKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcGVhdGluZyk7CiAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNVQk1JVF9SRVFVRVNULCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gcmVwbHkucmVhZEludDMyKCk7CisKKyAgICAgICAgc3RhdHVzX3QgcmVzRnJhbWVOdW1iZXIgPSBCQURfVkFMVUU7CisgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXNGcmFtZU51bWJlciA9IHJlcGx5LnJlYWRJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwlpZiAoKHJlcyAhPSBOT19FUlJPUikgfHwgKHJlc0ZyYW1lTnVtYmVyICE9IE5PX0VSUk9SKSkgeworICAgICAgICAgICAgcmVzID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRSZXF1ZXN0TGlzdChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RMaXN0LCBib29sIHJlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50MzIocmVxdWVzdExpc3Quc2l6ZSgpKTsKKworICAgICAgICBmb3IgKExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID46Oml0ZXJhdG9yIGl0ID0gcmVxdWVzdExpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSByZXF1ZXN0TGlzdC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSAqaXQ7CisgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LT53cml0ZVRvUGFyY2VsKCZkYXRhKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcGVhdGluZyk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNVQk1JVF9SRVFVRVNUX0xJU1QsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gcmVwbHkucmVhZEludDMyKCk7CisKKyAgICAgICAgc3RhdHVzX3QgcmVzRnJhbWVOdW1iZXIgPSBCQURfVkFMVUU7CisgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXNGcmFtZU51bWJlciA9IHJlcGx5LnJlYWRJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgocmVzICE9IE5PX0VSUk9SKSB8fCAocmVzRnJhbWVOdW1iZXIgIT0gTk9fRVJST1IpKSB7CisgICAgICAgICAgICByZXMgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0xMDYsNyArMTYwLDE4IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDQU5DRUxfUkVRVUVTVCwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkKQEAgLTE5NywxNCArMjYyLDI1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikKICAgICB7CiAgICAgICAgIEFMT0dWKCJmbHVzaCIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZMVVNILCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogcHJpdmF0ZToKQEAgLTIzOSwxMSArMzE1LDQzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGFyZzEgPSBzdHJlYW1pbmcgKGJvb2wpCi0gICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBib29sIHJlcGVhdGluZyA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIC8vIHJldHVybiBjb2RlOiByZXF1ZXN0SWQgKGludDMyKQogICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgc3RyZWFtaW5nKSk7CisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3VibWl0UmVxdWVzdChyZXF1ZXN0LCByZXBlYXRpbmcsICZsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQobGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNVQk1JVF9SRVFVRVNUX0xJU1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RMaXN0OworICAgICAgICAgICAgaW50IHJlcXVlc3RMaXN0U2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RMaXN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IG5ldyBDYXB0dXJlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC0+cmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkEgcmVxdWVzdCBpcyBtaXNzaW5nLiBTZW5kaW5nIGluIG51bGwgcmVxdWVzdC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgcmVwZWF0aW5nID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgcmVwZWF0aW5nLCAmbGFzdEZyYW1lTnVtYmVyKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGxhc3RGcmFtZU51bWJlcik7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTI1MSw3ICszNTksMTAgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2FuY2VsUmVxdWVzdChyZXF1ZXN0SWQpKTsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjYW5jZWxSZXF1ZXN0KHJlcXVlc3RJZCwgJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERFTEVURV9TVFJFQU06IHsKQEAgLTMzOSw3ICs0NTAsMTAgQEAKICAgICAgICAgY2FzZSBGTFVTSDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFEZXZpY2VVc2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmx1c2goKSk7CisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmx1c2goJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tayBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGVjMTM5MTEuLjYxMzg1ZTUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xLDkgKzEsMjQgQEAKKyMgQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKwogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCW1haW4uY3BwIFwKIAlQcm9DYW1lcmFUZXN0cy5jcHAgXAorCVZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlidXRpbHMgXApAQCAtMjYsNiArNDEsOCBAQAogCWV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAogCWV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCiAJc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCisJc3lzdGVtL21lZGlhL2NhbWVyYS90ZXN0cyBcCiAJZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZSBcCiAJZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL2NhbWVyYSBcCiAJZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSBcCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcCBiL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjRlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvdGVzdHMvVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cyIKKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV90ZXN0c19mYWtlX3ZlbmRvci5oPgorI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX3ZlbmRvcl90YWdzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2VudW0geworICAgIEJBRF9UQUdfQVJSQVkgPSAweERFQURCRUVGdSwKKyAgICBCQURfVEFHID0gMHg4REVBREJBRHUsCit9OworCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgICAgICAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisKK3N0YXRpYyBib29sIENvbnRhaW5zVGFnKHVpbnQzMl90KiB0YWdBcnJheSwgc2l6ZV90IHNpemUsIHVpbnQzMl90IHRhZykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIGlmICh0YWcgPT0gdGFnQXJyYXlbaV0pIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKyNkZWZpbmUgRVhQRUNUX0NPTlRBSU5TX1RBRyh0LCBhKSBcCisgICAgRVhQRUNUX1RSVUUoQ29udGFpbnNUYWcoYSwgQVJSQVlfU0laRShhKSwgdCkpCisKKyNkZWZpbmUgQVNTRVJUX05PVF9OVUxMKHgpIFwKKyAgICBBU1NFUlRfVFJVRSgoeCkgIT0gTlVMTCkKKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9nZXRfdGFnX2NvdW50KGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMpIHsKKyAgICByZXR1cm4gVkVORE9SX1RBR19DT1VOVF9FUlI7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfZ2V0X2FsbF90YWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsIHVpbnQzMl90KiB0YWdBcnJheSkgeworICAgIC8vTm9vcAorfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVmYXVsdF9nZXRfc2VjdGlvbl9uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsIHVpbnQzMl90IHRhZykgeworICAgIHJldHVybiBWRU5ET1JfU0VDVElPTl9OQU1FX0VSUjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGRlZmF1bHRfZ2V0X3RhZ19uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsIHVpbnQzMl90IHRhZykgeworICAgIHJldHVybiBWRU5ET1JfVEFHX05BTUVfRVJSOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfZ2V0X3RhZ190eXBlKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsIHVpbnQzMl90IHRhZykgeworICAgIHJldHVybiBWRU5ET1JfVEFHX1RZUEVfRVJSOworfQorCit9IC8qZXh0ZXJuICJDIiovCisKKy8vIFNldCBkZWZhdWx0IHZlbmRvciBvcGVyYXRpb25zIGZvciBhIHZlbmRvcl90YWdfb3BzIHN0cnVjdAorc3RhdGljIHZvaWQgRmlsbFdpdGhEZWZhdWx0cyh2ZW5kb3JfdGFnX29wc190KiB2T3BzKSB7CisgICAgQVNTRVJUX05PVF9OVUxMKHZPcHMpOworICAgIHZPcHMtPmdldF90YWdfY291bnQgPSBkZWZhdWx0X2dldF90YWdfY291bnQ7CisgICAgdk9wcy0+Z2V0X2FsbF90YWdzID0gZGVmYXVsdF9nZXRfYWxsX3RhZ3M7CisgICAgdk9wcy0+Z2V0X3NlY3Rpb25fbmFtZSA9IGRlZmF1bHRfZ2V0X3NlY3Rpb25fbmFtZTsKKyAgICB2T3BzLT5nZXRfdGFnX25hbWUgPSBkZWZhdWx0X2dldF90YWdfbmFtZTsKKyAgICB2T3BzLT5nZXRfdGFnX3R5cGUgPSBkZWZhdWx0X2dldF90YWdfdHlwZTsKK30KKworLyoqCisgKiBUZXN0IGlmIHZhbHVlcyBmcm9tIFZlbmRvclRhZ0Rlc2NyaXB0b3IgbWV0aG9kcyBtYXRjaCBjb3JyZXNwb25kaW5nIHZhbHVlcworICogZnJvbSB2ZW5kb3JfdGFnX29wcyBmdW5jdGlvbnMuCisgKi8KK1RFU1QoVmVuZG9yVGFnRGVzY3JpcHRvclRlc3QsIENvbnNpc3RlbnRXaXRoVmVuZG9yVGFncykgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZEZXNjOworICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKnZPcHMgPSAmZmFrZXZlbmRvcl9vcHM7CisgICAgRVhQRUNUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcyh2T3BzLCAvKm91dCovdkRlc2MpKTsKKworICAgIEFTU0VSVF9OT1RfTlVMTCh2RGVzYyk7CisKKyAgICAvLyBFbnN1cmUgcmVhc29uYWJsZSB0YWcgY291bnQKKyAgICBpbnQgdGFnQ291bnQgPSB2RGVzYy0+Z2V0VGFnQ291bnQoKTsKKyAgICBFWFBFQ1RfRVEodGFnQ291bnQsIHZPcHMtPmdldF90YWdfY291bnQodk9wcykpOworCisgICAgdWludDMyX3QgZGVzY1RhZ0FycmF5W3RhZ0NvdW50XTsKKyAgICB1aW50MzJfdCBvcHNUYWdBcnJheVt0YWdDb3VudF07CisKKyAgICAvLyBHZXQgYWxsIHRhZyBpZHMKKyAgICB2RGVzYy0+Z2V0VGFnQXJyYXkoZGVzY1RhZ0FycmF5KTsKKyAgICB2T3BzLT5nZXRfYWxsX3RhZ3Modk9wcywgb3BzVGFnQXJyYXkpOworCisgICAgQVNTRVJUX05PVF9OVUxMKGRlc2NUYWdBcnJheSk7CisgICAgQVNTRVJUX05PVF9OVUxMKG9wc1RhZ0FycmF5KTsKKworICAgIHVpbnQzMl90IHRhZzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0NvdW50OyArK2kpIHsKKyAgICAgICAgLy8gRm9yIGVhY2ggdGFnIGlkLCBjaGVjayB3aGV0aGVyIHR5cGUsIHNlY3Rpb24gbmFtZSwgdGFnIG5hbWUgbWF0Y2gKKyAgICAgICAgdGFnID0gZGVzY1RhZ0FycmF5W2ldOworICAgICAgICBFWFBFQ1RfQ09OVEFJTlNfVEFHKHRhZywgb3BzVGFnQXJyYXkpOworICAgICAgICBFWFBFQ1RfRVEodkRlc2MtPmdldFRhZ1R5cGUodGFnKSwgdk9wcy0+Z2V0X3RhZ190eXBlKHZPcHMsIHRhZykpOworICAgICAgICBFWFBFQ1RfU1RSRVEodkRlc2MtPmdldFNlY3Rpb25OYW1lKHRhZyksIHZPcHMtPmdldF9zZWN0aW9uX25hbWUodk9wcywgdGFnKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUSh2RGVzYy0+Z2V0VGFnTmFtZSh0YWcpLCB2T3BzLT5nZXRfdGFnX25hbWUodk9wcywgdGFnKSk7CisgICAgfQorfQorCisvKioKKyAqIFRlc3QgaWYgdmFsdWVzIGZyb20gVmVuZG9yVGFnRGVzY3JpcHRvciBtZXRob2RzIHN0YXkgY29uc2lzdGVudCBhZnRlciBiZWluZworICogcGFyY2VsbGVkL3VucGFyY2VsbGVkLgorICovCitURVNUKFZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0LCBDb25zaXN0ZW50QWNyb3NzUGFyY2VsKSB7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdkRlc2NPcmlnaW5hbCwgdkRlc2NQYXJjZWxlZDsKKyAgICBjb25zdCB2ZW5kb3JfdGFnX29wc190ICp2T3BzID0gJmZha2V2ZW5kb3Jfb3BzOworICAgIEVYUEVDVF9FUShPSywgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21PcHModk9wcywgLypvdXQqL3ZEZXNjT3JpZ2luYWwpKTsKKworICAgIEFTU0VSVF9UUlVFKHZEZXNjT3JpZ2luYWwgIT0gTlVMTCk7CisKKyAgICBQYXJjZWwgcDsKKworICAgIC8vIENoZWNrIHdoZXRoZXIgcGFyY2VsIHJlYWQvd3JpdGUgc3VjY2VlZAorICAgIEVYUEVDVF9FUShPSywgdkRlc2NPcmlnaW5hbC0+d3JpdGVUb1BhcmNlbCgmcCkpOworICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIEFTU0VSVF9FUShPSywgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRnJvbVBhcmNlbCgmcCwgdkRlc2NQYXJjZWxlZCkpOworCisgICAgLy8gRW5zdXJlIGNvbnNpc3RlbnQgdGFnIGNvdW50CisgICAgaW50IHRhZ0NvdW50ID0gdkRlc2NPcmlnaW5hbC0+Z2V0VGFnQ291bnQoKTsKKyAgICBBU1NFUlRfRVEodGFnQ291bnQsIHZEZXNjUGFyY2VsZWQtPmdldFRhZ0NvdW50KCkpOworCisgICAgdWludDMyX3QgZGVzY1RhZ0FycmF5W3RhZ0NvdW50XTsKKyAgICB1aW50MzJfdCBkZXNjMlRhZ0FycmF5W3RhZ0NvdW50XTsKKworICAgIC8vIEdldCBhbGwgdGFnIGlkcworICAgIHZEZXNjT3JpZ2luYWwtPmdldFRhZ0FycmF5KGRlc2NUYWdBcnJheSk7CisgICAgdkRlc2NQYXJjZWxlZC0+Z2V0VGFnQXJyYXkoZGVzYzJUYWdBcnJheSk7CisKKyAgICBBU1NFUlRfTk9UX05VTEwoZGVzY1RhZ0FycmF5KTsKKyAgICBBU1NFUlRfTk9UX05VTEwoZGVzYzJUYWdBcnJheSk7CisKKyAgICB1aW50MzJfdCB0YWc7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdDb3VudDsgKytpKSB7CisgICAgICAgIC8vIEZvciBlYWNoIHRhZyBpZCwgY2hlY2sgY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgdHdvIHZlbmRvciB0YWcKKyAgICAgICAgLy8gZGVzY3JpcHRvcnMgZm9yIGVhY2ggdHlwZSwgc2VjdGlvbiBuYW1lLCB0YWcgbmFtZQorICAgICAgICB0YWcgPSBkZXNjVGFnQXJyYXlbaV07CisgICAgICAgIEVYUEVDVF9DT05UQUlOU19UQUcodGFnLCBkZXNjMlRhZ0FycmF5KTsKKyAgICAgICAgRVhQRUNUX0VRKHZEZXNjT3JpZ2luYWwtPmdldFRhZ1R5cGUodGFnKSwgdkRlc2NQYXJjZWxlZC0+Z2V0VGFnVHlwZSh0YWcpKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKHZEZXNjT3JpZ2luYWwtPmdldFNlY3Rpb25OYW1lKHRhZyksIHZEZXNjUGFyY2VsZWQtPmdldFNlY3Rpb25OYW1lKHRhZykpOworICAgICAgICBFWFBFQ1RfU1RSRVEodkRlc2NPcmlnaW5hbC0+Z2V0VGFnTmFtZSh0YWcpLCB2RGVzY1BhcmNlbGVkLT5nZXRUYWdOYW1lKHRhZykpOworICAgIH0KK30KKworLyoqCisgKiBUZXN0IGRlZmF1bHRzIGFuZCBlcnJvciBjb25kaXRpb25zLgorICovCitURVNUKFZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0LCBFcnJvckNvbmRpdGlvbnMpIHsKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiB2RGVzYzsKKyAgICB2ZW5kb3JfdGFnX29wc190IHZPcHM7CisgICAgRmlsbFdpdGhEZWZhdWx0cygmdk9wcyk7CisKKyAgICAvLyBFbnN1cmUgY3JlYXRlIGZhaWxzIHdoZW4gdXNpbmcgbnVsbCB2T3BzCisgICAgRVhQRUNUX0VRKEJBRF9WQUxVRSwgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21PcHMoLyp2T3BzKi9OVUxMLCB2RGVzYykpOworCisgICAgLy8gRW5zdXJlIGNyZWF0ZSB3b3JrcyB3aGVuIHRoZXJlIGFyZSBubyB2dGFncyBkZWZpbmVkIGluIGEgd2VsbC1mb3JtZWQgdk9wcworICAgIEFTU0VSVF9FUShPSywgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21PcHMoJnZPcHMsIHZEZXNjKSk7CisKKyAgICAvLyBFbnN1cmUgZGVmYXVsdHMgYXJlIHJldHVybmVkIHdoZW4gbm8gdnRhZ3MgYXJlIGRlZmluZWQsIG9yIHRhZyBpcyB1bmtub3duCisgICAgRVhQRUNUX0VRKFZFTkRPUl9UQUdfQ09VTlRfRVJSLCB2RGVzYy0+Z2V0VGFnQ291bnQoKSk7CisgICAgdWludDMyX3QqIHRhZ0FycmF5ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KEJBRF9UQUdfQVJSQVkpOworICAgIHVpbnQzMl90KiB0ZXN0QXJyYXkgPSB0YWdBcnJheTsKKyAgICB2RGVzYy0+Z2V0VGFnQXJyYXkodGFnQXJyYXkpOworICAgIEVYUEVDVF9FUSh0ZXN0QXJyYXksIHRhZ0FycmF5KTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1NFQ1RJT05fTkFNRV9FUlIsIHZEZXNjLT5nZXRTZWN0aW9uTmFtZShCQURfVEFHKSk7CisgICAgRVhQRUNUX0VRKFZFTkRPUl9UQUdfTkFNRV9FUlIsIHZEZXNjLT5nZXRUYWdOYW1lKEJBRF9UQUcpKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1RBR19UWVBFX0VSUiwgdkRlc2MtPmdldFRhZ1R5cGUoQkFEX1RBRykpOworCisgICAgLy8gTWFrZSBzdXJlIGdsb2JhbCBjYW4gYmUgc2V0L2NsZWFyZWQKKyAgICBjb25zdCB2ZW5kb3JfdGFnX29wc190ICpmYWtlT3BzID0gJmZha2V2ZW5kb3Jfb3BzOworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHByZXZHbG9iYWwgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisKKyAgICBFWFBFQ1RfVFJVRShWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkgPT0gTlVMTCk7CisgICAgRVhQRUNUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpzZXRBc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IodkRlc2MpKTsKKyAgICBFWFBFQ1RfVFJVRShWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkgIT0gTlVMTCk7CisgICAgRVhQRUNUX0VRKFZFTkRPUl9TRUNUSU9OX05BTUVfRVJSLCB2RGVzYy0+Z2V0U2VjdGlvbk5hbWUoQkFEX1RBRykpOworICAgIEVYUEVDVF9FUShPSywgVmVuZG9yVGFnRGVzY3JpcHRvcjo6c2V0QXNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKHByZXZHbG9iYWwpKTsKKyAgICBFWFBFQ1RfRVEocHJldkdsb2JhbCwgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpKTsKK30KKwpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5tayBiL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQubWsKaW5kZXggZDc3ZmRiNi4uNjc0N2U2MCAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5taworKysgYi9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLm1rCkBAIC0xOSw2ICsxOSw3IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCXNjcmVlbnJlY29yZC5jcHAgXAogCUVnbFdpbmRvdy5jcHAgXAorCUZyYW1lT3V0cHV0LmNwcCBcCiAJVGV4dFJlbmRlcmVyLmNwcCBcCiAJT3ZlcmxheS5jcHAgXAogCVByb2dyYW0uY3BwCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9FZ2xXaW5kb3cuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvRWdsV2luZG93LmNwcAppbmRleCBhYTA1MTdmLi5jMTZmMmFkIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9FZ2xXaW5kb3cuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0VnbFdpbmRvdy5jcHAKQEAgLTM1LDExICszNSwxNiBAQAogCiAKIHN0YXR1c190IEVnbFdpbmRvdzo6Y3JlYXRlV2luZG93KGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gZWdsU2V0dXBDb250ZXh0KCk7CisgICAgaWYgKG1FZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgIEFMT0dFKCJzdXJmYWNlIGFscmVhZHkgY3JlYXRlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gZWdsU2V0dXBDb250ZXh0KGZhbHNlKTsKICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgLy8gQ2FjaGUgdGhlIGN1cnJlbnQgZGltZW5zaW9ucy4gIFdlJ3JlIG5vdCBleHBlY3RpbmcgdGhlc2UgdG8gY2hhbmdlLgogICAgIHN1cmZhY2UtPnF1ZXJ5KE5BVElWRV9XSU5ET1dfV0lEVEgsICZtV2lkdGgpOwogICAgIHN1cmZhY2UtPnF1ZXJ5KE5BVElWRV9XSU5ET1dfSEVJR0hULCAmbUhlaWdodCk7CiAKQEAgLTU2LDYgKzYxLDM0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBFZ2xXaW5kb3c6OmNyZWF0ZVBidWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgaWYgKG1FZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgIEFMT0dFKCJzdXJmYWNlIGFscmVhZHkgY3JlYXRlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gZWdsU2V0dXBDb250ZXh0KHRydWUpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgRUdMaW50IHBidWZmZXJBdHRyaWJzW10gPSB7CisgICAgICAgICAgICBFR0xfV0lEVEgsIHdpZHRoLAorICAgICAgICAgICAgRUdMX0hFSUdIVCwgaGVpZ2h0LAorICAgICAgICAgICAgRUdMX05PTkUKKyAgICB9OworICAgIG1FZ2xTdXJmYWNlID0gZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xDb25maWcsIHBidWZmZXJBdHRyaWJzKTsKKyAgICBpZiAobUVnbFN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgQUxPR0UoImVnbENyZWF0ZVBidWZmZXJTdXJmYWNlIGVycm9yOiAlI3giLCBlZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgZWdsUmVsZWFzZSgpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IEVnbFdpbmRvdzo6bWFrZUN1cnJlbnQoKSBjb25zdCB7CiAgICAgaWYgKCFlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBtRWdsQ29udGV4dCkpIHsKICAgICAgICAgQUxPR0UoImVnbE1ha2VDdXJyZW50IGZhaWxlZDogJSN4IiwgZWdsR2V0RXJyb3IoKSk7CkBAIC02NCw3ICs5Nyw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBFZ2xXaW5kb3c6OmVnbFNldHVwQ29udGV4dCgpIHsKK3N0YXR1c190IEVnbFdpbmRvdzo6ZWdsU2V0dXBDb250ZXh0KGJvb2wgZm9yUGJ1ZmZlcikgewogICAgIEVHTEJvb2xlYW4gcmVzdWx0OwogCiAgICAgbUVnbERpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwpAQCAtODIsMTcgKzExNSwyOCBAQAogICAgIEFMT0dWKCJJbml0aWFsaXplZCBFR0wgdiVkLiVkIiwgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb24pOwogCiAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAwOwotICAgIEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAotICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCi0gICAgICAgIEVHTF9SRUNPUkRBQkxFX0FORFJPSUQsIDEsCi0gICAgICAgIEVHTF9SRURfU0laRSwgOCwKLSAgICAgICAgRUdMX0dSRUVOX1NJWkUsIDgsCi0gICAgICAgIEVHTF9CTFVFX1NJWkUsIDgsCi0gICAgICAgIEVHTF9OT05FCisgICAgRUdMaW50IHdpbmRvd0NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAorICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAorICAgICAgICAgICAgRUdMX1JFQ09SREFCTEVfQU5EUk9JRCwgMSwKKyAgICAgICAgICAgIEVHTF9SRURfU0laRSwgOCwKKyAgICAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAorICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwgOCwKKyAgICAgICAgICAgIC8vIG5vIGFscGhhCisgICAgICAgICAgICBFR0xfTk9ORQogICAgIH07Ci0gICAgcmVzdWx0ID0gZWdsQ2hvb3NlQ29uZmlnKG1FZ2xEaXNwbGF5LCBjb25maWdBdHRyaWJzLCAmbUVnbENvbmZpZywgMSwKLSAgICAgICAgICAgICZudW1Db25maWdzKTsKKyAgICBFR0xpbnQgcGJ1ZmZlckNvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVCwKKyAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKKyAgICAgICAgICAgIEVHTF9SRURfU0laRSwgOCwKKyAgICAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAorICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwgOCwKKyAgICAgICAgICAgIEVHTF9BTFBIQV9TSVpFLCA4LAorICAgICAgICAgICAgRUdMX05PTkUKKyAgICB9OworICAgIHJlc3VsdCA9IGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwKKyAgICAgICAgICAgIGZvclBidWZmZXIgPyBwYnVmZmVyQ29uZmlnQXR0cmlicyA6IHdpbmRvd0NvbmZpZ0F0dHJpYnMsCisgICAgICAgICAgICAmbUVnbENvbmZpZywgMSwgJm51bUNvbmZpZ3MpOwogICAgIGlmIChyZXN1bHQgIT0gRUdMX1RSVUUpIHsKICAgICAgICAgQUxPR0UoImVnbENob29zZUNvbmZpZyBlcnJvcjogJSN4IiwgZWdsR2V0RXJyb3IoKSk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvRWdsV2luZG93LmggYi9jbWRzL3NjcmVlbnJlY29yZC9FZ2xXaW5kb3cuaAppbmRleCAwMmEyZWZjLi42OWQwYzMxIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9FZ2xXaW5kb3cuaAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9FZ2xXaW5kb3cuaApAQCAtNDQsNiArNDQsOSBAQAogICAgIC8vIENyZWF0ZXMgYW4gRUdMIHdpbmRvdyBmb3IgdGhlIHN1cHBsaWVkIHN1cmZhY2UuCiAgICAgc3RhdHVzX3QgY3JlYXRlV2luZG93KGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlKTsKIAorICAgIC8vIENyZWF0ZXMgYW4gRUdMIHBidWZmZXIgc3VyZmFjZS4KKyAgICBzdGF0dXNfdCBjcmVhdGVQYnVmZmVyKGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKICAgICAvLyBSZXR1cm4gd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgKG9idGFpbmVkIGZyb20gSUdCUCkuCiAgICAgaW50IGdldFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbVdpZHRoOyB9CiAgICAgaW50IGdldEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1IZWlnaHQ7IH0KQEAgLTY1LDcgKzY4LDcgQEAKICAgICBFZ2xXaW5kb3cmIG9wZXJhdG9yPShjb25zdCBFZ2xXaW5kb3cmKTsKIAogICAgIC8vIEluaXQgZGlzcGxheSwgY3JlYXRlIGNvbmZpZyBhbmQgY29udGV4dC4KLSAgICBzdGF0dXNfdCBlZ2xTZXR1cENvbnRleHQoKTsKKyAgICBzdGF0dXNfdCBlZ2xTZXR1cENvbnRleHQoYm9vbCBmb3JQYnVmZmVyKTsKICAgICB2b2lkIGVnbFJlbGVhc2UoKTsKIAogICAgIC8vIEJhc2ljIEVHTCBnb29kaWVzLgpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvRnJhbWVPdXRwdXQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvRnJhbWVPdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YjFmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5jcHAKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU2NyZWVuUmVjb3JkIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlICJGcmFtZU91dHB1dC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIGNvbnN0IGJvb2wga1Nob3dUaW1pbmcgPSBmYWxzZTsgICAgICAvLyBzZXQgdG8gInRydWUiIGZvciBkZWJ1Z2dpbmcKK3N0YXRpYyBjb25zdCBpbnQga0dsQnl0ZXNQZXJQaXhlbCA9IDQ7ICAgICAgLy8gR0xfUkdCQQorc3RhdGljIGNvbnN0IGludCBrT3V0Qnl0ZXNQZXJQaXhlbCA9IDM7ICAgICAvLyBSR0Igb25seQorCitpbmxpbmUgdm9pZCBGcmFtZU91dHB1dDo6c2V0VmFsdWVMRSh1aW50OF90KiBidWYsIHVpbnQzMl90IHZhbHVlKSB7CisgICAgLy8gU2luY2Ugd2UncmUgcnVubmluZyBvbiBhbiBBbmRyb2lkIGRldmljZSwgd2UncmUgKGFsbW9zdCkgZ3VhcmFudGVlZAorICAgIC8vIHRvIGJlIGxpdHRsZS1lbmRpYW4sIGFuZCAoYWxtb3N0KSBndWFyYW50ZWVkIHRoYXQgdW5hbGlnbmVkIDMyLWJpdAorICAgIC8vIHdyaXRlcyB3aWxsIHdvcmsgd2l0aG91dCBhbnkgcGVyZm9ybWFuY2UgcGVuYWx0eS4uLiBidXQgZG8gaXQKKyAgICAvLyBieXRlLWJ5LWJ5dGUgYW55d2F5LgorICAgIGJ1ZlswXSA9ICh1aW50OF90KSB2YWx1ZTsKKyAgICBidWZbMV0gPSAodWludDhfdCkgKHZhbHVlID4+IDgpOworICAgIGJ1ZlsyXSA9ICh1aW50OF90KSAodmFsdWUgPj4gMTYpOworICAgIGJ1ZlszXSA9ICh1aW50OF90KSAodmFsdWUgPj4gMjQpOworfQorCitzdGF0dXNfdCBGcmFtZU91dHB1dDo6Y3JlYXRlSW5wdXRTdXJmYWNlKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4qIHBCdWZmZXJQcm9kdWNlcikgeworICAgIHN0YXR1c190IGVycjsKKworICAgIGVyciA9IG1FZ2xXaW5kb3cuY3JlYXRlUGJ1ZmZlcih3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIG1FZ2xXaW5kb3cubWFrZUN1cnJlbnQoKTsKKworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworCisgICAgLy8gU2hhZGVyIGZvciByZW5kZXJpbmcgdGhlIGV4dGVybmFsIHRleHR1cmUuCisgICAgZXJyID0gbUV4dFRleFByb2dyYW0uc2V0dXAoUHJvZ3JhbTo6UFJPR1JBTV9FWFRFUk5BTF9URVhUVVJFKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLy8gSW5wdXQgc2lkZSAoYnVmZmVycyBmcm9tIHZpcnR1YWwgZGlzcGxheSkuCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmbUV4dFRleHR1cmVOYW1lKTsKKyAgICBpZiAobUV4dFRleHR1cmVOYW1lID09IDApIHsKKyAgICAgICAgQUxPR0UoImdsR2VuVGV4dHVyZXMgZmFpbGVkOiAlI3giLCBnbEdldEVycm9yKCkpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1HbENvbnN1bWVyID0gbmV3IEdMQ29uc3VtZXIoY29uc3VtZXIsIG1FeHRUZXh0dXJlTmFtZSwKKyAgICAgICAgICAgICAgICBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyk7CisgICAgbUdsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgidmlydHVhbCBkaXNwbGF5IikpOworICAgIG1HbENvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICBtR2xDb25zdW1lci0+c2V0RGVmYXVsdE1heEJ1ZmZlckNvdW50KDUpOworICAgIG1HbENvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpOworCisgICAgbUdsQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisKKyAgICBtUGl4ZWxCdWYgPSBuZXcgdWludDhfdFt3aWR0aCAqIGhlaWdodCAqIGtHbEJ5dGVzUGVyUGl4ZWxdOworCisgICAgKnBCdWZmZXJQcm9kdWNlciA9IHByb2R1Y2VyOworCisgICAgQUxPR0QoIkZyYW1lT3V0cHV0OjpjcmVhdGVJbnB1dFN1cmZhY2UgT0siKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEZyYW1lT3V0cHV0Ojpjb3B5RnJhbWUoRklMRSogZnAsIGxvbmcgdGltZW91dFVzZWMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBBTE9HVigiY29weUZyYW1lICVsZFxuIiwgdGltZW91dFVzZWMpOworCisgICAgaWYgKCFtRnJhbWVBdmFpbGFibGUpIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lb3V0TnNlYyA9IChuc2Vjc190KXRpbWVvdXRVc2VjICogMTAwMDsKKyAgICAgICAgaW50IGNjID0gbUV2ZW50Q29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB0aW1lb3V0TnNlYyk7CisgICAgICAgIGlmIChjYyA9PSAtRVRJTUVET1VUKSB7CisgICAgICAgICAgICBBTE9HVigiY29uZCB3YWl0IHRpbWVkIG91dCIpOworICAgICAgICAgICAgcmV0dXJuIEVUSU1FRE9VVDsKKyAgICAgICAgfSBlbHNlIGlmIChjYyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiY29uZCB3YWl0IHJldHVybmVkIGVycm9yICVkIiwgY2MpOworICAgICAgICAgICAgcmV0dXJuIGNjOworICAgICAgICB9CisgICAgfQorICAgIGlmICghbUZyYW1lQXZhaWxhYmxlKSB7CisgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIEN0cmwtQyBpcyBoaXQuICBBcHBhcmVudGx5IFBPU0lYIHNheXMgdGhhdCB0aGUKKyAgICAgICAgLy8gcHRocmVhZCB3YWl0IGNhbGwgZG9lc24ndCByZXR1cm4gRUlOVFIsIHRyZWF0aW5nIHRoaXMgaW5zdGVhZCBhcworICAgICAgICAvLyBhbiBpbnN0YW5jZSBvZiBhICJzcHVyaW91cyB3YWtldXAiLiAgV2UgZGlkbid0IGdldCBhIGZyYW1lLCBzbworICAgICAgICAvLyB3ZSBqdXN0IHRyZWF0IGl0IGFzIGEgdGltZW91dC4KKyAgICAgICAgcmV0dXJuIEVUSU1FRE9VVDsKKyAgICB9CisKKyAgICAvLyBBIGZyYW1lIGlzIGF2YWlsYWJsZS4gIENsZWFyIHRoZSBmbGFnIGZvciB0aGUgbmV4dCByb3VuZC4KKyAgICBtRnJhbWVBdmFpbGFibGUgPSBmYWxzZTsKKworICAgIGZsb2F0IHRleE1hdHJpeFsxNl07CisgICAgbUdsQ29uc3VtZXItPnVwZGF0ZVRleEltYWdlKCk7CisgICAgbUdsQ29uc3VtZXItPmdldFRyYW5zZm9ybU1hdHJpeCh0ZXhNYXRyaXgpOworCisgICAgLy8gVGhlIGRhdGEgaXMgaW4gYW4gZXh0ZXJuYWwgdGV4dHVyZSwgc28gd2UgbmVlZCB0byByZW5kZXIgaXQgdG8gdGhlCisgICAgLy8gcGJ1ZmZlciB0byBnZXQgYWNjZXNzIHRvIFJHQiBwaXhlbCBkYXRhLiAgV2UgYWxzbyB3YW50IHRvIGZsaXAgaXQKKyAgICAvLyB1cHNpZGUtZG93biBmb3IgZWFzeSBjb252ZXJzaW9uIHRvIGEgYml0bWFwLgorICAgIGludCB3aWR0aCA9IG1FZ2xXaW5kb3cuZ2V0V2lkdGgoKTsKKyAgICBpbnQgaGVpZ2h0ID0gbUVnbFdpbmRvdy5nZXRIZWlnaHQoKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRXh0VGV4UHJvZ3JhbS5ibGl0KG1FeHRUZXh0dXJlTmFtZSwgdGV4TWF0cml4LCAwLCAwLAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIEdMRVMgb25seSBndWFyYW50ZWVzIHRoYXQgZ2xSZWFkUGl4ZWxzKCkgd2lsbCB3b3JrIHdpdGggR0xfUkdCQSwgc28gd2UKKyAgICAvLyBuZWVkIHRvIGdldCA0IGJ5dGVzL3BpeGVsIGFuZCByZWR1Y2UgaXQuICBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlCisgICAgLy8gc2NyZWVuIGFuZCB0aGUgZGV2aWNlIGNhcGFiaWxpdGllcywgdGhpcyBjYW4gdGFrZSBhIHdoaWxlLgorICAgIGludDY0X3Qgc3RhcnRXaGVuTnNlYywgcGl4V2hlbk5zZWMsIGVuZFdoZW5Oc2VjOworICAgIGlmIChrU2hvd1RpbWluZykgeworICAgICAgICBzdGFydFdoZW5Oc2VjID0gc3lzdGVtVGltZShDTE9DS19NT05PVE9OSUMpOworICAgIH0KKyAgICBHTGVudW0gZ2xFcnI7CisgICAgZ2xSZWFkUGl4ZWxzKDAsIDAsIHdpZHRoLCBoZWlnaHQsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIG1QaXhlbEJ1Zik7CisgICAgaWYgKChnbEVyciA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImdsUmVhZFBpeGVscyBmYWlsZWQ6ICUjeCIsIGdsRXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChrU2hvd1RpbWluZykgeworICAgICAgICBwaXhXaGVuTnNlYyA9IHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKTsKKyAgICB9CisgICAgcmVkdWNlUmdiYVRvUmdiKG1QaXhlbEJ1Ziwgd2lkdGggKiBoZWlnaHQpOworICAgIGlmIChrU2hvd1RpbWluZykgeworICAgICAgICBlbmRXaGVuTnNlYyA9IHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKTsKKyAgICAgICAgQUxPR0QoImdvdCBwaXhlbHMgKGdldD0lLjNmIG1zLCByZWR1Y2U9JS4zZm1zKSIsCisgICAgICAgICAgICAgICAgKHBpeFdoZW5Oc2VjIC0gc3RhcnRXaGVuTnNlYykgLyAxMDAwMDAwLjAsCisgICAgICAgICAgICAgICAgKGVuZFdoZW5Oc2VjIC0gcGl4V2hlbk5zZWMpIC8gMTAwMDAwMC4wKTsKKyAgICB9CisKKyAgICAvLyBGaWxsIG91dCB0aGUgaGVhZGVyLgorICAgIHNpemVfdCBoZWFkZXJMZW4gPSBzaXplb2YodWludDMyX3QpICogNTsKKyAgICBzaXplX3QgcmdiRGF0YUxlbiA9IHdpZHRoICogaGVpZ2h0ICoga091dEJ5dGVzUGVyUGl4ZWw7CisgICAgc2l6ZV90IHBhY2tldExlbiA9IGhlYWRlckxlbiAtIHNpemVvZih1aW50MzJfdCkgKyByZ2JEYXRhTGVuOworICAgIHVpbnQ4X3QgaGVhZGVyW2hlYWRlckxlbl07CisgICAgc2V0VmFsdWVMRSgmaGVhZGVyWzBdLCBwYWNrZXRMZW4pOworICAgIHNldFZhbHVlTEUoJmhlYWRlcls0XSwgd2lkdGgpOworICAgIHNldFZhbHVlTEUoJmhlYWRlcls4XSwgaGVpZ2h0KTsKKyAgICBzZXRWYWx1ZUxFKCZoZWFkZXJbMTJdLCB3aWR0aCAqIGtPdXRCeXRlc1BlclBpeGVsKTsKKyAgICBzZXRWYWx1ZUxFKCZoZWFkZXJbMTZdLCBIQUxfUElYRUxfRk9STUFUX1JHQl84ODgpOworCisgICAgLy8gQ3VycmVudGx5IHVzaW5nIGJ1ZmZlcmVkIEkvTyByYXRoZXIgdGhhbiB3cml0ZXYoKS4gIE5vdCBleHBlY3RpbmcgaXQKKyAgICAvLyB0byBtYWtlIG11Y2ggb2YgYSBkaWZmZXJlbmNlLCBidXQgaXQgbWlnaHQgYmUgd29ydGggYSB0ZXN0IGZvciBsYXJnZXIKKyAgICAvLyBmcmFtZSBzaXplcy4KKyAgICBpZiAoa1Nob3dUaW1pbmcpIHsKKyAgICAgICAgc3RhcnRXaGVuTnNlYyA9IHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKTsKKyAgICB9CisgICAgZndyaXRlKGhlYWRlciwgMSwgaGVhZGVyTGVuLCBmcCk7CisgICAgZndyaXRlKG1QaXhlbEJ1ZiwgMSwgcmdiRGF0YUxlbiwgZnApOworICAgIGZmbHVzaChmcCk7CisgICAgaWYgKGtTaG93VGltaW5nKSB7CisgICAgICAgIGVuZFdoZW5Oc2VjID0gc3lzdGVtVGltZShDTE9DS19NT05PVE9OSUMpOworICAgICAgICBBTE9HRCgid3JvdGUgcGl4ZWxzICglLjNmIG1zKSIsCisgICAgICAgICAgICAgICAgKGVuZFdoZW5Oc2VjIC0gc3RhcnRXaGVuTnNlYykgLyAxMDAwMDAwLjApOworICAgIH0KKworICAgIGlmIChmZXJyb3IoZnApKSB7CisgICAgICAgIC8vIGVycm5vIG1heSBub3QgYmUgdXNlZnVsOyBsb2cgaXQgYW55d2F5CisgICAgICAgIEFMT0dFKCJ3cml0ZSBmYWlsZWQgKGVycm5vPSVkKSIsIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEZyYW1lT3V0cHV0OjpyZWR1Y2VSZ2JhVG9SZ2IodWludDhfdCogYnVmLCB1bnNpZ25lZCBpbnQgcGl4ZWxDb3VudCkgeworICAgIC8vIENvbnZlcnQgUkdCQSB0byBSR0IuCisgICAgLy8KKyAgICAvLyBVbmFsaWduZWQgMzItYml0IGFjY2Vzc2VzIGFyZSBhbGxvd2VkIG9uIEFSTSwgc28gd2UgY291bGQgZG8gdGhpcworICAgIC8vIHdpdGggMzItYml0IGNvcGllcyBhZHZhbmNpbmcgYXQgZGlmZmVyZW50IHJhdGVzICh0YWtpbmcgY2FyZSBhdCB0aGUKKyAgICAvLyBlbmQgdG8gbm90IGdvIG9uZSBieXRlIG92ZXIpLgorICAgIGNvbnN0IHVpbnQ4X3QqIHJlYWRQdHIgPSBidWY7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwaXhlbENvdW50OyBpKyspIHsKKyAgICAgICAgKmJ1ZisrID0gKnJlYWRQdHIrKzsKKyAgICAgICAgKmJ1ZisrID0gKnJlYWRQdHIrKzsKKyAgICAgICAgKmJ1ZisrID0gKnJlYWRQdHIrKzsKKyAgICAgICAgcmVhZFB0cisrOworICAgIH0KK30KKworLy8gQ2FsbGJhY2s7IGV4ZWN1dGVzIG9uIGFyYml0cmFyeSB0aHJlYWQuCit2b2lkIEZyYW1lT3V0cHV0OjpvbkZyYW1lQXZhaWxhYmxlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOworICAgIG1GcmFtZUF2YWlsYWJsZSA9IHRydWU7CisgICAgbUV2ZW50Q29uZC5zaWduYWwoKTsKK30KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL0ZyYW1lT3V0cHV0LmggYi9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTQ4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0NSRUVOUkVDT1JEX0ZSQU1FT1VUUFVUX0gKKyNkZWZpbmUgU0NSRUVOUkVDT1JEX0ZSQU1FT1VUUFVUX0gKKworI2luY2x1ZGUgIlByb2dyYW0uaCIKKyNpbmNsdWRlICJFZ2xXaW5kb3cuaCIKKworI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgorI2luY2x1ZGUgPGd1aS9HTENvbnN1bWVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyAqIFN1cHBvcnQgZm9yICJmcmFtZXMiIG91dHB1dCBmb3JtYXQuCisgKi8KK2NsYXNzIEZyYW1lT3V0cHV0IDogcHVibGljIEdMQ29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgeworcHVibGljOgorICAgIEZyYW1lT3V0cHV0KCkgOiBtRnJhbWVBdmFpbGFibGUoZmFsc2UpLAorICAgICAgICBtRXh0VGV4dHVyZU5hbWUoMCksCisgICAgICAgIG1QaXhlbEJ1ZihOVUxMKQorICAgICAgICB7fQorCisgICAgLy8gQ3JlYXRlIGFuICJpbnB1dCBzdXJmYWNlIiwgc2ltaWxhciBpbiBwdXJwb3NlIHRvIGEgTWVkaWFDb2RlYyBpbnB1dAorICAgIC8vIHN1cmZhY2UsIHRoYXQgdGhlIHZpcnR1YWwgZGlzcGxheSBjYW4gc2VuZCBidWZmZXJzIHRvLiAgQWxzbyBjb25maWd1cmVzCisgICAgLy8gRUdMIHdpdGggYSBwYnVmZmVyIHN1cmZhY2Ugb24gdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIHN0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZShpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiogcEJ1ZmZlclByb2R1Y2VyKTsKKworICAgIC8vIENvcHkgb25lIGZyb20gaW5wdXQgdG8gb3V0cHV0LiAgSWYgbm8gZnJhbWUgaXMgYXZhaWxhYmxlLCB0aGlzIHdpbGwgd2FpdCB1cCB0byB0aGUKKyAgICAvLyBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcy4KKyAgICAvLworICAgIC8vIFJldHVybnMgRVRJTUVET1VUIGlmIHRoZSB0aW1lb3V0IGV4cGlyZWQgYmVmb3JlIHdlIGZvdW5kIGEgZnJhbWUuCisgICAgc3RhdHVzX3QgY29weUZyYW1lKEZJTEUqIGZwLCBsb25nIHRpbWVvdXRVc2VjKTsKKworICAgIC8vIFByZXBhcmUgdG8gY29weSBmcmFtZXMuICBNYWtlcyB0aGUgRUdMIGNvbnRleHQgdXNlZCBieSB0aGlzIG9iamVjdCBjdXJyZW50LgorICAgIHZvaWQgcHJlcGFyZVRvQ29weSgpIHsKKyAgICAgICAgbUVnbFdpbmRvdy5tYWtlQ3VycmVudCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGcmFtZU91dHB1dChjb25zdCBGcmFtZU91dHB1dCYpOworICAgIEZyYW1lT3V0cHV0JiBvcGVyYXRvcj0oY29uc3QgRnJhbWVPdXRwdXQmKTsKKworICAgIC8vIERlc3RydWN0aW9uIHZpYSBSZWZCYXNlLgorICAgIHZpcnR1YWwgfkZyYW1lT3V0cHV0KCkgeworICAgICAgICBkZWxldGVbXSBtUGl4ZWxCdWY7CisgICAgfQorCisgICAgLy8gKG92ZXJyaWRlcyBHTENvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIG1ldGhvZCkKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpOworCisgICAgLy8gUmVkdWNlcyBSR0JBIHRvIFJHQiwgaW4gcGxhY2UuCisgICAgc3RhdGljIHZvaWQgcmVkdWNlUmdiYVRvUmdiKHVpbnQ4X3QqIGJ1ZiwgdW5zaWduZWQgaW50IHBpeGVsQ291bnQpOworCisgICAgLy8gUHV0IGEgMzItYml0IHZhbHVlIGludG8gYSBidWZmZXIsIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci4KKyAgICBzdGF0aWMgdm9pZCBzZXRWYWx1ZUxFKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgdmFsdWUpOworCisgICAgLy8gVXNlZCB0byB3YWl0IGZvciB0aGUgRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBjYWxsYmFjay4KKyAgICBNdXRleCBtTXV0ZXg7CisgICAgQ29uZGl0aW9uIG1FdmVudENvbmQ7CisKKyAgICAvLyBTZXQgYnkgdGhlIEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgY2FsbGJhY2suCisgICAgYm9vbCBtRnJhbWVBdmFpbGFibGU7CisKKyAgICAvLyBUaGlzIHJlY2VpdmVzIGZyYW1lcyBmcm9tIHRoZSB2aXJ0dWFsIGRpc3BsYXkgYW5kIG1ha2VzIHRoZW0gYXZhaWxhYmxlCisgICAgLy8gYXMgYW4gZXh0ZXJuYWwgdGV4dHVyZS4KKyAgICBzcDxHTENvbnN1bWVyPiBtR2xDb25zdW1lcjsKKworICAgIC8vIEVHTCBkaXNwbGF5IC8gY29udGV4dCAvIHN1cmZhY2UuCisgICAgRWdsV2luZG93IG1FZ2xXaW5kb3c7CisKKyAgICAvLyBHTCByZW5kZXJpbmcgc3VwcG9ydC4KKyAgICBQcm9ncmFtIG1FeHRUZXhQcm9ncmFtOworCisgICAgLy8gRXh0ZXJuYWwgdGV4dHVyZSwgdXBkYXRlZCBieSBHTENvbnN1bWVyLgorICAgIEdMdWludCBtRXh0VGV4dHVyZU5hbWU7CisKKyAgICAvLyBQaXhlbCBkYXRhIGJ1ZmZlci4KKyAgICB1aW50OF90KiBtUGl4ZWxCdWY7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLypTQ1JFRU5SRUNPUkRfRlJBTUVPVVRQVVRfSCovCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcCBiL2NtZHMvc2NyZWVucmVjb3JkL092ZXJsYXkuY3BwCmluZGV4IDJlOTg4NzQuLjk0ZjU2MGQgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL092ZXJsYXkuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL092ZXJsYXkuY3BwCkBAIC04NCw3ICs4NCw3IEBACiAgICAgYXNzZXJ0KG1TdGF0ZSA9PSBSVU5OSU5HKTsKIAogICAgIEFMT0dWKCJPdmVybGF5OjpzdGFydCBzdWNjZXNzZnVsIik7Ci0gICAgKnBCdWZmZXJQcm9kdWNlciA9IG1CdWZmZXJRdWV1ZTsKKyAgICAqcEJ1ZmZlclByb2R1Y2VyID0gbVByb2R1Y2VyOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMTY5LDggKzE2OSw5IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIG1CdWZmZXJRdWV1ZSA9IG5ldyBCdWZmZXJRdWV1ZSgvKm5ldyBHcmFwaGljQnVmZmVyQWxsb2MoKSovKTsKLSAgICBtR2xDb25zdW1lciA9IG5ldyBHTENvbnN1bWVyKG1CdWZmZXJRdWV1ZSwgbUV4dFRleHR1cmVOYW1lLAorICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1HbENvbnN1bWVyID0gbmV3IEdMQ29uc3VtZXIoY29uc3VtZXIsIG1FeHRUZXh0dXJlTmFtZSwKICAgICAgICAgICAgICAgICBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyk7CiAgICAgbUdsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgidmlydHVhbCBkaXNwbGF5IikpOwogICAgIG1HbENvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKQEAgLTE4Nyw3ICsxODgsNyBAQAogICAgIEFMT0dWKCJPdmVybGF5OjpyZWxlYXNlX2wiKTsKICAgICBtT3V0cHV0U3VyZmFjZS5jbGVhcigpOwogICAgIG1HbENvbnN1bWVyLmNsZWFyKCk7Ci0gICAgbUJ1ZmZlclF1ZXVlLmNsZWFyKCk7CisgICAgbVByb2R1Y2VyLmNsZWFyKCk7CiAKICAgICBtVGV4UHJvZ3JhbS5yZWxlYXNlKCk7CiAgICAgbUV4dFRleFByb2dyYW0ucmVsZWFzZSgpOwpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5oIGIvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5oCmluZGV4IGI4NDczYjQuLmIxYjVjMjkgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL092ZXJsYXkuaAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmgKQEAgLTQ3LDcgKzQ3LDYgQEAKICAgICAgICAgbUxhc3RGcmFtZU51bWJlcigtMSksCiAgICAgICAgIG1Ub3RhbERyb3BwZWRGcmFtZXMoMCkKICAgICAgICAge30KLSAgICB2aXJ0dWFsIH5PdmVybGF5KCkgeyBhc3NlcnQobVN0YXRlID09IFVOSU5JVElBTElaRUQgfHwgbVN0YXRlID09IFNUT1BQRUQpOyB9CiAKICAgICAvLyBDcmVhdGVzIGEgdGhyZWFkIHRoYXQgcGVyZm9ybXMgdGhlIG92ZXJsYXkuICBQYXNzIGluIHRoZSBzdXJmYWNlIHRoYXQKICAgICAvLyBvdXRwdXQgd2lsbCBiZSBzZW50IHRvLgpAQCAtNzEsNiArNzAsOSBAQAogICAgIE92ZXJsYXkoY29uc3QgT3ZlcmxheSYpOwogICAgIE92ZXJsYXkmIG9wZXJhdG9yPShjb25zdCBPdmVybGF5Jik7CiAKKyAgICAvLyBEZXN0cnVjdGlvbiB2aWEgUmVmQmFzZS4KKyAgICB2aXJ0dWFsIH5PdmVybGF5KCkgeyBhc3NlcnQobVN0YXRlID09IFVOSU5JVElBTElaRUQgfHwgbVN0YXRlID09IFNUT1BQRUQpOyB9CisKICAgICAvLyBEcmF3IHRoZSBpbml0aWFsIGluZm8gc2NyZWVuLgogICAgIHN0YXRpYyB2b2lkIGRvRHJhd0luZm9QYWdlKGNvbnN0IEVnbFdpbmRvdyYgd2luZG93LAogICAgICAgICAgICAgY29uc3QgUHJvZ3JhbSYgdGV4UmVuZGVyLCBUZXh0UmVuZGVyZXImIHRleHRSZW5kZXJlcik7CkBAIC0xMjAsOSArMTIyLDkgQEAKICAgICAvLyBzdXJmYWNlLgogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1PdXRwdXRTdXJmYWNlOwogCi0gICAgLy8gT3VyIHF1ZXVlLiAgVGhlIHByb2R1Y2VyIHNpZGUgaXMgcGFzc2VkIHRvIHRoZSB2aXJ0dWFsIGRpc3BsYXksIHRoZQotICAgIC8vIGNvbnN1bWVyIHNpZGUgZmVlZHMgaW50byBvdXIgR0xDb25zdW1lci4KLSAgICBzcDxCdWZmZXJRdWV1ZT4gbUJ1ZmZlclF1ZXVlOworICAgIC8vIFByb2R1Y2VyIHNpZGUgb2YgcXVldWUsIHBhc3NlZCBpbnRvIHRoZSB2aXJ0dWFsIGRpc3BsYXkuCisgICAgLy8gVGhlIGNvbnN1bWVyIGVuZCBmZWVkcyBpbnRvIG91ciBHTENvbnN1bWVyLgorICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKIAogICAgIC8vIFRoaXMgcmVjZWl2ZXMgZnJhbWVzIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheSBhbmQgbWFrZXMgdGhlbSBhdmFpbGFibGUKICAgICAvLyBhcyBhbiBleHRlcm5hbCB0ZXh0dXJlLgpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvUHJvZ3JhbS5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9Qcm9ncmFtLmNwcAppbmRleCBhMTk4MjA0Li43M2NhZTZlIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9Qcm9ncmFtLmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9Qcm9ncmFtLmNwcApAQCAtMjAxLDcgKzIwMSw3IEBACiAKIAogc3RhdHVzX3QgUHJvZ3JhbTo6YmxpdChHTHVpbnQgdGV4TmFtZSwgY29uc3QgZmxvYXQqIHRleE1hdHJpeCwKLSAgICAgICAgaW50MzJfdCB4LCBpbnQzMl90IHksIGludDMyX3QgdywgaW50MzJfdCBoKSBjb25zdCB7CisgICAgICAgIGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHcsIGludDMyX3QgaCwgYm9vbCBpbnZlcnQpIGNvbnN0IHsKICAgICBBTE9HVigiUHJvZ3JhbTo6YmxpdCAlZCB4eT0lZCwlZCB3aD0lZCwlZCIsIHRleE5hbWUsIHgsIHksIHcsIGgpOwogCiAgICAgY29uc3QgZmxvYXQgcG9zW10gPSB7CkBAIC0yMTgsNyArMjE4LDcgQEAKICAgICB9OwogICAgIHN0YXR1c190IGVycjsKIAotICAgIGVyciA9IGJlZm9yZURyYXcodGV4TmFtZSwgdGV4TWF0cml4LCBwb3MsIHV2KTsKKyAgICBlcnIgPSBiZWZvcmVEcmF3KHRleE5hbWUsIHRleE1hdHJpeCwgcG9zLCB1diwgaW52ZXJ0KTsKICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgIGVyciA9IGFmdGVyRHJhdygpOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAKICAgICBzdGF0dXNfdCBlcnI7CiAKLSAgICBlcnIgPSBiZWZvcmVEcmF3KHRleE5hbWUsIHRleE1hdHJpeCwgdmVydGljZXMsIHRleGVzKTsKKyAgICBlcnIgPSBiZWZvcmVEcmF3KHRleE5hbWUsIHRleE1hdHJpeCwgdmVydGljZXMsIHRleGVzLCBmYWxzZSk7CiAgICAgaWYgKGVyciA9PSBOT19FUlJPUikgewogICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBjb3VudCk7CiAgICAgICAgIGVyciA9IGFmdGVyRHJhdygpOwpAQCAtMjQxLDcgKzI0MSw3IEBACiB9CiAKIHN0YXR1c190IFByb2dyYW06OmJlZm9yZURyYXcoR0x1aW50IHRleE5hbWUsIGNvbnN0IGZsb2F0KiB0ZXhNYXRyaXgsCi0gICAgICAgIGNvbnN0IGZsb2F0KiB2ZXJ0aWNlcywgY29uc3QgZmxvYXQqIHRleGVzKSBjb25zdCB7CisgICAgICAgIGNvbnN0IGZsb2F0KiB2ZXJ0aWNlcywgY29uc3QgZmxvYXQqIHRleGVzLCBib29sIGludmVydCkgY29uc3QgewogICAgIC8vIENyZWF0ZSBhbiBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXggYmFzZWQgb24gdmlld3BvcnQgc2l6ZS4KICAgICBHTGludCB2cFs0XTsKICAgICBnbEdldEludGVnZXJ2KEdMX1ZJRVdQT1JULCB2cCk7CkBAIC0yNTEsNiArMjUxLDEwIEBACiAgICAgICAgIDAuMGYsICAgICAgICAgICAgICAgMC4wZiwgICAgICAgICAgICAgICAxLjBmLCAgIDAuMGYsCiAgICAgICAgIC0xLjBmLCAgICAgICAgICAgICAgMS4wZiwgICAgICAgICAgICAgICAwLjBmLCAgIDEuMGYsCiAgICAgfTsKKyAgICBpZiAoaW52ZXJ0KSB7CisgICAgICAgIHNjcmVlblRvTmRjWzVdID0gLXNjcmVlblRvTmRjWzVdOworICAgICAgICBzY3JlZW5Ub05kY1sxM10gPSAtc2NyZWVuVG9OZGNbMTNdOworICAgIH0KIAogICAgIGdsVXNlUHJvZ3JhbShtUHJvZ3JhbSk7CiAKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL1Byb2dyYW0uaCBiL2NtZHMvc2NyZWVucmVjb3JkL1Byb2dyYW0uaAppbmRleCBlNDdiYzBkLi41NThiZThkIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9Qcm9ncmFtLmgKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvUHJvZ3JhbS5oCkBAIC01MSw5ICs1MSwxMSBAQAogICAgIC8vIFJlbGVhc2UgdGhlIHByb2dyYW0gYW5kIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgogICAgIHZvaWQgcmVsZWFzZSgpOwogCi0gICAgLy8gQmxpdCB0aGUgc3BlY2lmaWVkIHRleHR1cmUgdG8geyB4LCB5LCB4K3csIHkraCB9LgorICAgIC8vIEJsaXQgdGhlIHNwZWNpZmllZCB0ZXh0dXJlIHRvIHsgeCwgeSwgeCt3LCB5K2ggfS4gIEludmVydHMgdGhlCisgICAgLy8gY29udGVudCBpZiAiaW52ZXJ0IiBpcyBzZXQuCiAgICAgc3RhdHVzX3QgYmxpdChHTHVpbnQgdGV4TmFtZSwgY29uc3QgZmxvYXQqIHRleE1hdHJpeCwKLSAgICAgICAgICAgIGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHcsIGludDMyX3QgaCkgY29uc3Q7CisgICAgICAgICAgICBpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB3LCBpbnQzMl90IGgsCisgICAgICAgICAgICBib29sIGludmVydCA9IGZhbHNlKSBjb25zdDsKIAogICAgIC8vIERyYXcgYSBudW1iZXIgb2YgdHJpYW5nbGVzLgogICAgIHN0YXR1c190IGRyYXdUcmlhbmdsZXMoR0x1aW50IHRleE5hbWUsIGNvbnN0IGZsb2F0KiB0ZXhNYXRyaXgsCkBAIC02Nyw3ICs2OSw3IEBACiAKICAgICAvLyBDb21tb24gY29kZSBmb3IgZHJhdyBmdW5jdGlvbnMuCiAgICAgc3RhdHVzX3QgYmVmb3JlRHJhdyhHTHVpbnQgdGV4TmFtZSwgY29uc3QgZmxvYXQqIHRleE1hdHJpeCwKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB2ZXJ0aWNlcywgY29uc3QgZmxvYXQqIHRleGVzKSBjb25zdDsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB2ZXJ0aWNlcywgY29uc3QgZmxvYXQqIHRleGVzLCBib29sIGludmVydCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgYWZ0ZXJEcmF3KCkgY29uc3Q7CiAKICAgICAvLyBHTEVTIDIgc2hhZGVyIHV0aWxpdGllcy4KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IDYxZjgzZTMuLmExN2ZjNTEgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtNDUsMTAgKzQ1LDEyIEBACiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpbmNsdWRlICJzY3JlZW5yZWNvcmQuaCIKICNpbmNsdWRlICJPdmVybGF5LmgiCisjaW5jbHVkZSAiRnJhbWVPdXRwdXQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTU3LDEwICs1OSwxNCBAQAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhUaW1lTGltaXRTZWMgPSAxODA7ICAgICAgIC8vIDMgbWludXRlcwogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtGYWxsYmFja1dpZHRoID0gMTI4MDsgICAgICAgIC8vIDcyMHAKIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRmFsbGJhY2tIZWlnaHQgPSA3MjA7CitzdGF0aWMgY29uc3QgY2hhcioga01pbWVUeXBlQXZjID0gInZpZGVvL2F2YyI7CiAKIC8vIENvbW1hbmQtbGluZSBwYXJhbWV0ZXJzLgogc3RhdGljIGJvb2wgZ1ZlcmJvc2UgPSBmYWxzZTsgICAgICAgICAgIC8vIGNoYXR0eSBvbiBzdGRvdXQKIHN0YXRpYyBib29sIGdSb3RhdGUgPSBmYWxzZTsgICAgICAgICAgICAvLyByb3RhdGUgOTAgZGVncmVlcworc3RhdGljIGVudW0geworICAgIEZPUk1BVF9NUDQsIEZPUk1BVF9IMjY0LCBGT1JNQVRfRlJBTUVTCit9IGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfTVA0OyAgICAgICAgICAgLy8gZGF0YSBmb3JtYXQgZm9yIG91dHB1dAogc3RhdGljIGJvb2wgZ1NpemVTcGVjaWZpZWQgPSBmYWxzZTsgICAgIC8vIHdhcyBzaXplIGV4cGxpY2l0bHkgcmVxdWVzdGVkPwogc3RhdGljIGJvb2wgZ1dhbnRJbmZvU2NyZWVuID0gZmFsc2U7ICAgIC8vIGRvIHdlIHdhbnQgaW5pdGlhbCBpbmZvIHNjcmVlbj8KIHN0YXRpYyBib29sIGdXYW50RnJhbWVUaW1lID0gZmFsc2U7ICAgICAvLyBkbyB3ZSB3YW50IHRpbWVzIG9uIGVhY2ggZnJhbWU/CkBAIC0xNDAsMTQgKzE0NiwxNCBAQAogICAgIHN0YXR1c190IGVycjsKIAogICAgIGlmIChnVmVyYm9zZSkgewotICAgICAgICBwcmludGYoIkNvbmZpZ3VyaW5nIHJlY29yZGVyIGZvciAlZHglZCB2aWRlbyBhdCAlLjJmTWJwc1xuIiwKLSAgICAgICAgICAgICAgICBnVmlkZW9XaWR0aCwgZ1ZpZGVvSGVpZ2h0LCBnQml0UmF0ZSAvIDEwMDAwMDAuMCk7CisgICAgICAgIHByaW50ZigiQ29uZmlndXJpbmcgcmVjb3JkZXIgZm9yICVkeCVkICVzIGF0ICUuMmZNYnBzXG4iLAorICAgICAgICAgICAgICAgIGdWaWRlb1dpZHRoLCBnVmlkZW9IZWlnaHQsIGtNaW1lVHlwZUF2YywgZ0JpdFJhdGUgLyAxMDAwMDAwLjApOwogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7CiAgICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCBnVmlkZW9XaWR0aCk7CiAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgZ1ZpZGVvSGVpZ2h0KTsKLSAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsICJ2aWRlby9hdmMiKTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIGtNaW1lVHlwZUF2Yyk7CiAgICAgZm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpOwogICAgIGZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCBnQml0UmF0ZSk7CiAgICAgZm9ybWF0LT5zZXRGbG9hdCgiZnJhbWUtcmF0ZSIsIGRpc3BsYXlGcHMpOwpAQCAtMTU3LDE2ICsxNjMsMTggQEAKICAgICBsb29wZXItPnNldE5hbWUoInNjcmVlbnJlY29yZF9sb29wZXIiKTsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAgICAgQUxPR1YoIkNyZWF0aW5nIGNvZGVjIik7Ci0gICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUobG9vcGVyLCAidmlkZW8vYXZjIiwgdHJ1ZSk7CisgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUobG9vcGVyLCBrTWltZVR5cGVBdmMsIHRydWUpOwogICAgIGlmIChjb2RlYyA9PSBOVUxMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBjcmVhdGUgdmlkZW8vYXZjIGNvZGVjIGluc3RhbmNlXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIGNyZWF0ZSAlcyBjb2RlYyBpbnN0YW5jZVxuIiwKKyAgICAgICAgICAgICAgICBrTWltZVR5cGVBdmMpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKICAgICBlcnIgPSBjb2RlYy0+Y29uZmlndXJlKGZvcm1hdCwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgIE1lZGlhQ29kZWM6OkNPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CiAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gY29uZmlndXJlIGNvZGVjIChlcnI9JWQpXG4iLCBlcnIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gY29uZmlndXJlICVzIGNvZGVjIGF0ICVkeCVkIChlcnI9JWQpXG4iLAorICAgICAgICAgICAgICAgIGtNaW1lVHlwZUF2YywgZ1ZpZGVvV2lkdGgsIGdWaWRlb0hlaWdodCwgZXJyKTsKICAgICAgICAgY29kZWMtPnJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC0yOTgsMTAgKzMwNiwxMiBAQAogICogaW5wdXQgZnJhbWVzIGFyZSBjb21pbmcgZnJvbSB0aGUgdmlydHVhbCBkaXNwbGF5IGFzIGZhc3QgYXMgU3VyZmFjZUZsaW5nZXIKICAqIHdhbnRzIHRvIHNlbmQgdGhlbS4KICAqCisgKiBFeGFjdGx5IG9uZSBvZiBtdXhlciBvciByYXdGcCBtdXN0IGJlIG5vbi1udWxsLgorICoKICAqIFRoZSBtdXhlciBtdXN0ICpub3QqIGhhdmUgYmVlbiBzdGFydGVkIGJlZm9yZSBjYWxsaW5nLgogICovCiBzdGF0aWMgc3RhdHVzX3QgcnVuRW5jb2Rlcihjb25zdCBzcDxNZWRpYUNvZGVjPiYgZW5jb2RlciwKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFNdXhlcj4mIG11eGVyLCBjb25zdCBzcDxJQmluZGVyPiYgbWFpbkRweSwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFNdXhlcj4mIG11eGVyLCBGSUxFKiByYXdGcCwgY29uc3Qgc3A8SUJpbmRlcj4mIG1haW5EcHksCiAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiB2aXJ0dWFsRHB5LCB1aW50OF90IG9yaWVudGF0aW9uKSB7CiAgICAgc3RhdGljIGludCBrVGltZW91dCA9IDI1MDAwMDsgICAvLyBiZSByZXNwb25zaXZlIG9uIHNpZ25hbAogICAgIHN0YXR1c190IGVycjsKQEAgLTMxMSw2ICszMjEsOCBAQAogICAgIGludDY0X3QgZW5kV2hlbk5zZWMgPSBzdGFydFdoZW5Oc2VjICsgc2Vjb25kc190b19uYW5vc2Vjb25kcyhnVGltZUxpbWl0U2VjKTsKICAgICBEaXNwbGF5SW5mbyBtYWluRHB5SW5mbzsKIAorICAgIGFzc2VydCgocmF3RnAgPT0gTlVMTCAmJiBtdXhlciAhPSBOVUxMKSB8fCAocmF3RnAgIT0gTlVMTCAmJiBtdXhlciA9PSBOVUxMKSk7CisKICAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBidWZmZXJzOwogICAgIGVyciA9IGVuY29kZXItPmdldE91dHB1dEJ1ZmZlcnMoJmJ1ZmZlcnMpOwogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKQEAgLTM0MiwxNSArMzU0LDE2IEBACiAgICAgICAgIGNhc2UgTk9fRVJST1I6CiAgICAgICAgICAgICAvLyBnb3QgYSBidWZmZXIKICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIC0tIHdlIHBhc3NlZCB0aGUgQ1NEIGludG8gTWVkaWFNdXhlciB3aGVuCi0gICAgICAgICAgICAgICAgLy8gd2UgZ290IHRoZSBmb3JtYXQgY2hhbmdlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgIEFMT0dWKCJHb3QgY29kZWMgY29uZmlnIGJ1ZmZlciAoJXUgYnl0ZXMpOyBpZ25vcmluZyIsIHNpemUpOwotICAgICAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICAgICAgICAgIEFMT0dWKCJHb3QgY29kZWMgY29uZmlnIGJ1ZmZlciAoJXUgYnl0ZXMpIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKG11eGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgLS0gd2UgcGFzc2VkIHRoZSBDU0QgaW50byBNZWRpYU11eGVyIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZ290IHRoZSBmb3JtYXQgY2hhbmdlIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc2l6ZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBkYXRhIGluIGJ1ZmZlciAlZCwgc2l6ZT0lZCwgcHRzPSVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgYnVmSW5kZXgsIHNpemUsIHB0c1VzZWMpOwotICAgICAgICAgICAgICAgIGFzc2VydCh0cmFja0lkeCAhPSAtMSk7CiAKICAgICAgICAgICAgICAgICB7IC8vIHNjb3BlCiAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJvcmllbnRhdGlvbiIpOwpAQCAtMzc5LDE0ICszOTIsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgcHRzVXNlYyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSAvIDEwMDA7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gVGhlIE1lZGlhTXV4ZXIgZG9jcyBhcmUgdW5jbGVhciwgYnV0IGl0IGFwcGVhcnMgdGhhdCB3ZQotICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcGFzcyBlaXRoZXIgdGhlIGZ1bGwgc2V0IG9mIEJ1ZmZlckluZm8gZmxhZ3MsIG9yCi0gICAgICAgICAgICAgICAgLy8gKGZsYWdzICYgQlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FKS4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgYmxvY2tzIGZvciB0b28gbG9uZyB3ZSBjb3VsZCBkcm9wIGZyYW1lcy4gIFdlIG1heQotICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gcXVldWUgdGhlc2UgdXAgYW5kIGRvIHRoZW0gb24gYSBkaWZmZXJlbnQgdGhyZWFkLgotICAgICAgICAgICAgICAgIHsgLy8gc2NvcGUKKyAgICAgICAgICAgICAgICBpZiAobXV4ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmd3JpdGUoYnVmZmVyc1tidWZJbmRleF0tPmRhdGEoKSwgMSwgc2l6ZSwgcmF3RnApOworICAgICAgICAgICAgICAgICAgICAvLyBGbHVzaCB0aGUgZGF0YSBpbW1lZGlhdGVseSBpbiBjYXNlIHdlJ3JlIHN0cmVhbWluZy4KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGlmIGFsbCB3ZSd2ZSB3cml0dGVuIGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBTUFMvUFBTIGRhdGEgYmVjYXVzZSBtcGxheWVyIGdldHMgY29uZnVzZWQuCisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHJhd0ZwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBNZWRpYU11eGVyIGRvY3MgYXJlIHVuY2xlYXIsIGJ1dCBpdCBhcHBlYXJzIHRoYXQgd2UKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBwYXNzIGVpdGhlciB0aGUgZnVsbCBzZXQgb2YgQnVmZmVySW5mbyBmbGFncywgb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gKGZsYWdzICYgQlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FKS4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBibG9ja3MgZm9yIHRvbyBsb25nIHdlIGNvdWxkIGRyb3AgZnJhbWVzLiAgV2UgbWF5CisgICAgICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gcXVldWUgdGhlc2UgdXAgYW5kIGRvIHRoZW0gb24gYSBkaWZmZXJlbnQgdGhyZWFkLgogICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgid3JpdGUgc2FtcGxlIik7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh0cmFja0lkeCAhPSAtMSk7CiAgICAgICAgICAgICAgICAgICAgIGVyciA9IG11eGVyLT53cml0ZVNhbXBsZURhdGEoYnVmZmVyc1tidWZJbmRleF0sIHRyYWNrSWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0c1VzZWMsIGZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewpAQCAtNDE4LDEyICs0NDAsMTQgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiRW5jb2RlciBmb3JtYXQgY2hhbmdlZCIpOwogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBuZXdGb3JtYXQ7CiAgICAgICAgICAgICAgICAgZW5jb2Rlci0+Z2V0T3V0cHV0Rm9ybWF0KCZuZXdGb3JtYXQpOwotICAgICAgICAgICAgICAgIHRyYWNrSWR4ID0gbXV4ZXItPmFkZFRyYWNrKG5ld0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlN0YXJ0aW5nIG11eGVyIik7Ci0gICAgICAgICAgICAgICAgZXJyID0gbXV4ZXItPnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBtdXhlciAoZXJyPSVkKVxuIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICBpZiAobXV4ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB0cmFja0lkeCA9IG11eGVyLT5hZGRUcmFjayhuZXdGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiU3RhcnRpbmcgbXV4ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbXV4ZXItPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IG11eGVyIChlcnI9JWQpXG4iLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDU3LDcgKzQ4MSw0NSBAQAogfQogCiAvKgotICogTWFpbiAiZG8gd29yayIgbWV0aG9kLgorICogUmF3IEguMjY0IGJ5dGUgc3RyZWFtIG91dHB1dCByZXF1ZXN0ZWQuICBTZW5kIHRoZSBvdXRwdXQgdG8gc3Rkb3V0CisgKiBpZiBkZXNpcmVkLiAgSWYgdGhlIG91dHB1dCBpcyBhIHR0eSwgcmVjb25maWd1cmUgaXQgdG8gYXZvaWQgdGhlCisgKiBDUkxGIGxpbmUgdGVybWluYXRpb24gdGhhdCB3ZSBzZWUgd2l0aCAiYWRiIHNoZWxsIiBjb21tYW5kcy4KKyAqLworc3RhdGljIEZJTEUqIHByZXBhcmVSYXdPdXRwdXQoY29uc3QgY2hhciogZmlsZU5hbWUpIHsKKyAgICBGSUxFKiByYXdGcCA9IE5VTEw7CisKKyAgICBpZiAoc3RyY21wKGZpbGVOYW1lLCAiLSIpID09IDApIHsKKyAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB2ZXJib3NlIG91dHB1dCBhbmQgJy0nIG5vdCBjb21wYXRpYmxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByYXdGcCA9IHN0ZG91dDsKKyAgICB9IGVsc2UgeworICAgICAgICByYXdGcCA9IGZvcGVuKGZpbGVOYW1lLCAidyIpOworICAgICAgICBpZiAocmF3RnAgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmb3BlbiByYXcgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGZkID0gZmlsZW5vKHJhd0ZwKTsKKyAgICBpZiAoaXNhdHR5KGZkKSkgeworICAgICAgICAvLyBiZXN0IGVmZm9ydCAtLSByZWNvbmZpZ3VyZSB0dHkgZm9yICJyYXciCisgICAgICAgIEFMT0dEKCJyYXcgdmlkZW8gb3V0cHV0IHRvIHR0eSAoZmQ9JWQpIiwgZmQpOworICAgICAgICBzdHJ1Y3QgdGVybWlvcyB0ZXJtOworICAgICAgICBpZiAodGNnZXRhdHRyKGZkLCAmdGVybSkgPT0gMCkgeworICAgICAgICAgICAgY2ZtYWtlcmF3KCZ0ZXJtKTsKKyAgICAgICAgICAgIGlmICh0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZ0ZXJtKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInR0eSBzdWNjZXNzZnVsbHkgY29uZmlndXJlZCBmb3IgcmF3Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmF3RnA7Cit9CisKKy8qCisgKiBNYWluICJkbyB3b3JrIiBzdGFydCBwb2ludC4KICAqCiAgKiBDb25maWd1cmVzIGNvZGVjLCBtdXhlciwgYW5kIHZpcnR1YWwgZGlzcGxheSwgdGhlbiBzdGFydHMgbW92aW5nIGJpdHMKICAqIGFyb3VuZC4KQEAgLTQ5OSwzMCArNTYxLDQwIEBACiAKICAgICAvLyBDb25maWd1cmUgYW5kIHN0YXJ0IHRoZSBlbmNvZGVyLgogICAgIHNwPE1lZGlhQ29kZWM+IGVuY29kZXI7CisgICAgc3A8RnJhbWVPdXRwdXQ+IGZyYW1lT3V0cHV0OwogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGVuY29kZXJJbnB1dFN1cmZhY2U7Ci0gICAgZXJyID0gcHJlcGFyZUVuY29kZXIobWFpbkRweUluZm8uZnBzLCAmZW5jb2RlciwgJmVuY29kZXJJbnB1dFN1cmZhY2UpOworICAgIGlmIChnT3V0cHV0Rm9ybWF0ICE9IEZPUk1BVF9GUkFNRVMpIHsKKyAgICAgICAgZXJyID0gcHJlcGFyZUVuY29kZXIobWFpbkRweUluZm8uZnBzLCAmZW5jb2RlciwgJmVuY29kZXJJbnB1dFN1cmZhY2UpOwogCi0gICAgaWYgKGVyciAhPSBOT19FUlJPUiAmJiAhZ1NpemVTcGVjaWZpZWQpIHsKLSAgICAgICAgLy8gZmFsbGJhY2sgaXMgZGVmaW5lZCBmb3IgbGFuZHNjYXBlOyBzd2FwIGlmIHdlJ3JlIGluIHBvcnRyYWl0Ci0gICAgICAgIGJvb2wgbmVlZFN3YXAgPSBnVmlkZW9XaWR0aCA8IGdWaWRlb0hlaWdodDsKLSAgICAgICAgdWludDMyX3QgbmV3V2lkdGggPSBuZWVkU3dhcCA/IGtGYWxsYmFja0hlaWdodCA6IGtGYWxsYmFja1dpZHRoOwotICAgICAgICB1aW50MzJfdCBuZXdIZWlnaHQgPSBuZWVkU3dhcCA/IGtGYWxsYmFja1dpZHRoIDoga0ZhbGxiYWNrSGVpZ2h0OwotICAgICAgICBpZiAoZ1ZpZGVvV2lkdGggIT0gbmV3V2lkdGggJiYgZ1ZpZGVvSGVpZ2h0ICE9IG5ld0hlaWdodCkgewotICAgICAgICAgICAgQUxPR1YoIlJldHJ5aW5nIHdpdGggNzIwcCIpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBmYWlsZWQgYXQgJWR4JWQsIHJldHJ5aW5nIGF0ICVkeCVkXG4iLAotICAgICAgICAgICAgICAgICAgICBnVmlkZW9XaWR0aCwgZ1ZpZGVvSGVpZ2h0LCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKLSAgICAgICAgICAgIGdWaWRlb1dpZHRoID0gbmV3V2lkdGg7Ci0gICAgICAgICAgICBnVmlkZW9IZWlnaHQgPSBuZXdIZWlnaHQ7Ci0gICAgICAgICAgICBlcnIgPSBwcmVwYXJlRW5jb2RlcihtYWluRHB5SW5mby5mcHMsICZlbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAmZW5jb2RlcklucHV0U3VyZmFjZSk7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IgJiYgIWdTaXplU3BlY2lmaWVkKSB7CisgICAgICAgICAgICAvLyBmYWxsYmFjayBpcyBkZWZpbmVkIGZvciBsYW5kc2NhcGU7IHN3YXAgaWYgd2UncmUgaW4gcG9ydHJhaXQKKyAgICAgICAgICAgIGJvb2wgbmVlZFN3YXAgPSBnVmlkZW9XaWR0aCA8IGdWaWRlb0hlaWdodDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld1dpZHRoID0gbmVlZFN3YXAgPyBrRmFsbGJhY2tIZWlnaHQgOiBrRmFsbGJhY2tXaWR0aDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld0hlaWdodCA9IG5lZWRTd2FwID8ga0ZhbGxiYWNrV2lkdGggOiBrRmFsbGJhY2tIZWlnaHQ7CisgICAgICAgICAgICBpZiAoZ1ZpZGVvV2lkdGggIT0gbmV3V2lkdGggJiYgZ1ZpZGVvSGVpZ2h0ICE9IG5ld0hlaWdodCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJSZXRyeWluZyB3aXRoIDcyMHAiKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IGZhaWxlZCBhdCAlZHglZCwgcmV0cnlpbmcgYXQgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBnVmlkZW9XaWR0aCwgZ1ZpZGVvSGVpZ2h0LCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBnVmlkZW9XaWR0aCA9IG5ld1dpZHRoOworICAgICAgICAgICAgICAgIGdWaWRlb0hlaWdodCA9IG5ld0hlaWdodDsKKyAgICAgICAgICAgICAgICBlcnIgPSBwcmVwYXJlRW5jb2RlcihtYWluRHB5SW5mby5mcHMsICZlbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kZXJJbnB1dFN1cmZhY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHJldHVybiBlcnI7CisKKyAgICAgICAgLy8gRnJvbSBoZXJlIG9uLCB3ZSBtdXN0IGV4cGxpY2l0bHkgcmVsZWFzZSgpIHRoZSBlbmNvZGVyIGJlZm9yZSBpdCBnb2VzCisgICAgICAgIC8vIG91dCBvZiBzY29wZSwgb3Igd2Ugd2lsbCBnZXQgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgZnJvbSBzdGFnZWZyaWdodAorICAgICAgICAvLyBsYXRlciBvbiBpbiBhIGRpZmZlcmVudCB0aHJlYWQuCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UncmUgbm90IHVzaW5nIGFuIGVuY29kZXIgYXQgYWxsLiAgVGhlICJlbmNvZGVyIGlucHV0IHN1cmZhY2UiIHdlIGhhbmQgdG8KKyAgICAgICAgLy8gU3VyZmFjZUZsaW5nZXIgd2lsbCBqdXN0IGZlZWQgZGlyZWN0bHkgdG8gdXMuCisgICAgICAgIGZyYW1lT3V0cHV0ID0gbmV3IEZyYW1lT3V0cHV0KCk7CisgICAgICAgIGVyciA9IGZyYW1lT3V0cHV0LT5jcmVhdGVJbnB1dFN1cmZhY2UoZ1ZpZGVvV2lkdGgsIGdWaWRlb0hlaWdodCwgJmVuY29kZXJJbnB1dFN1cmZhY2UpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHJldHVybiBlcnI7Ci0KLSAgICAvLyBGcm9tIGhlcmUgb24sIHdlIG11c3QgZXhwbGljaXRseSByZWxlYXNlKCkgdGhlIGVuY29kZXIgYmVmb3JlIGl0IGdvZXMKLSAgICAvLyBvdXQgb2Ygc2NvcGUsIG9yIHdlIHdpbGwgZ2V0IGFuIGFzc2VydGlvbiBmYWlsdXJlIGZyb20gc3RhZ2VmcmlnaHQKLSAgICAvLyBsYXRlciBvbiBpbiBhIGRpZmZlcmVudCB0aHJlYWQuCi0KIAogICAgIC8vIERyYXcgdGhlICJpbmZvIiBwYWdlIGJ5IHJlbmRlcmluZyBhIGZyYW1lIHdpdGggR0xFUyBhbmQgc2VuZGluZwogICAgIC8vIGl0IGRpcmVjdGx5IHRvIHRoZSBlbmNvZGVyLgpAQCAtNTM5LDcgKzYxMSw3IEBACiAgICAgICAgIG92ZXJsYXkgPSBuZXcgT3ZlcmxheSgpOwogICAgICAgICBlcnIgPSBvdmVybGF5LT5zdGFydChlbmNvZGVySW5wdXRTdXJmYWNlLCAmYnVmZmVyUHJvZHVjZXIpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBlbmNvZGVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBpZiAoZW5jb2RlciAhPSBOVUxMKSBlbmNvZGVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIGlmIChnVmVyYm9zZSkgewpAQCAtNTU0LDQwICs2MjYsOTEgQEAKICAgICBzcDxJQmluZGVyPiBkcHk7CiAgICAgZXJyID0gcHJlcGFyZVZpcnR1YWxEaXNwbGF5KG1haW5EcHlJbmZvLCBidWZmZXJQcm9kdWNlciwgJmRweSk7CiAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBlbmNvZGVyLT5yZWxlYXNlKCk7CisgICAgICAgIGlmIChlbmNvZGVyICE9IE5VTEwpIGVuY29kZXItPnJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICAvLyBDb25maWd1cmUgbXV4ZXIuICBXZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBDU0QgYmxvYiBmcm9tIHRoZSBlbmNvZGVyCi0gICAgLy8gYmVmb3JlIHdlIGNhbiBzdGFydCBpdC4KLSAgICBzcDxNZWRpYU11eGVyPiBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZpbGVOYW1lLAotICAgICAgICAgICAgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOwotICAgIGlmIChnUm90YXRlKSB7Ci0gICAgICAgIG11eGVyLT5zZXRPcmllbnRhdGlvbkhpbnQoOTApOyAgLy8gVE9ETzogZG9lcyB0aGlzIGRvIGFueXRoaW5nPworICAgIHNwPE1lZGlhTXV4ZXI+IG11eGVyID0gTlVMTDsKKyAgICBGSUxFKiByYXdGcCA9IE5VTEw7CisgICAgc3dpdGNoIChnT3V0cHV0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgRk9STUFUX01QNDogeworICAgICAgICAgICAgLy8gQ29uZmlndXJlIG11eGVyLiAgV2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgQ1NEIGJsb2IgZnJvbSB0aGUgZW5jb2RlcgorICAgICAgICAgICAgLy8gYmVmb3JlIHdlIGNhbiBzdGFydCBpdC4KKyAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmlsZU5hbWUsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfTVBFR180KTsKKyAgICAgICAgICAgIGlmIChnUm90YXRlKSB7CisgICAgICAgICAgICAgICAgbXV4ZXItPnNldE9yaWVudGF0aW9uSGludCg5MCk7ICAvLyBUT0RPOiBkb2VzIHRoaXMgZG8gYW55dGhpbmc/CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPUk1BVF9IMjY0OgorICAgICAgICBjYXNlIEZPUk1BVF9GUkFNRVM6IHsKKyAgICAgICAgICAgIHJhd0ZwID0gcHJlcGFyZVJhd091dHB1dChmaWxlTmFtZSk7CisgICAgICAgICAgICBpZiAocmF3RnAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChlbmNvZGVyICE9IE5VTEwpIGVuY29kZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5rbm93biBmb3JtYXQgJWRcbiIsIGdPdXRwdXRGb3JtYXQpOworICAgICAgICAgICAgYWJvcnQoKTsKICAgICB9CiAKLSAgICAvLyBNYWluIGVuY29kZXIgbG9vcC4KLSAgICBlcnIgPSBydW5FbmNvZGVyKGVuY29kZXIsIG11eGVyLCBtYWluRHB5LCBkcHksIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRW5jb2RlciBmYWlsZWQgKGVycj0lZClcbiIsIGVycik7Ci0gICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBjbGVhbnVwCi0gICAgfQorICAgIGlmIChnT3V0cHV0Rm9ybWF0ID09IEZPUk1BVF9GUkFNRVMpIHsKKyAgICAgICAgLy8gVE9ETzogaWYgd2Ugd2FudCB0byBtYWtlIHRoaXMgYSBwcm9wZXIgZmVhdHVyZSwgd2Ugc2hvdWxkIG91dHB1dAorICAgICAgICAvLyAgICAgICBhbiBvdXRlciBoZWFkZXIgd2l0aCB2ZXJzaW9uIGluZm8uICBSaWdodCBub3cgd2UgbmV2ZXIgY2hhbmdlCisgICAgICAgIC8vICAgICAgIHRoZSBmcmFtZSBzaXplIG9yIGZvcm1hdCwgc28gd2UgY291bGQgY29uY2VpdmFibHkganVzdCBzZW5kCisgICAgICAgIC8vICAgICAgIHRoZSBjdXJyZW50IGZyYW1lIGhlYWRlciBvbmNlIGFuZCB0aGVuIGZvbGxvdyBpdCB3aXRoIGFuCisgICAgICAgIC8vICAgICAgIHVuYnJva2VuIHN0cmVhbSBvZiBkYXRhLgogCi0gICAgaWYgKGdWZXJib3NlKSB7Ci0gICAgICAgIHByaW50ZigiU3RvcHBpbmcgZW5jb2RlciBhbmQgbXV4ZXJcbiIpOworICAgICAgICAvLyBNYWtlIHRoZSBFR0wgY29udGV4dCBjdXJyZW50IGFnYWluLiAgVGhpcyBnZXRzIHVuaG9va2VkIGlmIHdlJ3JlCisgICAgICAgIC8vIHVzaW5nICItLWJ1Z3JlcG9ydCIgbW9kZS4KKyAgICAgICAgLy8gVE9ETzogZmlndXJlIG91dCBpZiB3ZSBjYW4gZWxpbWluYXRlIHRoaXMKKyAgICAgICAgZnJhbWVPdXRwdXQtPnByZXBhcmVUb0NvcHkoKTsKKworICAgICAgICB3aGlsZSAoIWdTdG9wUmVxdWVzdGVkKSB7CisgICAgICAgICAgICAvLyBQb2xsIGZvciBmcmFtZXMsIHRoZSBzYW1lIHdheSB3ZSBkbyBmb3IgTWVkaWFDb2RlYy4gIFdlIGRvCisgICAgICAgICAgICAvLyBhbGwgb2YgdGhlIHdvcmsgb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElkZWFsbHkgd2UnZCBzbGVlcCBpbmRlZmluaXRlbHkgYW5kIHdha2Ugd2hlbiB0aGUKKyAgICAgICAgICAgIC8vIHN0b3Agd2FzIHJlcXVlc3RlZCwgYnV0IHRoaXMgd2lsbCBkbyBmb3Igbm93LiAgKEl0IGFsbW9zdAorICAgICAgICAgICAgLy8gd29ya3MgYmVjYXVzZSB3YWl0KCkgd2FrZXMgd2hlbiBhIHNpZ25hbCBoaXRzLCBidXQgd2UKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gaGFuZGxlIHRoZSBlZGdlIGNhc2VzLikKKyAgICAgICAgICAgIGVyciA9IGZyYW1lT3V0cHV0LT5jb3B5RnJhbWUocmF3RnAsIDI1MDAwMCk7CisgICAgICAgICAgICBpZiAoZXJyID09IEVUSU1FRE9VVCkgeworICAgICAgICAgICAgICAgIGVyciA9IE5PX0VSUk9SOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiR290IGVycm9yICVkIGZyb20gY29weUZyYW1lKCkiLCBlcnIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTWFpbiBlbmNvZGVyIGxvb3AuCisgICAgICAgIGVyciA9IHJ1bkVuY29kZXIoZW5jb2RlciwgbXV4ZXIsIHJhd0ZwLCBtYWluRHB5LCBkcHksCisgICAgICAgICAgICAgICAgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVuY29kZXIgZmFpbGVkIChlcnI9JWQpXG4iLCBlcnIpOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIGNsZWFudXAKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgcHJpbnRmKCJTdG9wcGluZyBlbmNvZGVyIGFuZCBtdXhlclxuIik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBTaHV0IGV2ZXJ5dGhpbmcgZG93biwgc3RhcnRpbmcgd2l0aCB0aGUgcHJvZHVjZXIgc2lkZS4KICAgICBlbmNvZGVySW5wdXRTdXJmYWNlID0gTlVMTDsKICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmRlc3Ryb3lEaXNwbGF5KGRweSk7Ci0gICAgaWYgKG92ZXJsYXkgIT0gTlVMTCkgewotICAgICAgICBvdmVybGF5LT5zdG9wKCk7CisgICAgaWYgKG92ZXJsYXkgIT0gTlVMTCkgb3ZlcmxheS0+c3RvcCgpOworICAgIGlmIChlbmNvZGVyICE9IE5VTEwpIGVuY29kZXItPnN0b3AoKTsKKyAgICBpZiAobXV4ZXIgIT0gTlVMTCkgeworICAgICAgICAvLyBJZiB3ZSBkb24ndCBzdG9wIG11eGVyIGV4cGxpY2l0bHksIGkuZS4gbGV0IHRoZSBkZXN0cnVjdG9yIHJ1biwKKyAgICAgICAgLy8gaXQgbWF5IGhhbmcgKGIvMTEwNTA2MjgpLgorICAgICAgICBtdXhlci0+c3RvcCgpOworICAgIH0gZWxzZSBpZiAocmF3RnAgIT0gc3Rkb3V0KSB7CisgICAgICAgIGZjbG9zZShyYXdGcCk7CiAgICAgfQotICAgIGVuY29kZXItPnN0b3AoKTsKLSAgICAvLyBJZiB3ZSBkb24ndCBzdG9wIG11eGVyIGV4cGxpY2l0bHksIGkuZS4gbGV0IHRoZSBkZXN0cnVjdG9yIHJ1biwKLSAgICAvLyBpdCBtYXkgaGFuZyAoYi8xMTA1MDYyOCkuCi0gICAgbXV4ZXItPnN0b3AoKTsKLSAgICBlbmNvZGVyLT5yZWxlYXNlKCk7CisgICAgaWYgKGVuY29kZXIgIT0gTlVMTCkgZW5jb2Rlci0+cmVsZWFzZSgpOwogCiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTc0OSwxMCArODcyLDEyIEBACiAgICAgICAgIHsgInNpemUiLCAgICAgICAgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAgTlVMTCwgJ3MnIH0sCiAgICAgICAgIHsgImJpdC1yYXRlIiwgICAgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAgTlVMTCwgJ2InIH0sCiAgICAgICAgIHsgInRpbWUtbGltaXQiLCAgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAgTlVMTCwgJ3QnIH0sCisgICAgICAgIHsgImJ1Z3JlcG9ydCIsICAgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ3UnIH0sCisgICAgICAgIC8vICJ1bm9mZmljaWFsIiBvcHRpb25zCiAgICAgICAgIHsgInNob3ctZGV2aWNlLWluZm8iLCAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ2knIH0sCiAgICAgICAgIHsgInNob3ctZnJhbWUtdGltZSIsICAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ2YnIH0sCi0gICAgICAgIHsgImJ1Z3JlcG9ydCIsICAgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ3UnIH0sCiAgICAgICAgIHsgInJvdGF0ZSIsICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ3InIH0sCisgICAgICAgIHsgIm91dHB1dC1mb3JtYXQiLCAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAgTlVMTCwgJ28nIH0sCiAgICAgICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgTlVMTCwgMCB9CiAgICAgfTsKIApAQCAtODA0LDIwICs5MjksMzIgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgIGdXYW50SW5mb1NjcmVlbiA9IHRydWU7CisgICAgICAgICAgICBnV2FudEZyYW1lVGltZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnaSc6CiAgICAgICAgICAgICBnV2FudEluZm9TY3JlZW4gPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ2YnOgogICAgICAgICAgICAgZ1dhbnRGcmFtZVRpbWUgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3UnOgotICAgICAgICAgICAgZ1dhbnRJbmZvU2NyZWVuID0gdHJ1ZTsKLSAgICAgICAgICAgIGdXYW50RnJhbWVUaW1lID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgIC8vIGV4cGVyaW1lbnRhbCBmZWF0dXJlCiAgICAgICAgICAgICBnUm90YXRlID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIGlmIChzdHJjbXAob3B0YXJnLCAibXA0IikgPT0gMCkgeworICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfTVA0OworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiaDI2NCIpID09IDApIHsKKyAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX0gyNjQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJmcmFtZXMiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9GUkFNRVM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBmb3JtYXQgJyVzJ1xuIiwgb3B0YXJnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKGljICE9ICc/JykgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0b3B0X2xvbmcgcmV0dXJuZWQgdW5leHBlY3RlZCB2YWx1ZSAweCV4XG4iLCBpYyk7CkBAIC04MzEsMTcgKzk2OCwxOSBAQAogICAgICAgICByZXR1cm4gMjsKICAgICB9CiAKLSAgICAvLyBNZWRpYU11eGVyIHRyaWVzIHRvIGNyZWF0ZSB0aGUgZmlsZSBpbiB0aGUgY29uc3RydWN0b3IsIGJ1dCB3ZSBkb24ndAotICAgIC8vIGxlYXJuIGFib3V0IHRoZSBmYWlsdXJlIHVudGlsIG11eGVyLnN0YXJ0KCksIHdoaWNoIHJldHVybnMgYSBnZW5lcmljCi0gICAgLy8gZXJyb3IgY29kZSB3aXRob3V0IGxvZ2dpbmcgYW55dGhpbmcuICBXZSBhdHRlbXB0IHRvIGNyZWF0ZSB0aGUgZmlsZQotICAgIC8vIG5vdyBmb3IgYmV0dGVyIGRpYWdub3N0aWNzLgogICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lID0gYXJndltvcHRpbmRdOwotICAgIGludCBmZCA9IG9wZW4oZmlsZU5hbWUsIE9fQ1JFQVQgfCBPX1JEV1IsIDA2NDQpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiAnJXMnOiAlc1xuIiwgZmlsZU5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAxOworICAgIGlmIChnT3V0cHV0Rm9ybWF0ID09IEZPUk1BVF9NUDQpIHsKKyAgICAgICAgLy8gTWVkaWFNdXhlciB0cmllcyB0byBjcmVhdGUgdGhlIGZpbGUgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbGVhcm4gYWJvdXQgdGhlIGZhaWx1cmUgdW50aWwgbXV4ZXIuc3RhcnQoKSwgd2hpY2ggcmV0dXJucyBhIGdlbmVyaWMKKyAgICAgICAgLy8gZXJyb3IgY29kZSB3aXRob3V0IGxvZ2dpbmcgYW55dGhpbmcuICBXZSBhdHRlbXB0IHRvIGNyZWF0ZSB0aGUgZmlsZQorICAgICAgICAvLyBub3cgZm9yIGJldHRlciBkaWFnbm9zdGljcy4KKyAgICAgICAgaW50IGZkID0gb3BlbihmaWxlTmFtZSwgT19DUkVBVCB8IE9fUkRXUiwgMDY0NCk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gJyVzJzogJXNcbiIsIGZpbGVOYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UoZmQpOwogICAgIH0KLSAgICBjbG9zZShmZCk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSByZWNvcmRTY3JlZW4oZmlsZU5hbWUpOwogICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5oIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmgKaW5kZXggOTVlOGE2OC4uOWIwNThjMiAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmgKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmgKQEAgLTE4LDYgKzE4LDYgQEAKICNkZWZpbmUgU0NSRUVOUkVDT1JEX1NDUkVFTlJFQ09SRF9ICiAKICNkZWZpbmUga1ZlcnNpb25NYWpvciAxCi0jZGVmaW5lIGtWZXJzaW9uTWlub3IgMQorI2RlZmluZSBrVmVyc2lvbk1pbm9yIDIKIAogI2VuZGlmIC8qU0NSRUVOUkVDT1JEX1NDUkVFTlJFQ09SRF9IKi8KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcAppbmRleCA1ZDJkNzIxLi4xYjJmNzkyIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yNzUsNyArMjc2LDggQEAKIAogICAgIG1FeHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKIAotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobVBhdGguY19zdHIoKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1QYXRoLmNfc3RyKCkpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRXh0cmFjdG9yLmNsZWFyKCk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmNwcAppbmRleCAxNGI0MzA2Li41ODcwNzdhIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFNpbmVTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IFNpbmVTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwpAQCAtNTgsNyArNTgsNyBAQAogfQogCiBzdGF0dXNfdCBTaW5lU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKaW5kZXggZDEyNWFkMS4uZmQwMmJjYyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNzYsNyArNzcsNyBAQAogICAgIHN0YXRpYyBpbnQ2NF90IGtUaW1lb3V0ID0gNTAwbGw7CiAKICAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKLSAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKHBhdGgpICE9IE9LKSB7CisgICAgaWYgKGV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBwYXRoKSAhPSBPSykgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBpbnN0YW50aWF0ZSBleHRyYWN0b3IuXG4iKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9tdXhlci5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L211eGVyLmNwcAppbmRleCA5MGRhZWEyLi5mNGEzM2U4IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L211eGVyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L211eGVyLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KQEAgLTU5LDcgKzYwLDcgQEAKICAgICAgICAgaW50IHRyaW1FbmRUaW1lTXMsCiAgICAgICAgIGludCByb3RhdGlvbkRlZ3JlZXMpIHsKICAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKLSAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKHBhdGgpICE9IE9LKSB7CisgICAgaWYgKGV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBwYXRoKSAhPSBPSykgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBpbnN0YW50aWF0ZSBleHRyYWN0b3IuICVzXG4iLCBwYXRoKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCmluZGV4IGI3YTQwYzIuLmZkYzM1MmUgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKQEAgLTI5Niw3ICsyOTYsNyBAQAogfQogI2Vsc2UKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CitpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhciAqKiAvKiBhcmd2ICovKSB7CiAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCiAgICAgT01YQ2xpZW50IGNsaWVudDsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcAppbmRleCBiMmI5Y2U1Li4zYzBjN2VjIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3NmMi5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwCkBAIC0xOSw4ICsxOSwxMiBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxzaWduYWwuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNDMsNiArNDcsMTggQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKK3ZvbGF0aWxlIHN0YXRpYyBib29sIGN0cmxjID0gZmFsc2U7CisKK3N0YXRpYyBzaWdoYW5kbGVyX3Qgb2xkaGFuZGxlciA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIG15c2lnaGFuZGxlcihpbnQgc2lnbnVtKSB7CisgICAgaWYgKHNpZ251bSA9PSBTSUdJTlQpIHsKKyAgICAgICAgY3RybGMgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG9sZGhhbmRsZXIoc2lnbnVtKTsKK30KKwogc3RydWN0IENvbnRyb2xsZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIENvbnRyb2xsZXIoY29uc3QgY2hhciAqdXJpLCBib29sIGRlY29kZUF1ZGlvLAogICAgICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsIGJvb2wgcmVuZGVyVG9TdXJmYWNlKQpAQCAtNjMsNyArNzksMzAgQEAKICAgICB2aXJ0dWFsIH5Db250cm9sbGVyKCkgewogICAgIH0KIAorICAgIHZpcnR1YWwgdm9pZCBwcmludFN0YXRpc3RpY3MoKSB7CisgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBtU3RhcnRUaW1lVXM7CisKKyAgICAgICAgaWYgKG1EZWNvZGVBdWRpbykgeworICAgICAgICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIiBieXRlcyByZWNlaXZlZC4gJS4yZiBLQi9zZWNcbiIsCisgICAgICAgICAgICBtVG90YWxCeXRlc1JlY2VpdmVkLAorICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCAqIDFFNiAvIDEwMjQgLyBkZWxheVVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJWQgZnJhbWVzIGRlY29kZWQsICUuMmYgZnBzLiAlIiBQUklkNjQgIiBieXRlcyAiCisgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlZC4gJS4yZiBLQi9zZWNcbiIsCisgICAgICAgICAgICBtTnVtT3V0cHV0QnVmZmVyc1JlY2VpdmVkLAorICAgICAgICAgICAgbU51bU91dHB1dEJ1ZmZlcnNSZWNlaXZlZCAqIDFFNiAvIGRlbGF5VXMsCisgICAgICAgICAgICBtVG90YWxCeXRlc1JlY2VpdmVkLAorICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCAqIDFFNiAvIDEwMjQgLyBkZWxheVVzKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgICAgICBpZiAoY3RybGMpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIHByaW50U3RhdGlzdGljcygpOworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgY3RybGMgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CiAgICAgICAgICAgICB7CkBAIC03Niw3ICsxMTUsOCBAQAogI2VuZGlmCiAKICAgICAgICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtVVJJLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1VUkkuY19zdHIoKSk7CiAKICAgICAgICAgICAgICAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0KICAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShkYXRhU291cmNlKTsKQEAgLTk5LDcgKzEzOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobVNvdXJjZSAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50Zigibm8gJXMgdHJhY2sgZm91bmRcbiIsIG1EZWNvZGVBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVNvdXJjZS0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKIApAQCAtMTgxLDIxICsyMjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCh3aGF0ID09IEFDb2RlYzo6a1doYXRFT1MpID8gIiRcbiIgOiAiRVxuIik7CiAKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIG1TdGFydFRpbWVVczsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobURlY29kZUF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiIGJ5dGVzIHJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCeXRlc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJSIgUFJJZDY0ICIgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlZC4gJS4yZiBLQi9zZWNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bU91dHB1dEJ1ZmZlcnNSZWNlaXZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtT3V0cHV0QnVmZmVyc1JlY2VpdmVkICogMUU2IC8gZGVsYXlVcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCeXRlc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgICAgICAgICBwcmludFN0YXRpc3RpY3MoKTsKICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIGlkKCkpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbVNlZWtTdGF0ZSA9IFNFRUtfRkxVU0hfQ09NUExFVEVEOwpAQCAtNjM5LDYgKzY2OCw4IEBACiAKICAgICBsb29wZXItPnJlZ2lzdGVySGFuZGxlcihjb250cm9sbGVyKTsKIAorICAgIHNpZ25hbChTSUdJTlQsIG15c2lnaGFuZGxlcik7CisKICAgICBjb250cm9sbGVyLT5zdGFydEFzeW5jKCk7CiAKICAgICBDSEVDS19FUShsb29wZXItPnN0YXJ0KHRydWUgLyogcnVuT25DYWxsaW5nVGhyZWFkICovKSwgKHN0YXR1c190KU9LKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKaW5kZXggYWIyYzU0Yi4uYjcwYWZlNiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKQEAgLTkzOCw5ICs5MzksMTEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIENIRUNLKHVzZVN1cmZhY2VUZXhBbGxvYyk7CiAKLSAgICAgICAgICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgICAgICAgICAgc3A8R0xDb25zdW1lcj4gdGV4dHVyZSA9IG5ldyBHTENvbnN1bWVyKGJxLCAwIC8qIHRleCAqLyk7Ci0gICAgICAgICAgICBnU3VyZmFjZSA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICAgICAgc3A8R0xDb25zdW1lcj4gdGV4dHVyZSA9IG5ldyBHTENvbnN1bWVyKGNvbnN1bWVyLCAwIC8qIHRleCAqLyk7CisgICAgICAgICAgICBnU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKICAgICAgICAgfQogCiAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywKQEAgLTk1OCw3ICs5NjEsOCBAQAogCiAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYXJndltrXTsKIAotICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShmaWxlbmFtZSk7CisgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQorICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlbmFtZSk7CiAKICAgICAgICAgaWYgKHN0cm5jYXNlY21wKGZpbGVuYW1lLCAic2luZToiLCA1KSAmJiBkYXRhU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZS5cbiIpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCmluZGV4IGRiYTY3YTkuLjA1NjZkMTQgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMTU5LDcgKzE2MCw5IEBACiBNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2U6Ok15Q29udmVydGluZ1N0cmVhbVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSkKICAgICA6IG1DdXJyZW50QnVmZmVySW5kZXgoLTEpLAogICAgICAgbUN1cnJlbnRCdWZmZXJPZmZzZXQoMCkgewotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKGZpbGVuYW1lKTsKKyAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KKyAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlbmFtZSk7CisKICAgICBDSEVDSyhkYXRhU291cmNlICE9IE5VTEwpOwogCiAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7CkBAIC0zNzEsNyArMzc0LDcgQEAKICAgICB9CiAKICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllciA9Ci0gICAgICAgIHNlcnZpY2UtPmNyZWF0ZShjbGllbnQsIDApOworICAgICAgICBzZXJ2aWNlLT5jcmVhdGUoY2xpZW50LCBBVURJT19TRVNTSU9OX0FMTE9DQVRFKTsKIAogICAgIGlmIChwbGF5ZXIgIT0gTlVMTCAmJiBwbGF5ZXItPnNldERhdGFTb3VyY2Uoc291cmNlKSA9PSBOT19FUlJPUikgewogICAgICAgICBwbGF5ZXItPnNldFZpZGVvU3VyZmFjZVRleHR1cmUoc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDIzNGFlZjIuLmY0MDA3MzIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtMzE2LDYgKzMxNiw3IEBACiAKICAgICBpZiAoLTEgPCBmaWxlRGVzYykgewogICAgICAgICBpZiAoRndkTG9ja0ZpbGVfYXR0YWNoKGZpbGVEZXNjKSA8IDApIHsKKyAgICAgICAgICAgIGNsb3NlKGZpbGVEZXNjKTsKICAgICAgICAgICAgIHJldHVybiBtaW1lU3RyaW5nOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IGNoYXIqIHBNaW1lVHlwZSA9IEZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGZpbGVEZXNjKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGFkODEyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkFfUEFSQU1FVEVSUzJfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQV9QQVJBTUVURVJTMl9ICi0KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSAiQ2FtZXJhUGFyYW1ldGVycy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKgotICogQSBjb3B5IG9mIENhbWVyYVBhcmFtZXRlcnMgcGx1cyBBQkktYnJlYWtpbmcgY2hhbmdlcy4gTmVlZGVkCi0gKiBiZWNhdXNlIHNvbWUgY2FtZXJhIEhBTHMgZGlyZWN0bHkgbGluayB0byBDYW1lcmFQYXJhbWV0ZXJzIGFuZCBjYW5ub3QKLSAqIHRvbGVyYXRlIGFuIEFCSSBjaGFuZ2UuCi0gKi8KLWNsYXNzIENhbWVyYVBhcmFtZXRlcnMyCi17Ci1wdWJsaWM6Ci0gICAgQ2FtZXJhUGFyYW1ldGVyczIoKTsKLSAgICBDYW1lcmFQYXJhbWV0ZXJzMihjb25zdCBTdHJpbmc4ICZwYXJhbXMpIHsgdW5mbGF0dGVuKHBhcmFtcyk7IH0KLSAgICB+Q2FtZXJhUGFyYW1ldGVyczIoKTsKLQotICAgIFN0cmluZzggZmxhdHRlbigpIGNvbnN0OwotICAgIHZvaWQgdW5mbGF0dGVuKGNvbnN0IFN0cmluZzggJnBhcmFtcyk7Ci0KLSAgICB2b2lkIHNldChjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKLSAgICB2b2lkIHNldChjb25zdCBjaGFyICprZXksIGludCB2YWx1ZSk7Ci0gICAgdm9pZCBzZXRGbG9hdChjb25zdCBjaGFyICprZXksIGZsb2F0IHZhbHVlKTsKLSAgICAvLyBMb29rIHVwIHN0cmluZyB2YWx1ZSBieSBrZXkuCi0gICAgLy8gLS0gVGhlIHN0cmluZyByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBuZXh0IHNldC9yZW1vdmUgb2YgdGhlIHNhbWUga2V5LAotICAgIC8vICAgIG9yIHVudGlsIHRoZSBtYXAgZ2V0cyBjbGVhcmVkLgotICAgIGNvbnN0IGNoYXIgKmdldChjb25zdCBjaGFyICprZXkpIGNvbnN0OwotICAgIGludCBnZXRJbnQoY29uc3QgY2hhciAqa2V5KSBjb25zdDsKLSAgICBmbG9hdCBnZXRGbG9hdChjb25zdCBjaGFyICprZXkpIGNvbnN0OwotCi0gICAgLy8gQ29tcGFyZSB0aGUgb3JkZXIgdGhhdCBrZXkxIHdhcyBzZXQgdnMgdGhlIG9yZGVyIHRoYXQga2V5MiB3YXMgc2V0LgotICAgIC8vCi0gICAgLy8gU2V0cyB0aGUgb3JkZXIgcGFyYW1ldGVyIHRvIGFuIGludGVnZXIgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlcgotICAgIC8vIHRoYW4gemVybyBpZiBrZXkxJ3Mgc2V0IG9yZGVyIHdhcyByZXNwZWN0aXZlbHksIHRvIGJlIGxlc3MgdGhhbiwgdG8KLSAgICAvLyBtYXRjaCwgb3IgdG8gYmUgZ3JlYXRlciB0aGFuIGtleTIncyBzZXQgb3JkZXIuCi0gICAgLy8KLSAgICAvLyBFcnJvciBjb2RlczoKLSAgICAvLyAgKiBOQU1FX05PVF9GT1VORCAtIGlmIGVpdGhlciBrZXkgaGFzIG5vdCBiZWVuIHNldCBwcmV2aW91c2x5Ci0gICAgLy8gICogQkFEX1ZBTFVFIC0gaWYgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSBOVUxMCi0gICAgc3RhdHVzX3QgY29tcGFyZVNldE9yZGVyKGNvbnN0IGNoYXIgKmtleTEsIGNvbnN0IGNoYXIgKmtleTIsCi0gICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICBpbnQgKm9yZGVyKSBjb25zdDsKLQotICAgIHZvaWQgcmVtb3ZlKGNvbnN0IGNoYXIgKmtleSk7Ci0KLSAgICB2b2lkIHNldFByZXZpZXdTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgdm9pZCBnZXRQcmV2aWV3U2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3Q7Ci0gICAgdm9pZCBnZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoVmVjdG9yPFNpemU+ICZzaXplcykgY29uc3Q7Ci0KLSAgICAvLyBTZXQgdGhlIGRpbWVuc2lvbnMgaW4gcGl4ZWxzIHRvIHRoZSBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0Ci0gICAgLy8gZm9yIHZpZGVvIGZyYW1lcy4gVGhlIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBvbmUKLSAgICAvLyBvZiB0aGUgc3VwcG9ydGVkIGRpbWVuc2lvbnMgcmV0dXJuZWQgZnJvbQotICAgIC8vIGdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKS4gTXVzdCBub3QgYmUgY2FsbGVkIGlmCi0gICAgLy8gZ2V0U3VwcG9ydGVkVmlkZW9TaXplcygpIHJldHVybnMgYW4gZW1wdHkgVmVjdG9yIG9mIFNpemUuCi0gICAgdm9pZCBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCBkaW1lbnNpb25zICh3aWR0aCBhbmQgaGVpZ2h0KQotICAgIC8vIGluIHBpeGVscyBmb3IgdmlkZW8gZnJhbWVzLCB3aGljaCBtdXN0IGJlIG9uZSBvZiB0aGUKLSAgICAvLyBzdXBwb3J0ZWQgZGltZW5zaW9ucyByZXR1cm5lZCBmcm9tIGdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKS4KLSAgICAvLyBNdXN0IG5vdCBiZSBjYWxsZWQgaWYgZ2V0U3VwcG9ydGVkVmlkZW9TaXplcygpIHJldHVybnMgYW4KLSAgICAvLyBlbXB0eSBWZWN0b3Igb2YgU2l6ZS4KLSAgICB2b2lkIGdldFZpZGVvU2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3Q7Ci0gICAgLy8gUmV0cmlldmUgYSBWZWN0b3Igb2Ygc3VwcG9ydGVkIGRpbWVuc2lvbnMgKHdpZHRoIGFuZCBoZWlnaHQpCi0gICAgLy8gaW4gcGl4ZWxzIGZvciB2aWRlbyBmcmFtZXMuIElmIHNpemVzIHJldHVybmVkIGZyb20gdGhlIG1ldGhvZAotICAgIC8vIGlzIGVtcHR5LCB0aGUgY2FtZXJhIGRvZXMgbm90IHN1cHBvcnQgY2FsbHMgdG8gc2V0VmlkZW9TaXplKCkKLSAgICAvLyBvciBnZXRWaWRlb1NpemUoKS4gSW4gYWRkZGl0aW9uLCBpdCBhbHNvIGluZGljYXRlcyB0aGF0Ci0gICAgLy8gdGhlIGNhbWVyYSBvbmx5IGhhcyBhIHNpbmdsZSBvdXRwdXQsIGFuZCBkb2VzIG5vdCBoYXZlCi0gICAgLy8gc2VwYXJhdGUgb3V0cHV0IGZvciB2aWRlbyBmcmFtZXMgYW5kIHByZXZpZXcgZnJhbWUuCi0gICAgdm9pZCBnZXRTdXBwb3J0ZWRWaWRlb1NpemVzKFZlY3RvcjxTaXplPiAmc2l6ZXMpIGNvbnN0OwotICAgIC8vIFJldHJpZXZlIHRoZSBwcmVmZXJyZWQgcHJldmlldyBzaXplICh3aWR0aCBhbmQgaGVpZ2h0KSBpbiBwaXhlbHMKLSAgICAvLyBmb3IgdmlkZW8gcmVjb3JkaW5nLiBUaGUgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIG9uZSBvZgotICAgIC8vIHN1cHBvcnRlZCBwcmV2aWV3IHNpemVzIHJldHVybmVkIGZyb20gZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKCkuCi0gICAgLy8gTXVzdCBub3QgYmUgY2FsbGVkIGlmIGdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKSByZXR1cm5zIGFuIGVtcHR5Ci0gICAgLy8gVmVjdG9yIG9mIFNpemUuIElmIGdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKSByZXR1cm5zIGFuIGVtcHR5Ci0gICAgLy8gVmVjdG9yIG9mIFNpemUsIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLSAgICAvLyBpcyBpbnZhbGlkLCBhbmQgaXMgIi0xeC0xIi4KLSAgICB2b2lkIGdldFByZWZlcnJlZFByZXZpZXdTaXplRm9yVmlkZW8oaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRQcmV2aWV3RnJhbWVSYXRlKGludCBmcHMpOwotICAgIGludCBnZXRQcmV2aWV3RnJhbWVSYXRlKCkgY29uc3Q7Ci0gICAgdm9pZCBnZXRQcmV2aWV3RnBzUmFuZ2UoaW50ICptaW5fZnBzLCBpbnQgKm1heF9mcHMpIGNvbnN0OwotICAgIHZvaWQgc2V0UHJldmlld0Zwc1JhbmdlKGludCBtaW5fZnBzLCBpbnQgbWF4X2Zwcyk7Ci0gICAgdm9pZCBzZXRQcmV2aWV3Rm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCk7Ci0gICAgY29uc3QgY2hhciAqZ2V0UHJldmlld0Zvcm1hdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0UGljdHVyZVNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICB2b2lkIGdldFBpY3R1cmVTaXplKGludCAqd2lkdGgsIGludCAqaGVpZ2h0KSBjb25zdDsKLSAgICB2b2lkIGdldFN1cHBvcnRlZFBpY3R1cmVTaXplcyhWZWN0b3I8U2l6ZT4gJnNpemVzKSBjb25zdDsKLSAgICB2b2lkIHNldFBpY3R1cmVGb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KTsKLSAgICBjb25zdCBjaGFyICpnZXRQaWN0dXJlRm9ybWF0KCkgY29uc3Q7Ci0KLSAgICB2b2lkIGR1bXAoKSBjb25zdDsKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7Ci0KLXByaXZhdGU6Ci0KLSAgICAvLyBRdWljayBhbmQgZGlydHkgbWFwIHRoYXQgbWFpbnRhaW5zIGluc2VydGlvbiBvcmRlcgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQ+Ci0gICAgc3RydWN0IE9yZGVyZWRLZXllZFZlY3RvciB7Ci0KLSAgICAgICAgc3NpemVfdCBhZGQoY29uc3QgS2V5VCYga2V5LCBjb25zdCBWYWx1ZVQmIHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUxpc3QuYWRkKFBhaXIoa2V5LCB2YWx1ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gbUxpc3Quc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgS2V5VCYga2V5QXQoc2l6ZV90IGlkeCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIG1MaXN0W2lkeF0ubUtleTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IFZhbHVlVCYgdmFsdWVBdChzaXplX3QgaWR4KSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gbUxpc3RbaWR4XS5tVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBWYWx1ZVQmIHZhbHVlRm9yKGNvbnN0IEtleVQmIGtleSkgY29uc3QgewotICAgICAgICAgICAgc3NpemVfdCBpID0gaW5kZXhPZktleShrZXkpOwotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpPDAsICIlczoga2V5IG5vdCBmb3VuZCIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotCi0gICAgICAgICAgICByZXR1cm4gdmFsdWVBdChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3QgaW5kZXhPZktleShjb25zdCBLZXlUJiBrZXkpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICBzaXplX3QgdmVjdG9ySWR4ID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKDsgdmVjdG9ySWR4IDwgbUxpc3Quc2l6ZSgpOyArK3ZlY3RvcklkeCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUxpc3RbdmVjdG9ySWR4XS5tS2V5ID09IGtleSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzc2l6ZV90KSB2ZWN0b3JJZHg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IHJlbW92ZUl0ZW0oY29uc3QgS2V5VCYga2V5KSB7Ci0gICAgICAgICAgICBzaXplX3QgdmVjdG9ySWR4ID0gKHNpemVfdCkgaW5kZXhPZktleShrZXkpOwotCi0gICAgICAgICAgICBpZiAodmVjdG9ySWR4IDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB2ZWN0b3JJZHg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtTGlzdC5yZW1vdmVBdCh2ZWN0b3JJZHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIG1MaXN0LmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTYW1lIGFzIHJlbW92aW5nIGFuZCByZS1hZGRpbmcuIFRoZSBrZXkncyBpbmRleCBjaGFuZ2VzIHRvIG1heC4KLSAgICAgICAgc3NpemVfdCByZXBsYWNlVmFsdWVGb3IoY29uc3QgS2V5VCYga2V5LCBjb25zdCBWYWx1ZVQmIHZhbHVlKSB7Ci0gICAgICAgICAgICByZW1vdmVJdGVtKGtleSk7Ci0gICAgICAgICAgICByZXR1cm4gYWRkKGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgIHN0cnVjdCBQYWlyIHsKLSAgICAgICAgICAgIFBhaXIoKSA6IG1LZXkoKSwgbVZhbHVlKCkge30KLSAgICAgICAgICAgIFBhaXIoY29uc3QgS2V5VCYga2V5LCBjb25zdCBWYWx1ZVQmIHZhbHVlKSA6Ci0gICAgICAgICAgICAgICAgICAgIG1LZXkoa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgbVZhbHVlKHZhbHVlKSB7fQotICAgICAgICAgICAgS2V5VCAgIG1LZXk7Ci0gICAgICAgICAgICBWYWx1ZVQgbVZhbHVlOwotICAgICAgICB9OwotCi0gICAgICAgIFZlY3RvcjxQYWlyPiBtTGlzdDsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogT3JkZXIgbWF0dGVyczogS2V5cyB0aGF0IGFyZSBzZXQoKSBsYXRlciBhcmUgc3RvcmVkIGxhdGVyIGluIHRoZSBtYXAuCi0gICAgICoKLSAgICAgKiBJZiB0d28ga2V5cyBoYXZlIG1lYW5pbmcgdGhhdCBjb25mbGljdCwgdGhlbiB0aGUgbGF0ZXItc2V0IGtleQotICAgICAqIHdpbnMuCi0gICAgICoKLSAgICAgKiBGb3IgZXhhbXBsZSwgcHJldmlldyBGUFMgYW5kIHByZXZpZXcgRlBTIHJhbmdlIGNvbmZsaWN0IHNpbmNlIG9ubHkKLSAgICAgKiB3ZSBvbmx5IHdhbnQgdG8gdXNlIHRoZSBGUFMgcmFuZ2UgaWYgdGhhdCdzIHRoZSBsYXN0IHRoaW5nIHRoYXQgd2FzIHNldC4KLSAgICAgKiBTbyBpbiB0aGF0IGNhc2UsIG9ubHkgdXNlIHByZXZpZXcgRlBTIHJhbmdlIGlmIGl0IHdhcyBzZXQgbGF0ZXIgdGhhbgotICAgICAqIHRoZSBwcmV2aWV3IEZQUy4KLSAgICAgKi8KLSAgICBPcmRlcmVkS2V5ZWRWZWN0b3I8U3RyaW5nOCxTdHJpbmc4PiAgICBtTWFwOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmggYi9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0N2ExNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhcHR1cmVSZXN1bHQuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBUFRVUkVSRVNVTFRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBUFRVUkVSRVNVTFRfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ2FwdHVyZVJlc3VsdEV4dHJhcyBpcyBhIHN0cnVjdHVyZSB0byBlbmNhcHN1bGF0ZSB2YXJpb3VzIGluZGljZXMgZm9yIGEgY2FwdHVyZSByZXN1bHQuCisgKiBUaGVzZSBpbmRpY2VzIGFyZSBmcmFtZXdvcmstaW50ZXJuYWwgYW5kIG5vdCBzZW50IHRvIHRoZSBIQUwuCisgKi8KK3N0cnVjdCBDYXB0dXJlUmVzdWx0RXh0cmFzIHsKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlZ2VyIHRvIGluZGV4IHRoZSByZXF1ZXN0IHNlcXVlbmNlIHRoYXQgdGhpcyByZXN1bHQgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBpbnQzMl90IHJlcXVlc3RJZDsKKworICAgIC8qKgorICAgICAqIEFuIGludGVnZXIgdG8gaW5kZXggdGhpcyByZXN1bHQgaW5zaWRlIGEgcmVxdWVzdCBzZXF1ZW5jZSwgc3RhcnRpbmcgZnJvbSAwLgorICAgICAqLworICAgIGludDMyX3QgYnVyc3RJZDsKKworICAgIC8qKgorICAgICAqIFRPRE86IEFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGZpZWxkLgorICAgICAqLworICAgIGludDMyX3QgYWZUcmlnZ2VySWQ7CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IHByZWNhcHR1cmVUcmlnZ2VySWQ7CisKKyAgICAvKioKKyAgICAgKiBBIDY0Yml0IGludGVnZXIgdG8gaW5kZXggdGhlIGZyYW1lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXN1bHQuCisgICAgICovCisgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGluaXRpYWxpemVzIG9iamVjdCBhcyBpbnZhbGlkIGJ5IHNldHRpbmcgcmVxdWVzdElkIHRvIGJlIC0xLgorICAgICAqLworICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKQorICAgICAgICA6IHJlcXVlc3RJZCgtMSksCisgICAgICAgICAgYnVyc3RJZCgwKSwKKyAgICAgICAgICBhZlRyaWdnZXJJZCgwKSwKKyAgICAgICAgICBwcmVjYXB0dXJlVHJpZ2dlcklkKDApLAorICAgICAgICAgIGZyYW1lTnVtYmVyKDApIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBpdCdzIGEgdmFsaWQgQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLiBJdCBpcyB2YWxpZCBvbmx5IHdoZW4gcmVxdWVzdElkIGlzIG5vbi1uZWdhdGl2ZS4KKyAgICAgKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCogcGFyY2VsKTsKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdDsKK307CisKK3N0cnVjdCBDYXB0dXJlUmVzdWx0IDogcHVibGljIHZpcnR1YWwgTGlnaHRSZWZCYXNlPENhcHR1cmVSZXN1bHQ+IHsKKyAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICBtTWV0YWRhdGE7CisgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAgICAgbVJlc3VsdEV4dHJhczsKKworICAgIENhcHR1cmVSZXN1bHQoKTsKKworICAgIENhcHR1cmVSZXN1bHQoY29uc3QgQ2FwdHVyZVJlc3VsdCYgb3RoZXJSZXN1bHQpOworCisgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgcmVhZEZyb21QYXJjZWwoUGFyY2VsKiBwYXJjZWwpOworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworfTsKKworfQorCisjZW5kaWYgLyogQU5EUk9JRF9IQVJEV0FSRV9DQVBUVVJFUkVTVUxUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oCmluZGV4IGYzNDIxMjIuLjZlNDhmMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaApAQCAtMzEsNiArMzEsNyBAQAogY2xhc3MgSUNhbWVyYURldmljZVVzZXI7CiBjbGFzcyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwogY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBWZW5kb3JUYWdEZXNjcmlwdG9yOwogCiBjbGFzcyBJQ2FtZXJhU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CkBAIC00Nyw2ICs0OCw3IEBACiAgICAgICAgIEFERF9MSVNURU5FUiwKICAgICAgICAgUkVNT1ZFX0xJU1RFTkVSLAogICAgICAgICBHRVRfQ0FNRVJBX0NIQVJBQ1RFUklTVElDUywKKyAgICAgICAgR0VUX0NBTUVSQV9WRU5ET1JfVEFHX0RFU0NSSVBUT1IsCiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtNTgsMTAgKzYwLDE2IEBACiAKICAgICB2aXJ0dWFsIGludDMyX3QgIGdldE51bWJlck9mQ2FtZXJhcygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pID0gMDsKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pID0gMDsKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgPSAwOwogCiAgICAgLy8gUmV0dXJucyAnT0snIGlmIG9wZXJhdGlvbiBzdWNjZWVkZWQKICAgICAvLyAtIEVycm9yczogQUxSRUFEWV9FWElTVFMgaWYgdGhlIGxpc3RlbmVyIHdhcyBhbHJlYWR5IGFkZGVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmggYi9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyMWQzMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVkVORE9SX1RBR19ERVNDUklQVE9SX0gKKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX3ZlbmRvcl90YWdzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBQYXJjZWw7CisKKy8qKgorICogVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3RzIGFyZSBwYXJjZWxhYmxlIGNvbnRhaW5lcnMgZm9yIHRoZSB2ZW5kb3IgdGFnCisgKiBkZWZpbml0aW9ucyBwcm92aWRlZCwgYW5kIGFyZSB0eXBpY2FsbHkgdXNlZCB0byBwYXNzIHRoZSB2ZW5kb3IgdGFnCisgKiBpbmZvcm1hdGlvbiBlbnVtZXJhdGVkIGJ5IHRoZSBIQUwgdG8gY2xpZW50cyBvZiB0aGUgY2FtZXJhIHNlcnZpY2UuCisgKi8KK2NsYXNzIFZlbmRvclRhZ0Rlc2NyaXB0b3IKKyAgICAgICAgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyAnZ2V0KicgbWV0aG9kcyBpbXBsZW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICogZnVuY3Rpb25zIGRlZmluZWQgaW4KKyAgICAgICAgICogc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlL3N5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaAorICAgICAgICAgKi8KKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmVuZG9yIHRhZ3MgZGVmaW5lZC4KKyAgICAgICAgaW50IGdldFRhZ0NvdW50KCkgY29uc3Q7CisKKyAgICAgICAgLy8gUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBpZCdzIG9mIHZlbmRvciB0YWdzIGRlZmluZWQuCisgICAgICAgIHZvaWQgZ2V0VGFnQXJyYXkodWludDMyX3QqIHRhZ0FycmF5KSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBzZWN0aW9uIG5hbWUgc3RyaW5nIGZvciBhIGdpdmVuIHZlbmRvciB0YWcgaWQuCisgICAgICAgIGNvbnN0IGNoYXIqIGdldFNlY3Rpb25OYW1lKHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgdGFnIG5hbWUgc3RyaW5nIGZvciBhIGdpdmVuIHZlbmRvciB0YWcgaWQuCisgICAgICAgIGNvbnN0IGNoYXIqIGdldFRhZ05hbWUodWludDMyX3QgdGFnKSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSB0YWcgdHlwZSBmb3IgYSBnaXZlbiB2ZW5kb3IgdGFnIGlkLgorICAgICAgICBpbnQgZ2V0VGFnVHlwZSh1aW50MzJfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgaW50byB0aGUgZ2l2ZW4gcGFyY2VsLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoCisgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgIFBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgICAgICAvLyBTdGF0aWMgbWV0aG9kczoKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gcGFyY2VsLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBjcmVhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIHZlbmRvcl90YWdfb3BzX3QKKyAgICAgICAgICogc3RydWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcyhjb25zdCB2ZW5kb3JfdGFnX29wc190KiB2T3BzLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGdsb2JhbCB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgdG8gdXNlIGZvciB0aGlzIHByb2Nlc3MuCisgICAgICAgICAqIENhbWVyYSBtZXRhZGF0YSBvcGVyYXRpb25zIHRoYXQgYWNjZXNzIHZlbmRvciB0YWdzIHdpbGwgdXNlIHRoZQorICAgICAgICAgKiB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIHNldCB0aGlzIHdheS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKGNvbnN0IHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xlYXJzIHRoZSBnbG9iYWwgdmVuZG9yIHRhZyBkZXNjcmlwdG9yIHVzZWQgYnkgdGhpcyBwcm9jZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHZvaWQgY2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgdXNlZCBieSB0aGlzIHByb2Nlc3MuCisgICAgICAgICAqIFRoaXMgd2lsbCBjb250YWluIE5VTEwgaWYgbm8gdmVuZG9yIHRhZ3MgYXJlIGRlZmluZWQuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZ2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIHByb3RlY3RlZDoKKyAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgU3RyaW5nOD4gbVRhZ1RvTmFtZU1hcDsKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFN0cmluZzg+IG1UYWdUb1NlY3Rpb25NYXA7CisgICAgICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBpbnQzMl90PiBtVGFnVG9UeXBlTWFwOworICAgICAgICAvLyBtdXN0IGJlIGludDMyX3QgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFBhcmNlbDo6d3JpdGVJbnQzMgorICAgICAgICBpbnQzMl90IG1UYWdDb3VudDsKKyAgICBwcml2YXRlOgorICAgICAgICB2ZW5kb3JfdGFnX29wcyBtVmVuZG9yT3BzOworfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworCisjZGVmaW5lIFZFTkRPUl9UQUdfREVTQ1JJUFRPUl9ICisjZW5kaWYgLyogVkVORE9SX1RBR19ERVNDUklQVE9SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKaW5kZXggOGRhYzRmMi4uZjA1OWIzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKQEAgLTI0LDkgKzI0LDEyIEBACiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2NhbWVyYS5oPgogCisjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CiAKKwogY2xhc3MgSUNhbWVyYURldmljZUNhbGxiYWNrcyA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiAgICAgLyoqCkBAIC00NSwxOCArNDgsMTkgQEAKICAgICB9OwogCiAgICAgLy8gT25lIHdheQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uRGV2aWNlRXJyb3IoQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uRGV2aWNlRXJyb3IoQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOwogCiAgICAgLy8gT25lIHdheQogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uRGV2aWNlSWRsZSgpID0gMDsKIAogICAgIC8vIE9uZSB3YXkKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkNhcHR1cmVTdGFydGVkKGludDMyX3QgcmVxdWVzdElkLAorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXApID0gMDsKIAogICAgIC8vIE9uZSB3YXkKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvblJlc3VsdFJlY2VpdmVkKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uUmVzdWx0UmVjZWl2ZWQoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmggYi9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmgKaW5kZXggZjcxZjMwMi4uOTEzNjk2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCiBzdHJ1Y3QgY2FtZXJhX21ldGFkYXRhOwogCkBAIC0zMCw2ICszMSwxMCBAQAogY2xhc3MgQ2FwdHVyZVJlcXVlc3Q7CiBjbGFzcyBDYW1lcmFNZXRhZGF0YTsKIAorZW51bSB7CisgICAgTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVMgPSAtMSwKK307CisKIGNsYXNzIElDYW1lcmFEZXZpY2VVc2VyIDogcHVibGljIElJbnRlcmZhY2UKIHsKICAgICAvKioKQEAgLTQ0LDkgKzQ5LDM0IEBACiAgICAgICogUmVxdWVzdCBIYW5kbGluZwogICAgICAqKi8KIAorICAgIC8qKgorICAgICAqIEZvciBzdHJlYW1pbmcgcmVxdWVzdHMsIG91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyCisgICAgICogb2YgdGhlIHByZXZpb3VzIHJlcGVhdGluZyByZXF1ZXN0LgorICAgICAqIEZvciBub24tc3RyZWFtaW5nIHJlcXVlc3RzLCBvdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBleHBlY3RlZCBsYXN0CisgICAgICogZnJhbWUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHJlcXVlc3QuCisgICAgICovCiAgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgc3VibWl0UmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGb3Igc3RyZWFtaW5nIHJlcXVlc3RzLCBvdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlcgorICAgICAqIG9mIHRoZSBwcmV2aW91cyByZXBlYXRpbmcgcmVxdWVzdC4KKyAgICAgKiBGb3Igbm9uLXN0cmVhbWluZyByZXF1ZXN0cywgb3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgZXhwZWN0ZWQgbGFzdAorICAgICAqIGZyYW1lIG51bWJlciBvZiB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqLworICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIHN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOworCisgICAgLyoqCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHJlcGVhdGluZyByZXF1ZXN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBjcmVhdGVTdHJlYW0oCkBAIC02NCw4ICs5NCwxMiBAQAogICAgIC8vIFdhaXQgdW50aWwgYWxsIHRoZSBzdWJtaXR0ZWQgcmVxdWVzdHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgd2FpdFVudGlsSWRsZSgpID0gIDA7CiAKLSAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBhbmQgaW4tcHJvZ3Jlc3Mgd29yayBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGZsdXNoKCkgPSAwOworICAgIC8qKgorICAgICAqIEZsdXNoIGFsbCBwZW5kaW5nIGFuZCBpbi1wcm9ncmVzcyB3b3JrIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHJlcGVhdGluZyByZXF1ZXN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGZsdXNoKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGVmMzkyZjAuLjdiZTQ0OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC02MSw2ICs2MSwxNyBAQAogICAgIC8vICBidWZmZXItPmZyYW1lQ291bnQgIDAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzID0ga0ludmFsaWRQVFMpID0gMDsKIAorICAgIC8vIFJlbGVhc2UgKGEgcG9ydGlvbiBvZikgdGhlIGJ1ZmZlciBwcmV2aW91c2x5IG9idGFpbmVkIGJ5IGdldE5leHRCdWZmZXIoKS4KKyAgICAvLyBJdCBpcyBwZXJtaXNzaWJsZSB0byBjYWxsIHJlbGVhc2VCdWZmZXIoKSBtdWx0aXBsZSB0aW1lcyBwZXIgZ2V0TmV4dEJ1ZmZlcigpLgorICAgIC8vIE9uIGVudHJ5OgorICAgIC8vICBidWZmZXItPmZyYW1lQ291bnQgIG51bWJlciBvZiBmcmFtZXMgdG8gcmVsZWFzZSwgbXVzdCBiZSA8PSBudW1iZXIgb2YgZnJhbWVzCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgb2J0YWluZWQgYnV0IG5vdCB5ZXQgcmVsZWFzZWQKKyAgICAvLyAgYnVmZmVyLT5yYXcgICAgICAgICB1bnVzZWQKKyAgICAvLyBPbiByZXR1cm46CisgICAgLy8gIGJ1ZmZlci0+ZnJhbWVDb3VudCAgMDsgaW1wbGVtZW50YXRpb24gTVVTVCBzZXQgdG8gemVybworICAgIC8vICBidWZmZXItPnJhdyAgICAgICAgIHVuZGVmaW5lZDsgaW1wbGVtZW50YXRpb24gaXMgUEVSTUlUVEVEIHRvIHNldCB0byBhbnkgdmFsdWUsCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgc28gaWYgY2FsbGVyIG5lZWRzIHRvIGNvbnRpbnVlIHVzaW5nIHRoaXMgYnVmZmVyIGl0IG11c3QKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBrZWVwIHRyYWNrIG9mIHRoZSBwb2ludGVyIGl0c2VsZgogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKSA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKaW5kZXggMDVkODM0ZC4uZjk4MDAyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApAQCAtMzYsNyArMzYsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIGVmZmVjdF9wYXJhbV9jYmxrX3Q7CitzdHJ1Y3QgZWZmZWN0X3BhcmFtX2NibGtfdDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yMTcsOCArMjE3LDkgQEAKICAgICAgKiAgICAgIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCiAgICAgICogY2JmOiAgICAgICAgIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIChzZWUgZWZmZWN0X2NhbGxiYWNrX3QpCiAgICAgICogdXNlcjogICAgICAgIHBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KLSAgICAgKiBzZXNzaW9uSUQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLiBJZiAwLCB0aGUgZWZmZWN0IHdpbGwgYmUgZ2xvYmFsIHRvCi0gICAgICogICAgICB0aGUgb3V0cHV0IG1peC4gSWYgbm90IDAsIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBwbGF5ZXJzCisgICAgICogc2Vzc2lvbklEOiAgIGF1ZGlvIHNlc3Npb24gdGhpcyBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0by4KKyAgICAgKiAgICAgIElmIGVxdWFsIHRvIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgdGhlIGVmZmVjdCB3aWxsIGJlIGdsb2JhbCB0bworICAgICAqICAgICAgdGhlIG91dHB1dCBtaXguICBPdGhlcndpc2UsIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBwbGF5ZXJzCiAgICAgICogICAgICAoQXVkaW9UcmFjayBvciBNZWRpYVBMYXllcikgd2l0aGluIHRoZSBzYW1lIGF1ZGlvIHNlc3Npb24uCiAgICAgICogaW86ICBIQUwgYXVkaW8gb3V0cHV0IG9yIGlucHV0IHN0cmVhbSB0byB3aGljaCB0aGlzIGVmZmVjdCBtdXN0IGJlIGF0dGFjaGVkLiBMZWF2ZSBhdCAwIGZvcgogICAgICAqICAgICAgYXV0b21hdGljIG91dHB1dCBzZWxlY3Rpb24gYnkgQXVkaW9GbGluZ2VyLgpAQCAtMjI5LDggKzIzMCw4IEBACiAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAotICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSAwCisgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORQogICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIENvbnN0cnVjdG9yLgpAQCAtMjQxLDggKzI0Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gMAorICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FCiAgICAgICAgICAgICAgICAgICAgICk7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb0VmZmVjdCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCkBAIC0yNjMsOCArMjY0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb0VmZmVjdC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAppbmRleCAwNTIwNjRkLi5iM2M0NGE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCkBAIC0yNiw3ICsyNiw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgYXVkaW9fdHJhY2tfY2Jsa190Oworc3RydWN0IGF1ZGlvX3RyYWNrX2NibGtfdDsKIGNsYXNzIEF1ZGlvUmVjb3JkQ2xpZW50UHJveHk7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM5LDggKzM5LDEyIEBACiAgICAgICogS2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhIE5BVElWRV9FVkVOVF8qLgogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7Ci0gICAgICAgIEVWRU5UX01PUkVfREFUQSA9IDAsICAgICAgICAvLyBSZXF1ZXN0IHRvIHJlYWQgbW9yZSBkYXRhIGZyb20gUENNIGJ1ZmZlci4KLSAgICAgICAgRVZFTlRfT1ZFUlJVTiA9IDEsICAgICAgICAgIC8vIFBDTSBidWZmZXIgb3ZlcnJ1biBvY2N1cnJlZC4KKyAgICAgICAgRVZFTlRfTU9SRV9EQVRBID0gMCwgICAgICAgIC8vIFJlcXVlc3QgdG8gcmVhZCBhdmFpbGFibGUgZGF0YSBmcm9tIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZXZlbnQgaXMgZGVsaXZlcmVkIGJ1dCB0aGUgY2FsbGJhY2sgaGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3Qgd2FudCB0byByZWFkIHRoZSBhdmFpbGFibGUgZGF0YSwgdGhlIGhhbmRsZXIgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBldmVudCBieSBzZXR0aW5nIGZyYW1lQ291bnQgdG8gemVyby4KKyAgICAgICAgRVZFTlRfT1ZFUlJVTiA9IDEsICAgICAgICAgIC8vIEJ1ZmZlciBvdmVycnVuIG9jY3VycmVkLgogICAgICAgICBFVkVOVF9NQVJLRVIgPSAyLCAgICAgICAgICAgLy8gUmVjb3JkIGhlYWQgaXMgYXQgdGhlIHNwZWNpZmllZCBtYXJrZXIgcG9zaXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChTZWUgc2V0TWFya2VyUG9zaXRpb24oKSkuCiAgICAgICAgIEVWRU5UX05FV19QT1MgPSAzLCAgICAgICAgICAvLyBSZWNvcmQgaGVhZCBpcyBhdCBhIG5ldyBwb3NpdGlvbgpAQCAtNjAsOSArNjQsMTAgQEAKICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudDsgICAgIC8vIG51bWJlciBvZiBzYW1wbGUgZnJhbWVzIGNvcnJlc3BvbmRpbmcgdG8gc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IGl0IGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGF2YWlsYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBkcmFpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoY3VycmVudGx5IGlnbm9yZWQsIGJ1dCB3aWxsIG1ha2UgdGhlIHByaW1hcnkgZmllbGQgaW4gZnV0dXJlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGN1cnJlbnRseSBpZ25vcmVkIGJ1dCB3aWxsIG1ha2UgdGhlIHByaW1hcnkgZmllbGQgaW4gZnV0dXJlKQogCiAgICAgICAgIHNpemVfdCAgICAgIHNpemU7ICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgaW4gYnl0ZXMgPT0gZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gb3V0cHV0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgZHJhaW5lZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBpcyByZWR1bmRhbnQgd2l0aCByZXNwZWN0IHRvIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgVFJBTlNGRVJfT0JUQUlOIG1vZGUgaXMgYnJva2VuIGZvciA4LWJpdCBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBkb24ndCBkZWZpbmUgdGhlIGZyYW1lIGZvcm1hdApAQCAtNzYsNyArODEsNyBAQAogCiAgICAgLyogQXMgYSBjb252ZW5pZW5jZSwgaWYgYSBjYWxsYmFjayBpcyBzdXBwbGllZCwgYSBoYW5kbGVyIHRocmVhZAogICAgICAqIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwcmlvcml0eS4gVGhpcyB0aHJlYWQKLSAgICAgKiBpbnZva2VzIHRoZSBjYWxsYmFjayB3aGVuIGEgbmV3IGJ1ZmZlciBiZWNvbWVzIHJlYWR5IG9yIHZhcmlvdXMgY29uZGl0aW9ucyBvY2N1ci4KKyAgICAgKiBpbnZva2VzIHRoZSBjYWxsYmFjayB3aGVuIGEgbmV3IGJ1ZmZlciBiZWNvbWVzIGF2YWlsYWJsZSBvciB2YXJpb3VzIGNvbmRpdGlvbnMgb2NjdXIuCiAgICAgICogUGFyYW1ldGVyczoKICAgICAgKgogICAgICAqIGV2ZW50OiAgIHR5cGUgb2YgZXZlbnQgbm90aWZpZWQgKHNlZSBlbnVtIEF1ZGlvUmVjb3JkOjpldmVudF90eXBlKS4KQEAgLTk5LDYgKzEwNCw4IEBACiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCiAgICAgICogIC0gTk9fSU5JVDogYXVkaW8gc2VydmVyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAogICAgICAqICAtIEJBRF9WQUxVRTogdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbgorICAgICAqIGZyYW1lQ291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSBub24temVybyBpZiBzdGF0dXMgaXMgTk9fRVJST1IsCisgICAgICogYW5kIGlzIHVuZGVmaW5lZCBvdGhlcndpc2UuCiAgICAgICovCiAKICAgICAgc3RhdGljIHN0YXR1c190IGdldE1pbkZyYW1lQ291bnQoc2l6ZV90KiBmcmFtZUNvdW50LApAQCAtMTA5LDcgKzExNiw3IEBACiAgICAgLyogSG93IGRhdGEgaXMgdHJhbnNmZXJyZWQgZnJvbSBBdWRpb1JlY29yZAogICAgICAqLwogICAgIGVudW0gdHJhbnNmZXJfdHlwZSB7Ci0gICAgICAgIFRSQU5TRkVSX0RFRkFVTFQsICAgLy8gbm90IHNwZWNpZmllZCBleHBsaWNpdGx5OyBkZXRlcm1pbmUgZnJvbSBvdGhlciBwYXJhbWV0ZXJzCisgICAgICAgIFRSQU5TRkVSX0RFRkFVTFQsICAgLy8gbm90IHNwZWNpZmllZCBleHBsaWNpdGx5OyBkZXRlcm1pbmUgZnJvbSB0aGUgb3RoZXIgcGFyYW1ldGVycwogICAgICAgICBUUkFOU0ZFUl9DQUxMQkFDSywgIC8vIGNhbGxiYWNrIEVWRU5UX01PUkVfREFUQQogICAgICAgICBUUkFOU0ZFUl9PQlRBSU4sICAgIC8vIEZJWE1FIGRlcHJlY2F0ZWQ6IGNhbGwgb2J0YWluQnVmZmVyKCkgYW5kIHJlbGVhc2VCdWZmZXIoKQogICAgICAgICBUUkFOU0ZFUl9TWU5DLCAgICAgIC8vIHN5bmNocm9ub3VzIHJlYWQoKQpAQCAtMTM3LDcgKzE0NCw3IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgICBiZSBsYXJnZXIgaWYgdGhlIHJlcXVlc3RlZCBzaXplIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggY3VycmVudCBhdWRpbyBIQUwKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3kuICBaZXJvIG1lYW5zIHRvIHVzZSBhIGRlZmF1bHQgdmFsdWUuCiAgICAgICogY2JmOiAgICAgICAgICAgICAgICBDYWxsYmFjayBmdW5jdGlvbi4gSWYgbm90IG51bGwsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseQotICAgICAqICAgICAgICAgICAgICAgICAgICAgdG8gY29uc3VtZSBuZXcgUENNIGRhdGEgYW5kIGluZm9ybSBvZiBtYXJrZXIsIHBvc2l0aW9uIHVwZGF0ZXMsIGV0Yy4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRvIGNvbnN1bWUgbmV3IGRhdGEgYW5kIGluZm9ybSBvZiBtYXJrZXIsIHBvc2l0aW9uIHVwZGF0ZXMsIGV0Yy4KICAgICAgKiB1c2VyOiAgICAgICAgICAgICAgIENvbnRleHQgZm9yIHVzZSBieSB0aGUgY2FsbGJhY2sgcmVjZWl2ZXIuCiAgICAgICogbm90aWZpY2F0aW9uRnJhbWVzOiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2ggdGltZSBub3RpZmljYXRpb25GcmFtZXMgUENNCiAgICAgICogICAgICAgICAgICAgICAgICAgICBmcmFtZXMgYXJlIHJlYWR5IGluIHJlY29yZCB0cmFjayBvdXRwdXQgYnVmZmVyLgpAQCAtMTUxLDExICsxNTgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CiAKQEAgLTE3MSw5ICsxNzgsMTAgQEAKICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBpbnRpYWxpemF0aW9uCiAgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IEF1ZGlvUmVjb3JkIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgb3IgcmVjb3JkIGRldmljZSBpcyBhbHJlYWR5IGluIHVzZQotICAgICAqICAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIgKGNoYW5uZWxzLCBmb3JtYXQsIHNhbXBsZVJhdGUuLi4pCisgICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlciAoY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2FtcGxlUmF0ZS4uLikKICAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBzZXJ2ZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCiAgICAgICogIC0gUEVSTUlTU0lPTl9ERU5JRUQ6IHJlY29yZGluZyBpcyBub3QgYWxsb3dlZCBmb3IgdGhlIHJlcXVlc3RpbmcgcHJvY2VzcworICAgICAqIElmIHN0YXR1cyBpcyBub3QgZXF1YWwgdG8gTk9fRVJST1IsIGRvbid0IGNhbGwgYW55IG90aGVyIEFQSXMgb24gdGhpcyBBdWRpb1JlY29yZC4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnMgbm90IGxpc3RlZCBpbiB0aGUgQXVkaW9SZWNvcmQgY29uc3RydWN0b3JzIGFib3ZlOgogICAgICAqCkBAIC0xODMsMTYgKzE5MSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkUpOwogCi0gICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9SZWNvcmQuIFRoaXMgbXVzdCBiZSBjaGVja2VkCisgICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9SZWNvcmQuIFRoaXMgbXVzdCBiZSBjaGVja2VkIGZvciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCiAgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb1JlY29yZCBBUEkgKGV4Y2VwdCBmb3Igc2V0KCkpLCBiZWNhdXNlIHVzaW5nCiAgICAgICogYW4gdW5pbml0aWFsaXplZCBBdWRpb1JlY29yZCBwcm9kdWNlcyB1bmRlZmluZWQgcmVzdWx0cy4KICAgICAgKiBTZWUgc2V0KCkgbWV0aG9kIGFib3ZlIGZvciBwb3NzaWJsZSByZXR1cm4gY29kZXMuCkBAIC0yMjEsNyArMjI5LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgPSBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uID0gMCk7CiAKLSAgICAvKiBTdG9wIGEgdHJhY2suIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkLiAgTm90ZSB0aGF0IG9idGFpbkJ1ZmZlcigpIHN0aWxsCisgICAgLyogU3RvcCBhIHRyYWNrLiAgVGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkLiAgTm90ZSB0aGF0IG9idGFpbkJ1ZmZlcigpIHN0aWxsCiAgICAgICogd29ya3MgYW5kIHdpbGwgZHJhaW4gYnVmZmVycyB1bnRpbCB0aGUgcG9vbCBpcyBleGhhdXN0ZWQsIGFuZCB0aGVuIHdpbGwgcmV0dXJuIFdPVUxEX0JMT0NLLgogICAgICAqLwogICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcCgpOwpAQCAtMjM2LDcgKzI0NCw3IEBACiAgICAgICogYSBjYWxsYmFjayB3aXRoIGV2ZW50IHR5cGUgRVZFTlRfTUFSS0VSIGlzIGNhbGxlZC4gQ2FsbGluZyBzZXRNYXJrZXJQb3NpdGlvbgogICAgICAqIHdpdGggbWFya2VyID09IDAgY2FuY2VscyBtYXJrZXIgbm90aWZpY2F0aW9uIGNhbGxiYWNrLgogICAgICAqIFRvIHNldCBhIG1hcmtlciBhdCBhIHBvc2l0aW9uIHdoaWNoIHdvdWxkIGNvbXB1dGUgYXMgMCwKLSAgICAgKiBhIHdvcmthcm91bmQgaXMgdG8gdGhlIHNldCB0aGUgbWFya2VyIGF0IGEgbmVhcmJ5IHBvc2l0aW9uIHN1Y2ggYXMgfjAgb3IgMS4KKyAgICAgKiBhIHdvcmthcm91bmQgaXMgdG8gc2V0IHRoZSBtYXJrZXIgYXQgYSBuZWFyYnkgcG9zaXRpb24gc3VjaCBhcyB+MCBvciAxLgogICAgICAqIElmIHRoZSBBdWRpb1JlY29yZCBoYXMgYmVlbiBvcGVuZWQgd2l0aCBubyBjYWxsYmFjayBmdW5jdGlvbiBhc3NvY2lhdGVkLAogICAgICAqIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsLgogICAgICAqCkBAIC0zNzgsOCArMzg2LDEwIEBACiAgICAgICogcmV0dXJuaW5nIHRoZSBjdXJyZW50IHZhbHVlIGJ5IHRoaXMgZnVuY3Rpb24gY2FsbC4gIFN1Y2ggbG9zcyB0eXBpY2FsbHkgb2NjdXJzIHdoZW4gdGhlCiAgICAgICogdXNlciBzcGFjZSBwcm9jZXNzIGlzIGJsb2NrZWQgbG9uZ2VyIHRoYW4gdGhlIGNhcGFjaXR5IG9mIGF1ZGlvIGRyaXZlciBidWZmZXJzLgogICAgICAqIFVuaXRzOiB0aGUgbnVtYmVyIG9mIGlucHV0IGF1ZGlvIGZyYW1lcy4KKyAgICAgKiBGSVhNRSBUaGUgc2lkZS1lZmZlY3Qgb2YgcmVzZXR0aW5nIHRoZSBjb3VudGVyIG1heSBiZSBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aS1jbGllbnQuCisgICAgICogQ29uc2lkZXIgbWFraW5nIGl0IG1vcmUgbGlrZSBBdWRpb1RyYWNrOjpnZXRVbmRlcnJ1bkZyYW1lcyB3aGljaCBkb2Vzbid0IGhhdmUgc2lkZSBlZmZlY3RzLgogICAgICAqLwotICAgICAgICAgICAgdW5zaWduZWQgaW50ICBnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdDsKKyAgICAgICAgICAgIHVpbnQzMl90ICAgIGdldElucHV0RnJhbWVzTG9zdCgpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIC8qIGNvcHlpbmcgYXVkaW8gcmVjb3JkIG9iamVjdHMgaXMgbm90IGFsbG93ZWQgKi8KQEAgLTQxMiw2ICs0MjIsNyBAQAogICAgICAgICBib29sICAgICAgICAgICAgICAgIG1QYXVzZWQ7ICAgIC8vIHdoZXRoZXIgdGhyZWFkIGlzIHJlcXVlc3RlZCB0byBwYXVzZSBhdCBuZXh0IGxvb3AgZW50cnkKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtUGF1c2VkSW50OyAvLyB3aGV0aGVyIHRocmVhZCBpbnRlcm5hbGx5IHJlcXVlc3RzIHBhdXNlCiAgICAgICAgIG5zZWNzX3QgICAgICAgICAgICAgbVBhdXNlZE5zOyAgLy8gaWYgbVBhdXNlZEludCB0aGVuIGFzc29jaWF0ZWQgdGltZW91dCwgb3RoZXJ3aXNlIGlnbm9yZWQKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtSWdub3JlTmV4dFBhdXNlZEludDsgICAvLyB3aGV0aGVyIHRvIGlnbm9yZSBuZXh0IG1QYXVzZWRJbnQgcmVxdWVzdAogICAgIH07CiAKICAgICAgICAgICAgIC8vIGJvZHkgb2YgQXVkaW9SZWNvcmRUaHJlYWQ6OnRocmVhZExvb3AoKQpAQCAtNDIyLDkgKzQzMywxMCBAQAogICAgICAgICAgICAgLy8gICAgICBOU19JTkFDVElWRSBpbmFjdGl2ZSBzbyBkb24ndCBydW4gYWdhaW4gdW50aWwgcmUtc3RhcnRlZAogICAgICAgICAgICAgLy8gICAgICBOU19ORVZFUiAgICBuZXZlciBhZ2FpbgogICAgICAgICAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgTlNfV0hFTkVWRVIgPSAtMSwgTlNfSU5BQ1RJVkUgPSAtMiwgTlNfTkVWRVIgPSAtMzsKLSAgICAgICAgICAgIG5zZWNzX3QgcHJvY2Vzc0F1ZGlvQnVmZmVyKGNvbnN0IHNwPEF1ZGlvUmVjb3JkVGhyZWFkPiYgdGhyZWFkKTsKKyAgICAgICAgICAgIG5zZWNzX3QgcHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAKICAgICAgICAgICAgIC8vIGNhbGxlciBtdXN0IGhvbGQgbG9jayBvbiBtTG9jayBmb3IgYWxsIF9sIG1ldGhvZHMKKwogICAgICAgICAgICAgc3RhdHVzX3Qgb3BlblJlY29yZF9sKHNpemVfdCBlcG9jaCk7CiAKICAgICAgICAgICAgIC8vIEZJWE1FIGVudW0gaXMgZmFzdGVyIHRoYW4gc3RyY21wKCkgZm9yIHBhcmFtZXRlciAnZnJvbScKQEAgLTQ0NiwxMiArNDU4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGNhbGxiYWNrCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgLy8gYWN0dWFsIG51bWJlciBvZiBmcmFtZXMgYmV0d2VlbiBlYWNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGNhbGxiYWNrCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAvLyBwcm9jZXNzQXVkaW9CdWZmZXIoKSBzaG91bGQgcmVmcmVzaCBuZXh0IDIKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtUmVmcmVzaFJlbWFpbmluZzsgICAgICAvLyBwcm9jZXNzQXVkaW9CdWZmZXIoKSBzaG91bGQgcmVmcmVzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1SZW1haW5pbmdGcmFtZXMgYW5kIG1SZXRyeU9uUGFydGlhbEJ1ZmZlcgogCiAgICAgLy8gVGhlc2UgYXJlIHByaXZhdGUgdG8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCksIGFuZCBhcmUgbm90IHByb3RlY3RlZCBieSBhIGxvY2sKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzOyAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHRvIHJlcXVlc3QgaW4gb2J0YWluQnVmZmVyKCkKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUmV0cnlPblBhcnRpYWxCdWZmZXI7ICAvLyBzbGVlcCBhbmQgcmV0cnkgYWZ0ZXIgcGFydGlhbCBvYnRhaW5CdWZmZXIoKQotICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1PYnNlcnZlZFNlcXVlbmNlOyAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgdmFsdWUgb2YgbVNlcXVlbmNlCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU9ic2VydmVkU2VxdWVuY2U7ICAgICAgLy8gbGFzdCBvYnNlcnZlZCB2YWx1ZSBvZiBtU2VxdWVuY2UKIAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1NYXJrZXJQb3NpdGlvbjsgICAgLy8gaW4gd3JhcHBpbmcgKG92ZXJmbG93KSBmcmFtZSB1bml0cwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1NYXJrZXJSZWFjaGVkOwpAQCAtNDYwLDkgKzQ3MywxMyBAQAogCiAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1czsKIAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvUmVjb3JkLCB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGJhY2sgYnkgQXVkaW9GbGluZ2VyIHRvIHRoZSBjbGllbnQKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudDsgICAgICAgICAvLyBmcmFtZSBjb3VudCB0byByZXF1ZXN0IHRoZSBmaXJzdCBvciBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG5ldyBJQXVkaW9SZWNvcmQgaXMgbmVlZGVkLCBub24tZGVjcmVhc2luZworCiAgICAgLy8gY29uc3RhbnQgYWZ0ZXIgY29uc3RydWN0b3Igb3Igc2V0KCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsKICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsgICAgICAgICAvLyBhcHAtbGV2ZWwgZnJhbWUgc2l6ZSA9PSBBdWRpb0ZsaW5nZXIgZnJhbWUgc2l6ZQpAQCAtNDczLDEyICs0OTAsMTEgQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgIHRyYW5zZmVyX3R5cGUgICAgICAgICAgIG1UcmFuc2ZlcjsKIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldElucHV0KCkKLQotICAgIC8vIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1JlY29yZCBvYmplY3QgaXMgcmUtY3JlYXRlZAorICAgIC8vIE5leHQgNCBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQsIGJ1dCBhbHdheXMgIT0gMAogICAgIHNwPElBdWRpb1JlY29yZD4gICAgICAgIG1BdWRpb1JlY29yZDsKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQ7ICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dCgpCiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNQcmlvcml0eTsgIC8vIGJlZm9yZSBzdGFydCgpCiAgICAgU2NoZWRQb2xpY3kgICAgICAgICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDRjMjI0MTIuLjQwMmI0NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTY3LDIwICs2NywyNCBAQAogCiAgICAgLy8gcmV0dXJucyB0cnVlIGluICpzdGF0ZSBpZiB0cmFja3MgYXJlIGFjdGl2ZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbSBvciBoYXZlIGJlZW4gYWN0aXZlCiAgICAgLy8gaW4gdGhlIHBhc3QgaW5QYXN0TXMgbWlsbGlzZWNvbmRzCi0gICAgc3RhdGljIHN0YXR1c190IGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sICpzdGF0ZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgKnN0YXRlLCB1aW50MzJfdCBpblBhc3RNcyk7CiAgICAgLy8gcmV0dXJucyB0cnVlIGluICpzdGF0ZSBpZiB0cmFja3MgYXJlIGFjdGl2ZSBmb3Igd2hhdCBxdWFsaWZpZXMgYXMgcmVtb3RlIHBsYXliYWNrCiAgICAgLy8gb24gdGhlIHNwZWNpZmllZCBzdHJlYW0gb3IgaGF2ZSBiZWVuIGFjdGl2ZSBpbiB0aGUgcGFzdCBpblBhc3RNcyBtaWxsaXNlY29uZHMuIFJlbW90ZQogICAgIC8vIHBsYXliYWNrIGlzbid0IG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGxvY2FsIHBsYXliYWNrLgogICAgIHN0YXRpYyBzdGF0dXNfdCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sICpzdGF0ZSwKLSAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCk7CisgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyk7CiAgICAgLy8gcmV0dXJucyB0cnVlIGluICpzdGF0ZSBpZiBhIHJlY29yZGVyIGlzIGN1cnJlbnRseSByZWNvcmRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQogICAgIHN0YXRpYyBzdGF0dXNfdCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGJvb2wgKnN0YXRlKTsKIAogICAgIC8vIHNldC9nZXQgYXVkaW8gaGFyZHdhcmUgcGFyYW1ldGVycy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBsaXN0IG9mIHBhcmFtZXRlcnMKICAgICAvLyBrZXkgdmFsdWUgcGFpcnMgaW4gdGhlIGZvcm06IGtleTE9dmFsdWUxO2tleTI9dmFsdWUyOy4uLgogICAgIC8vIFNvbWUga2V5cyBhcmUgcmVzZXJ2ZWQgZm9yIHN0YW5kYXJkIHBhcmFtZXRlcnMgKFNlZSBBdWRpb1BhcmFtZXRlciBjbGFzcykuCisgICAgLy8gVGhlIHZlcnNpb25zIHdpdGggYXVkaW9faW9faGFuZGxlX3QgYXJlIGludGVuZGVkIGZvciBpbnRlcm5hbCBtZWRpYSBmcmFtZXdvcmsgdXNlIG9ubHkuCiAgICAgc3RhdGljIHN0YXR1c190IHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwogICAgIHN0YXRpYyBTdHJpbmc4ICBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKTsKKyAgICAvLyBUaGUgdmVyc2lvbnMgd2l0aG91dCBhdWRpb19pb19oYW5kbGVfdCBhcmUgaW50ZW5kZWQgZm9yIEpOSS4KKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICBzdGF0aWMgU3RyaW5nOCAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKIAogICAgIHN0YXRpYyB2b2lkIHNldEVycm9yQ2FsbGJhY2soYXVkaW9fZXJyb3JfY2FsbGJhY2sgY2IpOwogCkBAIC05MCwxMiArOTQsMTQgQEAKICAgICBzdGF0aWMgZmxvYXQgbGluZWFyVG9Mb2coaW50IHZvbHVtZSk7CiAgICAgc3RhdGljIGludCBsb2dUb0xpbmVhcihmbG9hdCB2b2x1bWUpOwogCisgICAgLy8gUmV0dXJuZWQgc2FtcGxpbmdSYXRlIGFuZCBmcmFtZUNvdW50IG91dHB1dCB2YWx1ZXMgYXJlIGd1YXJhbnRlZWQKKyAgICAvLyB0byBiZSBub24temVybyBpZiBzdGF0dXMgPT0gTk9fRVJST1IKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0U2FtcGxpbmdSYXRlKHVpbnQzMl90KiBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0RnJhbWVDb3VudChzaXplX3QqIGZyYW1lQ291bnQsCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0TGF0ZW5jeSh1aW50MzJfdCogbGF0ZW5jeSwKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRTYW1wbGluZ1JhdGUoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNhbXBsaW5nUmF0ZSk7CkBAIC0xMDcsMTkgKzExMywxOCBAQAogICAgIC8vIHJldHVybnMgdGhlIGF1ZGlvIG91dHB1dCBzdHJlYW0gbGF0ZW5jeSBpbiBtcy4gQ29ycmVzcG9uZHMgdG8KICAgICAvLyBhdWRpb19zdHJlYW1fb3V0LT5nZXRfbGF0ZW5jeSgpCiAgICAgc3RhdGljIHN0YXR1c190IGdldExhdGVuY3koYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBsYXRlbmN5KTsKIAogICAgIHN0YXRpYyBib29sIHJvdXRlZFRvQTJkcE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwogCisgICAgLy8gcmV0dXJuIHN0YXR1cyBOT19FUlJPUiBpbXBsaWVzICpidWZmU2l6ZSA+IDAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIHNpemVfdCogYnVmZlNpemUpOwogCiAgICAgc3RhdGljIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CiAKICAgICAvLyByZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSBBdWRpb0ZsaW5nZXIgdG8gYXVkaW8gSEFMIGFuZAotICAgIC8vIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UgdGhlIG91dHB1dCBvbiB3aGljaCB0aGUgc3BlY2lmaWVkIHN0cmVhbSBpcyBwbGF5aW5nCi0gICAgLy8gaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIC8vIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UgdGhlIHNwZWNpZmllZCBvdXRwdXQgSS9PIGhhbmRsZSBoYXMgZXhpdGVkIHN0YW5kYnkuCiAgICAgLy8gcmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgLy8gLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24sIGhhbEZyYW1lcyBhbmQgZHNwRnJhbWVzIHBvaW50IHRvIHZhbGlkIGRhdGEKICAgICAvLyAtIElOVkFMSURfT1BFUkFUSU9OOiBOb3Qgc3VwcG9ydGVkIG9uIGN1cnJlbnQgaGFyZHdhcmUgcGxhdGZvcm0KQEAgLTEyOCwxNSArMTMzLDIwIEBACiAgICAgLy8gbmVjZXNzYXJ5IHRvIGNoZWNrIHJldHVybmVkIHN0YXR1cyBiZWZvcmUgdXNpbmcgdGhlIHJldHVybmVkIHZhbHVlcy4KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24oYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqaGFsRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZHNwRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRzcEZyYW1lcyk7CiAKICAgICAvLyByZXR1cm4gdGhlIG51bWJlciBvZiBpbnB1dCBmcmFtZXMgbG9zdCBieSBIQUwgaW1wbGVtZW50YXRpb24sIG9yIDAgaWYgdGhlIGhhbmRsZSBpcyBpbnZhbGlkCi0gICAgc3RhdGljIHNpemVfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOworICAgIHN0YXRpYyB1aW50MzJfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOwogCisgICAgLy8gQWxsb2NhdGUgYSBuZXcgYXVkaW8gc2Vzc2lvbiBJRCBhbmQgcmV0dXJuIHRoYXQgbmV3IElELgorICAgIC8vIElmIHVuYWJsZSB0byBjb250YWN0IEF1ZGlvRmxpbmdlciwgcmV0dXJucyBBVURJT19TRVNTSU9OX0FMTE9DQVRFIGluc3RlYWQuCisgICAgLy8gRklYTUUgSWYgQXVkaW9GbGluZ2VyIHdlcmUgdG8gZXZlciBleGhhdXN0IHRoZSBzZXNzaW9uIElEIG5hbWVzcGFjZSwKKyAgICAvLyAgICAgICB0aGlzIG1ldGhvZCBjb3VsZCBmYWlsIGJ5IHJldHVybmluZyBlaXRoZXIgQVVESU9fU0VTU0lPTl9BTExPQ0FURQorICAgIC8vICAgICAgIG9yIGFuIHVuc3BlY2lmaWVkIGV4aXN0aW5nIHNlc3Npb24gSUQuCiAgICAgc3RhdGljIGludCBuZXdBdWRpb1Nlc3Npb25JZCgpOwotICAgIHN0YXRpYyB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKTsKLSAgICBzdGF0aWMgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbik7CisKKyAgICBzdGF0aWMgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKIAogICAgIC8vIHR5cGVzIG9mIGlvIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGV2ZW50cyByZWNlaXZlZCB3aXRoIGlvQ29uZmlnQ2hhbmdlZCgpCiAgICAgZW51bSBpb19jb25maWdfZXZlbnQgewpAQCAtMTU1LDcgKzE2NSw4IEBACiAgICAgY2xhc3MgT3V0cHV0RGVzY3JpcHRvciB7CiAgICAgcHVibGljOgogICAgICAgICBPdXRwdXREZXNjcmlwdG9yKCkKLSAgICAgICAgOiBzYW1wbGluZ1JhdGUoMCksIGZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCksIGNoYW5uZWxNYXNrKDApLCBmcmFtZUNvdW50KDApLCBsYXRlbmN5KDApICB7fQorICAgICAgICA6IHNhbXBsaW5nUmF0ZSgwKSwgZm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKSwgY2hhbm5lbE1hc2soMCksIGZyYW1lQ291bnQoMCksIGxhdGVuY3koMCkKKyAgICAgICAgICAgIHt9CiAKICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlOwogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7CkBAIC0xOTMsMjQgKzIwNCwzMiBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CisKKyAgICAvLyBDbGllbnQgbXVzdCBzdWNjZXNzZnVsbHkgaGFuZCBvZmYgdGhlIGhhbmRsZSByZWZlcmVuY2UgdG8gQXVkaW9GbGluZ2VyIHZpYSBjcmVhdGVUcmFjaygpLAorICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlT3V0cHV0KCkuCiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbik7CiAgICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pOwogICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKworICAgIC8vIENsaWVudCBtdXN0IHN1Y2Nlc3NmdWxseSBoYW5kIG9mZiB0aGUgaGFuZGxlIHJlZmVyZW5jZSB0byBBdWRpb0ZsaW5nZXIgdmlhIG9wZW5SZWNvcmQoKSwKKyAgICAvLyBvciByZWxlYXNlIGl0IHdpdGggcmVsZWFzZUlucHV0KCkuCiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOworCiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwogICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CkBAIC0zMDIsOCArMzIxLDYgQEAKIAogICAgIHN0YXRpYyBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBnQXVkaW9Qb2xpY3lTZXJ2aWNlOwogCi0gICAgLy8gbWFwcGluZyBiZXR3ZWVuIHN0cmVhbSB0eXBlcyBhbmQgb3V0cHV0cwotICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9faW9faGFuZGxlX3Q+IGdTdHJlYW1PdXRwdXRNYXA7CiAgICAgLy8gbGlzdCBvZiBvdXRwdXQgZGVzY3JpcHRvcnMgY29udGFpbmluZyBjYWNoZWQgcGFyYW1ldGVycwogICAgIC8vIChzYW1wbGluZyByYXRlLCBmcmFtZWNvdW50LCBjaGFubmVsIGNvdW50Li4uKQogICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIE91dHB1dERlc2NyaXB0b3IgKj4gZ091dHB1dHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKaW5kZXggYzI5YzdlNS4uOTllOWMzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaApAQCAtMTksNiArMTksOCBAQAogCiAjaW5jbHVkZSA8dGltZS5oPgogCituYW1lc3BhY2UgYW5kcm9pZCB7CisKIGNsYXNzIEF1ZGlvVGltZXN0YW1wIHsKIHB1YmxpYzoKICAgICBBdWRpb1RpbWVzdGFtcCgpIDogbVBvc2l0aW9uKDApIHsKQEAgLTMwLDQgKzMyLDYgQEAKICAgICBzdHJ1Y3QgdGltZXNwZWMgbVRpbWU7ICAgICAvLyBjb3JyZXNwb25kaW5nIENMT0NLX01PTk9UT05JQyB3aGVuIGZyYW1lIGlzIGV4cGVjdGVkIHRvIHByZXNlbnQKIH07CiAKK30gICAvLyBuYW1lc3BhY2UKKwogI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX1RJTUVTVEFNUF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IDQ3MzYzNjkuLjJjNDhiYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC0yNyw3ICsyNyw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgYXVkaW9fdHJhY2tfY2Jsa190Oworc3RydWN0IGF1ZGlvX3RyYWNrX2NibGtfdDsKIGNsYXNzIEF1ZGlvVHJhY2tDbGllbnRQcm94eTsKIGNsYXNzIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTsKIApAQCAtMzYsMTEgKzM2LDYgQEAKIGNsYXNzIEF1ZGlvVHJhY2sgOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIGVudW0gY2hhbm5lbF9pbmRleCB7Ci0gICAgICAgIE1PTk8gICA9IDAsCi0gICAgICAgIExFRlQgICA9IDAsCi0gICAgICAgIFJJR0hUICA9IDEKLSAgICB9OwogCiAgICAgLyogRXZlbnRzIHVzZWQgYnkgQXVkaW9UcmFjayBjYWxsYmFjayBmdW5jdGlvbiAoY2FsbGJhY2tfdCkuCiAgICAgICogS2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrLmphdmEgTkFUSVZFX0VWRU5UXyouCkBAIC04Miw2ICs3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGN1cnJlbnRseSBpZ25vcmVkLCBidXQgd2lsbCBtYWtlIHRoZSBwcmltYXJ5IGZpZWxkIGluIGZ1dHVyZSkKIAogICAgICAgICBzaXplX3QgICAgICBzaXplOyAgICAgICAgIC8vIGlucHV0L291dHB1dCBpbiBieXRlcyA9PSBmcmFtZUNvdW50ICogZnJhbWVTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgaXQgaXMgdW51c2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gb3V0cHV0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgZmlsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBpcyByZWR1bmRhbnQgd2l0aCByZXNwZWN0IHRvIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIFRSQU5TRkVSX09CVEFJTiBtb2RlIGlzIGJyb2tlbiBmb3IgOC1iaXQgZGF0YQpAQCAtOTEsNyArODcsNyBAQAogICAgICAgICAgICAgdm9pZCogICAgICAgcmF3OwogICAgICAgICAgICAgc2hvcnQqICAgICAgaTE2OyAgICAgIC8vIHNpZ25lZCAxNi1iaXQKICAgICAgICAgICAgIGludDhfdCogICAgIGk4OyAgICAgICAvLyB1bnNpZ25lZCA4LWJpdCwgb2Zmc2V0IGJ5IDB4ODAKLSAgICAgICAgfTsKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dDogdW51c2VkLCBvdXRwdXQ6IHBvaW50ZXIgdG8gYnVmZmVyCiAgICAgfTsKIAogICAgIC8qIEFzIGEgY29udmVuaWVuY2UsIGlmIGEgY2FsbGJhY2sgaXMgc3VwcGxpZWQsIGEgaGFuZGxlciB0aHJlYWQKQEAgLTEyMyw2ICsxMTksOCBAQAogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbgogICAgICAqICAtIE5PX0lOSVQ6IGF1ZGlvIHNlcnZlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKICAgICAgKiAgLSBCQURfVkFMVUU6IHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBmcmFtZUNvdW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm9uLXplcm8gaWYgc3RhdHVzIGlzIE5PX0VSUk9SLAorICAgICAqIGFuZCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLgogICAgICAqLwogCiAgICAgc3RhdGljIHN0YXR1c190IGdldE1pbkZyYW1lQ291bnQoc2l6ZV90KiBmcmFtZUNvdW50LApAQCAtMTU4LDcgKzE1Niw3IEBACiAgICAgICogc2FtcGxlUmF0ZTogICAgICAgICBEYXRhIHNvdXJjZSBzYW1wbGluZyByYXRlIGluIEh6LgogICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgZm9yIHNpZ25lZAogICAgICAqICAgICAgICAgICAgICAgICAgICAgMTYgYml0cyBwZXIgc2FtcGxlKS4KLSAgICAgKiBjaGFubmVsTWFzazogICAgICAgIENoYW5uZWwgbWFzay4KKyAgICAgKiBjaGFubmVsTWFzazogICAgICAgIENoYW5uZWwgbWFzaywgc3VjaCB0aGF0IGF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSBpcyB0cnVlLgogICAgICAqIGZyYW1lQ291bnQ6ICAgICAgICAgTWluaW11bSBzaXplIG9mIHRyYWNrIFBDTSBidWZmZXIgaW4gZnJhbWVzLiBUaGlzIGRlZmluZXMgdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbidzIGNvbnRyaWJ1dGlvbiB0byB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3kgb2YgdGhlIHRyYWNrLiBUaGUgYWN0dWFsIHNpemUgc2VsZWN0ZWQgYnkgdGhlIEF1ZGlvVHJhY2sgY291bGQgYmUKQEAgLTE4MCwxNSArMTc4LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgICA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgICA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkICAgICAgICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xKTsKIAogICAgIC8qIENyZWF0ZXMgYW4gYXVkaW8gdHJhY2sgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiBXaXRoIHRoaXMgY29uc3RydWN0b3IsIHRoZSB0cmFjayBpcyBjb25maWd1cmVkIGZvciBzdGF0aWMgYnVmZmVyIG1vZGUuCkBAIC0yMDksMTEgKzIwOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xKTsKIAogICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvVHJhY2sgYW5kIHVucmVnaXN0ZXJzIGl0IGZyb20gQXVkaW9GbGluZ2VyLgogICAgICAqIEFsc28gZGVzdHJveXMgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIEF1ZGlvVHJhY2suCkBAIC0yNDEsMTcgKzI0MSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkICAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkICAgICAgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkID0gLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1RyYWNrLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9UcmFjayBBUEkgKGV4Y2VwdCBmb3Igc2V0KCkpLCBiZWNhdXNlIHVzaW5nCkBAIC0yNzksNyArMjgwLDcgQEAKICAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lU2l6ZSgpIGNvbnN0ICAgeyByZXR1cm4gbUZyYW1lU2l6ZTsgfQogCiAgICAgICAgICAgICB1aW50MzJfdCAgICBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50OyB9Ci0gICAgICAgICAgICB1aW50MzJfdCAgICBmcmFtZUNvdW50KCkgY29uc3QgIHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CisgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgIHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CiAKICAgICAvKiBSZXR1cm4gdGhlIHN0YXRpYyBidWZmZXIgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yIG9yIHNldCgpLCBvciAwIGZvciBzdHJlYW1pbmcgbW9kZSAqLwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gc2hhcmVkQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbVNoYXJlZEJ1ZmZlcjsgfQpAQCAtMzM2LDcgKzMzNyw3IEBACiAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRTYW1wbGVSYXRlKHVpbnQzMl90IHNhbXBsZVJhdGUpOwogCi0gICAgLyogUmV0dXJuIGN1cnJlbnQgc291cmNlIHNhbXBsZSByYXRlIGluIEh6LCBvciAwIGlmIHVua25vd24gKi8KKyAgICAvKiBSZXR1cm4gY3VycmVudCBzb3VyY2Ugc2FtcGxlIHJhdGUgaW4gSHogKi8KICAgICAgICAgICAgIHVpbnQzMl90ICAgIGdldFNhbXBsZVJhdGUoKSBjb25zdDsKIAogICAgIC8qIEVuYWJsZXMgbG9vcGluZyBhbmQgc2V0cyB0aGUgc3RhcnQgYW5kIGVuZCBwb2ludHMgb2YgbG9vcGluZy4KQEAgLTM2MSw3ICszNjIsNyBAQAogICAgIC8qIFNldHMgbWFya2VyIHBvc2l0aW9uLiBXaGVuIHBsYXliYWNrIHJlYWNoZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgc3BlY2lmaWVkLCBhIGNhbGxiYWNrIHdpdGgKICAgICAgKiBldmVudCB0eXBlIEVWRU5UX01BUktFUiBpcyBjYWxsZWQuIENhbGxpbmcgc2V0TWFya2VyUG9zaXRpb24gd2l0aCBtYXJrZXIgPT0gMCBjYW5jZWxzIG1hcmtlcgogICAgICAqIG5vdGlmaWNhdGlvbiBjYWxsYmFjay4gIFRvIHNldCBhIG1hcmtlciBhdCBhIHBvc2l0aW9uIHdoaWNoIHdvdWxkIGNvbXB1dGUgYXMgMCwKLSAgICAgKiBhIHdvcmthcm91bmQgaXMgdG8gdGhlIHNldCB0aGUgbWFya2VyIGF0IGEgbmVhcmJ5IHBvc2l0aW9uIHN1Y2ggYXMgfjAgb3IgMS4KKyAgICAgKiBhIHdvcmthcm91bmQgaXMgdG8gc2V0IHRoZSBtYXJrZXIgYXQgYSBuZWFyYnkgcG9zaXRpb24gc3VjaCBhcyB+MCBvciAxLgogICAgICAqIElmIHRoZSBBdWRpb1RyYWNrIGhhcyBiZWVuIG9wZW5lZCB3aXRoIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIGFzc29jaWF0ZWQsIHRoZSBvcGVyYXRpb24gd2lsbAogICAgICAqIGZhaWwuCiAgICAgICoKQEAgLTQ1MCw5ICs0NTEsMTAgQEAKICAgICAgKiAgbm9uZS4KICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlOgotICAgICAqICBoYW5kbGUgb24gYXVkaW8gaGFyZHdhcmUgb3V0cHV0CisgICAgICogIGhhbmRsZSBvbiBhdWRpbyBoYXJkd2FyZSBvdXRwdXQsIG9yIEFVRElPX0lPX0hBTkRMRV9OT05FIGlmIHRoZQorICAgICAqICB0cmFjayBuZWVkZWQgdG8gYmUgcmUtY3JlYXRlZCBidXQgdGhhdCBmYWlsZWQKICAgICAgKi8KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgIGdldE91dHB1dCgpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0T3V0cHV0KCkgY29uc3Q7CiAKICAgICAvKiBSZXR1cm5zIHRoZSB1bmlxdWUgc2Vzc2lvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFjay4KICAgICAgKgpAQCAtNTI4LDE1ICs1MzAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqZWxhcHNlZCA9IE5VTEwsIHNpemVfdCAqbm9uQ29udGlnID0gTlVMTCk7CiBwdWJsaWM6CiAKLS8vRUxfRklYTUUgdG8gYmUgcmVjb25jaWxlZCB3aXRoIG5ldyBvYnRhaW5CdWZmZXIoKSByZXR1cm4gY29kZXMgYW5kIGNvbnRyb2wgYmxvY2sgcHJveHkKLS8vICAgICAgICAgICAgZW51bSB7Ci0vLyAgICAgICAgICAgIE5PX01PUkVfQlVGRkVSUyA9IDB4ODAwMDAwMDEsICAgLy8gc2FtZSBuYW1lIGluIEF1ZGlvRmxpbmdlci5oLCBvayB0byBiZSBkaWZmZXJlbnQgdmFsdWUKLS8vICAgICAgICAgICAgVEVBUl9ET1dOICAgICAgID0gMHg4MDAwMDAwMiwKLS8vICAgICAgICAgICAgU1RPUFBFRCA9IDEsCi0vLyAgICAgICAgICAgIFNUUkVBTV9FTkRfV0FJVCwKLS8vICAgICAgICAgICAgU1RSRUFNX0VORAotLy8gICAgICAgIH07Ci0KICAgICAvKiBSZWxlYXNlIGEgZmlsbGVkIGJ1ZmZlciBvZiAiYXVkaW9CdWZmZXItPmZyYW1lQ291bnQiIGZyYW1lcyBmb3IgQXVkaW9GbGluZ2VyIHRvIHByb2Nlc3MuICovCiAgICAgLy8gRklYTUUgbWFrZSBwcml2YXRlIHdoZW4gb2J0YWluQnVmZmVyKCkgZm9yIFRSQU5TRkVSX09CVEFJTiBpcyByZW1vdmVkCiAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIpOwpAQCAtNTUxLDggKzU0NCwxMSBAQAogICAgICAqICAgICAgV09VTERfQkxPQ0sgICAgICAgICB3aGVuIG9idGFpbkJ1ZmZlcigpIHJldHVybnMgc2FtZSwgb3IKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayB3YXMgc3RvcHBlZCBkdXJpbmcgdGhlIHdyaXRlCiAgICAgICogICAgICBvciBhbnkgb3RoZXIgZXJyb3IgY29kZSByZXR1cm5lZCBieSBJQXVkaW9UcmFjazo6c3RhcnQoKSBvciByZXN0b3JlVHJhY2tfbCgpLgorICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gb25seSByZXR1cm4gdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQuIFNldCAnYmxvY2tpbmcnIHRvCisgICAgICogZmFsc2UgZm9yIHRoZSBtZXRob2QgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyB0byB0cnkgbXVsdGlwbGUgdGltZXMgdG8gd3JpdGUKKyAgICAgKiB0aGUgZnVsbCBjb250ZW50IG9mIHRoZSBidWZmZXIuCiAgICAgICovCi0gICAgICAgICAgICBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKIAogICAgIC8qCiAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHRyYWNrLgpAQCAtNTY2LDcgKzU2Miw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRVbmRlcnJ1bkZyYW1lcygpIGNvbnN0OwogCiAgICAgLyogR2V0IHRoZSBmbGFncyAqLwotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldEZsYWdzKCkgY29uc3QgeyBBdXRvTXV0ZXggX2wobUxvY2spOyByZXR1cm4gbUZsYWdzOyB9CiAKICAgICAvKiBTZXQgcGFyYW1ldGVycyAtIG9ubHkgcG9zc2libGUgd2hlbiB1c2luZyBkaXJlY3Qgb3V0cHV0ICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwpAQCAtNjI2LDUzICs2MjIsNTAgQEAKICAgICAgICAgICAgIC8vICAgICAgTlNfSU5BQ1RJVkUgaW5hY3RpdmUgc28gZG9uJ3QgcnVuIGFnYWluIHVudGlsIHJlLXN0YXJ0ZWQKICAgICAgICAgICAgIC8vICAgICAgTlNfTkVWRVIgICAgbmV2ZXIgYWdhaW4KICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IE5TX1dIRU5FVkVSID0gLTEsIE5TX0lOQUNUSVZFID0gLTIsIE5TX05FVkVSID0gLTM7Ci0gICAgICAgICAgICBuc2Vjc190IHByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1RyYWNrVGhyZWFkPiYgdGhyZWFkKTsKLSAgICAgICAgICAgIHN0YXR1c190IHByb2Nlc3NTdHJlYW1FbmQoaW50MzJfdCB3YWl0Q291bnQpOworICAgICAgICAgICAgbnNlY3NfdCBwcm9jZXNzQXVkaW9CdWZmZXIoKTsKIAorICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWQoKSBjb25zdDsKIAogICAgICAgICAgICAgLy8gY2FsbGVyIG11c3QgaG9sZCBsb2NrIG9uIG1Mb2NrIGZvciBhbGwgX2wgbWV0aG9kcwogCi0gICAgICAgICAgICBzdGF0dXNfdCBjcmVhdGVUcmFja19sKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlcG9jaCk7CisgICAgICAgICAgICBzdGF0dXNfdCBjcmVhdGVUcmFja19sKHNpemVfdCBlcG9jaCk7CiAKICAgICAgICAgICAgIC8vIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUKICAgICAgICAgICAgIHZvaWQgZmx1c2hfbCgpOwogCiAgICAgICAgICAgICB2b2lkIHNldExvb3BfbCh1aW50MzJfdCBsb29wU3RhcnQsIHVpbnQzMl90IGxvb3BFbmQsIGludCBsb29wQ291bnQpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0X2woKTsKIAogICAgICAgICAgICAgLy8gRklYTUUgZW51bSBpcyBmYXN0ZXIgdGhhbiBzdHJjbXAoKSBmb3IgcGFyYW1ldGVyICdmcm9tJwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdG9yZVRyYWNrX2woY29uc3QgY2hhciAqZnJvbSk7CiAKLSAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3QKKyAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkX2woKSBjb25zdAogICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwOyB9CiAKLSAgICAvLyBOZXh0IDMgZmllbGRzIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQsIGJ1dCBhbHdheXMgIT0gMAorICAgIC8vIE5leHQgNCBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCiAgICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQ7ICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoKQogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gICAgbUF1ZGlvVHJhY2tUaHJlYWQ7CisKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtVm9sdW1lWzJdOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgbXV0YWJsZSB1aW50MzJfdCAgICAgICAgbVNhbXBsZVJhdGU7ICAgICAgICAgICAgLy8gbXV0YWJsZSBiZWNhdXNlIGdldFNhbXBsZVJhdGUoKSBjYW4gdXBkYXRlIGl0LgotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2sKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudDsgICAgICAgICAvLyBmcmFtZSBjb3VudCB0byByZXF1ZXN0IHRoZSBuZXh0IHRpbWUgYSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJQXVkaW9UcmFjayBpcyBuZWVkZWQKLQorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2ssIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBieSBBdWRpb0ZsaW5nZXIgdG8gdGhlIGNsaWVudAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50OyAgICAgICAgIC8vIGZyYW1lIGNvdW50IHRvIHJlcXVlc3QgdGhlIGZpcnN0IG9yIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbmV3IElBdWRpb1RyYWNrIGlzIG5lZWRlZCwgbm9uLWRlY3JlYXNpbmcKIAogICAgIC8vIGNvbnN0YW50IGFmdGVyIGNvbnN0cnVjdG9yIG9yIHNldCgpCiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAgICAgICAgLy8gYXMgcmVxdWVzdGVkIGJ5IGNsaWVudCwgbm90IGZvcmNlZCB0byAxNi1iaXQKICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyOwogICAgIHRyYW5zZmVyX3R5cGUgICAgICAgICAgIG1UcmFuc2ZlcjsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCAgICBtT2ZmbG9hZEluZm9Db3B5OworICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190KiBtT2ZmbG9hZEluZm87CiAKICAgICAvLyBtRnJhbWVTaXplIGlzIGVxdWFsIHRvIG1GcmFtZVNpemVBRiBmb3Igbm9uLVBDTSBvciAxNi1iaXQgUENNIGRhdGEuICBGb3IgOC1iaXQgUENNIGRhdGEsIGl0J3MKICAgICAvLyB0d2ljZSBhcyBsYXJnZSBhcyBtRnJhbWVTaXplIGJlY2F1c2UgZGF0YSBpcyBleHBhbmRlZCB0byAxNi1iaXQgYmVmb3JlIGl0J3Mgc3RvcmVkIGluIGJ1ZmZlci4KQEAgLTcwNSwyMSArNjk4LDI1IEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgLy8gYWN0dWFsIG51bWJlciBvZiBmcmFtZXMgYmV0d2VlbiBlYWNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGluaXRpYWwgc291cmNlIHNhbXBsZSByYXRlCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2ggbmV4dCAyCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUmVtYWluaW5nRnJhbWVzIGFuZCBtUmV0cnlPblBhcnRpYWxCdWZmZXIKIAogICAgIC8vIFRoZXNlIGFyZSBwcml2YXRlIHRvIHByb2Nlc3NBdWRpb0J1ZmZlcigpLCBhbmQgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgYSBsb2NrCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lczsgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyB0byByZXF1ZXN0IGluIG9idGFpbkJ1ZmZlcigpCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyOyAgLy8gc2xlZXAgYW5kIHJldHJ5IGFmdGVyIHBhcnRpYWwgb2J0YWluQnVmZmVyKCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQogCi0gICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlcjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTG9vcFBlcmlvZDsgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIHplcm8gbWVhbnMgbG9vcGluZyBpcyBkaXNhYmxlZAorCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU1hcmtlclBvc2l0aW9uOyAgICAgICAgLy8gaW4gd3JhcHBpbmcgKG92ZXJmbG93KSBmcmFtZSB1bml0cwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1NYXJrZXJSZWFjaGVkOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsgICAgICAgICAgIC8vIGluIGZyYW1lcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1VcGRhdGVQZXJpb2Q7ICAgICAgICAgIC8vIGluIGZyYW1lcywgemVybyBtZWFucyBubyBFVkVOVF9ORVdfUE9TCiAKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7CisgICAgICAgIC8vIGNvbnN0IGFmdGVyIHNldCgpLCBleGNlcHQgZm9yIGJpdHMgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBhbmQgQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRC4KKyAgICAgICAgLy8gbUxvY2sgbXVzdCBiZSBoZWxkIHRvIHJlYWQgb3Igd3JpdGUgdGhvc2UgYml0cyByZWxpYWJseS4KKwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogCkBAIC03MzksNyArNzM2LDYgQEAKICAgICBzcDxBdWRpb1RyYWNrQ2xpZW50UHJveHk+ICAgICAgIG1Qcm94eTsgICAgICAgICAvLyBwcmltYXJ5IG93bmVyIG9mIHRoZSBtZW1vcnkKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1JblVuZGVycnVuOyAgICAgICAgICAgIC8vIHdoZXRoZXIgdHJhY2sgaXMgY3VycmVudGx5IGluIHVuZGVycnVuIHN0YXRlCi0gICAgU3RyaW5nOCAgICAgICAgICAgICAgICAgbU5hbWU7ICAgICAgICAgICAgICAgICAgLy8gc2VydmVyJ3MgbmFtZSBmb3IgdGhpcyBJQXVkaW9UcmFjawogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1QYXVzZWRQb3NpdGlvbjsKIAogcHJpdmF0ZToKQEAgLTc1NCw4ICs3NTAsOCBAQAogCiAgICAgc3A8RGVhdGhOb3RpZmllcj4gICAgICAgbURlYXRoTm90aWZpZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcXVlbmNlOyAgICAgICAgICAgICAgLy8gaW5jcmVtZW50ZWQgZm9yIGVhY2ggbmV3IElBdWRpb1RyYWNrIGF0dGVtcHQKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0OyAgICAgICAgICAgICAgICAvLyBjYWNoZWQgb3V0cHV0IGlvIGhhbmRsZQogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQ7CisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKIH07CiAKIGNsYXNzIFRpbWVkQXVkaW9UcmFjayA6IHB1YmxpYyBBdWRpb1RyYWNrCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCmluZGV4IDI4MmYyNzUuLjkxMDFmMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCkBAIC02NCwyNSArNjQsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBzdWNjZXNzZnVsIHJldHVybiwgQXVkaW9GbGluZ2VyIHRha2VzIG92ZXIgdGhlIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgYW5kIHdpbGwgcmVsZWFzZSBpdCB3aGVuIHRoZSB0cmFjayBpcyBkZXN0cm95ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIgb24gZmFpbHVyZSwgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsICAvLyAtMSBtZWFucyB1bnVzZWQsIG90aGVyd2lzZSBtdXN0IGJlIHZhbGlkIG5vbi0wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dDogaWdub3JlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQ6IHNlcnZlcidzIGRlc2NyaXB0aW9uIG9mIElBdWRpb1RyYWNrIGZvciBkaXNwbGF5IGluIGxvZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGF0dGVtcHQgdG8gcGFyc2UsIGFzIHRoZSBmb3JtYXQgY291bGQgY2hhbmdlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHNwPElBdWRpb1JlY29yZD4gb3BlblJlY29yZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT24gc3VjY2Vzc2Z1bCByZXR1cm4sIEF1ZGlvRmxpbmdlciB0YWtlcyBvdmVyIHRoZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGFuZCB3aWxsIHJlbGVhc2UgaXQgd2hlbiB0aGUgdHJhY2sgaXMgZGVzdHJveWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyIG9uIGZhaWx1cmUsIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwgIC8vIC0xIG1lYW5zIHVudXNlZCwgb3RoZXJ3aXNlIG11c3QgYmUgdmFsaWQgbm9uLTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCkBAIC0xNjMsNyArMTY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgPSAwOwogCkBAIC0xNzQsOCArMTc2LDggQEAKIAogICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpIGNvbnN0ID0gMDsKIApAQCAtMTg4LDYgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIGRvZXNuJ3QgdGFrZSBvdmVyIGhhbmRsZSByZWZlcmVuY2UgZnJvbSBjbGllbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjNlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSV9NRURJQV9IVFRQX0NPTk5FQ1RJT05fSF8KKworI2RlZmluZSBJX01FRElBX0hUVFBfQ09OTkVDVElPTl9IXworCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb247CisKKy8qKiBNVVNUIHN0YXkgaW4gc3luYyB3aXRoIElNZWRpYUhUVFBDb25uZWN0aW9uLmFpZGwgKi8KKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uIDogcHVibGljIElJbnRlcmZhY2UgeworICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFIVFRQQ29ubmVjdGlvbik7CisKKyAgICB2aXJ0dWFsIGJvb2wgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgPSAwOworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7CisgICAgdmlydHVhbCBvZmY2NF90IGdldFNpemUoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNSU1FVHlwZShTdHJpbmc4ICptaW1lVHlwZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VXJpKFN0cmluZzggKnVyaSkgPSAwOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElNZWRpYUhUVFBDb25uZWN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSV9NRURJQV9IVFRQX0NPTk5FQ1RJT05fSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjZkNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElfTUVESUFfSFRUUF9TRVJWSUNFX0hfCisKKyNkZWZpbmUgSV9NRURJQV9IVFRQX1NFUlZJQ0VfSF8KKworI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbjsKKworLyoqIE1VU1Qgc3RheSBpbiBzeW5jIHdpdGggSU1lZGlhSFRUUFNlcnZpY2UuYWlkbCAqLworCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZSB7CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUhUVFBTZXJ2aWNlKTsKKworICAgIHZpcnR1YWwgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpID0gMDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJTWVkaWFIVFRQU2VydmljZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIElfTUVESUFfSFRUUF9TRVJWSUNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggNmRiYjJkNy4uMjUyOTgwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMjYsNiArMjYsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKKwogY2xhc3MgSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiBwdWJsaWM6CkBAIC0zMyw2ICszNSw3IEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCmluZGV4IDBjYmQyNjkuLmRiNjJjZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaApAQCAtMzMsNiArMzMsNyBAQAogY2xhc3MgU3VyZmFjZTsKIGNsYXNzIElTdHJlYW1Tb3VyY2U7CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogCiBjbGFzcyBJTWVkaWFQbGF5ZXI6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CkBAIC00MSw4ICs0MiwxMSBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4qIGhlYWRlcnMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+KiBoZWFkZXJzKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiYgc291cmNlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggMjk5OGIzNy4uNWI0NTM3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTM0LDYgKzM0LDcgQEAKIHN0cnVjdCBJQ3J5cHRvOwogc3RydWN0IElEcm07CiBzdHJ1Y3QgSUhEQ1A7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFSZWNvcmRlcjsKIGNsYXNzIElPTVg7CiBjbGFzcyBJUmVtb3RlRGlzcGxheTsKQEAgLTQ5LDkgKzUwLDE0IEBACiAgICAgdmlydHVhbCBzcDxJTWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gY3JlYXRlTWV0YWRhdGFSZXRyaWV2ZXIoKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+IGNyZWF0ZShjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBhdWRpb1Nlc3Npb25JZCA9IDApID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkgPSAwOwpAQCAtOTMsOSArOTksNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIGFkZEJhdHRlcnlEYXRhKHVpbnQzMl90IHBhcmFtcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHVsbEJhdHRlcnlEYXRhKFBhcmNlbCogcmVwbHkpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKaW5kZXggNjY0MzczNi4uZjZmOWU3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JT01YLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKQEAgLTE0Myw2ICsxNDMsOCBAQAogICAgICAgICBJTlRFUk5BTF9PUFRJT05fU1VTUEVORCwgIC8vIGRhdGEgaXMgYSBib29sCiAgICAgICAgIElOVEVSTkFMX09QVElPTl9SRVBFQVRfUFJFVklPVVNfRlJBTUVfREVMQVksICAvLyBkYXRhIGlzIGFuIGludDY0X3QKICAgICAgICAgSU5URVJOQUxfT1BUSU9OX01BWF9USU1FU1RBTVBfR0FQLCAvLyBkYXRhIGlzIGludDY0X3QKKyAgICAgICAgSU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUsIC8vIGRhdGEgaXMgYW4gaW50NjRfdAorICAgICAgICBJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRSwgLy8gZGF0YSBpcyBhbiBpbnQ2NF90WzJdCiAgICAgfTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEludGVybmFsT3B0aW9uKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAppbmRleCBlY2MzYjY1Li5iYjZiOTdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaApAQCAtMjQsNiArMjQsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKKwogLy8gQWJzdHJhY3QgYmFzZSBjbGFzcwogY2xhc3MgTWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2UgOiBwdWJsaWMgUmVmQmFzZQogewpAQCAtMzIsNiArMzQsNyBAQAogICAgIHZpcnR1YWwgICAgICAgICAgICAgfk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlKCkge30KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpID0gMDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCmluZGV4IDI2ZDg3MjkuLjg3NzE3ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTEzNyw2ICsxMzcsNyBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpID0gMDsKIApAQCAtMjEzLDExICsyMTQsNiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKaW5kZXggMGRmNzdjMS4uYjM1Y2YzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFQbGF5ZXJTZXJ2aWNlOwogY2xhc3MgSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7CiAKQEAgLTY4LDYgKzY5LDcgQEAKICAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YVNvdXJjZVVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAppbmRleCA0YzA1ZmMzLi4zY2EzMDk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCkBAIC0xODksNiArMTg5LDggQEAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKIH07CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKKwogY2xhc3MgTWVkaWFQbGF5ZXIgOiBwdWJsaWMgQm5NZWRpYVBsYXllckNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgSU1lZGlhRGVhdGhOb3RpZmllcgogewpAQCAtMTk5LDYgKzIwMSw3IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKQEAgLTIyMCwxMyArMjIzLDE5IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50ICptc2VjKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7Ci0gICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CisgICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgICAgICBzaXplX3QgKnBTaXplKTsKICAgICBzdGF0aWMgIHN0YXR1c190ICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOwpAQCAtMjQyLDkgKzI1MSw2IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IGNoYXIqIGFkZHJTdHJpbmcsIHVpbnQxNl90IHBvcnQpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE5leHRNZWRpYVBsYXllcihjb25zdCBzcDxNZWRpYVBsYXllcj4mIHBsYXllcik7CiAKLSAgICAgICAgICAgIHN0YXR1c190IHVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCiBwcml2YXRlOgogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyX2woKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZWVrVG9fbChpbnQgbXNlYyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCmluZGV4IDg4YTQyYTAuLjE0MmNiOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCkBAIC0zOSw3ICszOSw3IEBACiBlbnVtIHZpZGVvX3NvdXJjZSB7CiAgICAgVklERU9fU09VUkNFX0RFRkFVTFQgPSAwLAogICAgIFZJREVPX1NPVVJDRV9DQU1FUkEgPSAxLAotICAgIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiA9IDIsCisgICAgVklERU9fU09VUkNFX1NVUkZBQ0UgPSAyLAogCiAgICAgVklERU9fU09VUkNFX0xJU1RfRU5EICAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGF1ZGlvIHNvdXJjZSB0eXBlCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKaW5kZXggYTczNDAzYi4uNDUzNzY3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCiBzdHJ1Y3QgZGlyZW50OwpAQCAtMjksNiArMzAsNyBAQAogCiBjbGFzcyBNZWRpYVNjYW5uZXJDbGllbnQ7CiBjbGFzcyBTdHJpbmdBcnJheTsKK2NsYXNzIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I7CiAKIGVudW0gTWVkaWFTY2FuUmVzdWx0IHsKICAgICAvLyBUaGlzIGZpbGUgb3IgZGlyZWN0b3J5IHdhcyBzY2FubmVkIHN1Y2Nlc3NmdWxseS4KQEAgLTk0LDE1ICs5Niw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaW1lVHlwZShjb25zdCBjaGFyKiBtaW1lVHlwZSkgPSAwOwogCiBwcm90ZWN0ZWQ6Ci0gICAgdm9pZCBjb252ZXJ0VmFsdWVzKHVpbnQzMl90IGVuY29kaW5nKTsKLQotcHJvdGVjdGVkOgotICAgIC8vIGNhY2hlZCBuYW1lIGFuZCB2YWx1ZSBzdHJpbmdzLCBmb3IgbmF0aXZlIGVuY29kaW5nIHN1cHBvcnQuCi0gICAgU3RyaW5nQXJyYXkqICAgIG1OYW1lczsKLSAgICBTdHJpbmdBcnJheSogICAgbVZhbHVlczsKLQotICAgIC8vIGRlZmF1bHQgZW5jb2RpbmcgYmFzZWQgb24gTWVkaWFTY2FubmVyOjptTG9jYWxlIHN0cmluZwotICAgIHVpbnQzMl90ICAgICAgICBtTG9jYWxlRW5jb2Rpbmc7CisgICAgLy8gZGVmYXVsdCBlbmNvZGluZyBmcm9tIE1lZGlhU2Nhbm5lcjo6bUxvY2FsZQorICAgIFN0cmluZzggbUxvY2FsZTsKKyAgICBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yICptRW5jb2RpbmdEZXRlY3RvcjsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCmluZGV4IDJjNGFhZmYuLmIxNmUyMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCkBAIC0yNyw3ICsyNyw3IEBACiBjbGFzcyBBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlIDogcHVibGljIE5CQUlPX1NvdXJjZSB7CiAKIHB1YmxpYzoKLSAgICBBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnByb3ZpZGVyLCBOQkFJT19Gb3JtYXQgZm9ybWF0KTsKKyAgICBBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnByb3ZpZGVyLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CiAgICAgdmlydHVhbCB+QXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZSgpOwogCiAgICAgLy8gTkJBSU9fUG9ydCBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKaW5kZXggMDdkOGM4OS4uZWFlYTYzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKQEAgLTQzLDcgKzQzLDcgQEAKIAogICAgIC8vIFRoaXMgaXMgYW4gb3Zlci1lc3RpbWF0ZSwgYW5kIGNvdWxkIGR1cGUgdGhlIGNhbGxlciBpbnRvIG1ha2luZyBhIGJsb2NraW5nIHJlYWQoKQogICAgIC8vIEZJWE1FIFVzZSBhbiBhdWRpbyBIQUwgQVBJIHRvIHF1ZXJ5IHRoZSBidWZmZXIgZmlsbGluZyBzdGF0dXMgd2hlbiBpdCdzIGF2YWlsYWJsZS4KLSAgICB2aXJ0dWFsIHNzaXplX3QgYXZhaWxhYmxlVG9SZWFkKCkgeyByZXR1cm4gbVN0cmVhbUJ1ZmZlclNpemVCeXRlcyA+PiBtQml0U2hpZnQ7IH0KKyAgICB2aXJ0dWFsIHNzaXplX3QgYXZhaWxhYmxlVG9SZWFkKCkgeyByZXR1cm4gbVN0cmVhbUJ1ZmZlclNpemVCeXRlcyAvIG1GcmFtZVNpemU7IH0KIAogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKaW5kZXggNzk0OGQ0MC4uOTk0OWI4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCkBAIC00Myw3ICs0Myw3IEBACiAKICAgICAvLyBUaGlzIGlzIGFuIG92ZXItZXN0aW1hdGUsIGFuZCBjb3VsZCBkdXBlIHRoZSBjYWxsZXIgaW50byBtYWtpbmcgYSBibG9ja2luZyB3cml0ZSgpCiAgICAgLy8gRklYTUUgVXNlIGFuIGF1ZGlvIEhBTCBBUEkgdG8gcXVlcnkgdGhlIGJ1ZmZlciBlbXB0eWluZyBzdGF0dXMgd2hlbiBpdCdzIGF2YWlsYWJsZS4KLSAgICB2aXJ0dWFsIHNzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgPj4gbUJpdFNoaWZ0OyB9CisgICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtQnVmZmVyU2l6ZUJ5dGVzIC8gbUZyYW1lU2l6ZTsgfQogCiAgICAgdmlydHVhbCBzc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCmluZGV4IGQzODAyZmUuLmIwOWIzNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAvLyBOb3RlOiB3aGF0ZXZlciBzaGFyZXMgdGhpcyBvYmplY3Qgd2l0aCBhbm90aGVyIHRocmVhZCBuZWVkcyB0byBkbyBzbyBpbiBhbiBTTVAtc2FmZSB3YXkgKGxpa2UKICAgICAvLyBjcmVhdGluZyBpdCB0aGUgb2JqZWN0IGJlZm9yZSBjcmVhdGluZyB0aGUgb3RoZXIgdGhyZWFkLCBvciBzdG9yaW5nIHRoZSBvYmplY3Qgd2l0aCBhCiAgICAgLy8gcmVsZWFzZV9zdG9yZSkuIE90aGVyd2lzZSB0aGUgb3RoZXIgdGhyZWFkIGNvdWxkIHNlZSBhIHBhcnRpYWxseS1jb25zdHJ1Y3RlZCBvYmplY3QuCi0gICAgTW9ub1BpcGUoc2l6ZV90IHJlcUZyYW1lcywgTkJBSU9fRm9ybWF0IGZvcm1hdCwgYm9vbCB3cml0ZUNhbkJsb2NrID0gZmFsc2UpOworICAgIE1vbm9QaXBlKHNpemVfdCByZXFGcmFtZXMsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0LCBib29sIHdyaXRlQ2FuQmxvY2sgPSBmYWxzZSk7CiAgICAgdmlydHVhbCB+TW9ub1BpcGUoKTsKIAogICAgIC8vIE5CQUlPX1BvcnQgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKaW5kZXggMWRhMGM3My4uYmUwYzE1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTUyLDMxICs1Myw0MSBAQAogLy8gdGhlIGNvbWJpbmF0aW9ucyB0aGF0IGFyZSBhY3R1YWxseSBuZWVkZWQgd2l0aGluIEF1ZGlvRmxpbmdlci4gIElmIHRoZSBsaXN0IG9mIGNvbWJpbmF0aW9ucyBncm93cwogLy8gdG9vIGxhcmdlLCB0aGVuIHRoaXMgZGVjaXNpb24gc2hvdWxkIGJlIHJlLXZpc2l0ZWQuCiAvLyBTYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbCBjb3VudCBhcmUgZXhwbGljaXQsIFBDTSBpbnRlcmxlYXZlZCAxNi1iaXQgaXMgYXNzdW1lZC4KLXR5cGVkZWYgdW5zaWduZWQgTkJBSU9fRm9ybWF0OwotZW51bSB7Ci0gICAgRm9ybWF0X0ludmFsaWQKK3N0cnVjdCBOQkFJT19Gb3JtYXQgeworLy8gRklYTUUgbWFrZSB0aGlzIGEgY2xhc3MsIGFuZCBjaGFuZ2UgRm9ybWF0Xy4uLiBnbG9iYWwgbWV0aG9kcyB0byBjbGFzcyBtZXRob2RzCisvL3ByaXZhdGU6CisgICAgdW5zaWduZWQgICAgbVNhbXBsZVJhdGU7CisgICAgdW5zaWduZWQgICAgbUNoYW5uZWxDb3VudDsKKyAgICBhdWRpb19mb3JtYXRfdCAgbUZvcm1hdDsKKyAgICBzaXplX3QgICAgICBtRnJhbWVTaXplOwogfTsKIAotLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIG9mIGFuIE5CQUlPX0Zvcm1hdCBpbiBieXRlcwotc2l6ZV90IEZvcm1hdF9mcmFtZVNpemUoTkJBSU9fRm9ybWF0IGZvcm1hdCk7CitleHRlcm4gY29uc3QgTkJBSU9fRm9ybWF0IEZvcm1hdF9JbnZhbGlkOwogCi0vLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgb2YgYW4gTkJBSU9fRm9ybWF0IGFzIGEgYml0IHNoaWZ0Ci1zaXplX3QgRm9ybWF0X2ZyYW1lQml0U2hpZnQoTkJBSU9fRm9ybWF0IGZvcm1hdCk7CisvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgb2YgYW4gTkJBSU9fRm9ybWF0IGluIGJ5dGVzCitzaXplX3QgRm9ybWF0X2ZyYW1lU2l6ZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CiAKIC8vIENvbnZlcnQgYSBzYW1wbGUgcmF0ZSBpbiBIeiBhbmQgY2hhbm5lbCBjb3VudCB0byBhbiBOQkFJT19Gb3JtYXQKLU5CQUlPX0Zvcm1hdCBGb3JtYXRfZnJvbV9TUl9DKHVuc2lnbmVkIHNhbXBsZVJhdGUsIHVuc2lnbmVkIGNoYW5uZWxDb3VudCk7CisvLyBGSVhNRSByZW5hbWUKK05CQUlPX0Zvcm1hdCBGb3JtYXRfZnJvbV9TUl9DKHVuc2lnbmVkIHNhbXBsZVJhdGUsIHVuc2lnbmVkIGNoYW5uZWxDb3VudCwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKIAogLy8gUmV0dXJuIHRoZSBzYW1wbGUgcmF0ZSBpbiBIeiBvZiBhbiBOQkFJT19Gb3JtYXQKLXVuc2lnbmVkIEZvcm1hdF9zYW1wbGVSYXRlKE5CQUlPX0Zvcm1hdCBmb3JtYXQpOwordW5zaWduZWQgRm9ybWF0X3NhbXBsZVJhdGUoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpOwogCiAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgY291bnQgb2YgYW4gTkJBSU9fRm9ybWF0Ci11bnNpZ25lZCBGb3JtYXRfY2hhbm5lbENvdW50KE5CQUlPX0Zvcm1hdCBmb3JtYXQpOwordW5zaWduZWQgRm9ybWF0X2NoYW5uZWxDb3VudChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CiAKIC8vIENhbGxiYWNrcyB1c2VkIGJ5IE5CQUlPX1Npbms6OndyaXRlVmlhKCkgYW5kIE5CQUlPX1NvdXJjZTo6cmVhZFZpYSgpIGJlbG93LgogdHlwZWRlZiBzc2l6ZV90ICgqd3JpdGVWaWFfdCkodm9pZCAqdXNlciwgdm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpOwogdHlwZWRlZiBzc2l6ZV90ICgqcmVhZFZpYV90KSh2b2lkICp1c2VyLCBjb25zdCB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgaW50NjRfdCByZWFkUFRTKTsKIAorLy8gQ2hlY2sgd2hldGhlciBhbiBOQkFJT19Gb3JtYXQgaXMgdmFsaWQKK2Jvb2wgRm9ybWF0X2lzVmFsaWQoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpOworCisvLyBDb21wYXJlIHR3byBOQkFJT19Gb3JtYXQgdmFsdWVzCitib29sIEZvcm1hdF9pc0VxdWFsKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0MSwgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQyKTsKKwogLy8gQWJzdHJhY3QgY2xhc3MgKGludGVyZmFjZSkgcmVwcmVzZW50aW5nIGEgZGF0YSBwb3J0LgogY2xhc3MgTkJBSU9fUG9ydCA6IHB1YmxpYyBSZWZCYXNlIHsKIApAQCAtMTE1LDE1ICsxMjYsMTUgQEAKICAgICB2aXJ0dWFsIE5CQUlPX0Zvcm1hdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtTmVnb3RpYXRlZCA/IG1Gb3JtYXQgOiBGb3JtYXRfSW52YWxpZDsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgTkJBSU9fUG9ydChOQkFJT19Gb3JtYXQgZm9ybWF0KSA6IG1OZWdvdGlhdGVkKGZhbHNlKSwgbUZvcm1hdChmb3JtYXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0U2hpZnQoRm9ybWF0X2ZyYW1lQml0U2hpZnQoZm9ybWF0KSkgeyB9CisgICAgTkJBSU9fUG9ydChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkgOiBtTmVnb3RpYXRlZChmYWxzZSksIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemUoRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpKSB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19Qb3J0KCkgeyB9CiAKICAgICAvLyBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gaWdub3JlIHRoZXNlIGlmIHRoZXkgZG9uJ3QgbmVlZCB0aGVtCiAKICAgICBib29sICAgICAgICAgICAgbU5lZ290aWF0ZWQ7ICAgIC8vIG1OZWdvdGlhdGVkIGltcGxpZXMgKG1Gb3JtYXQgIT0gRm9ybWF0X0ludmFsaWQpCiAgICAgTkJBSU9fRm9ybWF0ICAgIG1Gb3JtYXQ7ICAgICAgICAvLyAobUZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCkgZG9lcyBub3QgaW1wbHkgbU5lZ290aWF0ZWQKLSAgICBzaXplX3QgICAgICAgICAgbUJpdFNoaWZ0OyAgICAgIC8vIGFzc2lnbiBpbiBwYXJhbGxlbCB3aXRoIGFueSBhc3NpZ25tZW50IHRvIG1Gb3JtYXQKKyAgICBzaXplX3QgICAgICAgICAgbUZyYW1lU2l6ZTsgICAgIC8vIGFzc2lnbiBpbiBwYXJhbGxlbCB3aXRoIGFueSBhc3NpZ25tZW50IHRvIG1Gb3JtYXQKIH07CiAKIC8vIEFic3RyYWN0IGNsYXNzIChpbnRlcmZhY2UpIHJlcHJlc2VudGluZyBhIG5vbi1ibG9ja2luZyBkYXRhIHNpbmssIGZvciB1c2UgYnkgYSBkYXRhIHByb3ZpZGVyLgpAQCAtMjIwLDcgKzIzMSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KIAogcHJvdGVjdGVkOgotICAgIE5CQUlPX1NpbmsoTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1dyaXR0ZW4oMCkgeyB9CisgICAgTkJBSU9fU2luayhjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1dyaXR0ZW4oMCkgeyB9CiAgICAgdmlydHVhbCB+TkJBSU9fU2luaygpIHsgfQogCiAgICAgLy8gSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGlnbm9yZSB0aGVzZSBpZiB0aGV5IGRvbid0IG5lZWQgdGhlbQpAQCAtMzExLDcgKzMyMiw3IEBACiAgICAgdmlydHVhbCB2b2lkICAgIG9uVGltZXN0YW1wKGNvbnN0IEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgTkJBSU9fU291cmNlKE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZCkgOiBOQkFJT19Qb3J0KGZvcm1hdCksIG1GcmFtZXNSZWFkKDApIHsgfQorICAgIE5CQUlPX1NvdXJjZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1JlYWQoMCkgeyB9CiAgICAgdmlydHVhbCB+TkJBSU9fU291cmNlKCkgeyB9CiAKICAgICAvLyBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gaWdub3JlIHRoZXNlIGlmIHRoZXkgZG9uJ3QgbmVlZCB0aGVtCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCmluZGV4IDc5YTRlZWUuLmM3ODQxMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCkBAIC0zMCw3ICszMCw3IEBACiAKIHB1YmxpYzoKICAgICAvLyBtYXhGcmFtZXMgd2lsbCBiZSByb3VuZGVkIHVwIHRvIGEgcG93ZXIgb2YgMiwgYW5kIGFsbCBzbG90cyBhcmUgYXZhaWxhYmxlLiBNdXN0IGJlID49IDIuCi0gICAgUGlwZShzaXplX3QgbWF4RnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0KTsKKyAgICBQaXBlKHNpemVfdCBtYXhGcmFtZXMsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KTsKICAgICB2aXJ0dWFsIH5QaXBlKCk7CiAKICAgICAvLyBOQkFJT19Qb3J0IGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaAppbmRleCBjZGZiNmZlLi5kYWY2YmMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApAQCAtNDEsNyArNDEsNyBAQAogCiBwcml2YXRlOgogICAgIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4gbVNvdXJjZTsgICAgIC8vIHRoZSB3cmFwcGVkIHNvdXJjZQotICAgIC8qY29uc3QqLyBzaXplX3QgICAgbUZyYW1lQml0U2hpZnQ7IC8vIGxvZzIoZnJhbWUgc2l6ZSBpbiBieXRlcykKKyAgICAvKmNvbnN0Ki8gc2l6ZV90ICAgIG1GcmFtZVNpemU7IC8vIGZyYW1lIHNpemUgaW4gYnl0ZXMKICAgICB2b2lkKiAgICAgICAgICAgICAgIG1BbGxvY2F0ZWQ7IC8vIHBvaW50ZXIgdG8gYmFzZSBvZiBhbGxvY2F0ZWQgbWVtb3J5CiAgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2l6ZTsgICAgICAvLyBzaXplIG9mIG1BbGxvY2F0ZWQgaW4gZnJhbWVzCiAgICAgc2l6ZV90ICAgICAgICAgICAgICBtT2Zmc2V0OyAgICAvLyBmcmFtZSBvZmZzZXQgd2l0aGluIG1BbGxvY2F0ZWQgb2YgdmFsaWQgZGF0YQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggN2JhNWFjYy4uOGVjN2YxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC02Nyw4ICs2Nyw2IEBACiAKICAgICB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpOwogCi0gICAgYm9vbCBpc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrKCkgeyByZXR1cm4gbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2s7IH0KLQogICAgIHN0cnVjdCBQb3J0RGVzY3JpcHRpb24gOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgICAgIHNpemVfdCBjb3VudEJ1ZmZlcnMoKTsKICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEQXQoc2l6ZV90IGluZGV4KSBjb25zdDsKQEAgLTE3OCw2ICsxNzYsOCBAQAogICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlclsyXTsKIAogICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7CisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKIAogICAgIFZlY3RvcjxCdWZmZXJJbmZvPiBtQnVmZmVyc1syXTsKICAgICBib29sIG1Qb3J0RU9TWzJdOwpAQCAtMTg5LDcgKzE4OSw3IEBACiAgICAgYm9vbCBtSXNFbmNvZGVyOwogICAgIGJvb2wgbVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0OwogICAgIGJvb2wgbVNodXRkb3duSW5Qcm9ncmVzczsKLSAgICBib29sIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrOworICAgIGJvb2wgbUV4cGxpY2l0U2h1dGRvd247CiAKICAgICAvLyBJZiAibUtlZXBDb21wb25lbnRBbGxvY2F0ZWQiIHdlIG9ubHkgdHJhbnNpdGlvbiBiYWNrIHRvIExvYWRlZCBzdGF0ZQogICAgIC8vIGFuZCBkbyBub3QgcmVsZWFzZSB0aGUgY29tcG9uZW50IGluc3RhbmNlLgpAQCAtMjAzLDEwICsyMDMsMTYgQEAKICAgICB1bnNpZ25lZCBtRGVxdWV1ZUNvdW50ZXI7CiAgICAgYm9vbCBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVyczsKICAgICBpbnQzMl90IG1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdDsKKyAgICBzaXplX3QgbU51bVVuZGVxdWV1ZWRCdWZmZXJzOwogCiAgICAgaW50NjRfdCBtUmVwZWF0RnJhbWVEZWxheVVzOwogICAgIGludDY0X3QgbU1heFB0c0dhcFVzOwogCisgICAgaW50NjRfdCBtVGltZVBlckZyYW1lVXM7CisgICAgaW50NjRfdCBtVGltZVBlckNhcHR1cmVVczsKKworICAgIGJvb2wgbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZDsKKwogICAgIHN0YXR1c190IHNldEN5Y2xpY0ludHJhTWFjcm9ibG9ja1JlZnJlc2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgbW9kZSk7CiAgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICBzdGF0dXNfdCBmcmVlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCk7CkBAIC0zMDAsNiArMzA2LDcgQEAKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VzKCk7CiAKICAgICB2b2lkIHNlbmRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CisgICAgc3RhdHVzX3QgZ2V0UG9ydEZvcm1hdChPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwogCiAgICAgdm9pZCBzaWduYWxFcnJvcigKICAgICAgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyb3IgPSBPTVhfRXJyb3JVbmRlZmluZWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAppbmRleCBhODI5OTE2Li5kZDBhMTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOwogCi0gICAgdmlydHVhbCB2b2lkIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydENhbWVyYVJlY29yZGluZygpOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKTsKIAogICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBuZWVkIHRvIHNraXAgdGhlIGN1cnJlbnQgZnJhbWUuCkBAIC0xODUsNiArMTg1LDggQEAKICAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKIAorICAgIHZvaWQgcmVsZWFzZUNhbWVyYSgpOworCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBDYW1lcmFTb3VyY2VMaXN0ZW5lcjsKIApAQCAtMjMzLDcgKzIzNSw2IEBACiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlKTsKIAogICAgIHZvaWQgc3RvcENhbWVyYVJlY29yZGluZygpOwotICAgIHZvaWQgcmVsZWFzZUNhbWVyYSgpOwogICAgIHN0YXR1c190IHJlc2V0KCk7CiAKICAgICBDYW1lcmFTb3VyY2UoY29uc3QgQ2FtZXJhU291cmNlICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaAppbmRleCAxNTdiMWFhLi5mODc4N2RkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaApAQCAtMzEsNiArMzEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBTdHJpbmc4OwogCiBjbGFzcyBEYXRhU291cmNlIDogcHVibGljIFJlZkJhc2UgewpAQCAtNDMsNiArNDQsNyBAQAogICAgIH07CiAKICAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzU2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEQVRBX1VSSV9TT1VSQ0VfSF8KKworI2RlZmluZSBEQVRBX1VSSV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CisKK3N0cnVjdCBEYXRhVVJJU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworICAgIHN0YXRpYyBzcDxEYXRhVVJJU291cmNlPiBDcmVhdGUoY29uc3QgY2hhciAqdXJpKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRhdGFVUklTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOworCisgICAgRGF0YVVSSVNvdXJjZShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERhdGFVUklTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1VSSV9TT1VSQ0VfSF8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCBiZTE1MmU3Li5hOTgxZDFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMzAsNiArMzAsNyBAQAogY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKIHB1YmxpYzoKICAgICBGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICAvLyBGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKICAgICBGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCmluZGV4IDc2YWE1MDMuLjI3NjU0M2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCkBAIC0xMDYsNiArMTA2LDcgQEAKICAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CiAKICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JtYXQoc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIGNvbnN0OworICAgIHN0YXR1c190IGdldElucHV0Rm9ybWF0KHNwPEFNZXNzYWdlPiAqZm9ybWF0KSBjb25zdDsKIAogICAgIHN0YXR1c190IGdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0T3V0cHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CkBAIC0xNTksNiArMTYwLDcgQEAKICAgICAgICAga1doYXRHZXRCdWZmZXJzICAgICAgICAgICAgICAgICAgICAgPSAnZ2V0QicsCiAgICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgID0gJ2ZsdXMnLAogICAgICAgICBrV2hhdEdldE91dHB1dEZvcm1hdCAgICAgICAgICAgICAgICA9ICdnZXRPJywKKyAgICAgICAga1doYXRHZXRJbnB1dEZvcm1hdCAgICAgICAgICAgICAgICAgPSAnZ2V0SScsCiAgICAgICAgIGtXaGF0RGVxdWV1ZUlucHV0VGltZWRPdXQgICAgICAgICAgID0gJ2RJVE8nLAogICAgICAgICBrV2hhdERlcXVldWVPdXRwdXRUaW1lZE91dCAgICAgICAgICA9ICdkT1RPJywKICAgICAgICAga1doYXRDb2RlY05vdGlmeSAgICAgICAgICAgICAgICAgICAgPSAnY29kYycsCkBAIC0xOTksNiArMjAxLDcgQEAKICAgICBzcDxTdXJmYWNlPiBtTmF0aXZlV2luZG93OwogICAgIFNvZnR3YXJlUmVuZGVyZXIgKm1Tb2Z0UmVuZGVyZXI7CiAgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKIAogICAgIExpc3Q8c2l6ZV90PiBtQXZhaWxQb3J0QnVmZmVyc1syXTsKICAgICBWZWN0b3I8QnVmZmVySW5mbz4gbVBvcnRCdWZmZXJzWzJdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCmluZGV4IDU5MDYyM2IuLjAxYTVkYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKQEAgLTYwLDYgKzYwLDcgQEAKICAgICAgICAgU0VDVElPTl9ERUNPREVSLAogICAgICAgICBTRUNUSU9OX0VOQ09ERVJTLAogICAgICAgICBTRUNUSU9OX0VOQ09ERVIsCisgICAgICAgIFNFQ1RJT05fSU5DTFVERSwKICAgICB9OwogCiAgICAgc3RydWN0IENvZGVjSW5mbyB7CkBAIC03Myw3ICs3NCw5IEBACiAKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIFNlY3Rpb24gbUN1cnJlbnRTZWN0aW9uOworICAgIFZlY3RvcjxTZWN0aW9uPiBtUGFzdFNlY3Rpb25zOwogICAgIGludDMyX3QgbURlcHRoOworICAgIEFTdHJpbmcgbUhyZWZCYXNlOwogCiAgICAgVmVjdG9yPENvZGVjSW5mbz4gbUNvZGVjSW5mb3M7CiAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgc2l6ZV90PiBtQ29kZWNRdWlya3M7CkBAIC04Myw3ICs4Niw4IEBACiAgICAgfk1lZGlhQ29kZWNMaXN0KCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLSAgICB2b2lkIHBhcnNlWE1MRmlsZShGSUxFICpmaWxlKTsKKyAgICB2b2lkIHBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKTsKKyAgICB2b2lkIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwogCiAgICAgc3RhdGljIHZvaWQgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCiAgICAgICAgICAgICB2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKQEAgLTkzLDYgKzk3LDcgQEAKICAgICB2b2lkIHN0YXJ0RWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICB2b2lkIGVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpOwogCisgICAgc3RhdHVzX3QgaW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICBzdGF0dXNfdCBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjE4YTBiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1lZGlhQ29kZWNTb3VyY2VfSF8KKyNkZWZpbmUgTWVkaWFDb2RlY1NvdXJjZV9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEFMb29wZXI7CitjbGFzcyBBTWVzc2FnZTsKK2NsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CitjbGFzcyBNZWRpYUNvZGVjOworY2xhc3MgTWV0YURhdGE7CisKK3N0cnVjdCBNZWRpYUNvZGVjU291cmNlIDogcHVibGljIE1lZGlhU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7CisgICAgZW51bSBGbGFnQml0cyB7CisgICAgICAgIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQgICAgICA9IDEsCisgICAgICAgIEZMQUdfVVNFX01FVEFEQVRBX0lOUFVUICAgICA9IDIsCisgICAgfTsKKworICAgIHN0YXRpYyBzcDxNZWRpYUNvZGVjU291cmNlPiBDcmVhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CisKKyAgICBib29sIGlzVmlkZW8oKSBjb25zdCB7IHJldHVybiBtSXNWaWRlbzsgfQorICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworCisgICAgLy8gTWVkaWFTb3VyY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCkgeyByZXR1cm4gbU1ldGE7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICAvLyBNZWRpYUJ1ZmZlck9ic2VydmVyCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpOworCisgICAgLy8gZm9yIEFIYW5kbGVyUmVmbGVjdG9yCisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NZWRpYUNvZGVjU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IFB1bGxlcjsKKworICAgIGVudW0geworICAgICAgICBrV2hhdFB1bGxlck5vdGlmeSwKKyAgICAgICAga1doYXRFbmNvZGVyQWN0aXZpdHksCisgICAgICAgIGtXaGF0U3RhcnQsCisgICAgICAgIGtXaGF0U3RvcCwKKyAgICAgICAga1doYXRQYXVzZSwKKyAgICB9OworCisgICAgTWVkaWFDb2RlY1NvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKworICAgIHN0YXR1c190IG9uU3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7CisgICAgc3RhdHVzX3QgaW5pdCgpOworICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgdm9pZCByZWxlYXNlRW5jb2RlcigpOworICAgIHN0YXR1c190IGZlZWRFbmNvZGVySW5wdXRCdWZmZXJzKCk7CisgICAgdm9pZCBzY2hlZHVsZURvTW9yZVdvcmsoKTsKKyAgICBzdGF0dXNfdCBkb01vcmVXb3JrKCk7CisgICAgdm9pZCBzdXNwZW5kKCk7CisgICAgdm9pZCByZXN1bWUoaW50NjRfdCBza2lwRnJhbWVzQmVmb3JlVXMgPSAtMWxsKTsKKyAgICB2b2lkIHNpZ25hbEVPUyhzdGF0dXNfdCBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICBib29sIHJlYWNoZWRFT1MoKTsKKyAgICBzdGF0dXNfdCBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8QUxvb3Blcj4gbUNvZGVjTG9vcGVyOworICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPE1lZGlhQ29kZWNTb3VyY2U+ID4gbVJlZmxlY3RvcjsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKyAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CisgICAgc3A8UHVsbGVyPiBtUHVsbGVyOworICAgIHNwPE1lZGlhQ29kZWM+IG1FbmNvZGVyOworICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICBMaXN0PHVpbnQzMl90PiBtU3RvcFJlcGx5SURRdWV1ZTsKKyAgICBib29sIG1Jc1ZpZGVvOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtU3RvcHBpbmc7CisgICAgYm9vbCBtRG9Nb3JlV29ya1BlbmRpbmc7CisgICAgYm9vbCBtUHVsbGVyUmVhY2hlZEVPUzsKKyAgICBzcDxBTWVzc2FnZT4gbUVuY29kZXJBY3Rpdml0eU5vdGlmeTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1FbmNvZGVySW5wdXRCdWZmZXJzOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1FbmNvZGVyT3V0cHV0QnVmZmVyczsKKyAgICBMaXN0PE1lZGlhQnVmZmVyICo+IG1JbnB1dEJ1ZmZlclF1ZXVlOworICAgIExpc3Q8c2l6ZV90PiBtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzOworICAgIExpc3Q8aW50NjRfdD4gbURlY29kaW5nVGltZVF1ZXVlOyAvLyBkZWNvZGluZyB0aW1lICh1cykgZm9yIHZpZGVvCisKKyAgICAvLyBhdWRpbyBkcmlmdCB0aW1lCisgICAgaW50NjRfdCBtRmlyc3RTYW1wbGVUaW1lVXM7CisgICAgTGlzdDxpbnQ2NF90PiBtRHJpZnRUaW1lUXVldWU7CisKKyAgICAvLyBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBwcm90ZWN0ZWQgYnkgbU91dHB1dEJ1ZmZlckxvY2sKKyAgICBNdXRleCBtT3V0cHV0QnVmZmVyTG9jazsKKyAgICBDb25kaXRpb24gbU91dHB1dEJ1ZmZlckNvbmQ7CisgICAgTGlzdDxNZWRpYUJ1ZmZlcio+IG1PdXRwdXRCdWZmZXJRdWV1ZTsKKyAgICBib29sIG1FbmNvZGVkUmVhY2hlZEVPUzsKKyAgICBzdGF0dXNfdCBtRXJyb3JDb2RlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFDb2RlY1NvdXJjZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKiBNZWRpYUNvZGVjU291cmNlX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaAppbmRleCBjZjViZWRhLi42NzhkNjQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKQEAgLTM4LDYgKzM4LDcgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFA7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZkOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworCitzdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIEhUVFBCYXNlIHsKKyAgICBNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhSFRUUCgpOworCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7CisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOworCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOworICAgIEFTdHJpbmcgbUxhc3RVUkk7CisKKyAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7CisgICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKKworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworCisgICAgdm9pZCBjbGVhckRSTVN0YXRlX2woKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhSFRUUCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0hUVFBfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKaW5kZXggZmY2YTY2ZS4uYmJlNDMwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZXRhRGF0YTsKLXN0cnVjdCBNUEVHNFdyaXRlcjsKK3N0cnVjdCBNZWRpYVdyaXRlcjsKIAogLy8gTWVkaWFNdXhlciBpcyB1c2VkIHRvIG11eCBtdWx0aXBsZSB0cmFja3MgaW50byBhIHZpZGVvLiBDdXJyZW50bHksIHdlIG9ubHkKIC8vIHN1cHBvcnQgYSBtcDQgZmlsZSBhcyB0aGUgb3V0cHV0LgpAQCAtNDQsNiArNDQsNyBAQAogICAgIC8vIE91dHB1dEZvcm1hdCBpcyB1cGRhdGVkLgogICAgIGVudW0gT3V0cHV0Rm9ybWF0IHsKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQgPSAwLAorICAgICAgICBPVVRQVVRfRk9STUFUX1dFQk0gICA9IDEsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogICAgIH07CiAKQEAgLTExNSw3ICsxMTYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgdWludDMyX3QgZmxhZ3MpIDsKIAogcHJpdmF0ZToKLSAgICBzcDxNUEVHNFdyaXRlcj4gbVdyaXRlcjsKKyAgICBjb25zdCBPdXRwdXRGb3JtYXQgbUZvcm1hdDsKKyAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlcjsKICAgICBWZWN0b3I8IHNwPE1lZGlhQWRhcHRlcj4gPiBtVHJhY2tMaXN0OyAgLy8gRWFjaCB0cmFjayBoYXMgaXRzIE1lZGlhQWRhcHRlci4KICAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOyAgLy8gTWV0YWRhdGEgZm9yIHRoZSB3aG9sZSBmaWxlLgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKaW5kZXggZGI4MjE2Yi4uZTg2MmVjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApAQCAtNTYsNiArNTYsOSBAQAogICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVZvcmJpc0luZm8gICAgICAgID0gJ3ZpbmYnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5Vm9yYmlzQm9va3MgICAgICAgPSAndmJvbycsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCisgICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQorICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCiAgICAga0tleVdhbnRzTkFMRnJhZ21lbnRzID0gJ05BTGYnLAogICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCiAgICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggNWFlNmY2Yi4uNDAyZTdmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKQEAgLTMxLDYgKzMxLDcgQEAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IERhdGFTb3VyY2U7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTWVkaWFCdWZmZXI7CiBzdHJ1Y3QgTWVkaWFFeHRyYWN0b3I7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CkBAIC00NSw2ICs0Niw3IEBACiAgICAgTnVNZWRpYUV4dHJhY3RvcigpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaAppbmRleCAyNjUzYjUzLi4wOThhYTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaApAQCAtNDcsNiArNDcsNyBAQAogIHByaXZhdGU6CiAgICAgdm9pZCB3cml0ZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBudW0pOwogICAgIHNpemVfdCByZWFkKGNoYXIgKmRzdCwgc2l6ZV90IG51bSk7CisgICAgaW50MzJfdCBtU2tpcDsKICAgICBpbnQzMl90IG1Gcm9udFBhZGRpbmc7CiAgICAgaW50MzJfdCBtQmFja1BhZGRpbmc7CiAgICAgaW50MzJfdCBtV3JpdGVIZWFkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKaW5kZXggZGI1Zjk0Ny4uNDNiNzVmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICAvLyBwYXNzIG1ldGFkYXRhIHRocm91Z2ggdGhlIGJ1ZmZlcnMuIEN1cnJlbnRseSwgaXQgaXMgZm9yY2Ugc2V0IHRvIHRydWUKICAgICBib29sIGlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpIGNvbnN0OwogCi0gICAgc3A8QnVmZmVyUXVldWU+IGdldEJ1ZmZlclF1ZXVlKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclF1ZXVlOyB9CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0UHJvZHVjZXIoKSBjb25zdCB7IHJldHVybiBtUHJvZHVjZXI7IH0KIAogICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnQoKQogICAgIHN0YXR1c190IHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KTsKQEAgLTEzOSwxMiArMTM5LDE3IEBACiAgICAgLy8gZnJhbWVzIGlzIHNlcGFyYXRlIHRoYW4gdGhlIG9uZSBjYWxsaW5nIHN0b3AuCiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCk7CiAKKyAgICAvLyBTdXJmYWNlTWVkaWFTb3VyY2UgY2FuJ3QgaGFuZGxlIHNpZGViYW5kIHN0cmVhbXMsIHNvIHRoaXMgaXMgbm90IGV4cGVjdGVkCisgICAgLy8gdG8gZXZlciBiZSBjYWxsZWQuIERvZXMgbm90aGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKwogICAgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKIAogcHJpdmF0ZToKLSAgICAvLyBtQnVmZmVyUXVldWUgaXMgdGhlIGV4Y2hhbmdlIHBvaW50IGJldHdlZW4gdGhlIHByb2R1Y2VyIGFuZAotICAgIC8vIHRoaXMgY29uc3VtZXIKLSAgICBzcDxCdWZmZXJRdWV1ZT4gbUJ1ZmZlclF1ZXVlOworICAgIC8vIEEgQnVmZmVyUXVldWUsIHJlcHJlc2VudGVkIGJ5IHRoZXNlIGludGVyZmFjZXMsIGlzIHRoZSBleGNoYW5nZSBwb2ludAorICAgIC8vIGJldHdlZW4gdGhlIHByb2R1Y2VyIGFuZCB0aGlzIGNvbnN1bWVyCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKIAogICAgIHN0cnVjdCBTbG90RGF0YSB7CiAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1HcmFwaGljQnVmZmVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCmluZGV4IGJiYWQyNzEuLmM4NTM2OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKQEAgLTYwLDYgKzYwLDggQEAKIGJvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKIAorQVN0cmluZyB1cmlEZWJ1Z1N0cmluZyhjb25zdCBBU3RyaW5nICZ1cmksIGJvb2wgaW5jb2duaXRvID0gZmFsc2UpOworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIFVUSUxTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaAppbmRleCAwZjhmMWUxLi42MjIwMjhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKQEAgLTIyLDEwICsyMiwxMyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBTdHJpbmc4OworCiBzdHJ1Y3QgQVN0cmluZyB7CiAgICAgQVN0cmluZygpOwogICAgIEFTdHJpbmcoY29uc3QgY2hhciAqcyk7CiAgICAgQVN0cmluZyhjb25zdCBjaGFyICpzLCBzaXplX3Qgc2l6ZSk7CisgICAgQVN0cmluZyhjb25zdCBTdHJpbmc4ICZmcm9tKTsKICAgICBBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmZyb20pOwogICAgIEFTdHJpbmcoY29uc3QgQVN0cmluZyAmZnJvbSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG4pOwogICAgIH5BU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCmluZGV4IGYyM2MzMzcuLjM3ZWY2NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEFMb29wZXI7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBNZWRpYVBsYXllckJhc2U7CiBjbGFzcyBNZWRpYVNvdXJjZTsKIGNsYXNzIFBhcmNlbDsKQEAgLTM0LDcgKzM1LDkgQEAKIAogY2xhc3MgVGltZWRUZXh0RHJpdmVyIHsKIHB1YmxpYzoKLSAgICBUaW1lZFRleHREcml2ZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIpOworICAgIFRpbWVkVGV4dERyaXZlcigKKyAgICAgICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CiAKICAgICB+VGltZWRUZXh0RHJpdmVyKCk7CiAKQEAgLTc3LDYgKzgwLDcgQEAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPFRpbWVkVGV4dFBsYXllcj4gbVBsYXllcjsKICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogCiAgICAgLy8gVmFyaWFibGVzIHRvIGJlIGd1YXJkZWQgYnkgbUxvY2suCiAgICAgU3RhdGUgbVN0YXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggMmQwMzNlNi4uMzkwMWU3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC00OCw3ICs0OCw3IEBACiAjZGVmaW5lIENCTEtfU1RSRUFNX0VORF9ET05FIDB4NDAwIC8vIHNldCBieSBzZXJ2ZXIgb24gcmVuZGVyIGNvbXBsZXRpb24sIGNsZWFyZWQgYnkgY2xpZW50CiAKIC8vRUxfRklYTUUgMjAgc2Vjb25kcyBtYXkgbm90IGJlIGVub3VnaCBhbmQgbXVzdCBiZSByZWNvbmNpbGVkIHdpdGggbmV3IG9idGFpbkJ1ZmZlciBpbXBsZW1lbnRhdGlvbgotI2RlZmluZSBNQVhfUlVOX09GRkxPQURFRF9USU1FT1VUX01TIDIwMDAwIC8vYXNzdW1pbmcgdXB0byBhIG1heGltdW0gb2YgMjAgc2Vjb25kcyBvZiBvZmZsb2FkZWQKKyNkZWZpbmUgTUFYX1JVTl9PRkZMT0FERURfVElNRU9VVF9NUyAyMDAwMCAvLyBhc3N1bWluZyB1cCB0byBhIG1heGltdW0gb2YgMjAgc2Vjb25kcyBvZiBvZmZsb2FkZWQKIAogc3RydWN0IEF1ZGlvVHJhY2tTaGFyZWRTdHJlYW1pbmcgewogICAgIC8vIHNpbWlsYXIgdG8gTkJBSU8gTW9ub1BpcGUKQEAgLTk4LDExICs5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlIHNob3VsZCBiZSB1c2VkICJmb3IgZW50ZXJ0YWlubWVudCBwdXJwb3NlcyBvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBtZWFucyBkb24ndCBtYWtlIGltcG9ydGFudCBkZWNpc2lvbnMgYmFzZWQgb24gaXQuCiAKLSAgICAgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50XzsgICAgLy8gdXNlZCBkdXJpbmcgY3JlYXRpb24gdG8gcGFzcyBhY3R1YWwgdHJhY2sgYnVmZmVyIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBBdWRpb0ZsaW5nZXIgdG8gY2xpZW50LCBhbmQgbm90IHJlZmVyZW5jZWQgYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgcmVtb3ZlIGhlcmUgYW5kIHJlcGxhY2UgYnkgY3JlYXRlVHJhY2soKSBpbi9vdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZWQgdG8gIl8iIHRvIGRldGVjdCBpbmNvcnJlY3QgdXNlCisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgbVBhZDE7ICAgICAgLy8gdW51c2VkCiAKICAgICB2b2xhdGlsZSAgICBpbnQzMl90ICAgICBtRnV0ZXg7ICAgICAvLyBldmVudCBmbGFnOiBkb3duIChQKSBieSBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgKFYpIGJ5IHNlcnZlciBvciBiaW5kZXJEaWVkKCkgb3IgaW50ZXJydXB0KCkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZjMmU2YS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidmlkZW9lZGl0b3JwbGF5ZXIKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9ycGxheWVyCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICBWaWRlb0VkaXRvclRvb2xzLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JQbGF5ZXIuY3BwIFwKLSAgICBQcmV2aWV3UGxheWVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllci5jcHAgXAotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclNSQy5jcHAgXAotICAgIER1bW15QXVkaW9Tb3VyY2UuY3BwIFwKLSAgICBEdW1teVZpZGVvU291cmNlLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAgXAotICAgIFByZXZpZXdSZW5kZXJlci5jcHAgXAotICAgIEk0MjBDb2xvckNvbnZlcnRlci5jcHAgXAotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyLmNwcAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uCi0KLQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICBcCi0gICAgbGliYXVkaW9yZXNhbXBsZXIgICAgICAgICBcCi0gICAgbGliYXVkaW91dGlscyAgICAgICAgICAgICBcCi0gICAgbGliYmluZGVyICAgICAgICAgICAgICAgICBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICBcCi0gICAgbGlibG9nICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliRUdMICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliR0xFU3YyICAgICAgICAgICAgICAgICBcCi0gICAgbGliZ3VpICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICBcCi0gICAgbGliZHJtZnJhbWV3b3JrICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214ICAgICAgICBcCi0gICAgbGlic3luYyAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidWkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3Jfb3NhbCAgICAgICBcCi0KLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL3N5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgY29yZWNnIGdyYXBoaWNzKSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvbHZwcCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9lZGl0b3IgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAotICAgICAtRE00X0VOQUJMRV9SRU5ERVJJTkdNT0RFIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0FVRElPREVDIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9WSURFT0RFQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9FTkMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPRU5DIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9SRUFERVJTIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF8zR1BQX1JFQURFUgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGJjYWI2OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEdW1teUF1ZGlvU291cmNlIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlICJEdW1teUF1ZGlvU291cmNlLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vL3N0YXRpYwotc3A8RHVtbXlBdWRpb1NvdXJjZT4gRHVtbXlBdWRpb1NvdXJjZTo6Q3JlYXRlKAotICAgICAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgIGludDY0X3QgZnJhbWVEdXJhdGlvblVzLCBpbnQ2NF90IGF1ZGlvRHVyYXRpb25VcykgewotCi0gICAgQUxPR1YoIkNyZWF0ZSAiKTsKLSAgICByZXR1cm4gbmV3IER1bW15QXVkaW9Tb3VyY2Uoc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb25VcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EdXJhdGlvblVzKTsKLQotfQotCi1EdW1teUF1ZGlvU291cmNlOjpEdW1teUF1ZGlvU291cmNlKAotICAgICAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgIGludDY0X3QgZnJhbWVEdXJhdGlvblVzLCBpbnQ2NF90IGF1ZGlvRHVyYXRpb25VcykKLSAgICA6IG1TYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlKSwKLSAgICAgIG1DaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSwKLSAgICAgIG1GcmFtZUR1cmF0aW9uVXMoZnJhbWVEdXJhdGlvblVzKSwKLSAgICAgIG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lKDApLAotICAgICAgbUF1ZGlvRHVyYXRpb25VcyhhdWRpb0R1cmF0aW9uVXMpLAotICAgICAgbVRpbWVTdGFtcFVzKDApLAotICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpIHsKLQotICAgIG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lID0gKGludDMyX3QpCi0gICAgICAgICAgICAoKDFMICogbVNhbXBsaW5nUmF0ZSAqIG1GcmFtZUR1cmF0aW9uVXMpLzEwMDAwMDApOwotICAgIG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lID0gbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgICogbUNoYW5uZWxDb3VudDsKLQotICAgIEFMT0dWKCJDb25zdHJ1Y3RvcjogRSIpOwotICAgIEFMT0dWKCJzYW1wbGluZ1JhdGUgPSAlZCIsIHNhbXBsaW5nUmF0ZSk7Ci0gICAgQUxPR1YoImNoYW5uZWxDb3VudCA9ICVkIiwgY2hhbm5lbENvdW50KTsKLSAgICBBTE9HVigiZnJhbWVEdXJhdGlvblVzID0gJWxsZCIsIGZyYW1lRHVyYXRpb25Vcyk7Ci0gICAgQUxPR1YoImF1ZGlvRHVyYXRpb25VcyA9ICVsbGQiLCBhdWRpb0R1cmF0aW9uVXMpOwotICAgIEFMT0dWKCJtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA9ICVkIiwgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUpOwotICAgIEFMT0dWKCJDb25zdHJ1Y3RvcjogWCIpOwotfQotCi1EdW1teUF1ZGlvU291cmNlOjp+RHVtbXlBdWRpb1NvdXJjZSgpIHsKLSAgICAvKiBEbyBub3RoaW5nIGhlcmU/ICovCi0gICAgQUxPR1YoIn5EdW1teUF1ZGlvU291cmNlIik7Ci19Ci0KLXZvaWQgRHVtbXlBdWRpb1NvdXJjZTo6c2V0RHVyYXRpb24oaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpIHsKLSAgICBBTE9HVigic2V0RHVyYXRpb246ICVsbGQgdXMgYWRkZWQgdG8gJWxsZCB1cyIsCi0gICAgICAgIGF1ZGlvRHVyYXRpb25VcywgbUF1ZGlvRHVyYXRpb25Vcyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1BdWRpb0R1cmF0aW9uVXMgKz0gYXVkaW9EdXJhdGlvblVzOwotfQotCi1zdGF0dXNfdCBEdW1teUF1ZGlvU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgQUxPR1YoInN0YXJ0OiBFIik7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBtVGltZVN0YW1wVXMgPSAwOwotCi0gICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKAotICAgICAgICAgICAgbmV3IE1lZGlhQnVmZmVyKG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lICogc2l6ZW9mKGludDE2X3QpKSk7Ci0KLSAgICBBTE9HVigic3RhcnQ6IFgiKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IER1bW15QXVkaW9Tb3VyY2U6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLQotICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwID0gTlVMTDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi1zcDxNZXRhRGF0YT4gRHVtbXlBdWRpb1NvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJnZXRGb3JtYXQiKTsKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1DaGFubmVsQ291bnQpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxpbmdSYXRlKTsKLSAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIG1GcmFtZUR1cmF0aW9uVXMpOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJEdW1teUF1ZGlvU291cmNlIik7Ci0KLSAgICByZXR1cm4gbWV0YTsKLX0KLQotc3RhdHVzX3QgRHVtbXlBdWRpb1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotCi0gICAgQUxPR1YoInJlYWQ6IEUiKTsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLQotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7Ci0gICAgICAgIG1UaW1lU3RhbXBVcyA9IHNlZWtUaW1lVXM7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBpZiAobVRpbWVTdGFtcFVzID49IG1BdWRpb0R1cmF0aW9uVXMpIHsKLSAgICAgICAgICAgIEFMT0dJKCJyZWFkOiBFT1MgcmVhY2hlZCAlbGxkID4gJWxsZCIsCi0gICAgICAgICAgICAgICAgbVRpbWVTdGFtcFVzLCBtQXVkaW9EdXJhdGlvblVzKTsKLQotICAgICAgICAgICAgKm91dCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBidWZmZXIgZnJvbSBtQnVmZmVyR3JvdXA6ICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtZW1zZXQoKHVpbnQ4X3QgKikgYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgMCwgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPDwgMSk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwgKG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lIDw8IDEpKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbVRpbWVTdGFtcFVzKTsKLQotICAgIEFMT0dWKCJyZWFkOiBvZmZzZXQgID0gJWQsIHNpemUgPSAlZCwgbVRpbWVTdGFtcFVzID0gJWxsZCIsCi0gICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCksIG1UaW1lU3RhbXBVcyk7Ci0KLSAgICBtVGltZVN0YW1wVXMgPSBtVGltZVN0YW1wVXMgKyBtRnJhbWVEdXJhdGlvblVzOwotICAgICpvdXQgPSBidWZmZXI7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0vLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWYyNWE4Yy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERVTU1ZX0FVRElPU09VUkNFX0hfCi0jZGVmaW5lIERVTU1ZX0FVRElPU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWV0YURhdGE7Ci1zdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKLQotc3RydWN0IER1bW15QXVkaW9Tb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotCi1wdWJsaWM6Ci0gICAgc3RhdGljIHNwPER1bW15QXVkaW9Tb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi0gICAgdm9pZCBzZXREdXJhdGlvbihpbnQ2NF90IGF1ZGlvRHVyYXRpb25Vcyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EdW1teUF1ZGlvU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgaW50MzJfdCBtU2FtcGxpbmdSYXRlOwotICAgIGludDMyX3QgbUNoYW5uZWxDb3VudDsKLSAgICBpbnQ2NF90IG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgaW50MzJfdCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZTsKLSAgICBpbnQ2NF90IG1BdWRpb0R1cmF0aW9uVXM7Ci0gICAgaW50NjRfdCBtVGltZVN0YW1wVXM7Ci0gICAgTXV0ZXggbUxvY2s7Ci0KLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptQnVmZmVyR3JvdXA7Ci0KLSAgICBEdW1teUF1ZGlvU291cmNlKAotICAgICAgICAgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUsIGludDMyX3QgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICBEdW1teUF1ZGlvU291cmNlKGNvbnN0IER1bW15QXVkaW9Tb3VyY2UgJik7Ci0gICAgRHVtbXlBdWRpb1NvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IER1bW15QXVkaW9Tb3VyY2UgJik7Ci0KLX07Ci0KLX0vL25hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8vRFVNTVlfQVVESU9TT1VSQ0VfSF8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkYmNmMmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEdW1teVZpZGVvU291cmNlIgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotI2luY2x1ZGUgIkR1bW15VmlkZW9Tb3VyY2UuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXNwPER1bW15VmlkZW9Tb3VyY2U+IER1bW15VmlkZW9Tb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSkgewotCi0gICAgQUxPR1YoIkNyZWF0ZSIpOwotICAgIHJldHVybiBuZXcgRHVtbXlWaWRlb1NvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xpcER1cmF0aW9uLCBpbWFnZVVyaSk7Ci0KLX0KLQotCi1EdW1teVZpZGVvU291cmNlOjpEdW1teVZpZGVvU291cmNlKAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICB1aW50NjRfdCBjbGlwRHVyYXRpb24sIGNvbnN0IGNoYXIgKmltYWdlVXJpKSB7Ci0KLSAgICBBTE9HVigiQ29uc3RydWN0b3I6IEUiKTsKLQotICAgIG1GcmFtZVdpZHRoID0gd2lkdGg7Ci0gICAgbUZyYW1lSGVpZ2h0ID0gaGVpZ2h0OwotICAgIG1JbWFnZUNsaXBEdXJhdGlvbiA9IGNsaXBEdXJhdGlvbjsKLSAgICBtVXJpID0gaW1hZ2VVcmk7Ci0gICAgbUltYWdlQnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCIlcyIsIG1VcmkpOwotICAgIEFMT0dWKCJDb25zdHJ1Y3RvcjogWCIpOwotfQotCi0KLUR1bW15VmlkZW9Tb3VyY2U6On5EdW1teVZpZGVvU291cmNlKCkgewotICAgIC8qIERvIG5vdGhpbmcgaGVyZT8gKi8KLSAgICBBTE9HVigifkR1bW15VmlkZW9Tb3VyY2UiKTsKLX0KLQotCi0KLXN0YXR1c190IER1bW15VmlkZW9Tb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBBTE9HVigic3RhcnQ6IEUiKTsKLQotICAgIC8vIEdldCB0aGUgZnJhbWUgYnVmZmVyIGZyb20gdGhlIHJnYiBmaWxlLCBtVXJpLAotICAgIC8vIGFuZCBzdG9yZSBpdHMgY29udGVudCBpbnRvIGEgTWVkaWFCdWZmZXIKLSAgICBzdGF0dXNfdCBlcnIgPSBMdkdldEltYWdlVGh1bWJOYWlsKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW1VcmksCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZUhlaWdodCwgbUZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICoqKSAmbUltYWdlQnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJMdkdldEltYWdlVGh1bWJOYWlsIGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1Jc0ZpcnN0SW1hZ2VGcmFtZSA9IHRydWU7Ci0gICAgbUltYWdlU2Vla1RpbWUgPSAwOwotICAgIG1JbWFnZVBsYXlTdGFydFRpbWUgPSAwOwotICAgIG1GcmFtZVRpbWVVcyA9IDA7Ci0KLSAgICBBTE9HVigic3RhcnQ6IFgiKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgRHVtbXlWaWRlb1NvdXJjZTo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG1JbWFnZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUltYWdlQnVmZmVyKTsKLSAgICAgICAgbUltYWdlQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLXNwPE1ldGFEYXRhPiBEdW1teVZpZGVvU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgQUxPR1YoImdldEZvcm1hdCIpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIG1GcmFtZVdpZHRoKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtRnJhbWVIZWlnaHQpOwotICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbUltYWdlQ2xpcER1cmF0aW9uKTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiRHVtbXlWaWRlb1NvdXJjZSIpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXN0YXR1c190IER1bW15VmlkZW9Tb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LAotICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLQotICAgIEFMT0dWKCJyZWFkOiBFIik7Ci0KLSAgICBjb25zdCBpbnQzMl90IGtUaW1lU2NhbGUgPSAxMDAwOyAgLyogdGltZSBzY2FsZSBpbiBtcyAqLwotICAgIGJvb2wgc2Vla2luZyA9IGZhbHNlOwotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7Ci0gICAgICAgIHNlZWtpbmcgPSB0cnVlOwotICAgICAgICBtSW1hZ2VTZWVrVGltZSA9IHNlZWtUaW1lVXM7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmbUltYWdlUGxheVN0YXJ0VGltZSwga1RpbWVTY2FsZSk7Ci0gICAgfQotCi0gICAgaWYgKChtSW1hZ2VTZWVrVGltZSA9PSBtSW1hZ2VDbGlwRHVyYXRpb24pIHx8Ci0gICAgICAgIChtRnJhbWVUaW1lVXMgPT0gKGludDY0X3QpbUltYWdlQ2xpcER1cmF0aW9uKSkgewotICAgICAgICBBTE9HVigicmVhZDogRU9TIHJlYWNoZWQiKTsKLSAgICAgICAgKm91dCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoCi0gICAgICAgICAgICBtSW1hZ2VCdWZmZXIsIChtRnJhbWVXaWR0aCAqIG1GcmFtZUhlaWdodCAqIDEuNSkpOwotCi0gICAgLy8gU2V0IHRpbWVzdGFtcCBvZiBidWZmZXIKLSAgICBpZiAobUlzRmlyc3RJbWFnZUZyYW1lKSB7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmbUltYWdlUGxheVN0YXJ0VGltZSwga1RpbWVTY2FsZSk7Ci0gICAgICAgIG1GcmFtZVRpbWVVcyA9ICAobUltYWdlU2Vla1RpbWUgKyAxKTsKLSAgICAgICAgQUxPR1YoInJlYWQ6IGpwZyAxc3QgZnJhbWUgdGltZVVzID0gJWxsZCwgYmVnaW4gY3V0IHRpbWUgPSAlIiBQUkl1MzIsCi0gICAgICAgICAgICBtRnJhbWVUaW1lVXMsIG1JbWFnZVNlZWtUaW1lKTsKLQotICAgICAgICBtSXNGaXJzdEltYWdlRnJhbWUgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBNNE9TQV9UaW1lICBjdXJyZW50VGltZU1zOwotICAgICAgICBNNE9TQV9jbG9ja0dldFRpbWUoJmN1cnJlbnRUaW1lTXMsIGtUaW1lU2NhbGUpOwotCi0gICAgICAgIG1GcmFtZVRpbWVVcyA9IG1JbWFnZVNlZWtUaW1lICsKLSAgICAgICAgICAgIChjdXJyZW50VGltZU1zIC0gbUltYWdlUGxheVN0YXJ0VGltZSkgKiAxMDAwTEw7Ci0KLSAgICAgICAgQUxPR1YoInJlYWQ6IGpwZyBmcmFtZSB0aW1lVXMgPSAlbGxkIiwgbUZyYW1lVGltZVVzKTsKLSAgICB9Ci0KLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbUZyYW1lVGltZVVzKTsKLSAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgIG1GcmFtZVdpZHRoICogbUZyYW1lSGVpZ2h0ICogMS41KTsKLQotICAgICpvdXQgPSBidWZmZXI7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotfS8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNjUxNGYyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRFVNTVlfVklERU9TT1VSQ0VfSF8KLSNkZWZpbmUgRFVNTVlfVklERU9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSAiTTRPU0FfQ2xvY2suaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyAgTWVkaWFCdWZmZXI7Ci1jbGFzcyAgTWV0YURhdGE7Ci0KLXN0cnVjdCBEdW1teVZpZGVvU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLQotcHVibGljOgotICAgIHN0YXRpYyBzcDxEdW1teVZpZGVvU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICB1aW50NjRfdCBjbGlwRHVyYXRpb24sIGNvbnN0IGNoYXIgKmltYWdlVXJpKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RHVtbXlWaWRlb1NvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIHVpbnQzMl90IG1GcmFtZVdpZHRoOwotICAgIHVpbnQzMl90IG1GcmFtZUhlaWdodDsKLSAgICB1aW50NjRfdCBtSW1hZ2VDbGlwRHVyYXRpb247Ci0gICAgY29uc3QgY2hhciAqbVVyaTsKLSAgICBpbnQ2NF90IG1GcmFtZVRpbWVVczsKLSAgICBib29sIG1Jc0ZpcnN0SW1hZ2VGcmFtZTsKLSAgICB2b2lkICptSW1hZ2VCdWZmZXI7Ci0gICAgTTRPU0FfVGltZSBtSW1hZ2VQbGF5U3RhcnRUaW1lOwotICAgIHVpbnQzMl90IG1JbWFnZVNlZWtUaW1lOwotCi0gICAgRHVtbXlWaWRlb1NvdXJjZSgKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICB1aW50NjRfdCBjbGlwRHVyYXRpb24sIGNvbnN0IGNoYXIgKmltYWdlVXJpKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICBEdW1teVZpZGVvU291cmNlKGNvbnN0IER1bW15VmlkZW9Tb3VyY2UgJik7Ci0gICAgRHVtbXlWaWRlb1NvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IER1bW15VmlkZW9Tb3VyY2UgJik7Ci0KLX07Ci0KLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0jZW5kaWYgLy9EVU1NWV9WSURFT1NPVVJDRV9IXwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0k0MjBDb2xvckNvbnZlcnRlci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0k0MjBDb2xvckNvbnZlcnRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyMWQzZmUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxJNDIwQ29sb3JDb252ZXJ0ZXIuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLQotSTQyMENvbG9yQ29udmVydGVyOjpJNDIwQ29sb3JDb252ZXJ0ZXIoKSB7Ci0gICAgLy8gT3BlbiB0aGUgc2hhcmVkIGxpYnJhcnkKLSAgICBtSGFuZGxlID0gZGxvcGVuKCJsaWJJNDIwY29sb3Jjb252ZXJ0LnNvIiwgUlRMRF9OT1cpOwotCi0gICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiSTQyMENvbG9yQ29udmVydGVyOiBjYW5ub3QgbG9hZCBsaWJJNDIwY29sb3Jjb252ZXJ0LnNvIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGaW5kIHRoZSBlbnRyeSBwb2ludAotICAgIHZvaWQgKCpnZXRJNDIwQ29sb3JDb252ZXJ0ZXIpKEk0MjBDb2xvckNvbnZlcnRlciAqY29udmVydGVyKSA9Ci0gICAgICAgICh2b2lkICgqKShJNDIwQ29sb3JDb252ZXJ0ZXIqKSkgZGxzeW0obUhhbmRsZSwgImdldEk0MjBDb2xvckNvbnZlcnRlciIpOwotCi0gICAgaWYgKGdldEk0MjBDb2xvckNvbnZlcnRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJJNDIwQ29sb3JDb252ZXJ0ZXI6IGNhbm5vdCBsb2FkIGdldEk0MjBDb2xvckNvbnZlcnRlciIpOwotICAgICAgICBkbGNsb3NlKG1IYW5kbGUpOwotICAgICAgICBtSGFuZGxlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEZpbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzLgotICAgIGdldEk0MjBDb2xvckNvbnZlcnRlcih0aGlzKTsKLQotICAgIEFMT0dJKCJJNDIwQ29sb3JDb252ZXJ0ZXI6IGxpYkk0MjBjb2xvcmNvbnZlcnQuc28gbG9hZGVkIik7Ci19Ci0KLWJvb2wgSTQyMENvbG9yQ29udmVydGVyOjppc0xvYWRlZCgpIHsKLSAgICByZXR1cm4gbUhhbmRsZSAhPSBOVUxMOwotfQotCi1JNDIwQ29sb3JDb252ZXJ0ZXI6On5JNDIwQ29sb3JDb252ZXJ0ZXIoKSB7Ci0gICAgaWYgKG1IYW5kbGUpIHsKLSAgICAgICAgZGxjbG9zZShtSGFuZGxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0k0MjBDb2xvckNvbnZlcnRlci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQ0OGU0NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0k0MjBDb2xvckNvbnZlcnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgSTQyMF9DT0xPUl9DT05WRVJURVJfSAotI2RlZmluZSBJNDIwX0NPTE9SX0NPTlZFUlRFUl9ICi0KLSNpbmNsdWRlIDxJSTQyMENvbG9yQ29udmVydGVyLmg+Ci0KLS8vIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgSTQyMCBjb2xvciBjb252ZXJ0ZXIgZnVuY3Rpb25zIGluCi0vLyBJSTQyMENvbG9yQ29udmVydGVyLCB3aGljaCBpcyBsb2FkZWQgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LgotY2xhc3MgSTQyMENvbG9yQ29udmVydGVyOiBwdWJsaWMgSUk0MjBDb2xvckNvbnZlcnRlciB7Ci1wdWJsaWM6Ci0gICAgSTQyMENvbG9yQ29udmVydGVyKCk7Ci0gICAgfkk0MjBDb2xvckNvbnZlcnRlcigpOwotCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb252ZXJ0ZXIgZnVuY3Rpb25zIGFyZSBzdWNjZXNzZnVsbHkgbG9hZGVkLgotICAgIGJvb2wgaXNMb2FkZWQoKTsKLXByaXZhdGU6Ci0gICAgdm9pZCogbUhhbmRsZTsKLX07Ci0KLSNlbmRpZiAvKiBJNDIwX0NPTE9SX0NPTlZFUlRFUl9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci9sdnBwL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTk9USUNFIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9OYXRpdmVXaW5kb3dSZW5kZXJlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiMzYyZWYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9OYXRpdmVXaW5kb3dSZW5kZXJlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTmF0aXZlV2luZG93UmVuZGVyZXIiCi0jaW5jbHVkZSAiTmF0aXZlV2luZG93UmVuZGVyZXIuaCIKLQotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxndWkvR0xDb25zdW1lci5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotCi0jZGVmaW5lIENIRUNLX0VHTF9FUlJPUiBDSEVDSyhFR0xfU1VDQ0VTUyA9PSBlZ2xHZXRFcnJvcigpKQotI2RlZmluZSBDSEVDS19HTF9FUlJPUiBDSEVDSyhHTGVudW0oR0xfTk9fRVJST1IpID09IGdsR2V0RXJyb3IoKSkKLQotLy8KLS8vIFZlcnRleCBhbmQgZnJhZ21lbnQgcHJvZ3JhbXMKLS8vCi0KLS8vIFRoZSBtYXRyaXggaXMgZGVyaXZlZCBmcm9tCi0vLyBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAotLy8KLS8vIFIgKiAyNTUgPSAxLjE2NCAqIChZIC0gMTYpICsgMS41OTYgKiAoViAtIDEyOCkKLS8vIEcgKiAyNTUgPSAxLjE2NCAqIChZIC0gMTYpIC0gMC44MTMgKiAoViAtIDEyOCkgLSAwLjM5MSAqIChVIC0gMTI4KQotLy8gQiAqIDI1NSA9IDEuMTY0ICogKFkgLSAxNikgKyAyLjAxOCAqIChVIC0gMTI4KQotLy8KLS8vIEhlcmUgd2UgYXNzdW1lIFlVViBhcmUgaW4gdGhlIHJhbmdlIG9mIFswLDI1NV0sIFJHQiBhcmUgaW4gdGhlIHJhbmdlIG9mCi0vLyBbMCwgMV0KLSNkZWZpbmUgUkdCMllVVl9NQVRSSVggXAotImNvbnN0IG1hdDQgcmdiMnl1diA9IG1hdDQoIlwKLSIgICAgNjUuNTIyNTUsICAgLTM3Ljc5Mzk4LCAgIDExMS45ODczMiwgICAgIDAuMDAwMDAsIlwKLSIgICAxMjguNjI3MjksICAgLTc0LjE5MzM0LCAgIC05My44MTA4OCwgICAgIDAuMDAwMDAsIlwKLSIgICAgMjQuOTIyMzMsICAgMTExLjk4NzMyLCAgIC0xOC4xNzY0NCwgICAgIDAuMDAwMDAsIlwKLSIgICAgMTYuMDAwMDAsICAgMTI4LjAwMDAwLCAgIDEyOC4wMDAwMCwgICAgIDEuMDAwMDApO1xuIgotCi0jZGVmaW5lIFlVVjJSR0JfTUFUUklYIFwKLSJjb25zdCBtYXQ0IHl1djJyZ2IgPSBtYXQ0KCJcCi0iICAgMC4wMDQ1NiwgICAwLjAwNDU2LCAgIDAuMDA0NTYsICAgMC4wMDAwMCwiXAotIiAgIDAuMDAwMDAsICAtMC4wMDE1MywgICAwLjAwNzkxLCAgIDAuMDAwMDAsIlwKLSIgICAwLjAwNjI2LCAgLTAuMDAzMTksICAgMC4wMDAwMCwgICAwLjAwMDAwLCJcCi0iICAtMC44NzQxNiwgICAwLjUzMTMzLCAgLTEuMDg1OTksICAgMS4wMDAwMCk7XG4iCi0KLXN0YXRpYyBjb25zdCBjaGFyIHZTcmNOb3JtYWxbXSA9Ci0gICAgImF0dHJpYnV0ZSB2ZWM0IHZQb3NpdGlvbjtcbiIKLSAgICAiYXR0cmlidXRlIHZlYzIgdlRleFBvcztcbiIKLSAgICAidW5pZm9ybSBtYXQ0IHRleE1hdHJpeDtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICAidmFyeWluZyBmbG9hdCB0b3BEb3duO1xuIgotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgZ2xfUG9zaXRpb24gPSB2UG9zaXRpb247XG4iCi0gICAgIiAgdGV4Q29vcmRzID0gKHRleE1hdHJpeCAqIHZlYzQodlRleFBvcywgMC4wLCAxLjApKS54eTtcbiIKLSAgICAiICB0b3BEb3duID0gdlRleFBvcy55O1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBmU3JjTm9ybWFsW10gPQotICAgICIjZXh0ZW5zaW9uIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlXG4iCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXJFeHRlcm5hbE9FUyB0ZXhTYW1wbGVyO1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdGV4Q29vcmRzO1xuIgotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleFNhbXBsZXIsIHRleENvb3Jkcyk7XG4iCi0gICAgIn1cbiI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGZTcmNTZXBpYVtdID0KLSAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIgotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgdGV4U2FtcGxlcjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICBSR0IyWVVWX01BVFJJWAotICAgIFlVVjJSR0JfTUFUUklYCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICB2ZWM0IHJnYiA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICIgIHZlYzQgeXV2ID0gcmdiMnl1diAqIHJnYjtcbiIKLSAgICAiICB5dXYgPSB2ZWM0KHl1di54LCAxMTcuMCwgMTM5LjAsIDEuMCk7XG4iCi0gICAgIiAgZ2xfRnJhZ0NvbG9yID0geXV2MnJnYiAqIHl1djtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZlNyY05lZ2F0aXZlW10gPQotICAgICIjZXh0ZW5zaW9uIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlXG4iCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXJFeHRlcm5hbE9FUyB0ZXhTYW1wbGVyO1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdGV4Q29vcmRzO1xuIgotICAgIFJHQjJZVVZfTUFUUklYCi0gICAgWVVWMlJHQl9NQVRSSVgKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIHZlYzQgcmdiID0gdGV4dHVyZTJEKHRleFNhbXBsZXIsIHRleENvb3Jkcyk7XG4iCi0gICAgIiAgdmVjNCB5dXYgPSByZ2IyeXV2ICogcmdiO1xuIgotICAgICIgIHl1diA9IHZlYzQoMjU1LjAgLSB5dXYueCwgeXV2LnksIHl1di56LCAxLjApO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHl1djJyZ2IgKiB5dXY7XG4iCi0gICAgIn1cbiI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGZTcmNHcmFkaWVudFtdID0KLSAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIgotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgdGV4U2FtcGxlcjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICAidmFyeWluZyBmbG9hdCB0b3BEb3duO1xuIgotICAgIFJHQjJZVVZfTUFUUklYCi0gICAgWVVWMlJHQl9NQVRSSVgKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIHZlYzQgcmdiID0gdGV4dHVyZTJEKHRleFNhbXBsZXIsIHRleENvb3Jkcyk7XG4iCi0gICAgIiAgdmVjNCB5dXYgPSByZ2IyeXV2ICogcmdiO1xuIgotICAgICIgIHZlYzQgbWl4aW4gPSB2ZWM0KDE1LjAvMzEuMCwgNTkuMC82My4wLCAzMS4wLzMxLjAsIDEuMCk7XG4iCi0gICAgIiAgdmVjNCB5dXYyID0gcmdiMnl1diAqIHZlYzQoKG1peGluLnh5eiAqIHRvcERvd24pLCAxKTtcbiIKLSAgICAiICB5dXYgPSB2ZWM0KHl1di54LCB5dXYyLnksIHl1djIueiwgMSk7XG4iCi0gICAgIiAgZ2xfRnJhZ0NvbG9yID0geXV2MnJnYiAqIHl1djtcbiIKLSAgICAifVxuIjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1OYXRpdmVXaW5kb3dSZW5kZXJlcjo6TmF0aXZlV2luZG93UmVuZGVyZXIoc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93LAotICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gICAgOiBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdykKLSAgICAsIG1Ec3RXaWR0aCh3aWR0aCkKLSAgICAsIG1Ec3RIZWlnaHQoaGVpZ2h0KQotICAgICwgbUxhc3RWaWRlb0VmZmVjdCgtMSkKLSAgICAsIG1OZXh0VGV4dHVyZUlkKDEwMCkKLSAgICAsIG1BY3RpdmVJbnB1dHMoMCkKLSAgICAsIG1UaHJlYWRDbWQoQ01EX0lETEUpIHsKLSAgICBjcmVhdGVUaHJlYWQodGhyZWFkU3RhcnQsIHRoaXMpOwotfQotCi0vLyBUaGUgZnVuY3Rpb25zIGJlbG93IHJ1biBpbiB0aGUgR0wgdGhyZWFkLgotLy8KLS8vIEFsbCBHTC1yZWxhdGVkIHdvcmsgaXMgZG9uZSBpbiB0aGlzIHRocmVhZCwgYW5kIG90aGVyIHRocmVhZHMgc2VuZAotLy8gcmVxdWVzdHMgdG8gdGhpcyB0aHJlYWQgdXNpbmcgYSBjb21tYW5kIGNvZGUuIFdlIGV4cGVjdCBtb3N0IG9mIHRoZQotLy8gdGltZSB0aGVyZSB3aWxsIG9ubHkgYmUgb25lIHRocmVhZCBzZW5kaW5nIGluIHJlcXVlc3RzLCBzbyB3ZSBsZXQKLS8vIG90aGVyIHRocmVhZHMgd2FpdCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBmaW5pc2hlZCBieSBHTCB0aHJlYWQuCi0KLWludCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6dGhyZWFkU3RhcnQodm9pZCogc2VsZikgewotICAgIEFMT0dEKCJjcmVhdGUgdGhyZWFkIik7Ci0gICAgKChOYXRpdmVXaW5kb3dSZW5kZXJlciopc2VsZiktPmdsVGhyZWFkKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmdsVGhyZWFkKCkgewotICAgIGluaXRpYWxpemVFR0woKTsKLSAgICBjcmVhdGVQcm9ncmFtcygpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBib29sIHF1aXQgPSBmYWxzZTsKLSAgICB3aGlsZSAoIXF1aXQpIHsKLSAgICAgICAgc3dpdGNoIChtVGhyZWFkQ21kKSB7Ci0gICAgICAgICAgICBjYXNlIENNRF9JRExFOgotICAgICAgICAgICAgICAgIG1Db25kLndhaXQobUxvY2spOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgY2FzZSBDTURfUkVOREVSX0lOUFVUOgotICAgICAgICAgICAgICAgIHJlbmRlcihtVGhyZWFkUmVuZGVySW5wdXQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDTURfUkVTRVJWRV9URVhUVVJFOgotICAgICAgICAgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIG1UaHJlYWRUZXh0dXJlSWQpOwotICAgICAgICAgICAgICAgIENIRUNLX0dMX0VSUk9SOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDTURfREVMRVRFX1RFWFRVUkU6Ci0gICAgICAgICAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbVRocmVhZFRleHR1cmVJZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENNRF9RVUlUOgotICAgICAgICAgICAgICAgIHRlcm1pbmF0ZUVHTCgpOwotICAgICAgICAgICAgICAgIHF1aXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRlbGwgdGhlIHJlcXVlc3RlciB0aGF0IHRoZSBjb21tYW5kIGlzIGZpbmlzaGVkLgotICAgICAgICBtVGhyZWFkQ21kID0gQ01EX0lETEU7Ci0gICAgICAgIG1Db25kLmJyb2FkY2FzdCgpOwotICAgIH0KLSAgICBBTE9HRCgicXVpdCIpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjppbml0aWFsaXplRUdMKCkgewotICAgIG1FZ2xEaXNwbGF5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICBDSEVDS19FR0xfRVJST1I7Ci0KLSAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgZWdsSW5pdGlhbGl6ZShtRWdsRGlzcGxheSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotCi0gICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOwotICAgIEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAotICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCi0gICAgICAgIEVHTF9SRURfU0laRSwgOCwKLSAgICAgICAgRUdMX0dSRUVOX1NJWkUsIDgsCi0gICAgICAgIEVHTF9CTFVFX1NJWkUsIDgsCi0gICAgICAgIEVHTF9OT05FCi0gICAgfTsKLSAgICBlZ2xDaG9vc2VDb25maWcobUVnbERpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKLSAgICBDSEVDS19FR0xfRVJST1I7Ci0KLSAgICBtRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIGNvbmZpZywKLSAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgTlVMTCk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotCi0gICAgRUdMaW50IGNvbnRleHRBdHRyaWJzW10gPSB7IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0xfTk9ORSB9OwotICAgIG1FZ2xDb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChtRWdsRGlzcGxheSwgY29uZmlnLCBFR0xfTk9fQ09OVEVYVCwKLSAgICAgICAgY29udGV4dEF0dHJpYnMpOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsIG1FZ2xDb250ZXh0KTsKLSAgICBDSEVDS19FR0xfRVJST1I7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnRlcm1pbmF0ZUVHTCgpIHsKLSAgICBlZ2xEZXN0cm95Q29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbnRleHQpOwotICAgIGVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQpOwotICAgIGVnbFRlcm1pbmF0ZShtRWdsRGlzcGxheSk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmNyZWF0ZVByb2dyYW1zKCkgewotICAgIEdMdWludCB2U2hhZGVyOwotICAgIGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgdlNyY05vcm1hbCwgJnZTaGFkZXIpOwotCi0gICAgY29uc3QgY2hhciogZlNyY1tOVU1CRVJfT0ZfRUZGRUNUU10gPSB7Ci0gICAgICAgIGZTcmNOb3JtYWwsIGZTcmNTZXBpYSwgZlNyY05lZ2F0aXZlLCBmU3JjR3JhZGllbnQKLSAgICB9OwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1CRVJfT0ZfRUZGRUNUUzsgaSsrKSB7Ci0gICAgICAgIEdMdWludCBmU2hhZGVyOwotICAgICAgICBsb2FkU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwgZlNyY1tpXSwgJmZTaGFkZXIpOwotICAgICAgICBjcmVhdGVQcm9ncmFtKHZTaGFkZXIsIGZTaGFkZXIsICZtUHJvZ3JhbVtpXSk7Ci0gICAgICAgIGdsRGVsZXRlU2hhZGVyKGZTaGFkZXIpOwotICAgICAgICBDSEVDS19HTF9FUlJPUjsKLSAgICB9Ci0KLSAgICBnbERlbGV0ZVNoYWRlcih2U2hhZGVyKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Y3JlYXRlUHJvZ3JhbSgKLSAgICBHTHVpbnQgdmVydGV4U2hhZGVyLCBHTHVpbnQgZnJhZ21lbnRTaGFkZXIsIEdMdWludCogb3V0UGdtKSB7Ci0KLSAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7Ci0gICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZsaW5rU3RhdHVzKTsKLSAgICBpZiAobGlua1N0YXR1cyAhPSBHTF9UUlVFKSB7Ci0gICAgICAgIEdMaW50IGluZm9MZW4gPSAwOwotICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKLSAgICAgICAgaWYgKGluZm9MZW4pIHsKLSAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiUHJvZ3JhbSBsaW5rIGxvZzpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgIHByb2dyYW0gPSAwOwotICAgIH0KLQotICAgICpvdXRQZ20gPSBwcm9ncmFtOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpsb2FkU2hhZGVyKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlLAotICAgICAgICBHTHVpbnQqIG91dFNoYWRlcikgewotICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnBTb3VyY2UsIE5VTEwpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBHTGludCBjb21waWxlZCA9IDA7Ci0gICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZWQpOwotICAgIGlmICghY29tcGlsZWQpIHsKLSAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKLSAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGluZm9MZW4sIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICBBTE9HRSgiU2hhZGVyIGNvbXBpbGUgbG9nOlxuJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgIH0KLSAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgc2hhZGVyID0gMDsKLSAgICB9Ci0gICAgKm91dFNoYWRlciA9IHNoYWRlcjsKLX0KLQotTmF0aXZlV2luZG93UmVuZGVyZXI6On5OYXRpdmVXaW5kb3dSZW5kZXJlcigpIHsKLSAgICBDSEVDSyhtQWN0aXZlSW5wdXRzID09IDApOwotICAgIHN0YXJ0UmVxdWVzdChDTURfUVVJVCk7Ci0gICAgc2VuZFJlcXVlc3QoKTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6cmVuZGVyKFJlbmRlcklucHV0KiBpbnB1dCkgewotICAgIHNwPEdMQ29uc3VtZXI+IFNUID0gaW5wdXQtPm1TVDsKLSAgICBzcDxTdXJmYWNlPiBTVEMgPSBpbnB1dC0+bVNUQzsKLQotICAgIGlmIChpbnB1dC0+bUlzRXh0ZXJuYWxCdWZmZXIpIHsKLSAgICAgICAgcXVldWVFeHRlcm5hbEJ1ZmZlcihTVEMuZ2V0KCksIGlucHV0LT5tQnVmZmVyLAotICAgICAgICAgICAgaW5wdXQtPm1XaWR0aCwgaW5wdXQtPm1IZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHF1ZXVlSW50ZXJuYWxCdWZmZXIoU1RDLmdldCgpLCBpbnB1dC0+bUJ1ZmZlcik7Ci0gICAgfQotCi0gICAgU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0gICAgZ2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICBjYWxjdWxhdGVQb3NpdGlvbkNvb3JkaW5hdGVzKGlucHV0LT5tUmVuZGVyaW5nTW9kZSwKLSAgICAgICAgaW5wdXQtPm1XaWR0aCwgaW5wdXQtPm1IZWlnaHQpOwotCi0gICAgY29uc3QgR0xmbG9hdCB0ZXh0dXJlQ29vcmRpbmF0ZXNbXSA9IHsKLSAgICAgICAgIDAuMGYsICAxLjBmLAotICAgICAgICAgMC4wZiwgIDAuMGYsCi0gICAgICAgICAxLjBmLCAgMC4wZiwKLSAgICAgICAgIDEuMGYsICAxLjBmLAotICAgIH07Ci0KLSAgICB1cGRhdGVQcm9ncmFtQW5kSGFuZGxlKGlucHV0LT5tVmlkZW9FZmZlY3QpOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1Qb3NpdGlvbkhhbmRsZSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLAotICAgICAgICBtUG9zaXRpb25Db29yZGluYXRlcyk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1Qb3NpdGlvbkhhbmRsZSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobVRleFBvc0hhbmRsZSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLAotICAgICAgICB0ZXh0dXJlQ29vcmRpbmF0ZXMpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtVGV4UG9zSGFuZGxlKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIEdMZmxvYXQgdGV4TWF0cml4WzE2XTsKLSAgICBTVC0+Z2V0VHJhbnNmb3JtTWF0cml4KHRleE1hdHJpeCk7Ci0gICAgZ2xVbmlmb3JtTWF0cml4NGZ2KG1UZXhNYXRyaXhIYW5kbGUsIDEsIEdMX0ZBTFNFLCB0ZXhNYXRyaXgpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgaW5wdXQtPm1UZXh0dXJlSWQpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKAotICAgICAgICBHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgIGdsVGV4UGFyYW1ldGVyaSgKLSAgICAgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6cXVldWVJbnRlcm5hbEJ1ZmZlcihBTmF0aXZlV2luZG93ICphbncsCi0gICAgTWVkaWFCdWZmZXIqIGJ1ZmZlcikgewotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKGFudywgdGltZVVzICogMTAwMCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gYW53LT5xdWV1ZUJ1ZmZlcihhbncsIGJ1ZmZlci0+Z3JhcGhpY0J1ZmZlcigpLmdldCgpLCAtMSk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJxdWV1ZUJ1ZmZlciBmYWlsZWQgd2l0aCBlcnJvciAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8TWV0YURhdGE+IG1ldGFEYXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKLSAgICBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVJlbmRlcmVkLCAxKTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6cXVldWVFeHRlcm5hbEJ1ZmZlcihBTmF0aXZlV2luZG93KiBhbncsCi0gICAgTWVkaWFCdWZmZXIqIGJ1ZmZlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhbncsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIpOwotICAgIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKGFudywgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTik7Ci0KLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0gICAgQ0hFQ0soTk9fRVJST1IgPT0gbmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdChhbncsICZhbmIpKTsKLSAgICBDSEVDSyhhbmIgIT0gTlVMTCk7Ci0KLSAgICAvLyBDb3B5IHRoZSBidWZmZXIKLSAgICB1aW50OF90KiBpbWcgPSBOVUxMOwotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7Ci0gICAgYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZpbWcpKTsKLSAgICBjb3B5STQyMEJ1ZmZlcihidWZmZXIsIGltZywgd2lkdGgsIGhlaWdodCwgYnVmLT5nZXRTdHJpZGUoKSk7Ci0gICAgYnVmLT51bmxvY2soKTsKLSAgICBDSEVDSyhOT19FUlJPUiA9PSBhbnctPnF1ZXVlQnVmZmVyKGFudywgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSwgLTEpKTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Y29weUk0MjBCdWZmZXIoTWVkaWFCdWZmZXIqIHNyYywgdWludDhfdCogZHN0LAotICAgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsIGludCBzdHJpZGUpIHsKLSAgICBpbnQgc3RyaWRlVVYgPSAoc3RyaWRlIC8gMiArIDB4ZikgJiB+MHhmOwotICAgIHVpbnQ4X3QqIHAgPSAodWludDhfdCopc3JjLT5kYXRhKCkgKyBzcmMtPnJhbmdlX29mZnNldCgpOwotICAgIC8vIFkKLSAgICBmb3IgKGludCBpID0gc3JjSGVpZ2h0OyBpID4gMDsgaS0tKSB7Ci0gICAgICAgIG1lbWNweShkc3QsIHAsIHNyY1dpZHRoKTsKLSAgICAgICAgZHN0ICs9IHN0cmlkZTsKLSAgICAgICAgcCArPSBzcmNXaWR0aDsKLSAgICB9Ci0gICAgLy8gVGhlIHNyYyBpcyBJNDIwLCB0aGUgZHN0IGlzIFlWMTIuCi0gICAgLy8gVQotICAgIHAgKz0gc3JjV2lkdGggKiBzcmNIZWlnaHQgLyA0OwotICAgIGZvciAoaW50IGkgPSBzcmNIZWlnaHQgLyAyOyBpID4gMDsgaS0tKSB7Ci0gICAgICAgIG1lbWNweShkc3QsIHAsIHNyY1dpZHRoIC8gMik7Ci0gICAgICAgIGRzdCArPSBzdHJpZGVVVjsKLSAgICAgICAgcCArPSBzcmNXaWR0aCAvIDI7Ci0gICAgfQotICAgIC8vIFYKLSAgICBwIC09IHNyY1dpZHRoICogc3JjSGVpZ2h0IC8gMjsKLSAgICBmb3IgKGludCBpID0gc3JjSGVpZ2h0IC8gMjsgaSA+IDA7IGktLSkgewotICAgICAgICBtZW1jcHkoZHN0LCBwLCBzcmNXaWR0aCAvIDIpOwotICAgICAgICBkc3QgKz0gc3RyaWRlVVY7Ci0gICAgICAgIHAgKz0gc3JjV2lkdGggLyAyOwotICAgIH0KLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6dXBkYXRlUHJvZ3JhbUFuZEhhbmRsZSh1aW50MzJfdCB2aWRlb0VmZmVjdCkgewotICAgIGlmIChtTGFzdFZpZGVvRWZmZWN0ID09IHZpZGVvRWZmZWN0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtTGFzdFZpZGVvRWZmZWN0ID0gdmlkZW9FZmZlY3Q7Ci0gICAgaW50IGk7Ci0gICAgc3dpdGNoIChtTGFzdFZpZGVvRWZmZWN0KSB7Ci0gICAgICAgIGNhc2UgVklERU9fRUZGRUNUX05PTkU6Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPX0VGRkVDVF9TRVBJQToKLSAgICAgICAgICAgIGkgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9fRUZGRUNUX05FR0FUSVZFOgotICAgICAgICAgICAgaSA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT19FRkZFQ1RfR1JBRElFTlQ6Ci0gICAgICAgICAgICBpID0gMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZ2xVc2VQcm9ncmFtKG1Qcm9ncmFtW2ldKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIG1Qb3NpdGlvbkhhbmRsZSA9IGdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW1baV0sICJ2UG9zaXRpb24iKTsKLSAgICBtVGV4UG9zSGFuZGxlID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihtUHJvZ3JhbVtpXSwgInZUZXhQb3MiKTsKLSAgICBtVGV4TWF0cml4SGFuZGxlID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obVByb2dyYW1baV0sICJ0ZXhNYXRyaXgiKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Y2FsY3VsYXRlUG9zaXRpb25Db29yZGluYXRlcygKLSAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGUsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCkgewotICAgIGZsb2F0IHgsIHk7Ci0gICAgc3dpdGNoIChyZW5kZXJpbmdNb2RlKSB7Ci0gICAgICAgIGNhc2UgTTR4VlNTX2tSZXNpemluZzoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHggPSAxOwotICAgICAgICAgICAgeSA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa0Nyb3BwaW5nOgotICAgICAgICAgICAgeCA9IGZsb2F0KHNyY1dpZHRoKSAvIG1Ec3RXaWR0aDsKLSAgICAgICAgICAgIHkgPSBmbG9hdChzcmNIZWlnaHQpIC8gbURzdEhlaWdodDsKLSAgICAgICAgICAgIC8vIE1ha2UgdGhlIHNtYWxsZXIgc2lkZSAxCi0gICAgICAgICAgICBpZiAoeCA+IHkpIHsKLSAgICAgICAgICAgICAgICB4IC89IHk7Ci0gICAgICAgICAgICAgICAgeSA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHkgLz0geDsKLSAgICAgICAgICAgICAgICB4ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00eFZTU19rQmxhY2tCb3JkZXJzOgotICAgICAgICAgICAgeCA9IGZsb2F0KHNyY1dpZHRoKSAvIG1Ec3RXaWR0aDsKLSAgICAgICAgICAgIHkgPSBmbG9hdChzcmNIZWlnaHQpIC8gbURzdEhlaWdodDsKLSAgICAgICAgICAgIC8vIE1ha2UgdGhlIGxhcmdlciBzaWRlIDEKLSAgICAgICAgICAgIGlmICh4ID4geSkgewotICAgICAgICAgICAgICAgIHkgLz0geDsKLSAgICAgICAgICAgICAgICB4ID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeCAvPSB5OwotICAgICAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbMF0gPSAteDsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1sxXSA9IHk7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbMl0gPSAteDsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1szXSA9IC15OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzRdID0geDsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1s1XSA9IC15OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzZdID0geDsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1s3XSA9IHk7Ci19Ci0KLS8vCi0vLyAgVGhlIGZ1bmN0aW9ucyBiZWxvdyBydW4gaW4gb3RoZXIgdGhyZWFkcy4KLS8vCi0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnN0YXJ0UmVxdWVzdChpbnQgY21kKSB7Ci0gICAgbUxvY2subG9jaygpOwotICAgIHdoaWxlIChtVGhyZWFkQ21kICE9IENNRF9JRExFKSB7Ci0gICAgICAgIG1Db25kLndhaXQobUxvY2spOwotICAgIH0KLSAgICBtVGhyZWFkQ21kID0gY21kOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpzZW5kUmVxdWVzdCgpIHsKLSAgICBtQ29uZC5icm9hZGNhc3QoKTsKLSAgICB3aGlsZSAobVRocmVhZENtZCAhPSBDTURfSURMRSkgewotICAgICAgICBtQ29uZC53YWl0KG1Mb2NrKTsKLSAgICB9Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci19Ci0KLVJlbmRlcklucHV0KiBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Y3JlYXRlUmVuZGVySW5wdXQoKSB7Ci0gICAgQUxPR0QoIm5ldyByZW5kZXIgaW5wdXQgJWQiLCBtTmV4dFRleHR1cmVJZCk7Ci0gICAgUmVuZGVySW5wdXQqIGlucHV0ID0gbmV3IFJlbmRlcklucHV0KHRoaXMsIG1OZXh0VGV4dHVyZUlkKTsKLQotICAgIHN0YXJ0UmVxdWVzdChDTURfUkVTRVJWRV9URVhUVVJFKTsKLSAgICBtVGhyZWFkVGV4dHVyZUlkID0gbU5leHRUZXh0dXJlSWQ7Ci0gICAgc2VuZFJlcXVlc3QoKTsKLQotICAgIG1OZXh0VGV4dHVyZUlkKys7Ci0gICAgbUFjdGl2ZUlucHV0cysrOwotICAgIHJldHVybiBpbnB1dDsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6ZGVzdHJveVJlbmRlcklucHV0KFJlbmRlcklucHV0KiBpbnB1dCkgewotICAgIEFMT0dEKCJkZXN0cm95IHJlbmRlciBpbnB1dCAlZCIsIGlucHV0LT5tVGV4dHVyZUlkKTsKLSAgICBHTHVpbnQgdGV4dHVyZUlkID0gaW5wdXQtPm1UZXh0dXJlSWQ7Ci0gICAgZGVsZXRlIGlucHV0OwotCi0gICAgc3RhcnRSZXF1ZXN0KENNRF9ERUxFVEVfVEVYVFVSRSk7Ci0gICAgbVRocmVhZFRleHR1cmVJZCA9IHRleHR1cmVJZDsKLSAgICBzZW5kUmVxdWVzdCgpOwotCi0gICAgbUFjdGl2ZUlucHV0cy0tOwotfQotCi0vLwotLy8gIFJlbmRlcklucHV0Ci0vLwotCi1SZW5kZXJJbnB1dDo6UmVuZGVySW5wdXQoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyLCBHTHVpbnQgdGV4dHVyZUlkKQotICAgIDogbVJlbmRlcmVyKHJlbmRlcmVyKQotICAgICwgbVRleHR1cmVJZCh0ZXh0dXJlSWQpIHsKLSAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBtU1QgPSBuZXcgR0xDb25zdW1lcihicSwgbVRleHR1cmVJZCk7Ci0gICAgbVNUQyA9IG5ldyBTdXJmYWNlKGJxKTsKLSAgICBuYXRpdmVfd2luZG93X2Nvbm5lY3QobVNUQy5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwotfQotCi1SZW5kZXJJbnB1dDo6flJlbmRlcklucHV0KCkgewotfQotCi1BTmF0aXZlV2luZG93KiBSZW5kZXJJbnB1dDo6Z2V0VGFyZ2V0V2luZG93KCkgewotICAgIHJldHVybiBtU1RDLmdldCgpOwotfQotCi12b2lkIFJlbmRlcklucHV0Ojp1cGRhdGVWaWRlb1NpemUoc3A8TWV0YURhdGE+IG1ldGEpIHsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmbVdpZHRoKSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZtSGVpZ2h0KSk7Ci0KLSAgICBpbnQgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOwotICAgIGlmIChtZXRhLT5maW5kUmVjdChrS2V5Q3JvcFJlY3QsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7Ci0gICAgICAgIG1XaWR0aCA9IHJpZ2h0IC0gbGVmdCArIDE7Ci0gICAgICAgIG1IZWlnaHQgPSBib3R0b20gLSB0b3AgKyAxOwotICAgIH0KLQotICAgIC8vIElmIHJvdGF0aW9uIGRlZ3JlZXMgaXMgOTAgb3IgMjcwLCBzd2FwIHdpZHRoIGFuZCBoZWlnaHQKLSAgICAvLyAobVdpZHRoIGFuZCBtSGVpZ2h0IGFyZSB0aGUgX3JvdGF0ZWRfIHNvdXJjZSByZWN0YW5nbGUpLgotICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwotICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKLSAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKLSAgICB9Ci0KLSAgICBpZiAocm90YXRpb25EZWdyZWVzID09IDkwIHx8IHJvdGF0aW9uRGVncmVlcyA9PSAyNzApIHsKLSAgICAgICAgaW50IHRtcCA9IG1XaWR0aDsKLSAgICAgICAgbVdpZHRoID0gbUhlaWdodDsKLSAgICAgICAgbUhlaWdodCA9IHRtcDsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVySW5wdXQ6OnJlbmRlcihNZWRpYUJ1ZmZlciogYnVmZmVyLCB1aW50MzJfdCB2aWRlb0VmZmVjdCwKLSAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGUsIGJvb2wgaXNFeHRlcm5hbEJ1ZmZlcikgewotICAgIG1WaWRlb0VmZmVjdCA9IHZpZGVvRWZmZWN0OwotICAgIG1SZW5kZXJpbmdNb2RlID0gcmVuZGVyaW5nTW9kZTsKLSAgICBtSXNFeHRlcm5hbEJ1ZmZlciA9IGlzRXh0ZXJuYWxCdWZmZXI7Ci0gICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKLQotICAgIG1SZW5kZXJlci0+c3RhcnRSZXF1ZXN0KE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpDTURfUkVOREVSX0lOUFVUKTsKLSAgICBtUmVuZGVyZXItPm1UaHJlYWRSZW5kZXJJbnB1dCA9IHRoaXM7Ci0gICAgbVJlbmRlcmVyLT5zZW5kUmVxdWVzdCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9OYXRpdmVXaW5kb3dSZW5kZXJlci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9OYXRpdmVXaW5kb3dSZW5kZXJlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNmI0Y2JhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBOQVRJVkVfV0lORE9XX1JFTkRFUkVSX0hfCi0jZGVmaW5lIE5BVElWRV9XSU5ET1dfUkVOREVSRVJfSF8KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgIk00eFZTU19BUEkuaCIKLQotLy8gVGhlIE5hdGl2ZVdpbmRvd1JlbmRlcmVyIGRyYXdzIHZpZGVvIGZyYW1lcyBzdG9yZWQgaW4gTWVkaWFCdWZmZXJzIHRvCi0vLyBhbiBBTmF0aXZlV2luZG93LiAgSXQgY2FuIGFwcGx5ICJyZW5kZXJpbmcgbW9kZSIgYW5kIGNvbG9yIGVmZmVjdHMgdG8KLS8vIHRoZSBmcmFtZXMuICJSZW5kZXJpbmcgbW9kZSIgaXMgdGhlIG9wdGlvbiB0byBkbyByZXNpemluZywgY3JvcHBpbmcsCi0vLyBvciBibGFjay1ib3JkZXJpbmcgd2hlbiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhc3BlY3QgcmF0aW8gYXJlCi0vLyBkaWZmZXJlbnQuIENvbG9yIGVmZmVjdHMgaW5jbHVkZSBzZXBpYSwgbmVnYXRpdmUsIGFuZCBncmFkaWVudC4KLS8vCi0vLyBUaGUgaW5wdXQgdG8gTmF0aXZlV2luZG93UmVuZGVyZXIgaXMgcHJvdmlkZWQgYnkgdGhlIFJlbmRlcklucHV0IGNsYXNzLAotLy8gYW5kIHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBhY3RpdmUgUmVuZGVySW5wdXQgYXQgdGhlIHNhbWUgdGltZS4gQWx0aG91Z2gKLS8vIHdlIG9ubHkgZXhwZWN0IHRoYXQgaGFwcGVucyBicmllZmx5IHdoZW4gb25lIGNsaXAgaXMgYWJvdXQgdG8gZmluaXNoCi0vLyBhbmQgdGhlIG5leHQgY2xpcCBpcyBhYm91dCB0byBzdGFydC4KLS8vCi0vLyBXZSBhbGxvY2F0ZSBhIFN1cmZhY2UgZm9yIGVhY2ggUmVuZGVySW5wdXQgYW5kIHRoZSB1c2VyIGNhbiB1c2UKLS8vIHRoZSBnZXRUYXJnZXRXaW5kb3coKSBmdW5jdGlvbiB0byBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgQU5hdGl2ZVdpbmRvdwotLy8gZm9yIHRoYXQgU3VyZmFjZS4gVGhlIGludGVudGlvbiBpcyB0aGF0IHRoZSB1c2VyIGNhbiBwYXNzIHRoYXQKLS8vIEFOYXRpdmVXaW5kb3cgdG8gT01YQ29kZWM6OkNyZWF0ZSgpIHNvIHRoZSBjb2RlYyBjYW4gZGVjb2RlIGRpcmVjdGx5Ci0vLyB0byBidWZmZXJzIHByb3ZpZGVkIGJ5IHRoZSB0ZXh0dXJlLgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEdMQ29uc3VtZXI7Ci1jbGFzcyBTdXJmYWNlOwotY2xhc3MgUmVuZGVySW5wdXQ7Ci0KLWNsYXNzIE5hdGl2ZVdpbmRvd1JlbmRlcmVyIHsKLXB1YmxpYzoKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlcihzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3csIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgfk5hdGl2ZVdpbmRvd1JlbmRlcmVyKCk7Ci0KLSAgICBSZW5kZXJJbnB1dCogY3JlYXRlUmVuZGVySW5wdXQoKTsKLSAgICB2b2lkIGRlc3Ryb3lSZW5kZXJJbnB1dChSZW5kZXJJbnB1dCogaW5wdXQpOwotCi1wcml2YXRlOgotICAgIC8vIE5vIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlcihjb25zdCBOYXRpdmVXaW5kb3dSZW5kZXJlciAmKTsKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IE5hdGl2ZVdpbmRvd1JlbmRlcmVyICYpOwotCi0gICAgLy8gSW5pdGlhbGl6YXRpb24gYW5kIGZpbmlhbGl6YXRpb24KLSAgICB2b2lkIGluaXRpYWxpemVFR0woKTsKLSAgICB2b2lkIHRlcm1pbmF0ZUVHTCgpOwotICAgIHZvaWQgY3JlYXRlUHJvZ3JhbXMoKTsKLSAgICB2b2lkIGNyZWF0ZVByb2dyYW0oCi0gICAgICAgICAgICBHTHVpbnQgdmVydGV4U2hhZGVyLCBHTHVpbnQgZnJhZ21lbnRTaGFkZXIsIEdMdWludCogb3V0UGdtKTsKLSAgICB2b2lkIGxvYWRTaGFkZXIoCi0gICAgICAgICAgICBHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSwgR0x1aW50KiBvdXRTaGFkZXIpOwotCi0gICAgLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSBleGVjdXRlZCBldmVyeSBmcmFtZS4KLSAgICB2b2lkIHJlbmRlcihSZW5kZXJJbnB1dCogaW5wdXQpOwotICAgIHZvaWQgcXVldWVJbnRlcm5hbEJ1ZmZlcihBTmF0aXZlV2luZG93KiBhbncsIE1lZGlhQnVmZmVyKiBidWZmZXIpOwotICAgIHZvaWQgcXVldWVFeHRlcm5hbEJ1ZmZlcihBTmF0aXZlV2luZG93KiBhbncsIE1lZGlhQnVmZmVyKiBidWZmZXIsCi0gICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgIHZvaWQgY29weUk0MjBCdWZmZXIoTWVkaWFCdWZmZXIqIHNyYywgdWludDhfdCogZHN0LAotICAgICAgICAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LCBpbnQgc3RyaWRlKTsKLSAgICB2b2lkIHVwZGF0ZVByb2dyYW1BbmRIYW5kbGUodWludDMyX3QgdmlkZW9FZmZlY3QpOwotICAgIHZvaWQgY2FsY3VsYXRlUG9zaXRpb25Db29yZGluYXRlcyhNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwKLSAgICAgICAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCk7Ci0KLSAgICAvLyBUaGVzZSB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkIG9uY2UgYW5kIGRvZXNuJ3QgY2hhbmdlIGFmdGVyd2FyZHMuCi0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKLSAgICBpbnQgbURzdFdpZHRoLCBtRHN0SGVpZ2h0OwotICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7Ci0gICAgRUdMU3VyZmFjZSBtRWdsU3VyZmFjZTsKLSAgICBFR0xDb250ZXh0IG1FZ2xDb250ZXh0OwotICAgIGVudW0gewotICAgICAgICBFRkZFQ1RfTk9STUFMLAotICAgICAgICBFRkZFQ1RfU0VQSUEsCi0gICAgICAgIEVGRkVDVF9ORUdBVElWRSwKLSAgICAgICAgRUZGRUNUX0dSQURJRU5ULAotICAgICAgICBOVU1CRVJfT0ZfRUZGRUNUUwotICAgIH07Ci0gICAgR0x1aW50IG1Qcm9ncmFtW05VTUJFUl9PRl9FRkZFQ1RTXTsKLQotICAgIC8vIFdlIHVzZSBvbmUgc2hhZGVyIHByb2dyYW0gZm9yIGVhY2ggZWZmZWN0LiBtTGFzdFZpZGVvRWZmZWN0IHJlbWVtYmVycwotICAgIC8vIHRoZSBwcm9ncmFtIHVzZWQgZm9yIHRoZSBsYXN0IGZyYW1lLiB3aGVuIHRoZSBlZmZlY3QgdXNlZCBjaGFuZ2VzLAotICAgIC8vIHdlIGNoYW5nZSB0aGUgcHJvZ3JhbSB1c2VkIGFuZCB1cGRhdGUgdGhlIGhhbmRsZXMuCi0gICAgdWludDMyX3QgbUxhc3RWaWRlb0VmZmVjdDsKLSAgICBHTGludCBtUG9zaXRpb25IYW5kbGU7Ci0gICAgR0xpbnQgbVRleFBvc0hhbmRsZTsKLSAgICBHTGludCBtVGV4TWF0cml4SGFuZGxlOwotCi0gICAgLy8gVGhpcyBpcyB0aGUgdmVydGV4IGNvb3JkaW5hdGVzIHVzZWQgZm9yIHRoZSBmcmFtZSB0ZXh0dXJlLgotICAgIC8vIEl0J3MgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdGhlIHRoZSByZW5kZXJpbmcgbW9kZSBhbmQgdGhlIHNvdXJjZSBhbmQKLSAgICAvLyBkZXN0aW5hdGlvbiBhc3BlY3QgcmF0aW8uCi0gICAgR0xmbG9hdCBtUG9zaXRpb25Db29yZGluYXRlc1s4XTsKLQotICAgIC8vIFdlIHVzZSBhIGRpZmZlcmVudCBHTCBpZCBmb3IgZWFjaCBTdXJmYWNlLgotICAgIEdMdWludCBtTmV4dFRleHR1cmVJZDsKLQotICAgIC8vIE51bWJlciBvZiBleGlzdGluZyBSZW5kZXJJbnB1dHMsIGp1c3QgZm9yIGRlYnVnZ2luZy4KLSAgICBpbnQgbUFjdGl2ZUlucHV0czsKLQotICAgIC8vIFRoZSBHTCB0aHJlYWQgZnVuY3Rpb25zCi0gICAgc3RhdGljIGludCB0aHJlYWRTdGFydCh2b2lkKiBzZWxmKTsKLSAgICB2b2lkIGdsVGhyZWFkKCk7Ci0KLSAgICAvLyBUaGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiB0aGUgR0wgdGhyZWFkIGFuZAotICAgIC8vIG90aGVyIHRocmVhZHMuCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kOwotICAgIGVudW0gewotICAgICAgICBDTURfSURMRSwKLSAgICAgICAgQ01EX1JFTkRFUl9JTlBVVCwKLSAgICAgICAgQ01EX1JFU0VSVkVfVEVYVFVSRSwKLSAgICAgICAgQ01EX0RFTEVURV9URVhUVVJFLAotICAgICAgICBDTURfUVVJVCwKLSAgICB9OwotICAgIGludCBtVGhyZWFkQ21kOwotICAgIFJlbmRlcklucHV0KiBtVGhyZWFkUmVuZGVySW5wdXQ7Ci0gICAgR0x1aW50IG1UaHJlYWRUZXh0dXJlSWQ7Ci0KLSAgICAvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gc2VuZCBjb21tYW5kcyB0byB0aGUgR0wgdGhyZWFkLgotICAgIC8vIHNlbmRSZXF1ZXN0KCkgYWxzbyB3YWl0cyBmb3IgdGhlIEdMIHRocmVhZCBhY2tub3dsZWRnZXMgdGhlCi0gICAgLy8gY29tbWFuZCBpcyBmaW5pc2hlZC4KLSAgICB2b2lkIHN0YXJ0UmVxdWVzdChpbnQgY21kKTsKLSAgICB2b2lkIHNlbmRSZXF1ZXN0KCk7Ci0KLSAgICBmcmllbmQgY2xhc3MgUmVuZGVySW5wdXQ7Ci19OwotCi1jbGFzcyBSZW5kZXJJbnB1dCB7Ci1wdWJsaWM6Ci0gICAgLy8gUmV0dXJucyB0aGUgQU5hdGl2ZVdpbmRvdyBjb3JyZXNwb25kcyB0byB0aGUgU3VyZmFjZS4KLSAgICBBTmF0aXZlV2luZG93KiBnZXRUYXJnZXRXaW5kb3coKTsKLQotICAgIC8vIFVwZGF0ZXMgdmlkZW8gZnJhbWUgc2l6ZSBmcm9tIHRoZSBNZWRpYVNvdXJjZSdzIG1ldGFkYXRhLiBTcGVjaWZpY2FsbHkKLSAgICAvLyB3ZSBsb29rIGZvciBrS2V5V2lkdGgsIGtLZXlIZWlnaHQsIGFuZCAob3B0aW9uYWxseSkga0tleUNyb3BSZWN0LgotICAgIHZvaWQgdXBkYXRlVmlkZW9TaXplKHNwPE1ldGFEYXRhPiBtZXRhKTsKLQotICAgIC8vIFJlbmRlcnMgdGhlIGJ1ZmZlciB3aXRoIHRoZSBnaXZlbiB2aWRlbyBlZmZlY3QgYW5kIHJlbmRpbmcgbW9kZS4KLSAgICAvLyBUaGUgdmlkZW8gZWZmZXRzIGFyZSBkZWZpbmVkIGluIFZpZGVvRWRpdG9yVG9vbHMuaAotICAgIC8vIFNldCBpc0V4dGVybmFsQnVmZmVyIHRvIHRydWUgb25seSB3aGVuIHRoZSBidWZmZXIgZ2l2ZW4gaXMgbm90Ci0gICAgLy8gcHJvdmlkZWQgYnkgdGhlIFN1cmZhY2UuCi0gICAgdm9pZCByZW5kZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlciwgdWludDMyX3QgdmlkZW9FZmZlY3QsCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLCBib29sIGlzRXh0ZXJuYWxCdWZmZXIpOwotcHJpdmF0ZToKLSAgICBSZW5kZXJJbnB1dChOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIsIEdMdWludCB0ZXh0dXJlSWQpOwotICAgIH5SZW5kZXJJbnB1dCgpOwotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiBtUmVuZGVyZXI7Ci0gICAgR0x1aW50IG1UZXh0dXJlSWQ7Ci0gICAgc3A8R0xDb25zdW1lcj4gbVNUOwotICAgIHNwPFN1cmZhY2U+IG1TVEM7Ci0gICAgaW50IG1XaWR0aCwgbUhlaWdodDsKLQotICAgIC8vIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGR1cmluZyByZW5kZXIoKSBjYWxscwotICAgIHVpbnQzMl90IG1WaWRlb0VmZmVjdDsKLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbVJlbmRlcmluZ01vZGU7Ci0gICAgYm9vbCBtSXNFeHRlcm5hbEJ1ZmZlcjsKLSAgICBNZWRpYUJ1ZmZlciogbUJ1ZmZlcjsKLQotICAgIGZyaWVuZCBjbGFzcyBOYXRpdmVXaW5kb3dSZW5kZXJlcjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTkFUSVZFX1dJTkRPV19SRU5ERVJFUl9IXwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiZDlmODQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiUHJldmlld1BsYXllciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oIgotI2luY2x1ZGUgIkR1bW15QXVkaW9Tb3VyY2UuaCIKLSNpbmNsdWRlICJEdW1teVZpZGVvU291cmNlLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JTUkMuaCIKLSNpbmNsdWRlICJQcmV2aWV3UGxheWVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotCi12b2lkIGFkZEJhdHRlcnlEYXRhKHVpbnQzMl90IHBhcmFtcykgewotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9Ci0gICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7Ci0gICAgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7Ci0gICAgQ0hFQ0soc2VydmljZS5nZXQoKSAhPSBOVUxMKTsKLQotICAgIHNlcnZpY2UtPmFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7Ci19Ci0KLXN0cnVjdCBQcmV2aWV3UGxheWVyRXZlbnQgOiBwdWJsaWMgVGltZWRFdmVudFF1ZXVlOjpFdmVudCB7Ci0gICAgUHJldmlld1BsYXllckV2ZW50KAotICAgICAgICAgICAgUHJldmlld1BsYXllciAqcGxheWVyLAotICAgICAgICAgICAgdm9pZCAoUHJldmlld1BsYXllcjo6Km1ldGhvZCkoKSkKLSAgICAgICAgOiBtUGxheWVyKHBsYXllciksCi0gICAgICAgICAgbU1ldGhvZChtZXRob2QpIHsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QcmV2aWV3UGxheWVyRXZlbnQoKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICpxdWV1ZSwgaW50NjRfdCAvKiBub3dfdXMgKi8pIHsKLSAgICAgICAgKG1QbGF5ZXItPiptTWV0aG9kKSgpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBQcmV2aWV3UGxheWVyICptUGxheWVyOwotICAgIHZvaWQgKFByZXZpZXdQbGF5ZXI6OiptTWV0aG9kKSgpOwotCi0gICAgUHJldmlld1BsYXllckV2ZW50KGNvbnN0IFByZXZpZXdQbGF5ZXJFdmVudCAmKTsKLSAgICBQcmV2aWV3UGxheWVyRXZlbnQgJm9wZXJhdG9yPShjb25zdCBQcmV2aWV3UGxheWVyRXZlbnQgJik7Ci19OwotCi1QcmV2aWV3UGxheWVyOjpQcmV2aWV3UGxheWVyKE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiByZW5kZXJlcikKLSAgICA6IG1RdWV1ZVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVRpbWVTb3VyY2UoTlVMTCksCi0gICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyhmYWxzZSksCi0gICAgICBtQXVkaW9QbGF5ZXIoTlVMTCksCi0gICAgICBtRGlzcGxheVdpZHRoKDApLAotICAgICAgbURpc3BsYXlIZWlnaHQoMCksCi0gICAgICBtRmxhZ3MoMCksCi0gICAgICBtRXh0cmFjdG9yRmxhZ3MoMCksCi0gICAgICBtVmlkZW9CdWZmZXIoTlVMTCksCi0gICAgICBtTGFzdFZpZGVvVGltZVVzKC0xKSwKLSAgICAgIG1OYXRpdmVXaW5kb3dSZW5kZXJlcihyZW5kZXJlciksCi0gICAgICBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleCgwKSwKLSAgICAgIG1GcmFtZVJHQkJ1ZmZlcihOVUxMKSwKLSAgICAgIG1GcmFtZVlVVkJ1ZmZlcihOVUxMKSB7Ci0KLSAgICBDSEVDS19FUShtQ2xpZW50LmNvbm5lY3QoKSwgKHN0YXR1c190KU9LKTsKLSAgICBEYXRhU291cmNlOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwotCi0KLSAgICBtVmlkZW9SZW5kZXJlciA9IE5VTEw7Ci0gICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLSAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMgPSAwOwotICAgIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUgPSAwOwotICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSA9IDA7Ci0gICAgbU51bWJlckVmZmVjdHMgPSAwOwotICAgIG1EZWNvZGVkVmlkZW9UcyA9IDA7Ci0gICAgbURlY1ZpZGVvVHNTdG9yeUJvYXJkID0gMDsKLSAgICBtQ3VycmVudFZpZGVvRWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgbVByb2dyZXNzQ2JJbnRlcnZhbCA9IDA7Ci0gICAgbU51bWJlckRlY1ZpZGVvRnJhbWVzID0gMDsKLSAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgbUlzQ2hhbmdlU291cmNlUmVxdWlyZWQgPSB0cnVlOwotCi0gICAgbVZpZGVvRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KHRoaXMsICZQcmV2aWV3UGxheWVyOjpvblZpZGVvRXZlbnQpOwotICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1WaWRlb0xhZ0V2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCh0aGlzLCAmUHJldmlld1BsYXllcjo6b25WaWRlb0xhZ1VwZGF0ZSk7Ci0gICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbUNoZWNrQXVkaW9TdGF0dXNFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQoCi0gICAgICAgICAgICB0aGlzLCAmUHJldmlld1BsYXllcjo6b25DaGVja0F1ZGlvU3RhdHVzKTsKLSAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtU3RyZWFtRG9uZUV2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCgKLSAgICAgICAgICAgIHRoaXMsICZQcmV2aWV3UGxheWVyOjpvblN0cmVhbURvbmUpOwotICAgIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVByb2dyZXNzQ2JFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywKLSAgICAgICAgICZQcmV2aWV3UGxheWVyOjpvblByb2dyZXNzQ2JFdmVudCk7Ci0KLSAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCh0aGlzLAotICAgICAgICAmUHJldmlld1BsYXllcjo6b25VcGRhdGVPdmVybGF5RXZlbnQpOwotICAgIG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1SZW5kZXJpbmdNb2RlID0gKE00eFZTU19NZWRpYVJlbmRlcmluZylNRURJQV9SRU5ERVJJTkdfSU5WQUxJRDsKLSAgICBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IGZhbHNlOwotICAgIHJlc2V0KCk7Ci19Ci0KLVByZXZpZXdQbGF5ZXI6On5QcmV2aWV3UGxheWVyKCkgewotCi0gICAgaWYgKG1RdWV1ZVN0YXJ0ZWQpIHsKLSAgICAgICAgbVF1ZXVlLnN0b3AoKTsKLSAgICB9Ci0KLSAgICByZXNldCgpOwotCi0gICAgaWYgKG1WaWRlb1JlbmRlcmVyKSB7Ci0gICAgICAgIG1OYXRpdmVXaW5kb3dSZW5kZXJlci0+ZGVzdHJveVJlbmRlcklucHV0KG1WaWRlb1JlbmRlcmVyKTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgY2xlYXJfbCgpOwotICAgIG1DbGllbnQuZGlzY29ubmVjdCgpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmNhbmNlbFBsYXllckV2ZW50c19sKGJvb2wgdXBkYXRlUHJvZ3Jlc3NDYikgewotICAgIG1RdWV1ZS5jYW5jZWxFdmVudChtVmlkZW9FdmVudC0+ZXZlbnRJRCgpKTsKLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobVN0cmVhbURvbmVFdmVudC0+ZXZlbnRJRCgpKTsKLSAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1RdWV1ZS5jYW5jZWxFdmVudChtQ2hlY2tBdWRpb1N0YXR1c0V2ZW50LT5ldmVudElEKCkpOwotICAgIG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1RdWV1ZS5jYW5jZWxFdmVudChtVmlkZW9MYWdFdmVudC0+ZXZlbnRJRCgpKTsKLSAgICBtVmlkZW9MYWdFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBpZiAodXBkYXRlUHJvZ3Jlc3NDYikgewotICAgICAgICBtUXVldWUuY2FuY2VsRXZlbnQobVByb2dyZXNzQ2JFdmVudC0+ZXZlbnRJRCgpKTsKLSAgICAgICAgbVByb2dyZXNzQ2JFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqcGF0aCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChwYXRoKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZV9sKGNvbnN0IGNoYXIgKnBhdGgpIHsKLSAgICByZXNldF9sKCk7Ci0KLSAgICBtVXJpID0gcGF0aDsKLQotICAgIC8vIFRoZSBhY3R1YWwgd29yayB3aWxsIGJlIGRvbmUgZHVyaW5nIHByZXBhcmF0aW9uIGluIHRoZSBjYWxsIHRvCi0gICAgLy8gOjpmaW5pc2hTZXREYXRhU291cmNlX2wgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIGNhbGxpbmcgdGhyZWFkIGluCi0gICAgLy8gc2V0RGF0YVNvdXJjZSBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUuCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXREYXRhU291cmNlX2woY29uc3Qgc3A8TWVkaWFFeHRyYWN0b3I+ICZleHRyYWN0b3IpIHsKLSAgICBib29sIGhhdmVBdWRpbyA9IGZhbHNlOwotICAgIGJvb2wgaGF2ZVZpZGVvID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7ICsraSkgewotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKLQotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICAgICAgaWYgKCFoYXZlVmlkZW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewotICAgICAgICAgICAgc2V0VmlkZW9Tb3VyY2UoZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7Ci0gICAgICAgICAgICBoYXZlVmlkZW8gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCFoYXZlQXVkaW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewotICAgICAgICAgICAgc2V0QXVkaW9Tb3VyY2UoZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7Ci0gICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkgewotICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBmb3Igdm9yYmlzIGF1ZGlvLCBub25lIG9mIHRoZSBvdGhlciBhdWRpbwotICAgICAgICAgICAgICAgIC8vIGZvcm1hdHMgZXZlbiBzdXBwb3J0IHRoaXMgcmluZ3RvbmUgc3BlY2lmaWMgaGFjayBhbmQKLSAgICAgICAgICAgICAgICAvLyByZXRyaWV2aW5nIHRoZSBtZXRhZGF0YSBvbiBzb21lIGV4dHJhY3RvcnMgbWF5IHR1cm4gb3V0Ci0gICAgICAgICAgICAgICAgLy8gdG8gYmUgdmVyeSBleHBlbnNpdmUuCi0gICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gZXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotICAgICAgICAgICAgICAgIGludDMyX3QgbG9vcDsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZU1ldGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZU1ldGEtPmZpbmRJbnQzMihrS2V5QXV0b0xvb3AsICZsb29wKQotICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxvb3AgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVUT19MT09QSU5HOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXZlQXVkaW8gJiYgaGF2ZVZpZGVvKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFkZCB0aGUgc3VwcG9ydCBmb3IgRHVtbXkgYXVkaW8qLwotICAgIGlmKCAhaGF2ZUF1ZGlvICl7Ci0gICAgICAgIG1BdWRpb1RyYWNrID0gRHVtbXlBdWRpb1NvdXJjZTo6Q3JlYXRlKDMyMDAwLCAyLCAyMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1QbGF5RW5kVGltZU1zZWMpKjEwMDBMTCkpOwotICAgICAgICBpZihtQXVkaW9UcmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFoYXZlQXVkaW8gJiYgIWhhdmVWaWRlbykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtRXh0cmFjdG9yRmxhZ3MgPSBleHRyYWN0b3ItPmZsYWdzKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXREYXRhU291cmNlX2xfanBnKCkgewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlX2xfanBnIik7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIG1BdWRpb1NvdXJjZSA9IER1bW15QXVkaW9Tb3VyY2U6OkNyZWF0ZSgzMjAwMCwgMiwgMjAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1QbGF5RW5kVGltZU1zZWMpKjEwMDBMTCkpOwotICAgIGlmKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNldEF1ZGlvU291cmNlKG1BdWRpb1NvdXJjZSk7Ci0gICAgfQotICAgIHN0YXR1c190IGVycm9yID0gbUF1ZGlvU291cmNlLT5zdGFydCgpOwotICAgIGlmIChlcnJvciAhPSBPSykgewotICAgICAgICBBTE9HRSgiRXJyb3Igc3RhcnRpbmcgZHVtbXkgYXVkaW8gc291cmNlIik7Ci0gICAgICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1EdXJhdGlvblVzID0gKG1QbGF5RW5kVGltZU1zZWMgLSBtUGxheUJlZ2luVGltZU1zZWMpKjEwMDBMTDsKLQotICAgIG1WaWRlb1NvdXJjZSA9IER1bW15VmlkZW9Tb3VyY2U6OkNyZWF0ZShtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb25VcywgbVVyaSk7Ci0KLSAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0gICAgc2V0VmlkZW9Tb3VyY2UobVZpZGVvU291cmNlKTsKLSAgICBzdGF0dXNfdCBlcnIxID0gbVZpZGVvU291cmNlLT5zdGFydCgpOwotICAgIGlmIChlcnIxICE9IE9LKSB7Ci0gICAgICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1Jc1ZpZGVvU291cmNlSnBnID0gdHJ1ZTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cmVzZXRfbCgpIHsKLQotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgbUZsYWdzIHw9IFBSRVBBUkVfQ0FOQ0VMTEVEOwotICAgIH0KLQotICAgIHdoaWxlIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgbVByZXBhcmVkQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGNhbmNlbFBsYXllckV2ZW50c19sKCk7Ci0gICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKLSAgICBtVmlkZW9UcmFjay5jbGVhcigpOwotCi0gICAgLy8gU2h1dGRvd24gYXVkaW8gZmlyc3QsIHNvIHRoYXQgdGhlIHJlc3BvbmUgdG8gdGhlIHJlc2V0IHJlcXVlc3QKLSAgICAvLyBhcHBlYXJzIHRvIGhhcHBlbiBpbnN0YW50YW5lb3VzbHkgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAotICAgIC8vIElmIHdlIGRpZCB0aGlzIGxhdGVyLCBhdWRpbyB3b3VsZCBjb250aW51ZSBwbGF5aW5nIHdoaWxlIHdlCi0gICAgLy8gc2h1dGRvd24gdGhlIHZpZGVvLXJlbGF0ZWQgcmVzb3VyY2VzIGFuZCB0aGUgcGxheWVyIGFwcGVhciB0bwotICAgIC8vIG5vdCBiZSBhcyByZXNwb25zaXZlIHRvIGEgcmVzZXQgcmVxdWVzdC4KLSAgICBpZiAobUF1ZGlvUGxheWVyID09IE5VTEwgJiYgbUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gSWYgd2UgaGFkIGFuIGF1ZGlvIHBsYXllciwgaXQgd291bGQgaGF2ZSBlZmZlY3RpdmVseQotICAgICAgICAvLyB0YWtlbiBwb3NzZXNzaW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UgYW5kIHN0b3BwZWQgaXQgd2hlbgotICAgICAgICAvLyBfaXRfIGlzIHN0b3BwZWQuIE90aGVyd2lzZSB0aGlzIGlzIHN0aWxsIG91ciByZXNwb25zaWJpbGl0eS4KLSAgICAgICAgbUF1ZGlvU291cmNlLT5zdG9wKCk7Ci0gICAgfQotICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOwotCi0gICAgbVRpbWVTb3VyY2UgPSBOVUxMOwotCi0gICAgLy9TaW5nbGUgYXVkaW8gcGxheWVyIGluc3RhbmNlIHVzZWQKLSAgICAvL1NvIGRvbm90IGRlbGV0ZSBpdCBoZXJlCi0gICAgLy9JdCBpcyBkZWxldGVkIGZyb20gUHJldmlld0NvbnRyb2xsZXIgY2xhc3MKLSAgICAvL2RlbGV0ZSBtQXVkaW9QbGF5ZXI7Ci0gICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLQotICAgIGlmIChtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1NvdXJjZS0+c3RvcCgpOwotCi0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAotICAgICAgICAvLyBjb21wb25lbnQgaXMgY29tcGxldGVseSByZWxlYXNlZCBieSB0aGUgdGltZSB3ZSBtYXkgdHJ5Ci0gICAgICAgIC8vIHRvIGluc3RhbnRpYXRlIGl0IGFnYWluLgotICAgICAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVZpZGVvU291cmNlOwotICAgICAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgewotICAgICAgICAgICAgdXNsZWVwKDEwMDApOwotICAgICAgICB9Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci0KLSAgICBtRHVyYXRpb25VcyA9IC0xOwotICAgIG1GbGFncyA9IDA7Ci0gICAgbUV4dHJhY3RvckZsYWdzID0gMDsKLSAgICBtVmlkZW9XaWR0aCA9IG1WaWRlb0hlaWdodCA9IC0xOwotICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IDA7Ci0gICAgbVZpZGVvVGltZVVzID0gMDsKLQotICAgIG1TZWVraW5nID0gTk9fU0VFSzsKLSAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0KLSAgICBtVXJpLnNldFRvKCIiKTsKLQotICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLSAgICBtSXNWaWRlb1NvdXJjZUpwZyA9IGZhbHNlOwotICAgIG1GcmFtZVJHQkJ1ZmZlciA9IE5VTEw7Ci0gICAgaWYobUZyYW1lWVVWQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtRnJhbWVZVVZCdWZmZXIpOwotICAgICAgICBtRnJhbWVZVVZCdWZmZXIgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cGxheSgpIHsKLSAgICBBTE9HVigicGxheSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOwotICAgIG1GbGFncyAmPSB+SU5GT1JNRURfQVZfRU9TOwotICAgIHJldHVybiBwbGF5X2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c3RhcnRBdWRpb1BsYXllcl9sKCkgewotICAgIEFMT0dWKCJzdGFydEF1ZGlvUGxheWVyX2wiKTsKLSAgICBDSEVDSyghKG1GbGFncyAmIEFVRElPX1JVTk5JTkcpKTsKLQotICAgIGlmIChtQXVkaW9Tb3VyY2UgPT0gTlVMTCB8fCBtQXVkaW9QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKCEobUZsYWdzICYgQVVESU9QTEFZRVJfU1RBUlRFRCkpIHsKLSAgICAgICAgbUZsYWdzIHw9IEFVRElPUExBWUVSX1NUQVJURUQ7Ci0KLSAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBzdGFydGVkIHRoZSBNZWRpYVNvdXJjZSBpbiBvcmRlciB0byBlbmFibGUKLSAgICAgICAgLy8gdGhlIHByZWZldGNoZXIgdG8gcmVhZCBpdHMgZGF0YS4KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvUGxheWVyLT5zdGFydCgKLSAgICAgICAgICAgICAgICB0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1BsYXllci0+cmVzdW1lKCk7Ci0gICAgfQotCi0gICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7Ci0KLSAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldEF1ZGlvUGxheWVyKFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKmF1ZGlvUGxheWVyKSB7Ci0gICAgQUxPR1YoInNldEF1ZGlvUGxheWVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBDSEVDSyghKG1GbGFncyAmIFBMQVlJTkcpKTsKLSAgICBtQXVkaW9QbGF5ZXIgPSBhdWRpb1BsYXllcjsKLQotICAgIEFMT0dWKCJTZXRBdWRpb1BsYXllciIpOwotICAgIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID0gdHJ1ZTsKLQotICAgIC8vIGNoZWNrIGlmIHRoZSBuZXcgYW5kIG9sZCBzb3VyY2UgYXJlIGR1bW15Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGFuQXVkaW9Tb3VyY2UgPSBtQXVkaW9QbGF5ZXItPmdldFNvdXJjZSgpOwotICAgIGlmIChhbkF1ZGlvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgLy8gQXVkaW8gcGxheWVyIGRvZXMgbm90IGhhdmUgYW55IHNvdXJjZSBzZXQuCi0gICAgICAgIEFMT0dWKCJzZXRBdWRpb1BsYXllcjogQXVkaW8gcGxheWVyIGRvZXMgbm90IGhhdmUgYW55IHNvdXJjZSBzZXQiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIElmIG5ldyB2aWRlbyBzb3VyY2UgaXMgbm90IGR1bW15LCB0aGVuIGFsd2F5cyBjaGFuZ2Ugc291cmNlCi0gICAgLy8gRWxzZSBhdWRpbyBwbGF5ZXIgY29udGludWVzIHVzaW5nIG9sZCBhdWRpbyBzb3VyY2UgYW5kIHRoZXJlIGFyZQotICAgIC8vIGZyYW1lIGRyb3BzIHRvIG1haW50YWluIEFWIHN5bmMKLSAgICBzcDxNZXRhRGF0YT4gbWV0YTsKLSAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnBWaWRTcmNUeXBlOwotICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZwVmlkU3JjVHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChzdHJjbXAocFZpZFNyY1R5cGUsICJEdW1teVZpZGVvU291cmNlIikgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIgVmlkZW8gY2xpcCB3aXRoIHNpbGVudCBhdWRpbzsgbmVlZCB0byBjaGFuZ2Ugc291cmNlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqcFNyY1R5cGUxOwotICAgIGNvbnN0IGNoYXIgKnBTcmNUeXBlMjsKLSAgICBtZXRhID0gYW5BdWRpb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZwU3JjVHlwZTEpKSB7Ci0gICAgICAgIGlmIChzdHJjbXAocFNyY1R5cGUxLCAiRHVtbXlBdWRpb1NvdXJjZSIpID09IDApIHsKLSAgICAgICAgICAgIG1ldGEgPSBtQXVkaW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmcFNyY1R5cGUyKSkgewotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocFNyY1R5cGUyLCAiRHVtbXlBdWRpb1NvdXJjZSIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzQ2hhbmdlU291cmNlUmVxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBzZXQgdGhlIG5ldyBwbGF5IGR1cmF0aW9uIGZvciB0aGUgZXhpc3Rpbmcgc291cmNlCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhU291cmNlICpwTWVkaWFTcmMgPSBhbkF1ZGlvU291cmNlLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBEdW1teUF1ZGlvU291cmNlICpwRHVtbXlBdWRpb1NvdXJjZSA9IChEdW1teUF1ZGlvU291cmNlKilwTWVkaWFTcmM7Ci0gICAgICAgICAgICAgICAgICAgIC8vSW5jcmVtZW50IHRoZSBkdXJhdGlvbiBvZiBhdWRpbyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgcER1bW15QXVkaW9Tb3VyY2UtPnNldER1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKChtUGxheUVuZFRpbWVNc2VjKSoxMDAwTEwpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBuZXcgYXVkaW8gc291cmNlCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGNvbnRpbnVlIHVzaW5nIG9sZCBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldEF1ZGlvUGxheWVyOiBzdG9wIG5ldyBhdWRpbyBzb3VyY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uU3RyZWFtRG9uZSgpIHsKLSAgICBBTE9HVigib25TdHJlYW1Eb25lIik7Ci0gICAgLy8gUG9zdGVkIHdoZW5ldmVyIGFueSBzdHJlYW0gZmluaXNoZXMgcGxheWluZy4KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKCFtU3RyZWFtRG9uZUV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBpZiAobVN0cmVhbURvbmVTdGF0dXMgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICBBTE9HVigiTUVESUFfRVJST1IgJWQiLCBtU3RyZWFtRG9uZVN0YXR1cyk7Ci0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgICAgICAgICBNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgbVN0cmVhbURvbmVTdGF0dXMpOwotCi0gICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOwotCi0gICAgICAgIG1GbGFncyB8PSBBVF9FT1M7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBib29sIGFsbERvbmUgPQotICAgICAgICAobVZpZGVvU291cmNlID09IE5VTEwgfHwgKG1GbGFncyAmIFZJREVPX0FUX0VPUykpCi0gICAgICAgICAgICAmJiAobUF1ZGlvU291cmNlID09IE5VTEwgfHwgKG1GbGFncyAmIEFVRElPX0FUX0VPUykpOwotCi0gICAgaWYgKCFhbGxEb25lKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUZsYWdzICYgKExPT1BJTkcgfCBBVVRPX0xPT1BJTkcpKSB7Ci0gICAgICAgIHNlZWtUb19sKDApOwotCi0gICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIk1FRElBX1BMQVlCQUNLX0NPTVBMRVRFIik7Ci0gICAgICAgIC8vcGF1c2UgYmVmb3JlIHNlbmRpbmcgZXZlbnQKLSAgICAgICAgcGF1c2VfbCh0cnVlIC8qIGF0IGVvcyAqLyk7Ci0KLSAgICAgICAgLy9UaGlzIGxvY2sgaXMgdXNlZCB0byBzeW5jcm9uaXplIG9uU3RyZWFtRG9uZSgpIGluIFByZXZpZXdQbGF5ZXIgYW5kCi0gICAgICAgIC8vc3RvcFByZXZpZXcoKSBpbiBQcmV2aWV3Q29udHJvbGxlcgotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2tDb250cm9sKTsKLSAgICAgICAgLyogTWFrZSBzdXJlIFByZXZpZXdQbGF5ZXIgb25seSBub3RpZmllcyBNRURJQV9QTEFZQkFDS19DT01QTEVURSBvbmNlIGZvciBlYWNoIGNsaXAhCi0gICAgICAgICAqIEl0IGhhcHBlbnMgdHdpY2UgaW4gZm9sbG93aW5nIHNjZW5hcmlvLgotICAgICAgICAgKiBUbyBtYWtlIHRoZSBjbGlwcyBpbiBwcmV2aWV3IHN0b3J5Ym9hcmQgYXJlIHBsYXllZCBhbmQgc3dpdGNoZWQgc21vb3RobHksCi0gICAgICAgICAqIFByZXZpZXdDb250cm9sbGVyIHVzZXMgdHdvIFByZXZpZXdQbGF5ZXIgaW5zdGFuY2VzIGFuZCBvbmUgQXVkaW9QbGF5ZXIuCi0gICAgICAgICAqIFRoZSB0d28gUHJldmlld1BsYXllciB1c2UgdGhlIHNhbWUgQXVkaW9QbGF5ZXIgdG8gcGxheSB0aGUgYXVkaW8sCi0gICAgICAgICAqIGFuZCBjaGFuZ2UgdGhlIGF1ZGlvIHNvdXJjZSBvZiB0aGUgQXVkaW9QbGF5ZXIuCi0gICAgICAgICAqIElmIHRoZSBhdWRpbyBzb3VyY2Ugb2YgY3VycmVudCBwbGF5aW5nIGNsaXAgYW5kIG5leHQgY2xpcCBhcmUgZHVtbXkKLSAgICAgICAgICogYXVkaW8gc291cmNlKGltYWdlIG9yIHZpZGVvIHdpdGhvdXQgYXVkaW8pLCBpdCB3aWxsIG5vdCBjaGFuZ2UgdGhlIGF1ZGlvIHNvdXJjZQotICAgICAgICAgKiB0byBhdm9pZCB0aGUgImF1ZGlvIGdsaXRjaCIsIGFuZCBrZWVwIHVzaW5nIHRoZSBjdXJyZW50IGF1ZGlvIHNvdXJjZS4KLSAgICAgICAgICogV2hlbiB0aGUgdmlkZW8gb2YgY3VycmVudCBjbGlwIHJlYWNoZWQgdGhlIEVPUywgUHJldmlld1BsYXllciB3aWxsIHNldCBFT1MgZmxhZwotICAgICAgICAgKiBmb3IgdmlkZW8gYW5kIGF1ZGlvLCBhbmQgaXQgd2lsbCBub3RpZnkgTUVESUFfUExBWUJBQ0tfQ09NUExFVEUuCi0gICAgICAgICAqIEJ1dCB0aGUgYXVkaW8oZHVtbXkgYXVkaW8gc291cmNlKSBpcyBzdGlsbCBwbGF5aW5nKGZvciBuZXh0IGNsaXApLAotICAgICAgICAgKiBhbmQgd2hlbiBpdCByZWFjaGVkIHRoZSBFT1MsIGFuZCB2aWRlbyByZWFjaGVkIEVPUywKLSAgICAgICAgICogUHJldmlld1BsYXllciB3aWxsIG5vdGlmeSBNRURJQV9QTEFZQkFDS19DT01QTEVURSBhZ2Fpbi4gKi8KLSAgICAgICAgaWYgKCEobUZsYWdzICYgSU5GT1JNRURfQVZfRU9TKSkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QTEFZQkFDS19DT01QTEVURSk7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gSU5GT1JNRURfQVZfRU9TOwotICAgICAgICB9Ci0gICAgICAgIG1GbGFncyB8PSBBVF9FT1M7Ci0gICAgICAgIEFMT0dWKCJvblN0cmVhbURvbmUgZW5kIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cGxheV9sKCkgewotICAgIEFMT0dWKCJwbGF5X2wiKTsKLQotICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOwotCi0gICAgaWYgKG1GbGFncyAmIFBMQVlJTkcpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBtU3RhcnROZXh0UGxheWVyID0gZmFsc2U7Ci0KLSAgICBpZiAoIShtRmxhZ3MgJiBQUkVQQVJFRCkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcHJlcGFyZV9sKCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1GbGFncyB8PSBQTEFZSU5HOwotICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKLQotICAgIGJvb2wgZGVmZXJyZWRBdWRpb1NlZWsgPSBmYWxzZTsKLQotICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBpZiAobUF1ZGlvUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IG5ldyBWaWRlb0VkaXRvckF1ZGlvUGxheWVyKG1BdWRpb1NpbmssIHRoaXMpOwotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0U291cmNlKG1BdWRpb1NvdXJjZSk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4U2V0dGluZ3MoCi0gICAgICAgICAgICAgICAgIG1QcmV2aWV3UGxheWVyQXVkaW9NaXhTZXR0aW5ncyk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSgKLSAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgICAgICAgICAgIG1BdWRpb01peFN0b3J5Qm9hcmRUUywgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICAgICAgbUN1cnJlbnRNZWRpYVZvbHVtZVZhbHVlKTsKLQotICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9QTEFZRVJfU1RBUlRFRDsKLSAgICAgICAgICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IHN0YXJ0ZWQgdGhlIE1lZGlhU291cmNlIGluIG9yZGVyIHRvIGVuYWJsZQotICAgICAgICAgICAgICAgIC8vIHRoZSBwcmVmZXRjaGVyIHRvIHJlYWQgaXRzIGRhdGEuCi0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvUGxheWVyLT5zdGFydCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogc291cmNlQWxyZWFkeVN0YXJ0ZWQgKi8pOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAvL2RlbGV0ZSBtQXVkaW9QbGF5ZXI7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH4oUExBWUlORyB8IEZJUlNUX0ZSQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtVGltZVNvdXJjZSA9IG1BdWRpb1BsYXllcjsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9fUlVOTklORzsKLSAgICAgICAgICAgICAgICBkZWZlcnJlZEF1ZGlvU2VlayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sIGlzQXVkaW9QbGF5ZXJTdGFydGVkID0gbUF1ZGlvUGxheWVyLT5pc1N0YXJ0ZWQoKTsKLQotICAgICAgICAgICAgaWYgKG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicGxheV9sOiBDaGFuZ2UgYXVkaW8gc291cmNlIHJlcXVpcmVkIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNBdWRpb1BsYXllclN0YXJ0ZWQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRTb3VyY2UobUF1ZGlvU291cmNlKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldE9ic2VydmVyKHRoaXMpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFNldHRpbmdzKAotICAgICAgICAgICAgICAgICBtUHJldmlld1BsYXllckF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNBdWRpb1BsYXllclN0YXJ0ZWQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnJlc3VtZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQXVkaW9QbGF5ZXItPnN0YXJ0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH4oUExBWUlORyB8IEZJUlNUX0ZSQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJwbGF5X2w6IE5vIFNvdXJjZSBjaGFuZ2UgcmVxdWlyZWQiKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFN0b3J5Qm9hcmRUUywgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNZWRpYVZvbHVtZVZhbHVlKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cmVzdW1lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT1BMQVlFUl9TVEFSVEVEOwotICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7Ci0gICAgICAgICAgICBtVGltZVNvdXJjZSA9IG1BdWRpb1BsYXllcjsKLSAgICAgICAgICAgIGRlZmVycmVkQXVkaW9TZWVrID0gdHJ1ZTsKLSAgICAgICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobVRpbWVTb3VyY2UgPT0gTlVMTCAmJiBtQXVkaW9QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICBtVGltZVNvdXJjZSA9ICZtU3lzdGVtVGltZVNvdXJjZTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHNlZWsgb3B0aW9uIGZvciBJbWFnZSBzb3VyY2UgZmlsZXMgYW5kIHJlYWQuCi0gICAgLy8gVGhpcyByZXNldHMgdGhlIHRpbWVzdGFtcGluZyBmb3IgaW1hZ2UgcGxheQotICAgIGlmIChtSXNWaWRlb1NvdXJjZUpwZykgewotICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgTWVkaWFCdWZmZXIgKmFMb2NhbEJ1ZmZlcjsKLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMpOwotICAgICAgICBtVmlkZW9Tb3VyY2UtPnJlYWQoJmFMb2NhbEJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICBhTG9jYWxCdWZmZXItPnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gS2ljayBvZmYgdmlkZW8gcGxheWJhY2sKLSAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwotICAgIH0KLQotICAgIGlmIChkZWZlcnJlZEF1ZGlvU2VlaykgewotICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBzZWVrIHJlcXVlc3Qgd2hpbGUgd2Ugd2VyZSBwYXVzZWQKLSAgICAgICAgLy8gYW5kIHdlJ3JlIGp1c3Qgc3RhcnRpbmcgdXAgYWdhaW4sIGhvbm9yIHRoZSByZXF1ZXN0IG5vdy4KLSAgICAgICAgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOwotICAgIH0KLQotICAgIGlmIChtRmxhZ3MgJiBBVF9FT1MpIHsKLSAgICAgICAgLy8gTGVnYWN5IGJlaGF2aW91ciwgaWYgYSBzdHJlYW0gZmluaXNoZXMgcGxheWluZyBhbmQgdGhlbgotICAgICAgICAvLyBpcyBzdGFydGVkIGFnYWluLCB3ZSBwbGF5IGZyb20gdGhlIHN0YXJ0Li4uCi0gICAgICAgIHNlZWtUb19sKDApOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjppbml0UmVuZGVyZXJfbCgpIHsKLSAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgewotICAgICAgICBpZihtVmlkZW9SZW5kZXJlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtVmlkZW9SZW5kZXJlciA9IG1OYXRpdmVXaW5kb3dSZW5kZXJlci0+Y3JlYXRlUmVuZGVySW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNpemVUb1JlbmRlcihtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2Vla1RvKGludDY0X3QgdGltZVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoKG1FeHRyYWN0b3JGbGFncyAmIE1lZGlhRXh0cmFjdG9yOjpDQU5fU0VFSykgfHwgKG1Jc1ZpZGVvU291cmNlSnBnKSkgewotICAgICAgICByZXR1cm4gc2Vla1RvX2wodGltZVVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6Z2V0VmlkZW9EaW1lbnNpb25zKAotICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtVmlkZW9XaWR0aCA8IDAgfHwgbVZpZGVvSGVpZ2h0IDwgMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAqd2lkdGggPSBtVmlkZW9XaWR0aDsKLSAgICAqaGVpZ2h0ID0gbVZpZGVvSGVpZ2h0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmluaXRBdWRpb0RlY29kZXJfbCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKSB7Ci0gICAgICAgIG1BdWRpb1NvdXJjZSA9IG1BdWRpb1RyYWNrOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPE1lZGlhU291cmNlPiBhUmF3U291cmNlOwotICAgICAgICBhUmF3U291cmNlID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBtQ2xpZW50LmludGVyZmFjZSgpLCBtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCksCi0gICAgICAgICAgICAgICAgZmFsc2UsIC8vIGNyZWF0ZUVuY29kZXIKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFjayk7Ci0KLSAgICAgICAgaWYoYVJhd1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UgPSBuZXcgVmlkZW9FZGl0b3JTUkMoYVJhd1NvdXJjZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICBpZiAobUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgICAgIHNldER1cmF0aW9uX2woZHVyYXRpb25Vcyk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU291cmNlLT5zdGFydCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApKSB7Ci0gICAgICAgIC8vIEZvciBsZWdhY3kgcmVhc29ucyB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gaWdub3JlIHRoZSBhYnNlbmNlCi0gICAgICAgIC8vIG9mIGFuIGF1ZGlvIGRlY29kZXIgZm9yIFFDRUxQIGluc3RlYWQgb2YgYWJvcnRpbmcgcGxheWJhY2sKLSAgICAgICAgLy8gYWx0b2dldGhlci4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBtQXVkaW9Tb3VyY2UgIT0gTlVMTCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6aW5pdFZpZGVvRGVjb2Rlcl9sKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgaW5pdFJlbmRlcmVyX2woKTsKLQotICAgIGlmIChtVmlkZW9SZW5kZXJlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3QgY3JlYXRlIHJlbmRlcmVyIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG1WaWRlb1NvdXJjZSA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICBtQ2xpZW50LmludGVyZmFjZSgpLCBtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCksCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIG1WaWRlb1RyYWNrLAotICAgICAgICAgICAgTlVMTCwgZmxhZ3MsIG1WaWRlb1JlbmRlcmVyLT5nZXRUYXJnZXRXaW5kb3coKSk7Ci0KLSAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICBpZiAobVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgICAgIHNldER1cmF0aW9uX2woZHVyYXRpb25Vcyk7Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvVHJhY2stPmdldEZvcm1hdCgpKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVmlkZW9Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1WaWRlb1NvdXJjZSAhPSBOVUxMID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi0KLXZvaWQgUHJldmlld1BsYXllcjo6b25WaWRlb0V2ZW50KCkgewotICAgIHVpbnQzMl90IGk9MDsKLSAgICBNNE9TQV9FUlIgZXJyMSA9IE00Tk9fRVJST1I7Ci0gICAgaW50NjRfdCBpbWFnZUZyYW1lVGltZVVzID0gMDsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKCFtVmlkZW9FdmVudFBlbmRpbmcpIHsKLSAgICAgICAgLy8gVGhlIGV2ZW50IGhhcyBiZWVuIGNhbmNlbGxlZCBpbiByZXNldF9sKCkgYnV0IGhhZCBhbHJlYWR5Ci0gICAgICAgIC8vIGJlZW4gc2NoZWR1bGVkIGZvciBleGVjdXRpb24gYXQgdGhhdCB0aW1lLgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaWYgKG1GbGFncyAmIFNFRUtfUFJFVklFVykgewotICAgICAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFRpbWVTb3VyY2UgKnRzX3N0ID0gICZtU3lzdGVtVGltZVNvdXJjZTsKLSAgICBpbnQ2NF90IHRpbWVTdGFydFVzID0gdHNfc3QtPmdldFJlYWxUaW1lVXMoKTsKLQotICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0KLSAgICAgICAgaWYobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gc2VlayB0aGUgdmlkZW8gc291cmNlIGZpcnN0LCBmb2xsb3dlZCBieQotICAgICAgICAgICAgLy8gdGhlIGF1ZGlvIHNvdXJjZS4KLSAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIGp1bXBzIGluIHRoZSBEYXRhU291cmNlIG9mZnNldCBjYXVzZWQgYnkKLSAgICAgICAgICAgIC8vIHRoZSBhdWRpbyBjb2RlYyBwcmVmZXRjaGluZyBkYXRhIGZyb20gdGhlIG9sZCBsb2NhdGlvbnMKLSAgICAgICAgICAgIC8vIHdoaWxlIHRoZSB2aWRlbyBjb2RlYyBpcyBhbHJlYWR5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBuZXcKLSAgICAgICAgICAgIC8vIGxvY2F0aW9ucywgd2UnbGwgInBhdXNlIiB0aGUgYXVkaW8gc291cmNlLCBjYXVzaW5nIGl0IHRvCi0gICAgICAgICAgICAvLyBzdG9wIHJlYWRpbmcgaW5wdXQgZGF0YSB1bnRpbCBhIHN1YnNlcXVlbnQgc2Vlay4KLQotICAgICAgICAgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMICYmIChtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSkgewotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfkFVRElPX1JVTk5JTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UtPnBhdXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIW1WaWRlb0J1ZmZlcikgewotICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgIEFMT0dWKCJMViBQTEFZRVIgc2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwgbVNlZWtUaW1lVXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyAvIDFFNik7Ci0KLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKAotICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1WaWRlb1NvdXJjZS0+cmVhZCgmbVZpZGVvQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBDSEVDSyghbVZpZGVvQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiTFYgUExBWUVSIFZpZGVvU291cmNlIHNpZ25hbGxlZCBmb3JtYXQgY2hhbmdlIik7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZV9sKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1JlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBpbml0UmVuZGVyZXJfbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBTbyB2aWRlbyBwbGF5YmFjayBpcyBjb21wbGV0ZSwgYnV0IHdlIG1heSBzdGlsbCBoYXZlCi0gICAgICAgICAgICAgICAgLy8gYSBzZWVrIHJlcXVlc3QgcGVuZGluZyB0aGF0IG5lZWRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInZpZGVvIHN0cmVhbSBlbmRlZCB3aGlsZSBzZWVraW5nISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5pc2hTZWVrSWZOZWNlc3NhcnkoLTEpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJQcmV2aWV3UGxheWVyOiBvblZpZGVvRXZlbnQgRU9TIHJlYWNoZWQuIik7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IFZJREVPX0FUX0VPUzsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICAgICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGxhc3QgZGVjb2RlZCB0aW1lc3RhbXAgdG8gZHVyYXRpb24KLSAgICAgICAgICAgICAgICBtRGVjb2RlZFZpZGVvVHMgPSAobVBsYXlFbmRUaW1lTXNlYyoxMDAwTEwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1WaWRlb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFNvbWUgZGVjb2RlcnMsIG5vdGFibHkgdGhlIFBWIEFWQyBzb2Z0d2FyZSBkZWNvZGVyCi0gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHNwdXJpb3VzIGVtcHR5IGJ1ZmZlcnMgdGhhdCB3ZSBqdXN0IHdhbnQgdG8gaWdub3JlLgotCi0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50NjRfdCB2aWRlb1RpbWVVczsKLSAgICAgICAgICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnZpZGVvVGltZVVzKSk7Ci0KLSAgICAgICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvVGltZVVzIDwgbVNlZWtUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycyBhcmUgYmVmb3JlIHNlZWsgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlbQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZigodmlkZW9UaW1lVXMvMTAwMCkgPCBtUGxheUJlZ2luVGltZU1zZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRnJhbWVzIGFyZSBiZWZvcmUgYmVnaW4gY3V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gRG9ub3QgcmVuZGVyCi0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1OdW1iZXJEZWNWaWRlb0ZyYW1lcysrOwotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0sobVZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0gICAgc2V0UG9zaXRpb25fbCh0aW1lVXMpOwotCi0gICAgaWYgKCFtU3RhcnROZXh0UGxheWVyKSB7Ci0gICAgICAgIGludDY0X3QgcGxheWJhY2tUaW1lUmVtYWluaW5nID0gKG1QbGF5RW5kVGltZU1zZWMgKiAxMDAwTEwpIC0gdGltZVVzOwotICAgICAgICBpZiAocGxheWJhY2tUaW1lUmVtYWluaW5nIDw9IDE1MDAwMDApIHsKLSAgICAgICAgICAgIC8vV2hlbiBsZXNzIHRoYW4gMS41IHNlYyBvZiBwbGF5YmFjayBsZWZ0Ci0gICAgICAgICAgICAvLyBzZW5kIG5vdGlmaWNhdGlvbiB0byBzdGFydCBuZXh0IHBsYXllcgotCi0gICAgICAgICAgICBtU3RhcnROZXh0UGxheWVyID0gdHJ1ZTsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woMHhBQUFBQUFBQSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTZWVrVHlwZSB3YXNTZWVraW5nID0gbVNlZWtpbmc7Ci0gICAgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KHRpbWVVcyk7Ci0gICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMICYmICEobUZsYWdzICYgKEFVRElPX1JVTk5JTkcpKSkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBzdGFydEF1ZGlvUGxheWVyX2woKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIlN0YXJ0aW5nIHRoZSBhdWRpbyBwbGF5ZXIgZmFpbGVkIHcvIGVyciAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBUaW1lU291cmNlICp0cyA9IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpID8gJm1TeXN0ZW1UaW1lU291cmNlIDogbVRpbWVTb3VyY2U7Ci0KLSAgICBpZih0cyA9PSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYoIW1Jc1ZpZGVvU291cmNlSnBnKSB7Ci0gICAgICAgIGlmIChtRmxhZ3MgJiBGSVJTVF9GUkFNRSkgewotICAgICAgICAgICAgbUZsYWdzICY9IH5GSVJTVF9GUkFNRTsKLQotICAgICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIHRpbWVVczsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3QgcmVhbFRpbWVVcywgbWVkaWFUaW1lVXM7Ci0gICAgICAgIGlmICghKG1GbGFncyAmIEFVRElPX0FUX0VPUykgJiYgbUF1ZGlvUGxheWVyICE9IE5VTEwKLSAgICAgICAgICAgICYmIG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lTWFwcGluZygmcmVhbFRpbWVVcywgJm1lZGlhVGltZVVzKSkgewotICAgICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gcmVhbFRpbWVVcyAtIG1lZGlhVGltZVVzOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCBub3dVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSBtVGltZVNvdXJjZURlbHRhVXM7Ci0KLSAgICAgICAgaW50NjRfdCBsYXRlbmVzc1VzID0gbm93VXMgLSB0aW1lVXM7Ci0KLSAgICAgICAgaWYgKHdhc1NlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgLy8gTGV0J3MgZGlzcGxheSB0aGUgZmlyc3QgZnJhbWUgYWZ0ZXIgc2Vla2luZyByaWdodCBhd2F5LgotICAgICAgICAgICAgbGF0ZW5lc3NVcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkF1ZGlvIHRpbWUgc3RhbXAgPSAlbGxkIGFuZCB2aWRlbyB0aW1lIHN0YW1wID0gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLT5nZXRSZWFsVGltZVVzKCksdGltZVVzKTsKLSAgICAgICAgaWYgKGxhdGVuZXNzVXMgPiA0MDAwMCkgewotICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDQwbXMgbGF0ZS4KLQotICAgICAgICAgICAgQUxPR1YoIkxWIFBMQVlFUiB3ZSdyZSBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuZXNzVXMsIGxhdGVuZXNzVXMgLyAxRTYpOwotCi0gICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhdGVuZXNzVXMgPCAtMjUwMDApIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiAyNW1zIGVhcmx5LgotICAgICAgICAgICAgQUxPR1YoIldlJ3JlIG1vcmUgdGhhbiAyNW1zIGVhcmx5LCBsYXRlbmVzcyAlbGxkIiwgbGF0ZW5lc3NVcyk7Ci0KLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woMjUwMDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3IHx8IG1WaWRlb1JlbmRlcmVyID09IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgPSBmYWxzZTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbml0UmVuZGVyZXJfbCgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRpbWVzdGFtcCBleGNlZWRzIGVuZEN1dFRpbWUgb2YgY2xpcCwgZG9ub3QgcmVuZGVyCi0gICAgaWYoKHRpbWVVcy8xMDAwKSA+IG1QbGF5RW5kVGltZU1zZWMpIHsKLSAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgIEFMT0dWKCJQcmV2aWV3UGxheWVyOiBvblZpZGVvRXZlbnQgdGltZVVzID4gbVBsYXlFbmRUaW1lOyBzZW5kIEVPUy4uIik7Ci0gICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGRlY29kZWQgdGltZXN0YW1wIHRvIGR1cmF0aW9uCi0gICAgICAgIG1EZWNvZGVkVmlkZW9UcyA9IChtUGxheUVuZFRpbWVNc2VjKjEwMDBMTCk7Ci0gICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBDYXB0dXJlIHRoZSBmcmFtZSB0aW1lc3RhbXAgdG8gYmUgcmVuZGVyZWQKLSAgICBtRGVjb2RlZFZpZGVvVHMgPSB0aW1lVXM7Ci0KLSAgICAvLyBQb3N0IHByb2Nlc3NpbmcgdG8gYXBwbHkgdmlkZW8gZWZmZWN0cwotICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgZWZmZWN0IHN0YXJ0dGltZSBtYXRjaGVzIHRoZSBjbGlwIGJlaW5nIHByZXZpZXdlZAotICAgICAgICBpZigobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA8IChtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQvMTAwMCkpIHx8Ci0gICAgICAgIChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lID49Ci0gICAgICAgICAoKG1EZWNWaWRlb1RzU3RvcnlCb2FyZC8xMDAwKSArIG1QbGF5RW5kVGltZU1zZWMgLSBtUGxheUJlZ2luVGltZU1zZWMpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3QgZG9lc24ndCBiZWxvbmcgdG8gdGhpcyBjbGlwLCBjaGVjayBuZXh0IG9uZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgaWYgZWZmZWN0IGFwcGxpZXMgdG8gdGhpcyBwYXJ0aWN1bGFyIGZyYW1lIHRpbWVzdGFtcAotICAgICAgICBpZigobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA8PQotICAgICAgICAgKCgodGltZVVzK21EZWNWaWRlb1RzU3RvcnlCb2FyZCkvMTAwMCktbVBsYXlCZWdpblRpbWVNc2VjKSkgJiYKLSAgICAgICAgICAgICgobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSttRWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24pID49Ci0gICAgICAgICAgICAgKCgodGltZVVzK21EZWNWaWRlb1RzU3RvcnlCb2FyZCkvMTAwMCktbVBsYXlCZWdpblRpbWVNc2VjKSkKLSAgICAgICAgICAgICAgJiYgKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbiAhPSAwKSkgewotICAgICAgICAgICAgc2V0VmlkZW9Qb3N0UHJvY2Vzc2luZ05vZGUoCi0gICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUsIFRSVUUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc2V0VmlkZW9Qb3N0UHJvY2Vzc2luZ05vZGUoCi0gICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUsIEZBTFNFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vUHJvdmlkZSB0aGUgb3ZlcmxheSBVcGRhdGUgaW5kaWNhdGlvbiB3aGVuIHRoZXJlIGlzIGFuIG92ZXJsYXkgZWZmZWN0Ci0gICAgaWYgKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRlJBTUlORykgewotICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0ICY9IH5WSURFT19FRkZFQ1RfRlJBTUlORzsgLy9uZXZlciBhcHBseSBmcmFtaW5nIGhlcmUuCi0gICAgICAgIGlmICghbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCkgewotICAgICAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgaW5kZXg7Ci0gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtTnVtYmVyRWZmZWN0czsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0aW1lTXMgPSBtRGVjb2RlZFZpZGVvVHMvMTAwMDsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGltZU9mZnNldCA9IG1EZWNWaWRlb1RzU3RvcnlCb2FyZC8xMDAwOwotICAgICAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpU3RhcnRUaW1lICsgMSkgPD0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVNcyArIHRpbWVPZmZzZXQgLSBtUGxheUJlZ2luVGltZU1zZWMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpU3RhcnRUaW1lIC0gMSArCi0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aUR1cmF0aW9uKSA+PQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZU1zICsgdGltZU9mZnNldCAtIG1QbGF5QmVnaW5UaW1lTXNlYykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluZGV4IDwgbU51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgICAgICBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHBvc3RPdmVybGF5VXBkYXRlRXZlbnRfbCgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJGcmFtaW5nIGluZGV4ID0gJWxkIiwgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiTm8gZnJhbWluZyBlZmZlY3RzIGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAobU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCkgewotICAgICAgICAvL1Bvc3QgdGhlIGV2ZW50IHdoZW4gdGhlIG92ZXJsYXkgaXMgbm8gbW9yZSB2YWxpZAotICAgICAgICBBTE9HVigiT3ZlcmxheSBpcyBEb25lIik7Ci0gICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKLSAgICAgICAgcG9zdE92ZXJsYXlVcGRhdGVFdmVudF9sKCk7Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1JlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvUmVuZGVyZXItPnJlbmRlcihtVmlkZW9CdWZmZXIsIG1DdXJyZW50VmlkZW9FZmZlY3QsCi0gICAgICAgICAgICAgICAgbVJlbmRlcmluZ01vZGUsIG1Jc1ZpZGVvU291cmNlSnBnKTsKLSAgICB9Ci0KLSAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotCi0gICAgLy8gUG9zdCBwcm9ncmVzcyBjYWxsYmFjayBiYXNlZCBvbiBjYWxsYmFjayBpbnRlcnZhbCBzZXQKLSAgICBpZihtTnVtYmVyRGVjVmlkZW9GcmFtZXMgPj0gbVByb2dyZXNzQ2JJbnRlcnZhbCkgewotICAgICAgICBwb3N0UHJvZ3Jlc3NDYWxsYmFja0V2ZW50X2woKTsKLSAgICAgICAgbU51bWJlckRlY1ZpZGVvRnJhbWVzID0gMDsgIC8vIHJlc2V0IGNvdW50ZXIKLSAgICB9Ci0KLSAgICAvLyBpZiByZWFjaGVkIEVuZEN1dFRpbWUgb2YgY2xpcCwgcG9zdCBFT1MgZXZlbnQKLSAgICBpZigodGltZVVzLzEwMDApID49IG1QbGF5RW5kVGltZU1zZWMpIHsKLSAgICAgICAgQUxPR1YoIlByZXZpZXdQbGF5ZXI6IG9uVmlkZW9FdmVudCBFT1MuIik7Ci0gICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGRlY29kZWQgdGltZXN0YW1wIHRvIGR1cmF0aW9uCi0gICAgICAgIG1EZWNvZGVkVmlkZW9UcyA9IChtUGxheUVuZFRpbWVNc2VjKjEwMDBMTCk7Ci0gICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmICgod2FzU2Vla2luZyAhPSBOT19TRUVLKSAmJiAobUZsYWdzICYgU0VFS19QUkVWSUVXKSkgewotICAgICAgICAgICAgbUZsYWdzICY9IH5TRUVLX1BSRVZJRVc7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZighbUlzVmlkZW9Tb3VyY2VKcGcpIHsKLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDMzMDAwKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cHJlcGFyZSgpIHsKLSAgICBBTE9HVigicHJlcGFyZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHByZXBhcmVfbCgpOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwcmVwYXJlX2woKSB7Ci0gICAgQUxPR1YoInByZXBhcmVfbCIpOwotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJFRCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtSXNBc3luY1ByZXBhcmUgPSBmYWxzZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBwcmVwYXJlQXN5bmNfbCgpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHdoaWxlIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgbVByZXBhcmVkQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIHJldHVybiBtUHJlcGFyZVJlc3VsdDsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cHJlcGFyZUFzeW5jKCkgewotICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBwcmVwYXJlQXN5bmNfbCgpOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwcmVwYXJlQXN5bmNfbCgpIHsKLSAgICBBTE9HVigicHJlcGFyZUFzeW5jX2wiKTsKLSAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAgLy8gYXN5bmMgcHJlcGFyZSBhbHJlYWR5IHBlbmRpbmcKLSAgICB9Ci0KLSAgICBpZiAoIW1RdWV1ZVN0YXJ0ZWQpIHsKLSAgICAgICAgbVF1ZXVlLnN0YXJ0KCk7Ci0gICAgICAgIG1RdWV1ZVN0YXJ0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIG1GbGFncyB8PSBQUkVQQVJJTkc7Ci0gICAgbUFzeW5jUHJlcGFyZUV2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCgKLSAgICAgICAgICAgIHRoaXMsICZQcmV2aWV3UGxheWVyOjpvblByZXBhcmVBc3luY0V2ZW50KTsKLQotICAgIG1RdWV1ZS5wb3N0RXZlbnQobUFzeW5jUHJlcGFyZUV2ZW50KTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6ZmluaXNoU2V0RGF0YVNvdXJjZV9sKCkgewotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2U7Ci0gICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvcjsKLQotICAgIGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKG1Vcmkuc3RyaW5nKCksIE5VTEwpOwotCi0gICAgaWYgKGRhdGFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvL0lmIGZpbGUgdHlwZSBpcyAucmdiLCB0aGVuIG5vIG5lZWQgdG8gY2hlY2sgZm9yIEV4dHJhY3RvcgotICAgIGludCB1cmlMZW4gPSBzdHJsZW4obVVyaSk7Ci0gICAgaW50IHN0YXJ0T2Zmc2V0ID0gdXJpTGVuIC0gNDsKLSAgICBpZighc3RybmNhc2VjbXAobVVyaStzdGFydE9mZnNldCwgIi5yZ2IiLCA0KSkgewotICAgICAgICBleHRyYWN0b3IgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShkYXRhU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7Ci0gICAgfQotCi0gICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJmaW5pc2hTZXREYXRhU291cmNlX2w6IGZhaWxlZCB0byBjcmVhdGUgZXh0cmFjdG9yIik7Ci0gICAgICAgIHJldHVybiBzZXREYXRhU291cmNlX2xfanBnKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChleHRyYWN0b3IpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uUHJlcGFyZUFzeW5jRXZlbnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigib25QcmVwYXJlQXN5bmNFdmVudCIpOwotCi0gICAgaWYgKG1GbGFncyAmIFBSRVBBUkVfQ0FOQ0VMTEVEKSB7Ci0gICAgICAgIEFMT0dWKCJwcmVwYXJlIHdhcyBjYW5jZWxsZWQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIik7Ci0gICAgICAgIGFib3J0UHJlcGFyZShVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtVXJpLnNpemUoKSA+IDApIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gZmluaXNoU2V0RGF0YVNvdXJjZV9sKCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgYWJvcnRQcmVwYXJlKGVycik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvVHJhY2sgIT0gTlVMTCAmJiBtVmlkZW9Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbml0VmlkZW9EZWNvZGVyX2woT01YQ29kZWM6OmtIYXJkd2FyZUNvZGVjc09ubHkpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwgJiYgbUF1ZGlvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5pdEF1ZGlvRGVjb2Rlcl9sKCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgYWJvcnRQcmVwYXJlKGVycik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKLQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmZpbmlzaEFzeW5jUHJlcGFyZV9sKCkgewotICAgIEFMT0dWKCJmaW5pc2hBc3luY1ByZXBhcmVfbCIpOwotICAgIGlmIChtSXNBc3luY1ByZXBhcmUpIHsKLSAgICAgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFVF9WSURFT19TSVpFLCAwLCAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZV9sKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QUkVQQVJFRCk7Ci0gICAgfQotCi0gICAgbVByZXBhcmVSZXN1bHQgPSBPSzsKLSAgICBtRmxhZ3MgJj0gfihQUkVQQVJJTkd8UFJFUEFSRV9DQU5DRUxMRUQpOwotICAgIG1GbGFncyB8PSBQUkVQQVJFRDsKLSAgICBtQXN5bmNQcmVwYXJlRXZlbnQgPSBOVUxMOwotICAgIG1QcmVwYXJlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjphY3F1aXJlTG9jaygpIHsKLSAgICBBTE9HVigiYWNxdWlyZUxvY2siKTsKLSAgICBtTG9ja0NvbnRyb2wubG9jaygpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnJlbGVhc2VMb2NrKCkgewotICAgIEFMT0dWKCJyZWxlYXNlTG9jayIpOwotICAgIG1Mb2NrQ29udHJvbC51bmxvY2soKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6bG9hZEVmZmVjdHNTZXR0aW5ncygKLSAgICAgICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0U2V0dGluZ3MsIGludCBuRWZmZWN0cykgewotCi0gICAgQUxPR1YoImxvYWRFZmZlY3RzU2V0dGluZ3MiKTsKLSAgICBtTnVtYmVyRWZmZWN0cyA9IG5FZmZlY3RzOwotICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBwRWZmZWN0U2V0dGluZ3M7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpsb2FkQXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzKSB7Ci0KLSAgICBBTE9HVigibG9hZEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICBtUHJldmlld1BsYXllckF1ZGlvTWl4U2V0dGluZ3MgPSBwQXVkaW9NaXhTZXR0aW5nczsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSgKLSAgICAgICAgTTRPU0FfQ29udGV4dCBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlKSB7Ci0KLSAgICBBTE9HVigic2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlIik7Ci0gICAgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZSA9IHBBdWRpb01peFBDTUZpbGVIYW5kbGU7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbSgKLSAgICAgICAgTTRPU0FfVUludDMyIGF1ZGlvTWl4U3RvcnlCb2FyZFRTLAotICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLAotICAgICAgICBNNE9TQV9VSW50MzIgcHJpbWFyeVRyYWNrVm9sVmFsdWUgKSB7Ci0KLSAgICBBTE9HVigic2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0iKTsKLSAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMgPSBhdWRpb01peFN0b3J5Qm9hcmRUUzsKLSAgICBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lID0gY3VycmVudE1lZGlhQmVnaW5DdXRUaW1lOwotICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSA9IHByaW1hcnlUcmFja1ZvbFZhbHVlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0UGxheWJhY2tCZWdpblRpbWUodWludDMyX3QgbXNlYykgewotCi0gICAgbVBsYXlCZWdpblRpbWVNc2VjID0gbXNlYzsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldFBsYXliYWNrRW5kVGltZSh1aW50MzJfdCBtc2VjKSB7Ci0KLSAgICBtUGxheUVuZFRpbWVNc2VjID0gbXNlYzsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldFN0b3J5Ym9hcmRTdGFydFRpbWUodWludDMyX3QgbXNlYykgewotCi0gICAgbVN0b3J5Ym9hcmRTdGFydFRpbWVNc2VjID0gbXNlYzsKLSAgICBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQgPSBtU3Rvcnlib2FyZFN0YXJ0VGltZU1zZWMgKiAxMDAwTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwodWludDMyX3QgY2JJbnRlcnZhbCkgewotCi0gICAgbVByb2dyZXNzQ2JJbnRlcnZhbCA9IGNiSW50ZXJ2YWw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldE1lZGlhUmVuZGVyaW5nTW9kZSgKLSAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG91dHB1dFZpZGVvU2l6ZSkgewotCi0gICAgbVJlbmRlcmluZ01vZGUgPSBtb2RlOwotCi0gICAgLyogZ2V0IHRoZSB2aWRlbyB3aWR0aCBhbmQgaGVpZ2h0IGJ5IHJlc29sdXRpb24gKi8KLSAgICByZXR1cm4gZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKAotICAgICAgICAgICAgICAgIG91dHB1dFZpZGVvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgJm1PdXRwdXRWaWRlb1dpZHRoLCAmbU91dHB1dFZpZGVvSGVpZ2h0KTsKLQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpyZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCkgewotCi0gICAgbURlY1ZpZGVvVHNTdG9yeUJvYXJkID0gbVN0b3J5Ym9hcmRTdGFydFRpbWVNc2VjICogMTAwMExMOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0UHJvZ3Jlc3NDYWxsYmFja0V2ZW50X2woKSB7Ci0gICAgaWYgKG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVByb2dyZXNzQ2JFdmVudFBlbmRpbmcgPSB0cnVlOwotCi0gICAgbVF1ZXVlLnBvc3RFdmVudChtUHJvZ3Jlc3NDYkV2ZW50KTsKLX0KLQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uUHJvZ3Jlc3NDYkV2ZW50KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKCFtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgLy8gSWYgcGxheWJhY2sgc3RhcnRzIGZyb20gcHJldmlvdXMgSS1mcmFtZSwKLSAgICAvLyB0aGVuIHNlbmQgZnJhbWUgc3Rvcnlib2FyZCBkdXJhdGlvbgotICAgIGlmICgobURlY29kZWRWaWRlb1RzLzEwMDApIDwgbVBsYXlCZWdpblRpbWVNc2VjKSB7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgMCwgbURlY1ZpZGVvVHNTdG9yeUJvYXJkLzEwMDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgMCwKLSAgICAgICAgKCgobURlY29kZWRWaWRlb1RzK21EZWNWaWRlb1RzU3RvcnlCb2FyZCkvMTAwMCktbVBsYXlCZWdpblRpbWVNc2VjKSk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RPdmVybGF5VXBkYXRlRXZlbnRfbCgpIHsKLSAgICBpZiAobU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UGVuZGluZyA9IHRydWU7Ci0gICAgbVF1ZXVlLnBvc3RFdmVudChtT3ZlcmxheVVwZGF0ZUV2ZW50KTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblVwZGF0ZU92ZXJsYXlFdmVudCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKCFtT3ZlcmxheVVwZGF0ZUV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBpbnQgdXBkYXRlU3RhdGUgPSBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkPyAxOiAwOwotICAgIG5vdGlmeUxpc3RlbmVyX2woMHhCQkJCQkJCQiwgdXBkYXRlU3RhdGUsIG1DdXJyRnJhbWluZ0VmZmVjdEluZGV4KTsKLX0KLQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFZpZGVvUG9zdFByb2Nlc3NpbmdOb2RlKAotICAgICAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHR5cGUsIE00T1NBX0Jvb2wgZW5hYmxlKSB7Ci0KLSAgICB1aW50MzJfdCBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLQotICAgIC8vTWFwIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdG8gbG9jYWwgZW51bQotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GQURFRlJPTUJMQUNLOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GQURFVE9CTEFDSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9CTEFDS0FORFdISVRFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX1BJTks7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0dSRUVOOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9TRVBJQTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTkVHQVRJVkU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmc6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRlJBTUlORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllczoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GSUZUSUVTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0NPTE9SX1JHQjE2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudDoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9HUkFESUVOVDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChlbmFibGUgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAvL0lmIGFscmVhZHkgc2V0LCB0aGVuIG5vIG5lZWQgdG8gc2V0IGFnYWluCi0gICAgICAgIGlmICghKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBlZmZlY3QpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0IHw9IGVmZmVjdDsKLSAgICAgICAgICAgIGlmIChlZmZlY3QgPT0gVklERU9fRUZGRUNUX0ZJRlRJRVMpIHsKLSAgICAgICAgICAgICAgICBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgIHsKLSAgICAgICAgLy9SZXNldCBvbmx5IGlmIGFscmVhZHkgc2V0Ci0gICAgICAgIGlmIChtQ3VycmVudFZpZGVvRWZmZWN0ICYgZWZmZWN0KSB7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0ICY9IH5lZmZlY3Q7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldEltYWdlQ2xpcFByb3BlcnRpZXModWludDMyX3Qgd2lkdGgsdWludDMyX3QgaGVpZ2h0KSB7Ci0gICAgbVZpZGVvV2lkdGggPSB3aWR0aDsKLSAgICBtVmlkZW9IZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpyZWFkRmlyc3RWaWRlb0ZyYW1lKCkgewotICAgIEFMT0dWKCJyZWFkRmlyc3RWaWRlb0ZyYW1lIik7Ci0KLSAgICBpZiAoIW1WaWRlb0J1ZmZlcikgewotICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgIEFMT0dWKCJzZWVraW5nIHRvICVsbGQgdXMgKCUuMmYgc2VjcykiLCBtU2Vla1RpbWVVcywKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMgLyAxRTYpOwotCi0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbygKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVmlkZW9Tb3VyY2UtPnJlYWQoJm1WaWRlb0J1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soIW1WaWRlb0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvU291cmNlIHNpZ25hbGxlZCBmb3JtYXQgY2hhbmdlIik7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZV9sKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1JlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBpbml0UmVuZGVyZXJfbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkVPUyByZWFjaGVkLiIpOwotICAgICAgICAgICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKLSAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVmlkZW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBTb21lIGRlY29kZXJzLCBub3RhYmx5IHRoZSBQViBBVkMgc29mdHdhcmUgZGVjb2RlcgotICAgICAgICAgICAgICAgIC8vIHJldHVybiBzcHVyaW91cyBlbXB0eSBidWZmZXJzIHRoYXQgd2UganVzdCB3YW50IHRvIGlnbm9yZS4KLQotICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgdmlkZW9UaW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ2aWRlb1RpbWVVcykpOwotICAgICAgICAgICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgICAgICBpZiAodmlkZW9UaW1lVXMgPCBtU2Vla1RpbWVVcykgewotICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJzIGFyZSBiZWZvcmUgc2VlayB0aW1lCi0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGVtCi0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgodmlkZW9UaW1lVXMvMTAwMCkgPCBtUGxheUJlZ2luVGltZU1zZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycyBhcmUgYmVmb3JlIGJlZ2luIGN1dCB0aW1lCi0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGVtCi0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotICAgIHNldFBvc2l0aW9uX2wodGltZVVzKTsKLQotICAgIG1EZWNvZGVkVmlkZW9UcyA9IHRpbWVVczsKLQotICAgIHJldHVybiBPSzsKLQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpnZXRMYXN0UmVuZGVyZWRUaW1lTXModWludDMyX3QgKmxhc3RSZW5kZXJlZFRpbWVNcykgewotICAgICpsYXN0UmVuZGVyZWRUaW1lTXMgPSAoKChtRGVjb2RlZFZpZGVvVHMrbURlY1ZpZGVvVHNTdG9yeUJvYXJkKS8xMDAwKS1tUGxheUJlZ2luVGltZU1zZWMpOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjp1cGRhdGVTaXplVG9SZW5kZXIoc3A8TWV0YURhdGE+IG1ldGEpIHsKLSAgICBpZiAobVZpZGVvUmVuZGVyZXIpIHsKLSAgICAgICAgbVZpZGVvUmVuZGVyZXItPnVwZGF0ZVZpZGVvU2l6ZShtZXRhKTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0TGlzdGVuZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cmVzZXQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXNldF9sKCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6Y2xlYXJfbCgpIHsKLSAgICBtRGlzcGxheVdpZHRoID0gMDsKLSAgICBtRGlzcGxheUhlaWdodCA9IDA7Ci0KLSAgICBpZiAobUZsYWdzICYgUExBWUlORykgewotICAgICAgICB1cGRhdGVCYXR0ZXJ5VXNhZ2VfbCgpOwotICAgIH0KLQotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgbUZsYWdzIHw9IFBSRVBBUkVfQ0FOQ0VMTEVEOwotCi0gICAgICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkdfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAvLyBXZSBhcmUgYmFzaWNhbGx5IGRvbmUgcHJlcGFyaW5nLCB3ZSdyZSBqdXN0IGJ1ZmZlcmluZwotICAgICAgICAgICAgLy8gZW5vdWdoIGRhdGEgdG8gc3RhcnQgcGxheWJhY2ssIHdlIGNhbiBzYWZlbHkgaW50ZXJydXB0IHRoYXQuCi0gICAgICAgICAgICBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICBtUHJlcGFyZWRDb25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgY2FuY2VsUGxheWVyRXZlbnRzX2wodHJ1ZSk7Ci0KLSAgICBtQXVkaW9UcmFjay5jbGVhcigpOwotICAgIG1WaWRlb1RyYWNrLmNsZWFyKCk7Ci0KLSAgICAvLyBTaHV0ZG93biBhdWRpbyBmaXJzdCwgc28gdGhhdCB0aGUgcmVzcG9uZSB0byB0aGUgcmVzZXQgcmVxdWVzdAotICAgIC8vIGFwcGVhcnMgdG8gaGFwcGVuIGluc3RhbnRhbmVvdXNseSBhcyBmYXIgYXMgdGhlIHVzZXIgaXMgY29uY2VybmVkCi0gICAgLy8gSWYgd2UgZGlkIHRoaXMgbGF0ZXIsIGF1ZGlvIHdvdWxkIGNvbnRpbnVlIHBsYXlpbmcgd2hpbGUgd2UKLSAgICAvLyBzaHV0ZG93biB0aGUgdmlkZW8tcmVsYXRlZCByZXNvdXJjZXMgYW5kIHRoZSBwbGF5ZXIgYXBwZWFyIHRvCi0gICAgLy8gbm90IGJlIGFzIHJlc3BvbnNpdmUgdG8gYSByZXNldCByZXF1ZXN0LgotICAgIGlmIChtQXVkaW9QbGF5ZXIgPT0gTlVMTCAmJiBtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAvLyBJZiB3ZSBoYWQgYW4gYXVkaW8gcGxheWVyLCBpdCB3b3VsZCBoYXZlIGVmZmVjdGl2ZWx5Ci0gICAgICAgIC8vIHRha2VuIHBvc3Nlc3Npb24gb2YgdGhlIGF1ZGlvIHNvdXJjZSBhbmQgc3RvcHBlZCBpdCB3aGVuCi0gICAgICAgIC8vIF9pdF8gaXMgc3RvcHBlZC4gT3RoZXJ3aXNlIHRoaXMgaXMgc3RpbGwgb3VyIHJlc3BvbnNpYmlsaXR5LgotICAgICAgICBtQXVkaW9Tb3VyY2UtPnN0b3AoKTsKLSAgICB9Ci0gICAgbUF1ZGlvU291cmNlLmNsZWFyKCk7Ci0KLSAgICBtVGltZVNvdXJjZSA9IE5VTEw7Ci0KLSAgICBkZWxldGUgbUF1ZGlvUGxheWVyOwotICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0KLSAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgc2h1dGRvd25WaWRlb0RlY29kZXJfbCgpOwotICAgIH0KLQotICAgIG1EdXJhdGlvblVzID0gLTE7Ci0gICAgbUZsYWdzID0gMDsKLSAgICBtRXh0cmFjdG9yRmxhZ3MgPSAwOwotICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IDA7Ci0gICAgbVZpZGVvVGltZVVzID0gMDsKLQotICAgIG1TZWVraW5nID0gTk9fU0VFSzsKLSAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0KLSAgICBtVXJpLnNldFRvKCIiKTsKLQotICAgIG1CaXRyYXRlID0gLTE7Ci0gICAgbUxhc3RWaWRlb1RpbWVVcyA9IC0xOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om5vdGlmeUxpc3RlbmVyX2woaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSB7Ci0gICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotCi0gICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KG1zZywgZXh0MSwgZXh0Mik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6b25WaWRlb0xhZ1VwZGF0ZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbVZpZGVvTGFnRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVZpZGVvTGFnRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBpbnQ2NF90IGF1ZGlvVGltZVVzID0gbUF1ZGlvUGxheWVyLT5nZXRNZWRpYVRpbWVVcygpOwotICAgIGludDY0X3QgdmlkZW9MYXRlQnlVcyA9IGF1ZGlvVGltZVVzIC0gbVZpZGVvVGltZVVzOwotCi0gICAgaWYgKCEobUZsYWdzICYgVklERU9fQVRfRU9TKSAmJiB2aWRlb0xhdGVCeVVzID4gMzAwMDAwbGwpIHsKLSAgICAgICAgQUxPR1YoInZpZGVvIGxhdGUgYnkgJWxsZCBtcy4iLCB2aWRlb0xhdGVCeVVzIC8gMTAwMGxsKTsKLQotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICAgICAgICAgIE1FRElBX0lORk8sCi0gICAgICAgICAgICAgICAgTUVESUFfSU5GT19WSURFT19UUkFDS19MQUdHSU5HLAotICAgICAgICAgICAgICAgIHZpZGVvTGF0ZUJ5VXMgLyAxMDAwbGwpOwotICAgIH0KLQotICAgIHBvc3RWaWRlb0xhZ0V2ZW50X2woKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpub3RpZnlWaWRlb1NpemVfbCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBpbnQzMl90IHZXaWR0aCwgdkhlaWdodDsKLSAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207Ci0KLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmdldpZHRoKSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZ2SGVpZ2h0KSk7Ci0KLSAgICBtR2l2ZW5XaWR0aCA9IHZXaWR0aDsKLSAgICBtR2l2ZW5IZWlnaHQgPSB2SGVpZ2h0OwotCi0gICAgaWYgKCFtZXRhLT5maW5kUmVjdCgKLSAgICAgICAgICAgICAgICBrS2V5Q3JvcFJlY3QsICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSkgewotCi0gICAgICAgIGNyb3BMZWZ0ID0gY3JvcFRvcCA9IDA7Ci0gICAgICAgIGNyb3BSaWdodCA9IHZXaWR0aCAtIDE7Ci0gICAgICAgIGNyb3BCb3R0b20gPSB2SGVpZ2h0IC0gMTsKLQotICAgICAgICBBTE9HRCgiZ290IGRpbWVuc2lvbnMgb25seSAlZCB4ICVkIiwgdldpZHRoLCB2SGVpZ2h0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRCgiZ290IGNyb3AgcmVjdCAlZCwgJWQsICVkLCAlZCIsCi0gICAgICAgICAgICAgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbSk7Ci0gICAgfQotCi0gICAgbUNyb3BSZWN0LmxlZnQgPSBjcm9wTGVmdDsKLSAgICBtQ3JvcFJlY3QucmlnaHQgPSBjcm9wUmlnaHQ7Ci0gICAgbUNyb3BSZWN0LnRvcCA9IGNyb3BUb3A7Ci0gICAgbUNyb3BSZWN0LmJvdHRvbSA9IGNyb3BCb3R0b207Ci0KLSAgICBpbnQzMl90IGRpc3BsYXlXaWR0aDsKLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5V2lkdGgsICZkaXNwbGF5V2lkdGgpKSB7Ci0gICAgICAgIEFMT0dWKCJEaXNwbGF5IHdpZHRoIGNoYW5nZWQgKCVkPT4lZCkiLCBtRGlzcGxheVdpZHRoLCBkaXNwbGF5V2lkdGgpOwotICAgICAgICBtRGlzcGxheVdpZHRoID0gZGlzcGxheVdpZHRoOwotICAgIH0KLSAgICBpbnQzMl90IGRpc3BsYXlIZWlnaHQ7Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgJmRpc3BsYXlIZWlnaHQpKSB7Ci0gICAgICAgIEFMT0dWKCJEaXNwbGF5IGhlaWdodCBjaGFuZ2VkICglZD0+JWQpIiwgbURpc3BsYXlIZWlnaHQsIGRpc3BsYXlIZWlnaHQpOwotICAgICAgICBtRGlzcGxheUhlaWdodCA9IGRpc3BsYXlIZWlnaHQ7Ci0gICAgfQotCi0gICAgaW50MzJfdCB1c2FibGVXaWR0aCA9IGNyb3BSaWdodCAtIGNyb3BMZWZ0ICsgMTsKLSAgICBpbnQzMl90IHVzYWJsZUhlaWdodCA9IGNyb3BCb3R0b20gLSBjcm9wVG9wICsgMTsKLSAgICBpZiAobURpc3BsYXlXaWR0aCAhPSAwKSB7Ci0gICAgICAgIHVzYWJsZVdpZHRoID0gbURpc3BsYXlXaWR0aDsKLSAgICB9Ci0gICAgaWYgKG1EaXNwbGF5SGVpZ2h0ICE9IDApIHsKLSAgICAgICAgdXNhYmxlSGVpZ2h0ID0gbURpc3BsYXlIZWlnaHQ7Ci0gICAgfQotCi0gICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7Ci0gICAgaWYgKCFtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICBrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlcyA9PSA5MCB8fCByb3RhdGlvbkRlZ3JlZXMgPT0gMjcwKSB7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCi0gICAgICAgICAgICAgICAgTUVESUFfU0VUX1ZJREVPX1NJWkUsIHVzYWJsZUhlaWdodCwgdXNhYmxlV2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCi0gICAgICAgICAgICAgICAgTUVESUFfU0VUX1ZJREVPX1NJWkUsIHVzYWJsZVdpZHRoLCB1c2FibGVIZWlnaHQpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cGF1c2UoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47Ci0KLSAgICByZXR1cm4gcGF1c2VfbCgpOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwYXVzZV9sKGJvb2wgYXRfZW9zKSB7Ci0gICAgaWYgKCEobUZsYWdzICYgUExBWUlORykpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGNhbmNlbFBsYXllckV2ZW50c19sKCk7Ci0KLSAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwgJiYgKG1GbGFncyAmIEFVRElPX1JVTk5JTkcpKSB7Ci0gICAgICAgIGlmIChhdF9lb3MpIHsKLSAgICAgICAgICAgIC8vIElmIHdlIHBsYXllZCB0aGUgYXVkaW8gc3RyZWFtIHRvIGNvbXBsZXRpb24gd2UKLSAgICAgICAgICAgIC8vIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHNhbXBsZXMgcmVtYWluaW5nIGluIHRoZSBhdWRpbwotICAgICAgICAgICAgLy8gdHJhY2sncyBxdWV1ZSBhcmUgcGxheWVkIG91dC4KLSAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UodHJ1ZSAvKiBwbGF5UGVuZGluZ1NhbXBsZXMgKi8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5wYXVzZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUZsYWdzICY9IH5BVURJT19SVU5OSU5HOwotICAgIH0KLQotICAgIG1GbGFncyAmPSB+UExBWUlORzsKLSAgICB1cGRhdGVCYXR0ZXJ5VXNhZ2VfbCgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIFByZXZpZXdQbGF5ZXI6OmlzUGxheWluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gKG1GbGFncyAmIFBMQVlJTkcpIHx8IChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTik7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtU3VyZmFjZSA9IHN1cmZhY2U7Ci0gICAgc2V0TmF0aXZlV2luZG93X2woc3VyZmFjZSk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0U3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1TdXJmYWNlLmNsZWFyKCk7Ci0gICAgaWYgKGJ1ZmZlclByb2R1Y2VyICE9IE5VTEwpIHsKLSAgICAgICAgc2V0TmF0aXZlV2luZG93X2wobmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIpKTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2h1dGRvd25WaWRlb0RlY29kZXJfbCgpIHsKLSAgICBpZiAobVZpZGVvQnVmZmVyKSB7Ci0gICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIG1WaWRlb1NvdXJjZS0+c3RvcCgpOwotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBoYWNrIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgT01YCi0gICAgLy8gY29tcG9uZW50IGlzIGNvbXBsZXRlbHkgcmVsZWFzZWQgYnkgdGhlIHRpbWUgd2UgbWF5IHRyeQotICAgIC8vIHRvIGluc3RhbnRpYXRlIGl0IGFnYWluLgotICAgIHdwPE1lZGlhU291cmNlPiB0bXAgPSBtVmlkZW9Tb3VyY2U7Ci0gICAgbVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgewotICAgICAgICB1c2xlZXAoMTAwMCk7Ci0gICAgfQotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXROYXRpdmVXaW5kb3dfbChjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlKSB7Ci0gICAgbU5hdGl2ZVdpbmRvdyA9IG5hdGl2ZTsKLQotICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR0koImF0dGVtcHRpbmcgdG8gcmVjb25maWd1cmUgdG8gdXNlIG5ldyBzdXJmYWNlIik7Ci0KLSAgICBib29sIHdhc1BsYXlpbmcgPSAobUZsYWdzICYgUExBWUlORykgIT0gMDsKLQotICAgIHBhdXNlX2woKTsKLQotICAgIHNodXRkb3duVmlkZW9EZWNvZGVyX2woKTsKLQotICAgIENIRUNLX0VRKGluaXRWaWRlb0RlY29kZXJfbCgpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgaWYgKG1MYXN0VmlkZW9UaW1lVXMgPj0gMCkgewotICAgICAgICBtU2Vla2luZyA9IFNFRUs7Ci0gICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7Ci0gICAgICAgIG1TZWVrVGltZVVzID0gbUxhc3RWaWRlb1RpbWVVczsKLSAgICAgICAgbUZsYWdzICY9IH4oQVRfRU9TIHwgQVVESU9fQVRfRU9TIHwgVklERU9fQVRfRU9TKTsKLSAgICB9Ci0KLSAgICBpZiAod2FzUGxheWluZykgewotICAgICAgICBwbGF5X2woKTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0QXVkaW9TaW5rKAotICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luaykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtQXVkaW9TaW5rID0gYXVkaW9TaW5rOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRMb29waW5nKGJvb2wgc2hvdWxkTG9vcCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtRmxhZ3MgPSBtRmxhZ3MgJiB+TE9PUElORzsKLQotICAgIGlmIChzaG91bGRMb29wKSB7Ci0gICAgICAgIG1GbGFncyB8PSBMT09QSU5HOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXREdXJhdGlvbl9sKGludDY0X3QgZHVyYXRpb25VcykgewotICAgIGlmIChtRHVyYXRpb25VcyA8IDAgfHwgZHVyYXRpb25VcyA+IG1EdXJhdGlvblVzKSB7Ci0gICAgICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChtRHVyYXRpb25VcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgKmR1cmF0aW9uVXMgPSBtRHVyYXRpb25VczsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmdldFBvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgKnBvc2l0aW9uVXMgPSBtU2Vla1RpbWVVczsKLSAgICB9IGVsc2UgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMCi0gICAgICAgICAgICAmJiAobUF1ZGlvUGxheWVyID09IE5VTEwgfHwgIShtRmxhZ3MgJiBWSURFT19BVF9FT1MpKSkgewotICAgICAgICAqcG9zaXRpb25VcyA9IG1WaWRlb1RpbWVVczsKLSAgICB9IGVsc2UgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgICpwb3NpdGlvblVzID0gbUF1ZGlvUGxheWVyLT5nZXRNZWRpYVRpbWVVcygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpwb3NpdGlvblVzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0UG9zaXRpb25fbChpbnQ2NF90IHRpbWVVcykgewotICAgIG1WaWRlb1RpbWVVcyA9IHRpbWVVczsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2Vla1RvX2woaW50NjRfdCB0aW1lVXMpIHsKLSAgICBBTE9HVigic2Vla1RvX2wiKTsKLSAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKLSAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKLSAgICAgICAgcGxheV9sKCk7Ci0gICAgfQotCi0gICAgaWYgKChtRmxhZ3MgJiBQTEFZSU5HKSAmJiBtVmlkZW9Tb3VyY2UgIT0gTlVMTCAmJiAobUZsYWdzICYgVklERU9fQVRfRU9TKSkgewotICAgICAgICAvLyBWaWRlbyBwbGF5YmFjayBjb21wbGV0ZWQgYmVmb3JlLCB0aGVyZSdzIG5vIHBlbmRpbmcKLSAgICAgICAgLy8gdmlkZW8gZXZlbnQgcmlnaHQgbm93LiBJbiBvcmRlciBmb3IgdGhpcyBuZXcgc2VlawotICAgICAgICAvLyB0byBiZSBob25vcmVkLCB3ZSBuZWVkIHRvIHBvc3Qgb25lLgotCi0gICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKLSAgICB9Ci0KLSAgICBtU2Vla2luZyA9IFNFRUs7Ci0gICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7Ci0gICAgbVNlZWtUaW1lVXMgPSB0aW1lVXM7Ci0gICAgbUZsYWdzICY9IH4oQVRfRU9TIHwgQVVESU9fQVRfRU9TIHwgVklERU9fQVRfRU9TKTsKLQotICAgIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKLQotICAgIGlmICghKG1GbGFncyAmIFBMQVlJTkcpKSB7Ci0gICAgICAgIEFMT0dWKCJzZWVraW5nIHdoaWxlIHBhdXNlZCwgc2VuZGluZyBTRUVLX0NPTVBMRVRFIG5vdGlmaWNhdGlvbiIKLSAgICAgICAgICAgICAiIGltbWVkaWF0ZWx5LiIpOwotCi0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VFS19DT01QTEVURSk7Ci0gICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7Ci0KLSAgICAgICAgaWYgKChtRmxhZ3MgJiBQUkVQQVJFRCkgJiYgbVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GbGFncyB8PSBTRUVLX1BSRVZJRVc7Ci0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpIHsKLSAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSyAmJiBtVmlkZW9Tb3VyY2UgPT0gTlVMTCAmJiBtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9QbGF5ZXItPnNlZWtUbyhtU2Vla1RpbWVVcyk7Ci0KLSAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSB0cnVlOwotICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldEF1ZGlvU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKSB7Ci0gICAgQ0hFQ0soc291cmNlICE9IE5VTEwpOwotICAgIG1BdWRpb1RyYWNrID0gc291cmNlOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFZpZGVvU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKSB7Ci0gICAgQ0hFQ0soc291cmNlICE9IE5VTEwpOwotICAgIG1WaWRlb1RyYWNrID0gc291cmNlOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmZpbmlzaFNlZWtJZk5lY2Vzc2FyeShpbnQ2NF90IHZpZGVvVGltZVVzKSB7Ci0gICAgaWYgKG1TZWVraW5nID09IFNFRUtfVklERU9fT05MWSkgewotICAgICAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVNlZWtpbmcgPT0gTk9fU0VFSyB8fCAobUZsYWdzICYgU0VFS19QUkVWSUVXKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJzZWVraW5nIGF1ZGlvIHRvICVsbGQgdXMgKCUuMmYgc2VjcykuIiwgdmlkZW9UaW1lVXMsIHZpZGVvVGltZVVzIC8gMUU2KTsKLQotICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdmlkZW8gdGltZSwgc2VlayBhdWRpbyB0byB0aGUgb3JpZ2luYWxseQotICAgICAgICAvLyByZXF1ZXN0ZWQgc2VlayB0aW1lIGluc3RlYWQuCi0KLSAgICAgICAgbUF1ZGlvUGxheWVyLT5zZWVrVG8odmlkZW9UaW1lVXMgPCAwID8gbVNlZWtUaW1lVXMgOiB2aWRlb1RpbWVVcyk7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoIW1TZWVrTm90aWZpY2F0aW9uU2VudCkgewotICAgICAgICAvLyBJZiB3ZSdyZSBwbGF5aW5nIHZpZGVvIG9ubHksIHJlcG9ydCBzZWVrIGNvbXBsZXRlIG5vdywKLSAgICAgICAgLy8gb3RoZXJ3aXNlIGF1ZGlvIHBsYXllciB3aWxsIG5vdGlmeSB1cyBsYXRlci4KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRUVLX0NPTVBMRVRFKTsKLSAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7Ci0gICAgbVNlZWtpbmcgPSBOT19TRUVLOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uQ2hlY2tBdWRpb1N0YXR1cygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIC8vIEV2ZW50IHdhcyBkaXNwYXRjaGVkIGFuZCB3aGlsZSB3ZSB3ZXJlIGJsb2NraW5nIG9uIHRoZSBtdXRleCwKLSAgICAgICAgLy8gaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxsZWQuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIGlmIChtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSAmJiAhbUF1ZGlvUGxheWVyLT5pc1NlZWtpbmcoKSkgewotICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IGZhbHNlOwotCi0gICAgICAgIGlmICghbVNlZWtOb3RpZmljYXRpb25TZW50KSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFRUtfQ09NUExFVEUpOwotICAgICAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZWVraW5nID0gTk9fU0VFSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLSAgICBpZiAobVdhdGNoRm9yQXVkaW9FT1MgJiYgbUF1ZGlvUGxheWVyLT5yZWFjaGVkRU9TKCZmaW5hbFN0YXR1cykpIHsKLSAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSBmYWxzZTsKLSAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKLSAgICAgICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOwotICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZmluYWxTdGF0dXMpOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0VmlkZW9FdmVudF9sKGludDY0X3QgZGVsYXlVcykgewotICAgIGlmIChtVmlkZW9FdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IHRydWU7Ci0gICAgbVF1ZXVlLnBvc3RFdmVudFdpdGhEZWxheShtVmlkZW9FdmVudCwgZGVsYXlVcyA8IDAgPyAxMDAwMCA6IGRlbGF5VXMpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RTdHJlYW1Eb25lRXZlbnRfbChzdGF0dXNfdCBzdGF0dXMpIHsKLSAgICBpZiAobVN0cmVhbURvbmVFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IHRydWU7Ci0KLSAgICBtU3RyZWFtRG9uZVN0YXR1cyA9IHN0YXR1czsKLSAgICBtUXVldWUucG9zdEV2ZW50KG1TdHJlYW1Eb25lRXZlbnQpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RWaWRlb0xhZ0V2ZW50X2woKSB7Ci0gICAgaWYgKG1WaWRlb0xhZ0V2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1WaWRlb0xhZ0V2ZW50UGVuZGluZyA9IHRydWU7Ci0gICAgbVF1ZXVlLnBvc3RFdmVudFdpdGhEZWxheShtVmlkZW9MYWdFdmVudCwgMTAwMDAwMGxsKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgaWYgKG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZyA9IHRydWU7Ci0gICAgbVF1ZXVlLnBvc3RFdmVudFdpdGhEZWxheShtQ2hlY2tBdWRpb1N0YXR1c0V2ZW50LCBkZWxheVVzKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjphYm9ydFByZXBhcmUoc3RhdHVzX3QgZXJyKSB7Ci0gICAgQ0hFQ0soZXJyICE9IE9LKTsKLQotICAgIGlmIChtSXNBc3luY1ByZXBhcmUpIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKLSAgICB9Ci0KLSAgICBtUHJlcGFyZVJlc3VsdCA9IGVycjsKLSAgICBtRmxhZ3MgJj0gfihQUkVQQVJJTkd8UFJFUEFSRV9DQU5DRUxMRUR8UFJFUEFSSU5HX0NPTk5FQ1RFRCk7Ci0gICAgbUFzeW5jUHJlcGFyZUV2ZW50ID0gTlVMTDsKLSAgICBtUHJlcGFyZWRDb25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXVpbnQzMl90IFByZXZpZXdQbGF5ZXI6OmdldFNvdXJjZVNlZWtGbGFncygpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIG1FeHRyYWN0b3JGbGFnczsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0QXVkaW9FT1MoaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woZGVsYXlVcyk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKDAgLyogZGVsYXlVcyAqLyk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6dXBkYXRlQmF0dGVyeVVzYWdlX2woKSB7Ci0gICAgdWludDMyX3QgcGFyYW1zID0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tEZWNvZGVyOwotICAgIGlmICgobUF1ZGlvU291cmNlICE9IE5VTEwpICYmIChtQXVkaW9Tb3VyY2UgIT0gbUF1ZGlvVHJhY2spKSB7Ci0gICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0F1ZGlvOwotICAgIH0KLSAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrVmlkZW87Ci0gICAgfQotICAgIGFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTEzYjU4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBSRVZJRVdfUExBWUVSX0hfCi0KLSNkZWZpbmUgUFJFVklFV19QTEFZRVJfSF8KLQotI2luY2x1ZGUgIlRpbWVkRXZlbnRRdWV1ZS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVGltZVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlICJOYXRpdmVXaW5kb3dSZW5kZXJlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOwotc3RydWN0IE1lZGlhRXh0cmFjdG9yOwotCi1zdHJ1Y3QgUHJldmlld1BsYXllciB7Ci0gICAgUHJldmlld1BsYXllcihOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIpOwotICAgIH5QcmV2aWV3UGxheWVyKCk7Ci0KLSAgICB2b2lkIHNldExpc3RlbmVyKGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyKTsKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICBzdGF0dXNfdCBwbGF5KCk7Ci0gICAgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIGJvb2wgaXNQbGF5aW5nKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKLSAgICB2b2lkIHNldFN1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7Ci0gICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgdGltZVVzKTsKLQotICAgIHN0YXR1c190IGdldFZpZGVvRGltZW5zaW9ucyhpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSBjb25zdDsKLQotCi0gICAgLy8gRklYTUU6IFN5bmMgYmV0d2VlbiAuLi4KLSAgICB2b2lkIGFjcXVpcmVMb2NrKCk7Ci0gICAgdm9pZCByZWxlYXNlTG9jaygpOwotCi0gICAgc3RhdHVzX3QgcHJlcGFyZSgpOwotICAgIHN0YXR1c190IHByZXBhcmVBc3luYygpOwotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqcGF0aCk7Ci0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKLQotICAgIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rKTsKLSAgICBzdGF0dXNfdCBzZXRMb29waW5nKGJvb2wgc2hvdWxkTG9vcCk7Ci0gICAgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7Ci0gICAgc3RhdHVzX3QgZ2V0UG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25Vcyk7Ci0KLSAgICB1aW50MzJfdCBnZXRTb3VyY2VTZWVrRmxhZ3MoKSBjb25zdDsKLQotICAgIHZvaWQgcG9zdEF1ZGlvRU9TKGludDY0X3QgZGVsYXlVcyA9IDBsbCk7Ci0gICAgdm9pZCBwb3N0QXVkaW9TZWVrQ29tcGxldGUoKTsKLQotICAgIHN0YXR1c190IGxvYWRFZmZlY3RzU2V0dGluZ3MoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0U2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkVmZmVjdHMpOwotICAgIHN0YXR1c190IGxvYWRBdWRpb01peFNldHRpbmdzKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncyk7Ci0gICAgc3RhdHVzX3Qgc2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKE00T1NBX0NvbnRleHQgcEF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0gICAgc3RhdHVzX3Qgc2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oTTRPU0FfVUludDMyIGF1ZGlvTWl4U3RvcnlCb2FyZFRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGN1cnJlbnRNZWRpYVZvbHVtZVZvbCk7Ci0KLSAgICBzdGF0dXNfdCBzZXRQbGF5YmFja0JlZ2luVGltZSh1aW50MzJfdCBtc2VjKTsKLSAgICBzdGF0dXNfdCBzZXRQbGF5YmFja0VuZFRpbWUodWludDMyX3QgbXNlYyk7Ci0gICAgc3RhdHVzX3Qgc2V0U3Rvcnlib2FyZFN0YXJ0VGltZSh1aW50MzJfdCBtc2VjKTsKLSAgICBzdGF0dXNfdCBzZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwodWludDMyX3QgY2JJbnRlcnZhbCk7Ci0gICAgc3RhdHVzX3Qgc2V0TWVkaWFSZW5kZXJpbmdNb2RlKE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG91dHB1dFZpZGVvU2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCByZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci0gICAgc3RhdHVzX3Qgc2V0SW1hZ2VDbGlwUHJvcGVydGllcyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKLSAgICBzdGF0dXNfdCByZWFkRmlyc3RWaWRlb0ZyYW1lKCk7Ci0gICAgc3RhdHVzX3QgZ2V0TGFzdFJlbmRlcmVkVGltZU1zKHVpbnQzMl90ICpsYXN0UmVuZGVyZWRUaW1lTXMpOwotICAgIHN0YXR1c190IHNldEF1ZGlvUGxheWVyKFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKmF1ZGlvUGxheWVyKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAgUExBWUlORyAgICAgICAgICAgICA9IDEsCi0gICAgICAgIExPT1BJTkcgICAgICAgICAgICAgPSAyLAotICAgICAgICBGSVJTVF9GUkFNRSAgICAgICAgID0gNCwKLSAgICAgICAgUFJFUEFSSU5HICAgICAgICAgICA9IDgsCi0gICAgICAgIFBSRVBBUkVEICAgICAgICAgICAgPSAxNiwKLSAgICAgICAgQVRfRU9TICAgICAgICAgICAgICA9IDMyLAotICAgICAgICBQUkVQQVJFX0NBTkNFTExFRCAgID0gNjQsCi0gICAgICAgIENBQ0hFX1VOREVSUlVOICAgICAgPSAxMjgsCi0gICAgICAgIEFVRElPX0FUX0VPUyAgICAgICAgPSAyNTYsCi0gICAgICAgIFZJREVPX0FUX0VPUyAgICAgICAgPSA1MTIsCi0gICAgICAgIEFVVE9fTE9PUElORyAgICAgICAgPSAxMDI0LAotICAgICAgICBJTkZPUk1FRF9BVl9FT1MgICAgID0gMjA0OCwKLQotICAgICAgICAvLyBXZSBhcmUgYmFzaWNhbGx5IGRvbmUgcHJlcGFyaW5nIGJ1dCBhcmUgY3VycmVudGx5IGJ1ZmZlcmluZwotICAgICAgICAvLyBzdWZmaWNpZW50IGRhdGEgdG8gYmVnaW4gcGxheWJhY2sgYW5kIGZpbmlzaCB0aGUgcHJlcGFyYXRpb24gcGhhc2UKLSAgICAgICAgLy8gZm9yIGdvb2QuCi0gICAgICAgIFBSRVBBUklOR19DT05ORUNURUQgPSAyMDQ4LAotCi0gICAgICAgIC8vIFdlJ3JlIHRyaWdnZXJpbmcgYSBzaW5nbGUgdmlkZW8gZXZlbnQgdG8gZGlzcGxheSB0aGUgZmlyc3QgZnJhbWUKLSAgICAgICAgLy8gYWZ0ZXIgdGhlIHNlZWtwb2ludC4KLSAgICAgICAgU0VFS19QUkVWSUVXICAgICAgICA9IDQwOTYsCi0KLSAgICAgICAgQVVESU9fUlVOTklORyAgICAgICA9IDgxOTIsCi0gICAgICAgIEFVRElPUExBWUVSX1NUQVJURUQgPSAxNjM4NCwKLQotICAgICAgICBJTkNPR05JVE8gICAgICAgICAgID0gMzI3NjgsCi0gICAgfTsKLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0KLSAgICBPTVhDbGllbnQgbUNsaWVudDsKLSAgICBUaW1lZEV2ZW50UXVldWUgbVF1ZXVlOwotICAgIGJvb2wgbVF1ZXVlU3RhcnRlZDsKLSAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKLQotICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7Ci0gICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7Ci0KLSAgICBTeXN0ZW1UaW1lU291cmNlIG1TeXN0ZW1UaW1lU291cmNlOwotICAgIFRpbWVTb3VyY2UgKm1UaW1lU291cmNlOwotCi0gICAgU3RyaW5nOCBtVXJpOwotCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1WaWRlb1RyYWNrOwotICAgIHNwPE1lZGlhU291cmNlPiBtVmlkZW9Tb3VyY2U7Ci0gICAgYm9vbCBtVmlkZW9SZW5kZXJlcklzUHJldmlldzsKLQotICAgIHNwPE1lZGlhU291cmNlPiBtQXVkaW9UcmFjazsKLSAgICBzcDxNZWRpYVNvdXJjZT4gbUF1ZGlvU291cmNlOwotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKm1BdWRpb1BsYXllcjsKLSAgICBpbnQ2NF90IG1EdXJhdGlvblVzOwotCi0gICAgaW50MzJfdCBtRGlzcGxheVdpZHRoOwotICAgIGludDMyX3QgbURpc3BsYXlIZWlnaHQ7Ci0KLSAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgdWludDMyX3QgbUV4dHJhY3RvckZsYWdzOwotCi0gICAgaW50NjRfdCBtVGltZVNvdXJjZURlbHRhVXM7Ci0gICAgaW50NjRfdCBtVmlkZW9UaW1lVXM7Ci0KLSAgICBlbnVtIFNlZWtUeXBlIHsKLSAgICAgICAgTk9fU0VFSywKLSAgICAgICAgU0VFSywKLSAgICAgICAgU0VFS19WSURFT19PTkxZCi0gICAgfTsKLSAgICBTZWVrVHlwZSBtU2Vla2luZzsKLQotICAgIGJvb2wgbVNlZWtOb3RpZmljYXRpb25TZW50OwotICAgIGludDY0X3QgbVNlZWtUaW1lVXM7Ci0KLSAgICBpbnQ2NF90IG1CaXRyYXRlOyAgLy8gdG90YWwgYml0cmF0ZSBvZiB0aGUgZmlsZSAoaW4gYnBzKSBvciAtMSBpZiB1bmtub3duLgotCi0gICAgYm9vbCBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZTsKLSAgICBib29sIG1XYXRjaEZvckF1ZGlvRU9TOwotCi0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbVZpZGVvRXZlbnQ7Ci0gICAgYm9vbCBtVmlkZW9FdmVudFBlbmRpbmc7Ci0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbVN0cmVhbURvbmVFdmVudDsKLSAgICBib29sIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nOwotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1DaGVja0F1ZGlvU3RhdHVzRXZlbnQ7Ci0gICAgYm9vbCBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmc7Ci0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbVZpZGVvTGFnRXZlbnQ7Ci0gICAgYm9vbCBtVmlkZW9MYWdFdmVudFBlbmRpbmc7Ci0KLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtQXN5bmNQcmVwYXJlRXZlbnQ7Ci0gICAgQ29uZGl0aW9uIG1QcmVwYXJlZENvbmRpdGlvbjsKLSAgICBib29sIG1Jc0FzeW5jUHJlcGFyZTsKLSAgICBzdGF0dXNfdCBtUHJlcGFyZVJlc3VsdDsKLSAgICBzdGF0dXNfdCBtU3RyZWFtRG9uZVN0YXR1czsKLQotICAgIE1lZGlhQnVmZmVyICptVmlkZW9CdWZmZXI7Ci0gICAgaW50NjRfdCBtTGFzdFZpZGVvVGltZVVzOwotICAgIEFSZWN0IG1Dcm9wUmVjdDsKLSAgICBpbnQzMl90IG1HaXZlbldpZHRoLCBtR2l2ZW5IZWlnaHQ7Ci0KLQotICAgIGJvb2wgbUlzQ2hhbmdlU291cmNlUmVxdWlyZWQ7Ci0KLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlciAqbU5hdGl2ZVdpbmRvd1JlbmRlcmVyOwotICAgIFJlbmRlcklucHV0ICptVmlkZW9SZW5kZXJlcjsKLQotICAgIGludDMyX3QgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodDsKLQotICAgIC8vRGF0YSBzdHJ1Y3R1cmVzIHVzZWQgZm9yIGF1ZGlvIGFuZCB2aWRlbyBlZmZlY3RzCi0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBtRWZmZWN0c1NldHRpbmdzOwotICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBtUHJldmlld1BsYXllckF1ZGlvTWl4U2V0dGluZ3M7Ci0gICAgTTRPU0FfQ29udGV4dCBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlOwotICAgIE00T1NBX1VJbnQzMiBtQXVkaW9NaXhTdG9yeUJvYXJkVFM7Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWU7Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZTsKLSAgICBNNE9TQV9VSW50MzIgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXg7Ci0KLSAgICB1aW50MzJfdCBtTnVtYmVyRWZmZWN0czsKLSAgICB1aW50MzJfdCBtUGxheUJlZ2luVGltZU1zZWM7Ci0gICAgdWludDMyX3QgbVBsYXlFbmRUaW1lTXNlYzsKLSAgICB1aW50NjRfdCBtRGVjb2RlZFZpZGVvVHM7IC8vIHRpbWVzdGFtcCBvZiBjdXJyZW50IGRlY29kZWQgdmlkZW8gZnJhbWUgYnVmZmVyCi0gICAgdWludDY0X3QgbURlY1ZpZGVvVHNTdG9yeUJvYXJkOyAvLyB0aW1lc3RhbXAgb2YgZnJhbWUgcmVsYXRpdmUgdG8gc3Rvcnlib2FyZAotICAgIHVpbnQzMl90IG1DdXJyZW50VmlkZW9FZmZlY3Q7Ci0gICAgdWludDMyX3QgbVByb2dyZXNzQ2JJbnRlcnZhbDsKLSAgICB1aW50MzJfdCBtTnVtYmVyRGVjVmlkZW9GcmFtZXM7IC8vIENvdW50ZXIgb2YgbnVtYmVyIG9mIHZpZGVvIGZyYW1lcyBkZWNvZGVkCi0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbVByb2dyZXNzQ2JFdmVudDsKLSAgICBib29sIG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nOwotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1PdmVybGF5VXBkYXRlRXZlbnQ7Ci0gICAgYm9vbCBtT3ZlcmxheVVwZGF0ZUV2ZW50UGVuZGluZzsKLSAgICBib29sIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQ7Ci0KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbVJlbmRlcmluZ01vZGU7Ci0gICAgdWludDMyX3QgbU91dHB1dFZpZGVvV2lkdGg7Ci0gICAgdWludDMyX3QgbU91dHB1dFZpZGVvSGVpZ2h0OwotCi0gICAgdWludDMyX3QgbVN0b3J5Ym9hcmRTdGFydFRpbWVNc2VjOwotCi0gICAgYm9vbCBtSXNWaWRlb1NvdXJjZUpwZzsKLSAgICBib29sIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkOwotICAgIGludDY0X3QgbUltYWdlRnJhbWVUaW1lVXM7Ci0gICAgYm9vbCBtU3RhcnROZXh0UGxheWVyOwotICAgIG11dGFibGUgTXV0ZXggbUxvY2tDb250cm9sOwotCi0gICAgTTRWSUZJX1VJbnQ4KiAgbUZyYW1lUkdCQnVmZmVyOwotICAgIE00VklGSV9VSW50OCogIG1GcmFtZVlVVkJ1ZmZlcjsKLQotICAgIHZvaWQgY2FuY2VsUGxheWVyRXZlbnRzX2woYm9vbCB1cGRhdGVQcm9ncmVzc0NiID0gZmFsc2UpOwotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2VfbChjb25zdCBzcDxNZWRpYUV4dHJhY3Rvcj4gJmV4dHJhY3Rvcik7Ci0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sKGNvbnN0IGNoYXIgKnBhdGgpOwotICAgIHZvaWQgc2V0TmF0aXZlV2luZG93X2woY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZSk7Ci0gICAgdm9pZCByZXNldF9sKCk7Ci0gICAgdm9pZCBjbGVhcl9sKCk7Ci0gICAgc3RhdHVzX3QgcGxheV9sKCk7Ci0gICAgc3RhdHVzX3QgcGF1c2VfbChib29sIGF0X2VvcyA9IGZhbHNlKTsKLSAgICBzdGF0dXNfdCBpbml0UmVuZGVyZXJfbCgpOwotICAgIHN0YXR1c190IGluaXRBdWRpb0RlY29kZXJfbCgpOwotICAgIHN0YXR1c190IGluaXRWaWRlb0RlY29kZXJfbCh1aW50MzJfdCBmbGFncyA9IDApOwotICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplX2woKTsKLSAgICB2b2lkIG5vdGlmeUxpc3RlbmVyX2woaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDApOwotICAgIHZvaWQgb25WaWRlb0V2ZW50KCk7Ci0gICAgdm9pZCBvblZpZGVvTGFnVXBkYXRlKCk7Ci0gICAgdm9pZCBvblN0cmVhbURvbmUoKTsKLSAgICB2b2lkIG9uQ2hlY2tBdWRpb1N0YXR1cygpOwotICAgIHZvaWQgb25QcmVwYXJlQXN5bmNFdmVudCgpOwotCi0gICAgdm9pZCBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOwotICAgIHZvaWQgYWJvcnRQcmVwYXJlKHN0YXR1c190IGVycik7Ci0KLSAgICBzdGF0dXNfdCBzdGFydEF1ZGlvUGxheWVyX2woKTsKLSAgICB2b2lkIHNldFZpZGVvU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKTsKLSAgICBzdGF0dXNfdCBmaW5pc2hTZXREYXRhU291cmNlX2woKTsKLSAgICB2b2lkIHNldEF1ZGlvU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKTsKLQotICAgIHN0YXR1c190IHNlZWtUb19sKGludDY0X3QgdGltZVVzKTsKLSAgICB2b2lkIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKLSAgICB2b2lkIGZpbmlzaFNlZWtJZk5lY2Vzc2FyeShpbnQ2NF90IHZpZGVvVGltZVVzKTsKLQotICAgIHZvaWQgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGludDY0X3QgZGVsYXlVcyk7Ci0gICAgdm9pZCBwb3N0VmlkZW9MYWdFdmVudF9sKCk7Ci0gICAgdm9pZCBwb3N0U3RyZWFtRG9uZUV2ZW50X2woc3RhdHVzX3Qgc3RhdHVzKTsKLSAgICB2b2lkIHBvc3RWaWRlb0V2ZW50X2woaW50NjRfdCBkZWxheVVzID0gLTEpOwotICAgIHZvaWQgc2V0VmlkZW9Qb3N0UHJvY2Vzc2luZ05vZGUoCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdHlwZSwgTTRPU0FfQm9vbCBlbmFibGUpOwotICAgIHZvaWQgcG9zdFByb2dyZXNzQ2FsbGJhY2tFdmVudF9sKCk7Ci0gICAgdm9pZCBzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCk7Ci0gICAgdm9pZCBvblByb2dyZXNzQ2JFdmVudCgpOwotCi0gICAgdm9pZCBwb3N0T3ZlcmxheVVwZGF0ZUV2ZW50X2woKTsKLSAgICB2b2lkIG9uVXBkYXRlT3ZlcmxheUV2ZW50KCk7Ci0KLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2xfanBnKCk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZV9sKCk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUFzeW5jX2woKTsKLSAgICB2b2lkIHVwZGF0ZUJhdHRlcnlVc2FnZV9sKCk7Ci0gICAgdm9pZCB1cGRhdGVTaXplVG9SZW5kZXIoc3A8TWV0YURhdGE+IG1ldGEpOwotCi0gICAgdm9pZCBzZXREdXJhdGlvbl9sKGludDY0X3QgZHVyYXRpb25Vcyk7Ci0gICAgdm9pZCBzZXRQb3NpdGlvbl9sKGludDY0X3QgdGltZVVzKTsKLQotICAgIFByZXZpZXdQbGF5ZXIoY29uc3QgUHJldmlld1BsYXllciAmKTsKLSAgICBQcmV2aWV3UGxheWVyICZvcGVyYXRvcj0oY29uc3QgUHJldmlld1BsYXllciAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gUFJFVklFV19QTEFZRVJfSF8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWNmYzhlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJQcmV2aWV3UmVuZGVyZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJQcmV2aWV3UmVuZGVyZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1QcmV2aWV3UmVuZGVyZXIqIFByZXZpZXdSZW5kZXJlcjo6Q3JlYXRlUHJldmlld1JlbmRlcmVyICgKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotCi0gICAgUHJldmlld1JlbmRlcmVyKiByZW5kZXJlciA9IG5ldyBQcmV2aWV3UmVuZGVyZXIoc3VyZmFjZSwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICBpZiAocmVuZGVyZXItPmluaXQoKSAhPSAwKSB7Ci0gICAgICAgIGRlbGV0ZSByZW5kZXJlcjsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlbmRlcmVyOwotfQotCi1QcmV2aWV3UmVuZGVyZXI6OlByZXZpZXdSZW5kZXJlcigKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCi0gICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkKLSAgICA6IG1TdXJmYWNlKHN1cmZhY2UpLAotICAgICAgbVdpZHRoKHdpZHRoKSwKLSAgICAgIG1IZWlnaHQoaGVpZ2h0KSB7Ci19Ci0KLWludCBQcmV2aWV3UmVuZGVyZXI6OmluaXQoKSB7Ci0gICAgaW50IGVyciA9IDA7Ci0gICAgQU5hdGl2ZVdpbmRvdyogYW53ID0gbVN1cmZhY2UuZ2V0KCk7Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KGFudywgTkFUSVZFX1dJTkRPV19BUElfQ1BVKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF91c2FnZSgKLSAgICAgICAgICAgIGFudywgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTik7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KGFudywgMyk7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfc2NhbGluZ19tb2RlKAotICAgICAgICAgICAgYW53LCBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCi0gICAgICAgICAgICBhbncsIG1XaWR0aCwgbUhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybShhbncsIDApOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotZmFpbDoKLSAgICByZXR1cm4gZXJyOwotfQotCi1QcmV2aWV3UmVuZGVyZXI6On5QcmV2aWV3UmVuZGVyZXIoKSB7Ci0gICAgbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtU3VyZmFjZS5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfQ1BVKTsKLX0KLQotCi0vLwotLy8gUHJvdmlkZXMgYSBidWZmZXIgYW5kIGFzc29jaWF0ZWQgc3RyaWRlCi0vLyBUaGlzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgYnkgdGhlIFN1cmZhY2VGbGluZ2VyCi0vLwotLy8gRm9yIG9wdGltYWwgZGlzcGxheSBwZXJmb3JtYW5jZXMsIHlvdSBzaG91bGQgOgotLy8gMSkgY2FsbCBnZXRCdWZmZXJZVjEyKCkKLS8vIDIpIGZpbGwgdGhlIGJ1ZmZlciB3aXRoIHlvdXIgZGF0YQotLy8gMykgY2FsbCByZW5kZXJZVjEyKCkgdG8gdGFrZSB0aGVzZSBjaGFuZ2VzIGludG8gYWNjb3VudAotLy8KLS8vIEZvciBlYWNoIGNhbGwgdG8gZ2V0QnVmZmVyWVYxMigpLCB5b3UgbXVzdCBhbHNvIGNhbGwgcmVuZGVyWVYxMigpCi0vLyBFeHBlY3RlZCBmb3JtYXQgaW4gdGhlIGJ1ZmZlciBpcyBZVjEyIGZvcm1hdHMgKHNpbWlsYXIgdG8gWVVWNDIwIHBsYW5hciBmcm9tYXQpCi0vLyBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgWVYxMiBjZiBoYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlL2hhcmR3YXJlL2hhcmR3YXJlLmgKLS8vCi12b2lkIFByZXZpZXdSZW5kZXJlcjo6Z2V0QnVmZmVyWVYxMih1aW50OF90ICoqZGF0YSwgc2l6ZV90ICpzdHJpZGUpIHsKLSAgICBpbnQgZXJyID0gT0s7Ci0KLSAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobVN1cmZhY2UuZ2V0KCksCi0gICAgICAgICAgICAmbUJ1ZikpICE9IDApIHsKLSAgICAgICAgQUxPR1coIm5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7Ci0KLSAgICBSZWN0IGJvdW5kcyhtV2lkdGgsIG1IZWlnaHQpOwotCi0gICAgdm9pZCAqZHN0OwotICAgIENIRUNLX0VRKDAsIG1hcHBlci5sb2NrKG1CdWYtPmhhbmRsZSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9ORVZFUiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCi0gICAgICAgICAgICBib3VuZHMsICZkc3QpKTsKLQotICAgICpkYXRhICAgPSAodWludDhfdCopZHN0OwotICAgICpzdHJpZGUgPSBtQnVmLT5zdHJpZGU7Ci19Ci0KLQotLy8KLS8vIERpc3BsYXkgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlciBwcm92aWRlZCBieSBsYXN0IGNhbGwgdG8gZ2V0QnVmZmVyWVYxMigpCi0vLwotLy8gU2VlIGdldEJ1ZmZlcllWMTIoKSBmb3IgZGV0YWlscy4KLS8vCi12b2lkIFByZXZpZXdSZW5kZXJlcjo6cmVuZGVyWVYxMigpIHsKLSAgICBpbnQgZXJyID0gT0s7Ci0KLSAgICBHcmFwaGljQnVmZmVyTWFwcGVyICZtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKLQotICAgIGlmIChtQnVmIT0gTlVMTCkgewotICAgICAgICBDSEVDS19FUSgwLCBtYXBwZXIudW5sb2NrKG1CdWYtPmhhbmRsZSkpOwotCi0gICAgICAgIGlmICgoZXJyID0gbVN1cmZhY2UtPkFOYXRpdmVXaW5kb3c6OnF1ZXVlQnVmZmVyKG1TdXJmYWNlLmdldCgpLCBtQnVmLCAtMSkpICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJTdXJmYWNlOjpxdWV1ZUJ1ZmZlciByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUJ1ZiA9IE5VTEw7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2UyODI3Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgUFJFVklFV19SRU5ERVJFUl9IXwotCi0jZGVmaW5lIFBSRVZJRVdfUkVOREVSRVJfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdXJmYWNlOwotCi1jbGFzcyBQcmV2aWV3UmVuZGVyZXIgewotcHVibGljOgotCi1zdGF0aWMgUHJldmlld1JlbmRlcmVyKiBDcmVhdGVQcmV2aWV3UmVuZGVyZXIgKAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKLSAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KTsKLQotICAgIH5QcmV2aWV3UmVuZGVyZXIoKTsKLQotICAgIHZvaWQgZ2V0QnVmZmVyWVYxMih1aW50OF90ICoqZGF0YSwgc2l6ZV90ICpzdHJpZGUpOwotCi0gICAgdm9pZCByZW5kZXJZVjEyKCk7Ci0KLSAgICBzdGF0aWMgc2l6ZV90IEFMSUdOKHNpemVfdCB4LCBzaXplX3QgYWxpZ25tZW50KSB7Ci0gICAgICAgIHJldHVybiAoeCArIGFsaWdubWVudCAtIDEpICYgfihhbGlnbm1lbnQgLSAxKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgUHJldmlld1JlbmRlcmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCi0gICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpOwotCi0gICAgaW50IGluaXQoKTsKLQotICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwotICAgIHNpemVfdCBtV2lkdGgsIG1IZWlnaHQ7Ci0KLSAgICBBTmF0aXZlV2luZG93QnVmZmVyICptQnVmOwotCi0gICAgUHJldmlld1JlbmRlcmVyKGNvbnN0IFByZXZpZXdSZW5kZXJlciAmKTsKLSAgICBQcmV2aWV3UmVuZGVyZXIgJm9wZXJhdG9yPShjb25zdCBQcmV2aWV3UmVuZGVyZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFBSRVZJRVdfUkVOREVSRVJfSF8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWRjNTkwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgotI2luY2x1ZGUgPFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLSNpbmNsdWRlICJQcmV2aWV3UGxheWVyLmgiCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAotICAgICAgICBQcmV2aWV3UGxheWVyICpvYnNlcnZlcikKLSAgICA6IG1JbnB1dEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1TYW1wbGVSYXRlKDApLAotICAgICAgbUxhdGVuY3lVcygwKSwKLSAgICAgIG1GcmFtZVNpemUoMCksCi0gICAgICBtTnVtRnJhbWVzUGxheWVkKDApLAotICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMoLTEpLAotICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcygtMSksCi0gICAgICBtU2Vla2luZyhmYWxzZSksCi0gICAgICBtUmVhY2hlZEVPUyhmYWxzZSksCi0gICAgICBtRmluYWxTdGF0dXMoT0spLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUlzRmlyc3RCdWZmZXIoZmFsc2UpLAotICAgICAgbUZpcnN0QnVmZmVyUmVzdWx0KE9LKSwKLSAgICAgIG1GaXJzdEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1BdWRpb1NpbmsoYXVkaW9TaW5rKSwKLSAgICAgIG1PYnNlcnZlcihvYnNlcnZlcikgewotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7Ci0gICAgbUJHQXVkaW9QQ01GaWxlSGFuZGxlID0gTlVMTDsKLSAgICBtQXVkaW9Qcm9jZXNzID0gTlVMTDsKLSAgICBtQkdBdWRpb1BDTUZpbGVMZW5ndGggPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gMDsKLSAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFCZWdpbkN1dFRTID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwgPSAwOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtU291cmNlID0gTlVMTDsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6flZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoKSB7Ci0KLSAgICBBTE9HVigiRGVzdHJ1Y3RvciIpOwotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICByZXNldCgpOwotICAgIH0KLSAgICBpZiAobUF1ZGlvUHJvY2VzcyAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQXVkaW9Qcm9jZXNzOwotICAgICAgICBtQXVkaW9Qcm9jZXNzID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cGF1c2UoYm9vbCBwbGF5UGVuZGluZ1NhbXBsZXMpIHsKLSAgICBBTE9HVigicGF1c2U6IHBsYXlQZW5kaW5nU2FtcGxlcz0lZCIsIHBsYXlQZW5kaW5nU2FtcGxlcyk7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKHBsYXlQZW5kaW5nU2FtcGxlcykgewotICAgICAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmNsZWFyKCkgewotICAgIEFMT0dWKCJjbGVhciIpOwotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwotICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQotICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KLQotICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIkF1ZGlvUGxheWVyQmFzZSByZWxlYXNpbmcgaW5wdXQgYnVmZmVyLiIpOwotCi0gICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAotICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKLSAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KLSAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVNvdXJjZTsKLSAgICBtU291cmNlLmNsZWFyKCk7Ci0gICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgewotICAgICAgICB1c2xlZXAoMTAwMCk7Ci0gICAgfQotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLQotICAgIG1OdW1GcmFtZXNQbGF5ZWQgPSAwOwotICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzID0gLTE7Ci0gICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IC0xOwotICAgIG1TZWVraW5nID0gZmFsc2U7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLSAgICBtRmluYWxTdGF0dXMgPSBPSzsKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpyZXN1bWUoKSB7Ci0gICAgQUxPR1YoInJlc3VtZSIpOwotCi0gICAgQXVkaW9NaXhTZXR0aW5ncyBhdWRpb01peFNldHRpbmdzOwotCi0gICAgLy8gU2luZ2xlIGF1ZGlvIHBsYXllciBpcyB1c2VkOwotICAgIC8vIFBhc3Mgb24gdGhlIGF1ZGlvIGR1Y2tpbmcgcGFyYW1ldGVycwotICAgIC8vIHdoaWNoIG1pZ2h0IGhhdmUgY2hhbmdlZCB3aXRoIG5ldyBhdWRpbyBzb3VyY2UKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX3RocmVzaG9sZCA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ19sb3dWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19lbmFibGUgPQotICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YkluRHVja2luZ19lbmFibGU7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUVm9sTGV2ZWwgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2QlRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkVm9sdW1lKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aUJUQ2hhbm5lbENvdW50OwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvLyBDYWxsIHRvIEF1ZGlvIG1peCBwYXJhbSBzZXR0aW5nCi0gICAgbUF1ZGlvUHJvY2Vzcy0+c2V0TWl4UGFyYW1zKGF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNlZWtUbyhpbnQ2NF90IHRpbWVfdXMpIHsKLSAgICBBTE9HVigic2Vla1RvOiAlbGxkIiwgdGltZV91cyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1TZWVraW5nID0gdHJ1ZTsKLSAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gbVBvc2l0aW9uVGltZU1lZGlhVXMgPSAtMTsKLSAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKLQotICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9UcmFjay0+Zmx1c2goKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6aXNTZWVraW5nKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiaXNTZWVraW5nOiBtU2Vla2luZz0lZCIsIG1TZWVraW5nKTsKLSAgICByZXR1cm4gbVNlZWtpbmc7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVhY2hlZEVPUyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIHsKLSAgICBBTE9HVigicmVhY2hlZEVPUzogc3RhdHVzPSVkIiwgbUZpbmFsU3RhdHVzKTsKLSAgICAqZmluYWxTdGF0dXMgPSBPSzsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOwotICAgIHJldHVybiBtUmVhY2hlZEVPUzsKLX0KLQotaW50NjRfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRSZWFsVGltZVVzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGdldFJlYWxUaW1lVXNfbCgpOwotfQotCi1pbnQ2NF90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldFJlYWxUaW1lVXNfbCgpIHsKLSAgICByZXR1cm4gLW1MYXRlbmN5VXMgKyAobU51bUZyYW1lc1BsYXllZCAqIDEwMDAwMDApIC8gbVNhbXBsZVJhdGU7Ci19Ci0KLWludDY0X3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Z2V0TWVkaWFUaW1lVXMoKSB7Ci0gICAgQUxPR1YoImdldE1lZGlhVGltZVVzIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtUG9zaXRpb25UaW1lTWVkaWFVcyA8IDAgfHwgbVBvc2l0aW9uVGltZVJlYWxVcyA8IDApIHsKLSAgICAgICAgaWYgKG1TZWVraW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlZWtUaW1lVXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHJlYWxUaW1lT2Zmc2V0ID0gZ2V0UmVhbFRpbWVVc19sKCkgLSBtUG9zaXRpb25UaW1lUmVhbFVzOwotICAgIGlmIChyZWFsVGltZU9mZnNldCA8IDApIHsKLSAgICAgICAgcmVhbFRpbWVPZmZzZXQgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBtUG9zaXRpb25UaW1lTWVkaWFVcyArIHJlYWxUaW1lT2Zmc2V0OwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldE1lZGlhVGltZU1hcHBpbmcoCi0gICAgICAgIGludDY0X3QgKnJlYWx0aW1lX3VzLCBpbnQ2NF90ICptZWRpYXRpbWVfdXMpIHsKLSAgICBBTE9HVigiZ2V0TWVkaWFUaW1lTWFwcGluZyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqcmVhbHRpbWVfdXMgPSBtUG9zaXRpb25UaW1lUmVhbFVzOwotICAgICptZWRpYXRpbWVfdXMgPSBtUG9zaXRpb25UaW1lTWVkaWFVczsKLQotICAgIHJldHVybiBtUG9zaXRpb25UaW1lUmVhbFVzICE9IC0xICYmIG1Qb3NpdGlvblRpbWVNZWRpYVVzICE9IC0xOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBCZWZvcmUgc2V0dGluZyBzb3VyY2UsIHN0b3AgYW55IGV4aXN0aW5nIHNvdXJjZS4KLSAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQotICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KLQotICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgcmVsZWFzaW5nIGlucHV0IGJ1ZmZlci4iKTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgbVNvdXJjZS5jbGVhcigpOwotICAgIH0KLQotICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLX0KLQotc3A8TWVkaWFTb3VyY2U+IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldFNvdXJjZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBtU291cmNlOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldE9ic2VydmVyKFByZXZpZXdQbGF5ZXIgKm9ic2VydmVyKSB7Ci0gICAgQUxPR1YoInNldE9ic2VydmVyIik7Ci0gICAgLy9DSEVDSyghbVN0YXJ0ZWQpOwotICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmlzU3RhcnRlZCgpIHsKLSAgICByZXR1cm4gbVN0YXJ0ZWQ7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbykgewotICAgIHN0YXRpY19jYXN0PFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKj4odXNlciktPkF1ZGlvQ2FsbGJhY2soZXZlbnQsIGluZm8pOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKLSAgICBpZiAoZXZlbnQgIT0gQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOwotICAgIHNpemVfdCBudW1CeXRlc1dyaXR0ZW4gPSBmaWxsQnVmZmVyKGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUpOwotCi0gICAgYnVmZmVyLT5zaXplID0gbnVtQnl0ZXNXcml0dGVuOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzdGFydChib29sIHNvdXJjZUFscmVhZHlTdGFydGVkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotICAgIENIRUNLKG1Tb3VyY2UgIT0gTlVMTCk7Ci0gICAgQUxPR1YoIlN0YXJ0Iik7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIE00T1NBX0VSUiByZXN1bHQgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBzdGFydFRpbWUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzZWVrVGltZVN0YW1wID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTdG9yeUJvYXJkVFNCZXlvbmRCVEVuZEN1dFRpbWUgPSBNNE9TQV9GQUxTRTsKLQotICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENyZWF0ZSB0aGUgQkcgQXVkaW8gaGFuZGxlcgotICAgIG1BdWRpb1Byb2Nlc3MgPSBuZXcgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpOwotICAgIEF1ZGlvTWl4U2V0dGluZ3MgYXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8vIFBhc3Mgb24gdGhlIGF1ZGlvIGR1Y2tpbmcgcGFyYW1ldGVycwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfdGhyZXNob2xkID0KLSAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpSW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX2xvd1ZvbHVtZSA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpSW5EdWNraW5nX2xvd1ZvbHVtZSkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX2VuYWJsZSA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iSW5EdWNraW5nX2VuYWJsZTsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2UFRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVFZvbExldmVsID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkJUQ2hhbm5lbENvdW50ID0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQlRDaGFubmVsQ291bnQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUQ2hhbm5lbENvdW50ID0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVsczsKLQotICAgIC8vIENhbGwgdG8gQXVkaW8gbWl4IHBhcmFtIHNldHRpbmcKLSAgICBtQXVkaW9Qcm9jZXNzLT5zZXRNaXhQYXJhbXMoYXVkaW9NaXhTZXR0aW5ncyk7Ci0KLSAgICAvLyBHZXQgdGhlIEJHIEF1ZGlvIFBDTSBmaWxlIGRldGFpbHMKLSAgICBpZiAoIG1CR0F1ZGlvUENNRmlsZUhhbmRsZSApIHsKLQotICAgICAgICAvLyBUT0RPIDogMzJiaXRzIHJlcXVpcmVkIGZvciBPU0FMLCB0byBiZSB1cGRhdGVkIG9uY2UgT1NBTCBpcyB1cGRhdGVkCi0gICAgICAgIE00T1NBX1VJbnQzMiB0bXAzMiA9IDA7Ci0gICAgICAgIHJlc3VsdCA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCoqKSZ0bXAzMik7Ci0gICAgICAgIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCA9IHRtcDMyOwotICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gbUJHQXVkaW9QQ01GaWxlTGVuZ3RoOwotCi0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnN0YXJ0IE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplID0gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGR1cmF0aW9uIGluIHRpbWUgb2YgdGhlIGF1ZGlvIEJUCi0gICAgICAgIGlmICggcmVzdWx0ID09IE00Tk9fRVJST1IgKSB7Ci0gICAgICAgICBBTE9HVigiVkVBUDogY2hhbm5lbHMgPSAlIiBQUkl1MzIgIiBmcmVxID0gJSIgUFJJdTMyLAotICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscywgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgICAgICAgICAgLy8gTm8gdHJpbQotICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSAoKAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlTGVuZ3RoL3NpemVvZihNNE9TQV9VSW50MTYpLwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSkqMTAwMCApIC8KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjogYmVnaW5DdXRNcyAlZCAsIGVuZEN1dE1zICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdHJpbSBwYXJ0Ci0gICAgICAgICAgICBpZiAoKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zID09IDApICYmCi0gICAgICAgICAgICAgICAgKG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyAhPSAwKSkgewotICAgICAgICAgICAgICAgIC8vIEVuZCB0aW1lIGl0c2VsZiB0aGUgZmlsZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gbUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zOwotICAgICAgICAgICAgICAgIC8vIExpbWl0IHRoZSBmaWxlIGxlbmd0aCBhbHNvCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9ICgoCi0gICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpICoKLSAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMpICoKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIChtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgPT0gbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIHRpbWUgaXRzZWxmIHRoZSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiAtCi0gICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXM7Ci0gICAgICAgICAgICAgICAgLy8gTGltaXQgdGhlIGZpbGUgbGVuZ3RoIGFsc28KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gKCgKLSAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiAqCi0gICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscykgKgotICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX1VJbnQxNikpIC8gMTAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcyAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAobUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIHRpbWUgaXRzZWxmIHRoZSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSBtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgLQotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgICAgICAvLyBMaW1pdCB0aGUgZmlsZSBsZW5ndGggYWxzbwotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAoKAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKgotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSAqCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7IC8qbWFrZSB0byBzZWMgZnJvbSBtcyovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOiBmaWxlIGR1cmF0aW9uIHJlY29yZGVkIDogJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExhc3QgcGxheWVkIGxvY2F0aW9uIHRvIGJlIHNlZWtlZCBhdCBmb3IgbmV4dCBtZWRpYSBpdGVtCi0gICAgICAgIGlmICggcmVzdWx0ID09IE00Tk9fRVJST1IgKSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6bUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCk7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6dWlBZGRDdHMgJWQiLAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMpOwotICAgICAgICAgICAgaWYgKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgPj0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgLQotICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c3RhcnRUaW1lICUiIFBSSXUzMiwgc3RhcnRUaW1lKTsKLSAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAwOwotICAgICAgICAgICAgaWYgKHN0YXJ0VGltZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWUgPj0gbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJHIHRyYWNrIHNob3VsZCBiZSBsb29wZWQgYW5kIHN0YXJ0ZWQgYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb01peFNldHRpbmdzLT5iTG9vcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGJlZ2luIGN1dCB0aW1lIHRvIHRoZSBtb2QgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAoKHN0YXJ0VGltZSVtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbikgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb29waW5nIGRpc2FibGVkLCBkb25vdCBkbyBCVCBNaXggLCBzZXQgdG8gZmlsZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBCVCBzdGlsbCBwcmVzZW50ICwganVzdCBzZWVrIHRvIHN0b3J5IGJvYXJkIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVTdGFtcCA9IHN0YXJ0VGltZSArIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgc2Vla1RpbWVTdGFtcCB0byBmaWxlIGxvY2F0aW9uCi0gICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCA9ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQxNikpLyAxMDAwIDsgLyptYWtlIHRvIHNlYyBmcm9tIG1zKi8KLQotICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gKChpbnQ2NF90KShzZWVrVGltZVN0YW1wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MTYpKS8gMTAwMCA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXZSBhbGxvdyBhbiBvcHRpb25hbCBJTkZPX0ZPUk1BVF9DSEFOR0VEIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZwotICAgIC8vIG9mIHBsYXliYWNrLCBpZiB0aGVyZSBpcyBvbmUsIGdldEZvcm1hdCBiZWxvdyB3aWxsIHJldHJpZXZlIHRoZQotICAgIC8vIHVwZGF0ZWQgZm9ybWF0LCBpZiB0aGVyZSBpc24ndCwgd2UnbGwgc3Rhc2ggYXdheSB0aGUgdmFsaWQgYnVmZmVyCi0gICAgLy8gb2YgZGF0YSB0byBiZSB1c2VkIG9uIHRoZSBmaXJzdCBhdWRpbyBjYWxsYmFjay4KLQotICAgIENIRUNLKG1GaXJzdEJ1ZmZlciA9PSBOVUxMKTsKLQotICAgIG1GaXJzdEJ1ZmZlclJlc3VsdCA9IG1Tb3VyY2UtPnJlYWQoJm1GaXJzdEJ1ZmZlcik7Ci0gICAgaWYgKG1GaXJzdEJ1ZmZlclJlc3VsdCA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgIEFMT0dWKCJJTkZPX0ZPUk1BVF9DSEFOR0VEISEhIik7Ci0KLSAgICAgICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOwotICAgICAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBPSzsKLSAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IHRydWU7Ci0gICAgfQotCi0gICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgYm9vbCBzdWNjZXNzID0gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLSAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKTsKLQotICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLQotICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7Ci0gICAgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscyk7Ci0gICAgQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCi0gICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG51bUNoYW5uZWxzLCBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5ULAotICAgICAgICAgICAgICAgICZWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaywgdGhpcyk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvU2luay0+bGF0ZW5jeSgpICogMTAwMDsKLSAgICAgICAgbUZyYW1lU2l6ZSA9IG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOwotCi0gICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fTVVTSUMsIG1TYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobnVtQ2hhbm5lbHMpLAotICAgICAgICAgICAgICAgIDAsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZBdWRpb0NhbGxiYWNrLCB0aGlzLCAwKTsKLQotICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvVHJhY2stPmxhdGVuY3koKSAqIDEwMDA7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBtQXVkaW9UcmFjay0+ZnJhbWVTaXplKCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVzZXQoKSB7Ci0KLSAgICBBTE9HVigicmVzZXQiKTsKLSAgICBjbGVhcigpOwotCi0gICAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCBzZWVrIHBvaW50Ci0gICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID0wOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFM9MDsKLX0KLQotc2l6ZV90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrKAotICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAotICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCB2b2lkICpjb29raWUsCi0gICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KSB7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbWUgPSAoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqKWNvb2tpZTsKLQotICAgIGlmIChldmVudCA9PSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfRklMTF9CVUZGRVIgKSB7Ci0gICAgICAgIHJldHVybiBtZS0+ZmlsbEJ1ZmZlcihidWZmZXIsIHNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotCi1zaXplX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6ZmlsbEJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotCi0gICAgaWYgKG1SZWFjaGVkRU9TKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHNpemVfdCBzaXplX2RvbmUgPSAwOwotICAgIHNpemVfdCBzaXplX3JlbWFpbmluZyA9IHNpemU7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNEFNX0J1ZmZlcjE2IGJnRnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgTTRBTV9CdWZmZXIxNiBtaXhGcmFtZSA9IHtOVUxMLCAwfTsKLSAgICBNNEFNX0J1ZmZlcjE2IHB0RnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgaW50NjRfdCBjdXJyZW50U3RlYW1UUyA9IDA7Ci0gICAgaW50NjRfdCBzdGFydFRpbWVGb3JCVCA9IDA7Ci0gICAgTTRPU0FfRmxvYXQgZlBUVm9sTGV2ZWwgPQotICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkvMTAwOwotICAgIE00T1NBX0ludDE2ICAgICAqcFBUTWRhdGE9TlVMTDsKLSAgICBNNE9TQV9VSW50MzIgICAgIHVpUENNc2l6ZSA9IDA7Ci0KLSAgICBib29sIHBvc3RTZWVrQ29tcGxldGUgPSBmYWxzZTsKLSAgICBib29sIHBvc3RFT1MgPSBmYWxzZTsKLQotICAgIHdoaWxlICgoc2l6ZV9yZW1haW5pbmcgPiAwKSYmKGVycj09TTROT19FUlJPUikpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIGlmIChtU2Vla2luZykgewotICAgICAgICAgICAgICAgIGlmIChtSXNGaXJzdEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKLQotICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2Vla2luZyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKG1PYnNlcnZlcikgewotICAgICAgICAgICAgICAgICAgICBwb3N0U2Vla0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotCi0gICAgICAgICAgICBpZiAobUlzRmlyc3RCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBtRmlyc3RCdWZmZXI7Ci0gICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtRmlyc3RCdWZmZXJSZXN1bHQ7Ci0KLSAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIERhdGEgaXMgUHJpbWFyeSBUcmFjaywgbWl4IHdpdGggYmFja2dyb3VuZCB0cmFjawotICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgc2FtZSBzaXplIGZyb20gQmFja2dyb3VuZCB0cmFjayBQQ00gZmlsZQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBNaXggb25seSB3aGVuIHNraW0gcG9pbnQgaXMgYWZ0ZXIgc3RhcnRUaW1lIG9mIEJUCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAqIDEwMDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Qb3NpdGlvblRpbWVNZWRpYVVzIC0gbVNlZWtUaW1lVXMpKSA+PQotICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzICogMTAwMCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OklOU0lERSBNSVhJTkciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDaGVja2luZyAlbGxkIDw9ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludC1tQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoKTsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWludGVycHJldF9jYXN0PE00T1NBX1ZvaWQqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG1JbnB1dEJ1ZmZlci0+ZGF0YSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGVuID0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgZnAgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVBDTXNpemUgPSAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkvMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQVE1kYXRhID0gKE00T1NBX0ludDE2KikgKCh1aW50OF90KikgbUlucHV0QnVmZmVyLT5kYXRhKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1peCB3aXRoIGJhY2tncm91bmQgbWFsbG9jIHRvIGRvIGxlbiAlZCIsIGxlbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJnRnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggbGVuLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiYmdGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmdGcmFtZS5tX2J1ZmZlclNpemUgPSBsZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1peEZyYW1lLm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfVUludDE2KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikibWl4RnJhbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peEZyYW1lLm1fYnVmZmVyU2l6ZSA9IGxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1peCB3aXRoIGJnbSB3aXRoIHNpemUgJWxsZCIsIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Qb3NpdGlvblRpbWVNZWRpYVVzKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCA8PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggLSBsZW4pKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ2hlY2tpbmcgbUJHQXVkaW9QQ01GaWxlSGFuZGxlICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVIYW5kbGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIHNlZWtpbmcgZmlsZSB0byAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogMzJiaXRzIHJlcXVpcmVkIGZvciBPU0FMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0bXAzMiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKW1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWRTZWVrKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GaWxlUG9zaXRpb24qKSZ0bXAzMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gdG1wMzI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNNE9TQV9maWxlUmVhZFNlZWsgZXJyICVkIiwoaW50KWVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZERhdGEobUJHQXVkaW9QQ01GaWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDgqKWJnRnJhbWUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE00V0FSX05PX0RBVEFfWUVUICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlciBFbmQgb2YgZmlsZSByZWFjaGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSByZWFjaGVkIHRoZSBlbmQgb2YgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBiZWdpbiBjdXQgdGltZSBlcXVhbCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb01peFNldHRpbmdzLT5iTG9vcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGludDY0X3QpKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX1VJbnQxNikpIC8gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlciBMb29waW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIHZvbHVtZSBvZiBwcmltYXJ5IHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZQVFZvbExldmVsIDwgMS4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByaW1hcnlUcmFja1ZvbHVtZShwUFRNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpUENNc2l6ZSwgZlBUVm9sTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gTTROT19FUlJPUiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsZVJlYWREYXRhIGZvciBhdWRpbyBlcnIgJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVsbGQiLCBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gdGhlIHB0ciBkYXRhIHRvIHByaW1hcnkgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKXB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RnJhbWUubV9idWZmZXJTaXplID0gbGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRvIG1peCBhbmQgZHVjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUHJvY2Vzcy0+bWl4QW5kRHVjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0RnJhbWUsICZiZ0ZyYW1lLCAmbWl4RnJhbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBkZWNvZGVkIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1peEZyYW1lLm1fZGF0YUFkZHJlc3MsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdWRpb01peFNldHRpbmdzLT5iTG9vcCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB0byBiZWdpbiBjdXQgdGltZSBlcXVhbCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBtaXhpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIHZvbHVtZSBsZXZlbCBvZiBwcmltYXJ5IHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZlBUVm9sTGV2ZWwgPCAxLjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJpbWFyeVRyYWNrVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUFRNZGF0YSwgdWlQQ01zaXplLCBmUFRWb2xMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJnRnJhbWUubV9kYXRhQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYmdGcmFtZS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaXhGcmFtZS5tX2RhdGFBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtaXhGcmFtZS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiB2b2x1bWUgbGV2ZWwgb2YgcHJpbWFyeSB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZlBUVm9sTGV2ZWwgPCAxLjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmltYXJ5VHJhY2tWb2x1bWUocFBUTWRhdGEsIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUFRWb2xMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKChzdGF0dXMgPT0gT0sgJiYgbUlucHV0QnVmZmVyICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgfHwgKHN0YXR1cyAhPSBPSyAmJiBtSW5wdXRCdWZmZXIgPT0gTlVMTCkpOwotCi0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXI6IG1Tb3VyY2UtPnJlYWQgcmV0dXJuZWQgZXJyICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBpZiAobU9ic2VydmVyICYmICFtUmVhY2hlZEVPUykgewotICAgICAgICAgICAgICAgICAgICBwb3N0RU9TID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUZpbmFsU3RhdHVzID0gc3RhdHVzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgJm1Qb3NpdGlvblRpbWVNZWRpYVVzKSk7Ci0KLSAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPQotICAgICAgICAgICAgICAgICgobU51bUZyYW1lc1BsYXllZCArIHNpemVfZG9uZSAvIG1GcmFtZVNpemUpICogMTAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgLyBtU2FtcGxlUmF0ZTsKLQotICAgICAgICAgICAgQUxPR1YoImJ1ZmZlci0+c2l6ZSgpID0gJWQsICIKLSAgICAgICAgICAgICAgICAgICAgICJtUG9zaXRpb25UaW1lTWVkaWFVcz0lLjJmIG1Qb3NpdGlvblRpbWVSZWFsVXM9JS4yZiIsCi0gICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzIC8gMUU2LCBtUG9zaXRpb25UaW1lUmVhbFVzIC8gMUU2KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgY29weSA9IHNpemVfcmVtYWluaW5nOwotICAgICAgICBpZiAoY29weSA+IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGNvcHkgPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KChjaGFyICopZGF0YSArIHNpemVfZG9uZSwKLSAgICAgICAgICAgKGNvbnN0IGNoYXIgKiltSW5wdXRCdWZmZXItPmRhdGEoKSArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICBjb3B5KTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnNldF9yYW5nZShtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpICsgY29weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gY29weSk7Ci0KLSAgICAgICAgc2l6ZV9kb25lICs9IGNvcHk7Ci0gICAgICAgIHNpemVfcmVtYWluaW5nIC09IGNvcHk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBtTnVtRnJhbWVzUGxheWVkICs9IHNpemVfZG9uZSAvIG1GcmFtZVNpemU7Ci0gICAgfQotCi0gICAgaWYgKHBvc3RFT1MpIHsKLSAgICAgICAgbU9ic2VydmVyLT5wb3N0QXVkaW9FT1MoKTsKLSAgICB9Ci0KLSAgICBpZiAocG9zdFNlZWtDb21wbGV0ZSkgewotICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpOwotICAgIH0KLQotICAgIHJldHVybiBzaXplX2RvbmU7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0QXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpIHsKLSAgICBtQXVkaW9NaXhTZXR0aW5ncyA9IHBBdWRpb01peFNldHRpbmdzOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IHBCR0F1ZGlvUENNRmlsZUhhbmRsZSl7Ci0gICAgbUJHQXVkaW9QQ01GaWxlSGFuZGxlID0gcEJHQXVkaW9QQ01GaWxlSGFuZGxlOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvQ3VycmVudE1lZGlhQmVnaW5DdXRUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFWb2x1bWVWYWwpIHsKLQotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgPSBwQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFMgPSBwQkdBdWRpb0N1cnJlbnRNZWRpYUJlZ2luQ3V0VFM7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsID0gcEJHQXVkaW9DdXJyZW50TWVkaWFWb2x1bWVWYWw7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0UHJpbWFyeVRyYWNrVm9sdW1lKAotICAgIE00T1NBX0ludDE2ICpkYXRhLCBNNE9TQV9VSW50MzIgc2l6ZSwgTTRPU0FfRmxvYXQgdm9sTGV2ZWwpIHsKLQotICAgIHdoaWxlKHNpemUtLSA+IDApIHsKLSAgICAgICAgKmRhdGEgPSAoTTRPU0FfSW50MTYpKCgqZGF0YSkqdm9sTGV2ZWwpOwotICAgICAgICBkYXRhKys7Ci0gICAgfQotfQotCi19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyY2FmNWU4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFZFX0FVRElPX1BMQVlFUl9IXwotI2RlZmluZSBWRV9BVURJT19QTEFZRVJfSF8KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9UaW1lU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTWFpbi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZWRpYVNvdXJjZTsKLWNsYXNzIEF1ZGlvVHJhY2s7Ci1jbGFzcyBQcmV2aWV3UGxheWVyOwotCi1jbGFzcyBWaWRlb0VkaXRvckF1ZGlvUGxheWVyIDogcHVibGljIFRpbWVTb3VyY2UgewotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBSRUFDSEVEX0VPUywKLSAgICAgICAgU0VFS19DT01QTEVURQotICAgIH07Ci0KLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAotICAgICAgICBQcmV2aWV3UGxheWVyICphdWRpb09ic2VydmVyID0gTlVMTCk7Ci0KLSAgICB+VmlkZW9FZGl0b3JBdWRpb1BsYXllcigpOwotCi0gICAgLy8gUmV0dXJuIHRpbWUgaW4gdXMuCi0gICAgaW50NjRfdCBnZXRSZWFsVGltZVVzKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgYnVmZmVyIHBsYXllZCAoaW4gdXMpLgotICAgIGludDY0X3QgZ2V0TWVkaWFUaW1lVXMoKTsKLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgYSBtYXBwaW5nIGlzIGVzdGFibGlzaGVkLCBpLmUuIHRoZSBBdWRpb1BsYXllckJhc2UKLSAgICAvLyBoYXMgcGxheWVkIGF0IGxlYXN0IG9uZSBmcmFtZSBvZiBhdWRpby4KLSAgICBib29sIGdldE1lZGlhVGltZU1hcHBpbmcoaW50NjRfdCAqcmVhbHRpbWVfdXMsIGludDY0X3QgKm1lZGlhdGltZV91cyk7Ci0KLSAgICBzdGF0dXNfdCBzdGFydChib29sIHNvdXJjZUFscmVhZHlTdGFydGVkID0gZmFsc2UpOwotICAgIHZvaWQgcGF1c2UoYm9vbCBwbGF5UGVuZGluZ1NhbXBsZXMgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3QgcmVzdW1lKCk7Ci0gICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgdGltZV91cyk7Ci0gICAgYm9vbCBpc1NlZWtpbmcoKTsKLSAgICBib29sIHJlYWNoZWRFT1Moc3RhdHVzX3QgKmZpbmFsU3RhdHVzKTsKLQotICAgIHZvaWQgc2V0QXVkaW9NaXhTZXR0aW5ncyhNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOwotICAgIHZvaWQgc2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKE00T1NBX0NvbnRleHQgcEJHQXVkaW9QQ01GaWxlSGFuZGxlKTsKLSAgICB2b2lkIHNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wLAotICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFCZWdpbkN1dFRTLAotICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFWb2x1bWVWYWwpOwotCi0gICAgdm9pZCBzZXRPYnNlcnZlcihQcmV2aWV3UGxheWVyICpvYnNlcnZlcik7Ci0gICAgdm9pZCBzZXRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwotICAgIHNwPE1lZGlhU291cmNlPiBnZXRTb3VyY2UoKTsKLQotICAgIGJvb2wgaXNTdGFydGVkKCk7Ci1wcml2YXRlOgotCi0gICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKm1BdWRpb01peFNldHRpbmdzOwotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcgKm1BdWRpb1Byb2Nlc3M7Ci0KLSAgICBNNE9TQV9Db250ZXh0IG1CR0F1ZGlvUENNRmlsZUhhbmRsZTsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZUxlbmd0aDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGg7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbjsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50OwotICAgIGludDY0X3QgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFM7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWw7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBzcDxBdWRpb1RyYWNrPiBtQXVkaW9UcmFjazsKLQotICAgIE1lZGlhQnVmZmVyICptSW5wdXRCdWZmZXI7Ci0KLSAgICBpbnQgbVNhbXBsZVJhdGU7Ci0gICAgaW50NjRfdCBtTGF0ZW5jeVVzOwotICAgIHNpemVfdCBtRnJhbWVTaXplOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgaW50NjRfdCBtTnVtRnJhbWVzUGxheWVkOwotCi0gICAgaW50NjRfdCBtUG9zaXRpb25UaW1lTWVkaWFVczsKLSAgICBpbnQ2NF90IG1Qb3NpdGlvblRpbWVSZWFsVXM7Ci0KLSAgICBib29sIG1TZWVraW5nOwotICAgIGJvb2wgbVJlYWNoZWRFT1M7Ci0gICAgc3RhdHVzX3QgbUZpbmFsU3RhdHVzOwotICAgIGludDY0X3QgbVNlZWtUaW1lVXM7Ci0KLSAgICBib29sIG1TdGFydGVkOwotCi0gICAgYm9vbCBtSXNGaXJzdEJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBtRmlyc3RCdWZmZXJSZXN1bHQ7Ci0gICAgTWVkaWFCdWZmZXIgKm1GaXJzdEJ1ZmZlcjsKLQotICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwotICAgIFByZXZpZXdQbGF5ZXIgKm1PYnNlcnZlcjsKLQotICAgIHN0YXRpYyB2b2lkIEF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKTsKLSAgICB2b2lkIEF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKTsKLSAgICBzaXplX3QgZmlsbEJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdGljIHNpemVfdCBBdWRpb1NpbmtDYWxsYmFjaygKLSAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rICphdWRpb1NpbmssCi0gICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqbWUsCi0gICAgICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCk7Ci0KLSAgICB2b2lkIHJlc2V0KCk7Ci0gICAgdm9pZCBjbGVhcigpOwotICAgIGludDY0X3QgZ2V0UmVhbFRpbWVVc19sKCk7Ci0gICAgdm9pZCBzZXRQcmltYXJ5VHJhY2tWb2x1bWUoCi0gICAgICAgICAgICBNNE9TQV9JbnQxNiAqZGF0YSwgTTRPU0FfVUludDMyIHNpemUsIE00T1NBX0Zsb2F0IHZvbExldmVsKTsKLQotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoY29uc3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAmKTsKLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gVkVfQVVESU9fUExBWUVSX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGMxMmFhYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nKCkgewotICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwotCi0gICAgbUF1ZFZvbEFyckluZGV4ID0gMDsKLSAgICBtRG9EdWNraW5nID0gMDsKLSAgICBtRHVja2luZ19lbmFibGUgPSAwOwotICAgIG1EdWNraW5nX2xvd1ZvbHVtZSA9IDA7Ci0gICAgbUR1Y2tpbmdfdGhyZXNob2xkID0gMDsKLSAgICBtRHVja2luZ0ZhY3RvciA9IDA7Ci0KLSAgICBtQlRWb2xMZXZlbCA9IDA7Ci0gICAgbVBUVm9sTGV2ZWwgPSAwOwotCi0gICAgbUlzU1NSQ25lZWRlZCA9IDA7Ci0gICAgbUNoYW5uZWxDb252ZXJzaW9uID0gMDsKLQotICAgIG1CVEZvcm1hdCA9IE1PTk9fMTZfQklUOwotCi0gICAgbUluU2FtcGxlUmF0ZSA9IDgwMDA7Ci0gICAgbU91dFNhbXBsZVJhdGUgPSAxNjAwMDsKLSAgICBtUFRDaGFubmVsQ291bnQgPSAyOwotICAgIG1CVENoYW5uZWxDb3VudCA9IDE7Ci19Ci0KLU00T1NBX0ludDMyIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Om1peEFuZER1Y2soCi0gICAgICAgIHZvaWQgKnByaW1hcnlUcmFja0J1ZmZlciwKLSAgICAgICAgdm9pZCAqYmFja2dyb3VuZFRyYWNrQnVmZmVyLAotICAgICAgICB2b2lkICpvdXRCdWZmZXIpIHsKLQotICAgIEFMT0dWKCJtaXhBbmREdWNrOiB0cmFjayBidWZmZXJzIChwcmltYXJ5OiAlcCBhbmQgYmFja2dyb3VuZDogJXApICIKLSAgICAgICAgICAgICJhbmQgb3V0IGJ1ZmZlciAlcCIsCi0gICAgICAgICAgICBwcmltYXJ5VHJhY2tCdWZmZXIsIGJhY2tncm91bmRUcmFja0J1ZmZlciwgb3V0QnVmZmVyKTsKLQotICAgIE00QU1fQnVmZmVyMTYqIHBQcmltYXJ5VHJhY2sgICA9IChNNEFNX0J1ZmZlcjE2KilwcmltYXJ5VHJhY2tCdWZmZXI7Ci0gICAgTTRBTV9CdWZmZXIxNiogcEJhY2tncm91bmRUcmFjayA9IChNNEFNX0J1ZmZlcjE2KiliYWNrZ3JvdW5kVHJhY2tCdWZmZXI7Ci0gICAgTTRBTV9CdWZmZXIxNiogcE1peGVkT3V0QnVmZmVyICA9IChNNEFNX0J1ZmZlcjE2KilvdXRCdWZmZXI7Ci0KLSAgICAvLyBPdXRwdXQgc2l6ZSBpZiBzYW1lIGFzIFBUIHNpemUKLSAgICBwTWl4ZWRPdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSA9IHBQcmltYXJ5VHJhY2stPm1fYnVmZmVyU2l6ZTsKLQotICAgIC8vIEJlZm9yZSBtaXhpbmcsIHdlIG5lZWQgdG8gaGF2ZSBvbmx5IFBUIGFzIG91dCBidWZmZXIKLSAgICBtZW1jcHkoKHZvaWQgKilwTWl4ZWRPdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICh2b2lkICopcFByaW1hcnlUcmFjay0+bV9kYXRhQWRkcmVzcywgcE1peGVkT3V0QnVmZmVyLT5tX2J1ZmZlclNpemUpOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBkdWNraW5nIHZhcmlhYmxlcwotICAgIC8vIEluaXRpYWxseSBjb250YWlucyB0aGUgaW5wdXQgcHJpbWFyeSB0cmFjawotICAgIE00T1NBX0ludDE2ICpwUFRNZGF0YTIgPSAoTTRPU0FfSW50MTYqKXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzczsKLQotICAgIC8vIENvbnRhaW5zIEJHIHRyYWNrIHByb2Nlc3NlZCBkYXRhKGxpa2UgY2hhbm5lbCBjb252ZXJzaW9uIGV0Yy4uCi0gICAgTTRPU0FfSW50MTYgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNiopIHBCYWNrZ3JvdW5kVHJhY2stPm1fZGF0YUFkZHJlc3M7Ci0KLSAgICAvLyBTaW5jZSB3ZSBuZWVkIHRvIGdpdmUgc2FtcGxlIGNvdW50IGFuZCBub3QgYnVmZmVyIHNpemUKLSAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplID0gcE1peGVkT3V0QnVmZmVyLT5tX2J1ZmZlclNpemUgLyAyIDsKLQotICAgIGlmICgobUR1Y2tpbmdfZW5hYmxlKSAmJiAobVBUVm9sTGV2ZWwgIT0gMC4wKSkgewotICAgICAgICBNNE9TQV9JbnQzMiBwZWFrRGJWYWx1ZSA9IDA7Ci0gICAgICAgIE00T1NBX0ludDMyIHByZXZpb3VzRGJWYWx1ZSA9IDA7Ci0gICAgICAgIE00T1NBX0ludDE2ICpwUENNMTZTYW1wbGUgPSAoTTRPU0FfSW50MTYqKXBQcmltYXJ5VHJhY2stPm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBuID0gcFByaW1hcnlUcmFjay0+bV9idWZmZXJTaXplIC8gc2l6ZW9mKE00T1NBX0ludDE2KTsKLQotICAgICAgICBmb3IgKHNpemVfdCBsb29wSW5kZXggPSAwOyBsb29wSW5kZXggPCBuOyArK2xvb3BJbmRleCkgewotICAgICAgICAgICAgaWYgKHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID49IDApIHsKLSAgICAgICAgICAgICAgICBwZWFrRGJWYWx1ZSA9IHByZXZpb3VzRGJWYWx1ZSA+IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID8KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA6IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwZWFrRGJWYWx1ZSA9IHByZXZpb3VzRGJWYWx1ZSA+IC1wUENNMTZTYW1wbGVbbG9vcEluZGV4XSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWU6IC1wUENNMTZTYW1wbGVbbG9vcEluZGV4XTsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1BdWRpb1ZvbHVtZUFycmF5W21BdWRWb2xBcnJJbmRleF0gPSBnZXREZWNpYmVsU291bmQocGVha0RiVmFsdWUpOwotCi0gICAgICAgIC8vIENoZWNrIGZvciB0aHJlc2hvbGQgaXMgZG9uZSBhZnRlciBrUHJvY2Vzc2luZ1dpbmRvd1NpemUgY3ljbGVzCi0gICAgICAgIGlmIChtQXVkVm9sQXJySW5kZXggPj0ga1Byb2Nlc3NpbmdXaW5kb3dTaXplIC0gMSkgewotICAgICAgICAgICAgbURvRHVja2luZyA9IGlzVGhyZXNob2xkQnJlYWNoZWQoCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1ZvbHVtZUFycmF5LCBtQXVkVm9sQXJySW5kZXgsIG1EdWNraW5nX3RocmVzaG9sZCk7Ci0KLSAgICAgICAgICAgIG1BdWRWb2xBcnJJbmRleCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkVm9sQXJySW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEJlbG93IGxvZ2ljIGNvbnRyb2xzIHRoZSBtaXhpbmcgd2VpZ2h0YWdlCi0gICAgICAgIC8vIGZvciBCYWNrZ3JvdW5kIGFuZCBQcmltYXJ5IFRyYWNrcwotICAgICAgICAvLyBmb3IgdGhlIGR1cmF0aW9uIG9mIHdpbmRvdyB1bmRlciBhbmFseXNpcywKLSAgICAgICAgLy8gdG8gZ2l2ZSBmYWRlLW91dCBmb3IgQmFja2dyb3VuZCBhbmQgZmFkZS1pbiBmb3IgcHJpbWFyeQotICAgICAgICAvLyBDdXJyZW50IGZhZGluZyBmYWN0b3IgaXMgZGlzdHJpYnV0ZWQgaW4gZXF1YWwgcmFuZ2Ugb3ZlcgotICAgICAgICAvLyB0aGUgZGVmaW5lZCB3aW5kb3cgc2l6ZS4KLSAgICAgICAgLy8gRm9yIGEgd2luZG93IHNpemUgPSAyNQotICAgICAgICAvLyAoNTAwIG1zICh3aW5kb3cgdW5kZXIgYW5hbHlzaXMpIC8gMjAgbXMgKHNhbXBsZSBkdXJhdGlvbikpCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKG1Eb0R1Y2tpbmcpIHsKLSAgICAgICAgICAgIGlmIChtRHVja2luZ0ZhY3RvciA+IG1EdWNraW5nX2xvd1ZvbHVtZSkgewotICAgICAgICAgICAgICAgIC8vIEZBREUgT1VUIEJHIFRyYWNrCi0gICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIGluIGZhY3RvcgotICAgICAgICAgICAgICAgIC8vIG9mIGxvdyB2b2x1bWUgc3RlcHMgdG8gcmVhY2ggbG93IHZvbHVtZSBsZXZlbAotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yIC09IG1EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgPSBtRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUR1Y2tpbmdGYWN0b3IgPCAxLjAgKSB7Ci0gICAgICAgICAgICAgICAgLy8gRkFERSBJTiBCRyBUcmFjawotICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBvZgotICAgICAgICAgICAgICAgIC8vIGxvdyB2b2x1bWUgZmFjdG9yIHRvIHJlYWNoIG9yaWcudm9sdW1lIGxldmVsCi0gICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgKz0gbUR1Y2tpbmdfbG93Vm9sdW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRHVja2luZ0ZhY3RvciA9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLy8gZW5kIGlmIC0gbUR1Y2tpbmdfZW5hYmxlCi0KLQotICAgIC8vIE1peGluZyBsb2dpYwotICAgIEFMT0dWKCJPdXQgb2YgRHVja2luZyBhbmFseXNpcyB1aVBDTXNpemUgJWQgJWYgJWYiLAotICAgICAgICAgICAgbURvRHVja2luZywgbUR1Y2tpbmdGYWN0b3IsIG1CVFZvbExldmVsKTsKLSAgICB3aGlsZSAodWlQQ01zaXplLS0gPiAwKSB7Ci0KLSAgICAgICAgLy8gU2V0IHZvbCBmYWN0b3IgZm9yIEJUIGFuZCBQVAotICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgqcEJUTWRhdGExKm1CVFZvbExldmVsKTsKLSAgICAgICAgKnBQVE1kYXRhMiA9IChNNE9TQV9JbnQxNikoKnBQVE1kYXRhMiptUFRWb2xMZXZlbCk7Ci0KLSAgICAgICAgLy8gTWl4IHRoZSB0d28gc2FtcGxlcwotICAgICAgICBpZiAobURvRHVja2luZykgewotCi0gICAgICAgICAgICAvLyBEdWNrIHRoZSBCRyB0cmFjayB0byBkdWNraW5nIGZhY3RvciB2YWx1ZSBiZWZvcmUgbWl4aW5nCi0gICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgoKnBCVE1kYXRhMSkqKG1EdWNraW5nRmFjdG9yKSk7Ci0KLSAgICAgICAgICAgIC8vIG1peCBhcyBub3JtYWwgY2FzZQotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSAvMiArICpwUFRNZGF0YTIgLzIpOwotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgoKnBCVE1kYXRhMSkqKG1EdWNraW5nRmFjdG9yKSk7Ci0gICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgqcEJUTWRhdGExIC8yICsgKnBQVE1kYXRhMiAvMik7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9JbnQzMiB0ZW1wOwotICAgICAgICBpZiAoKnBCVE1kYXRhMSA8IDApIHsKLSAgICAgICAgICAgIHRlbXAgPSAtKCpwQlRNZGF0YTEpICogMjsgLy8gYnJpbmcgdG8gb3JpZ2luYWwgQW1wbGl0dWRlIGxldmVsCi0KLSAgICAgICAgICAgIGlmICh0ZW1wID4gMzI3NjcpIHsKLSAgICAgICAgICAgICAgICAqcEJUTWRhdGExID0gLTMyNzY2OyAvLyBsZXNzIHRoZW4gbWF4IGFsbG93ZWQgdmFsdWUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoLXRlbXApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGVtcCA9ICgqcEJUTWRhdGExKSAqIDI7IC8vIGJyaW5nIHRvIG9yaWdpbmFsIEFtcGxpdHVkZSBsZXZlbAotICAgICAgICAgICAgaWYgKCB0ZW1wID4gMzI3NjgpIHsKLSAgICAgICAgICAgICAgICAqcEJUTWRhdGExID0gMzI3Njc7IC8vIGxlc3MgdGhhbiBtYXggYWxsb3dlZCB2YWx1ZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KXRlbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwQlRNZGF0YTErKzsKLSAgICAgICAgcFBUTWRhdGEyKys7Ci0gICAgfQotCi0gICAgbWVtY3B5KCh2b2lkICopcE1peGVkT3V0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBCYWNrZ3JvdW5kVHJhY2stPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgIHBCYWNrZ3JvdW5kVHJhY2stPm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICBBTE9HVigibWl4QW5kRHVjazogWCIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpjYWxjdWxhdGVPdXRSZXNhbXBsZUJ1ZlNpemUoKSB7Ci0KLSAgICAvLyBUaGlzIGFscmVhZHkgdGFrZXMgY2FyZSBvZiBjaGFubmVsIGNvdW50IGluIG1CVEJ1ZmZlci5tX2J1ZmZlclNpemUKLSAgICByZXR1cm4gKG1PdXRTYW1wbGVSYXRlIC8gbUluU2FtcGxlUmF0ZSkgKiBtQlRCdWZmZXIubV9idWZmZXJTaXplOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OnNldE1peFBhcmFtcygKLSAgICAgICAgY29uc3QgQXVkaW9NaXhTZXR0aW5ncyYgc2V0dGluZykgewotICAgIEFMT0dWKCJzZXRNaXhQYXJhbXMiKTsKLQotICAgIG1EdWNraW5nX2VuYWJsZSAgICAgICA9IHNldHRpbmcubHZJbkR1Y2tpbmdfZW5hYmxlOwotICAgIG1EdWNraW5nX2xvd1ZvbHVtZSAgICA9IHNldHRpbmcubHZJbkR1Y2tpbmdfbG93Vm9sdW1lOwotICAgIG1EdWNraW5nX3RocmVzaG9sZCAgICA9IHNldHRpbmcubHZJbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIG1QVFZvbExldmVsICAgICAgICAgICA9IHNldHRpbmcubHZQVFZvbExldmVsOwotICAgIG1CVFZvbExldmVsICAgICAgICAgICA9IHNldHRpbmcubHZCVFZvbExldmVsIDsKLSAgICBtQlRDaGFubmVsQ291bnQgICAgICAgPSBzZXR0aW5nLmx2QlRDaGFubmVsQ291bnQ7Ci0gICAgbVBUQ2hhbm5lbENvdW50ICAgICAgID0gc2V0dGluZy5sdlBUQ2hhbm5lbENvdW50OwotICAgIG1CVEZvcm1hdCAgICAgICAgICAgICA9IHNldHRpbmcubHZCVEZvcm1hdDsKLSAgICBtSW5TYW1wbGVSYXRlICAgICAgICAgPSBzZXR0aW5nLmx2SW5TYW1wbGVSYXRlOwotICAgIG1PdXRTYW1wbGVSYXRlICAgICAgICA9IHNldHRpbmcubHZPdXRTYW1wbGVSYXRlOwotCi0gICAgLy8gUmVzZXQgdGhlIGZvbGxvd2luZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMKLSAgICBtQXVkVm9sQXJySW5kZXggICAgICAgPSAwOwotICAgIG1Eb0R1Y2tpbmcgICAgICAgICAgICA9IDA7Ci0gICAgbUR1Y2tpbmdGYWN0b3IgICAgICAgID0gMS4wOwotCi0gICAgQUxPR1YoImR1Y2tpbmcgZW5hYmxlIDB4JXggbG93Vm9sdW1lICVmIHRocmVzaG9sZCAlIiBQUkl1MzIgIiAiCi0gICAgICAgICAgICAiZlBUVm9sTGV2ZWwgJWYgQlRWb2xMZXZlbCAlZiIsCi0gICAgICAgICAgICBtRHVja2luZ19lbmFibGUsIG1EdWNraW5nX2xvd1ZvbHVtZSwgbUR1Y2tpbmdfdGhyZXNob2xkLAotICAgICAgICAgICAgbVBUVm9sTGV2ZWwsIG1QVFZvbExldmVsKTsKLQotICAgIC8vIERlY2lkZXMgaWYgU1NSQyBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgdGhpcyBtaXhpbmcKLSAgICBtSXNTU1JDbmVlZGVkID0gKHNldHRpbmcubHZJblNhbXBsZVJhdGUgIT0gc2V0dGluZy5sdk91dFNhbXBsZVJhdGUpOwotICAgIGlmIChzZXR0aW5nLmx2QlRDaGFubmVsQ291bnQgIT0gc2V0dGluZy5sdlBUQ2hhbm5lbENvdW50KXsKLSAgICAgICAgaWYgKHNldHRpbmcubHZCVENoYW5uZWxDb3VudCA9PSAyKXsKLSAgICAgICAgICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDE7IC8vIGNvbnZlcnQgdG8gTU9OTwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYW5uZWxDb252ZXJzaW9uID0gMjsgLy8gQ29udmVydCB0byBTVEVSRU8KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDA7Ci0gICAgfQotfQotCi0vLyBGYXN0IHdheSB0byBjb21wdXRlIDEwICogbG9nKHZhbHVlKQotTTRPU0FfSW50MzIgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6Z2V0RGVjaWJlbFNvdW5kKE00T1NBX1VJbnQzMiB2YWx1ZSkgewotICAgIEFMT0dWKCJnZXREZWNpYmVsU291bmQ6ICVsZCIsIHZhbHVlKTsKLQotICAgIGlmICh2YWx1ZSA8PSAwIHx8IHZhbHVlID4gMHg4MDAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDQwMDApIHsgLy8gMzI3NjgKLSAgICAgICAgcmV0dXJuIDkwOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDIwMDApIHsgLy8gMTYzODQKLSAgICAgICAgcmV0dXJuIDg0OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDEwMDApIHsgLy8gODE5MgotICAgICAgICByZXR1cm4gNzg7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDgwMCkgeyAvLyA0MDI4Ci0gICAgICAgIHJldHVybiA3MjsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwNDAwKSB7IC8vIDIwNDgKLSAgICAgICAgcmV0dXJuIDY2OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAyMDApIHsgLy8gMTAyNAotICAgICAgICByZXR1cm4gNjA7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDEwMCkgeyAvLyA1MTIKLSAgICAgICAgcmV0dXJuIDU0OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwODApIHsgLy8gMjU2Ci0gICAgICAgIHJldHVybiA0ODsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDQwKSB7IC8vIDEyOAotICAgICAgICByZXR1cm4gNDI7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAyMCkgeyAvLyA2NAotICAgICAgICByZXR1cm4gMzY7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAxMCkgeyAvLyAzMgotICAgICAgICByZXR1cm4gMzA7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwOCkgeyAvLyAxNgotICAgICAgICByZXR1cm4gMjQ7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwNykgeyAvLyA4Ci0gICAgICAgIHJldHVybiAyNDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDAzKSB7IC8vIDQKLSAgICAgICAgcmV0dXJuIDE4OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMDEpIHsgLy8gMgotICAgICAgICByZXR1cm4gMTI7Ci0gICAgfSBlbHNlICB7IC8vIDEKLSAgICAgICAgcmV0dXJuIDY7Ci0gICAgfQotfQotCi1NNE9TQV9Cb29sIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OmlzVGhyZXNob2xkQnJlYWNoZWQoCi0gICAgICAgIE00T1NBX0ludDMyKiBhdmVyYWdlVmFsdWUsCi0gICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsCi0gICAgICAgIE00T1NBX0ludDMyIHRocmVzaG9sZFZhbHVlKSB7Ci0KLSAgICBBTE9HVigiaXNUaHJlc2hvbGRCcmVhY2hlZCIpOwotCi0gICAgaW50IHRvdGFsVmFsdWUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmVDb3VudDsgKytpKSB7Ci0gICAgICAgIHRvdGFsVmFsdWUgKz0gYXZlcmFnZVZhbHVlW2ldOwotICAgIH0KLSAgICByZXR1cm4gKHRvdGFsVmFsdWUgLyBzdG9yZUNvdW50ID4gdGhyZXNob2xkVmFsdWUpOwotfQotCi19Ly9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2I3YTY5Zi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBWRV9CQUNLR1JPVU5EX0FVRElPX1BST0NfSAotI2RlZmluZSBWRV9CQUNLR1JPVU5EX0FVRElPX1BST0NfSAotCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0V4cG9ydC5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQxNiogICBtX2RhdGFBZGRyZXNzOyAvLyBBbmRyb2lkIFNSQyBuZWVkcyBhIEludDE2IHBvaW50ZXIKLSAgICBNNE9TQV9VSW50MzIgICAgbV9idWZmZXJTaXplOwotfSBNNEFNX0J1ZmZlcjE2OyAgICAvLyBTdHJ1Y3R1cmUgY29udGFpbnMgSW50MTZfdCBwb2ludGVyCi0KLWVudW0gQXVkaW9Gb3JtYXQgewotICAgIE1PTk9fMTZfQklULAotICAgIFNURVJFT18xNl9CSVQKLX07Ci0KLS8vIEZvbGxvd2luZyBzdHJ1Y3Qgd2lsbCBiZSB1c2VkIGJ5IGFwcCB0byBzdXBwbHkgdGhlIFBUIGFuZCBCVCBwcm9wZXJ0aWVzCi0vLyBhbG9uZyB3aXRoIGR1Y2tpbmcgdmFsdWVzCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfSW50MzIgbHZJblNhbXBsZVJhdGU7IC8vIFNhbXBsaW5nIGF1ZGlvIGZyZXEgKDgwMDAsMTYwMDAgb3IgbW9yZSApCi0gICAgTTRPU0FfSW50MzIgbHZPdXRTYW1wbGVSYXRlOyAvL1NhbXBsaW5nIGF1ZGlvIGZyZXEgKDgwMDAsMTYwMDAgb3IgbW9yZSApCi0gICAgQXVkaW9Gb3JtYXQgbHZCVEZvcm1hdDsKLQotICAgIE00T1NBX0ludDMyIGx2SW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBNNE9TQV9GbG9hdCBsdkluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgTTRPU0FfQm9vbCBsdkluRHVja2luZ19lbmFibGU7Ci0gICAgTTRPU0FfRmxvYXQgbHZQVFZvbExldmVsOwotICAgIE00T1NBX0Zsb2F0IGx2QlRWb2xMZXZlbDsKLSAgICBNNE9TQV9JbnQzMiBsdkJUQ2hhbm5lbENvdW50OwotICAgIE00T1NBX0ludDMyIGx2UFRDaGFubmVsQ291bnQ7Ci19IEF1ZGlvTWl4U2V0dGluZ3M7Ci0KLS8vIFRoaXMgY2xhc3MgaXMgZGVmaW5lZCB0byBnZXQgU0YgU1JDIGFjY2VzcwotY2xhc3MgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyB7Ci1wdWJsaWM6Ci0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpOwotICAgIH5WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nKCkge30KLQotICAgIHZvaWQgc2V0TWl4UGFyYW1zKGNvbnN0IEF1ZGlvTWl4U2V0dGluZ3MmIHBhcmFtcyk7Ci0KLSAgICBNNE9TQV9JbnQzMiBtaXhBbmREdWNrKAotICAgICAgICAgICAgICAgICAgICB2b2lkKiBwcmltYXJ5VHJhY2tCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIGJhY2tncm91bmRUcmFja0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogbWl4ZWRPdXRwdXRCdWZmZXIpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrUHJvY2Vzc2luZ1dpbmRvd1NpemUgPSAxMCwKLSAgICB9OwotCi0gICAgTTRPU0FfSW50MzIgbUluU2FtcGxlUmF0ZTsKLSAgICBNNE9TQV9JbnQzMiBtT3V0U2FtcGxlUmF0ZTsKLSAgICBBdWRpb0Zvcm1hdCBtQlRGb3JtYXQ7Ci0KLSAgICBNNE9TQV9Cb29sIG1Jc1NTUkNuZWVkZWQ7Ci0gICAgTTRPU0FfSW50MzIgbUJUQ2hhbm5lbENvdW50OwotICAgIE00T1NBX0ludDMyIG1QVENoYW5uZWxDb3VudDsKLSAgICBNNE9TQV9VSW50OCBtQ2hhbm5lbENvbnZlcnNpb247Ci0KLSAgICBNNE9TQV9VSW50MzIgbUR1Y2tpbmdfdGhyZXNob2xkOwotICAgIE00T1NBX0Zsb2F0IG1EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBNNE9TQV9GbG9hdCBtRHVja2luZ0ZhY3RvciA7Ci0gICAgTTRPU0FfQm9vbCBtRHVja2luZ19lbmFibGU7Ci0gICAgTTRPU0FfSW50MzIgbUF1ZGlvVm9sdW1lQXJyYXlba1Byb2Nlc3NpbmdXaW5kb3dTaXplXTsKLSAgICBNNE9TQV9JbnQzMiBtQXVkVm9sQXJySW5kZXg7Ci0gICAgTTRPU0FfQm9vbCBtRG9EdWNraW5nOwotICAgIE00T1NBX0Zsb2F0IG1QVFZvbExldmVsOwotICAgIE00T1NBX0Zsb2F0IG1CVFZvbExldmVsOwotCi0gICAgTTRBTV9CdWZmZXIxNiBtQlRCdWZmZXI7Ci0KLSAgICBNNE9TQV9JbnQzMiBnZXREZWNpYmVsU291bmQoTTRPU0FfVUludDMyIHZhbHVlKTsKLSAgICBNNE9TQV9Cb29sICBpc1RocmVzaG9sZEJyZWFjaGVkKE00T1NBX0ludDMyKiBhdmVyYWdlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsIE00T1NBX0ludDMyIHRocmVzaG9sZFZhbHVlKTsKLQotICAgIC8vIFRoaXMgcmV0dXJucyB0aGUgc2l6ZSBvZiBidWZmZXIgd2hpY2ggbmVlZHMgdG8gYWxsb2NhdGVkCi0gICAgLy8gYmVmb3JlIHJlc2FtcGxpbmcgaXMgY2FsbGVkCi0gICAgTTRPU0FfSW50MzIgY2FsY3VsYXRlT3V0UmVzYW1wbGVCdWZTaXplKCk7Ci0KLSAgICAvLyBEb24ndCBjYWxsIG1lLgotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoY29uc3QgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyYpOwotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcmIG9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBWRV9CQUNLR1JPVU5EX0FVRElPX1BST0NfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQ2NTZjNC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JQbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclBsYXllci5oIgotI2luY2x1ZGUgIlByZXZpZXdQbGF5ZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yUGxheWVyOjpWaWRlb0VkaXRvclBsYXllcihOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIpCi0gICAgOiBtUGxheWVyKG5ldyBQcmV2aWV3UGxheWVyKHJlbmRlcmVyKSkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yUGxheWVyIik7Ci0gICAgbVBsYXllci0+c2V0TGlzdGVuZXIodGhpcyk7Ci19Ci0KLVZpZGVvRWRpdG9yUGxheWVyOjp+VmlkZW9FZGl0b3JQbGF5ZXIoKSB7Ci0gICAgQUxPR1YoIn5WaWRlb0VkaXRvclBsYXllciIpOwotCi0gICAgcmVzZXQoKTsKLSAgICBtVmVBdWRpb1NpbmsuY2xlYXIoKTsKLQotICAgIGRlbGV0ZSBtUGxheWVyOwotICAgIG1QbGF5ZXIgPSBOVUxMOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6aW5pdENoZWNrKCkgewotICAgIEFMT0dWKCJpbml0Q2hlY2siKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEF1ZGlvUGxheWVyKFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKmF1ZGlvUGxheWVyKSB7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldEF1ZGlvUGxheWVyKGF1ZGlvUGxheWVyKTsKLX0KLQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewotICAgIEFMT0dJKCJzZXREYXRhU291cmNlKCclcycpIiwgdXJsKTsKLSAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJIZWFkZXJzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwpOwotfQotCi0vL1dlIGRvbm90IHVzZSB0aGlzIGluIHByZXZpZXcsIGR1bW15IGltcGxpbWVudGF0aW9uIGFzIHRoaXMgaXMgcHVyZSB2aXJ0dWFsCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LAotICAgIGludDY0X3QgbGVuZ3RoKSB7Ci0gICAgQUxPR0UoInNldERhdGFTb3VyY2UoJWQsICVsbGQsICVsbGQpIE5vdCBzdXBwb3J0ZWQiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIHJldHVybiAoIU9LKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgewotICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2UiKTsKLQotICAgIG1QbGF5ZXItPnNldFN1cmZhY2Uoc3VyZmFjZSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpIHsKLSAgICBBTE9HVigic2V0VmlkZW9TdXJmYWNlVGV4dHVyZSIpOwotCi0gICAgbVBsYXllci0+c2V0U3VyZmFjZVRleHR1cmUoYnVmZmVyUHJvZHVjZXIpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnByZXBhcmUoKSB7Ci0gICAgQUxPR1YoInByZXBhcmUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZSgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cHJlcGFyZUFzeW5jKCkgewotICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnN0YXJ0KCkgewotICAgIEFMT0dWKCJzdGFydCIpOwotICAgIHJldHVybiBtUGxheWVyLT5wbGF5KCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzdG9wKCkgewotICAgIEFMT0dWKCJzdG9wIik7Ci0gICAgcmV0dXJuIHBhdXNlKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpwYXVzZSgpIHsKLSAgICBBTE9HVigicGF1c2UiKTsKLSAgICByZXR1cm4gbVBsYXllci0+cGF1c2UoKTsKLX0KLQotYm9vbCBWaWRlb0VkaXRvclBsYXllcjo6aXNQbGF5aW5nKCkgewotICAgIEFMT0dWKCJpc1BsYXlpbmciKTsKLSAgICByZXR1cm4gbVBsYXllci0+aXNQbGF5aW5nKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZWVrVG8oaW50IG1zZWMpIHsKLSAgICBBTE9HVigic2Vla1RvIik7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+c2Vla1RvKChpbnQ2NF90KW1zZWMgKiAxMDAwKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludCAqbXNlYykgewotICAgIEFMT0dWKCJnZXRDdXJyZW50UG9zaXRpb24iKTsKLSAgICBpbnQ2NF90IHBvc2l0aW9uVXM7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+Z2V0UG9zaXRpb24oJnBvc2l0aW9uVXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICptc2VjID0gKHBvc2l0aW9uVXMgKyA1MDApIC8gMTAwMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpnZXREdXJhdGlvbihpbnQgKm1zZWMpIHsKLSAgICBBTE9HVigiZ2V0RHVyYXRpb24iKTsKLQotICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5nZXREdXJhdGlvbigmZHVyYXRpb25Vcyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICptc2VjID0gMDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgICptc2VjID0gKGR1cmF0aW9uVXMgKyA1MDApIC8gMTAwMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpyZXNldCgpIHsKLSAgICBBTE9HVigicmVzZXQiKTsKLSAgICBtUGxheWVyLT5yZXNldCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldExvb3BpbmcoaW50IGxvb3ApIHsKLSAgICBBTE9HVigic2V0TG9vcGluZyIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRMb29waW5nKGxvb3ApOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgewotICAgIEFMT0dFKCJzZXRQYXJhbWV0ZXIgbm90IGltcGxlbWVudGVkIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKLSAgICBBTE9HRSgiZ2V0UGFyYW1ldGVyIG5vdCBpbXBsZW1lbnRlZCIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotcGxheWVyX3R5cGUgVmlkZW9FZGl0b3JQbGF5ZXI6OnBsYXllclR5cGUoKSB7Ci0gICAgQUxPR1YoInBsYXllclR5cGUiKTsKLSAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjphY3F1aXJlTG9jaygpIHsKLSAgICBBTE9HVigiYWNxdWlyZUxvY2siKTsKLSAgICBtUGxheWVyLT5hY3F1aXJlTG9jaygpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpyZWxlYXNlTG9jaygpIHsKLSAgICBBTE9HVigicmVsZWFzZUxvY2siKTsKLSAgICBtUGxheWVyLT5yZWxlYXNlTG9jaygpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6aW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6c2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luaykgewotICAgIE1lZGlhUGxheWVySW50ZXJmYWNlOjpzZXRBdWRpb1NpbmsoYXVkaW9TaW5rKTsKLQotICAgIG1QbGF5ZXItPnNldEF1ZGlvU2luayhhdWRpb1NpbmspOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0TWV0YWRhdGEoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3JkcykgewotICAgIHVzaW5nIG1lZGlhOjpNZXRhZGF0YTsKLQotICAgIHVpbnQzMl90IGZsYWdzID0gbVBsYXllci0+Z2V0U291cmNlU2Vla0ZsYWdzKCk7Ci0KLSAgICBNZXRhZGF0YSBtZXRhZGF0YShyZWNvcmRzKTsKLQotICAgIG1ldGFkYXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1BhdXNlQXZhaWxhYmxlLAotICAgICAgICAgICAgZmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1BBVVNFKTsKLQotICAgIG1ldGFkYXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtCYWNrd2FyZEF2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9TRUVLX0JBQ0tXQVJEKTsKLQotICAgIG1ldGFkYXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtGb3J3YXJkQXZhaWxhYmxlLAotICAgICAgICAgICAgZmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUtfRk9SV0FSRCk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQXZhaWxhYmxlLAotICAgICAgICAgICAgZmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUspOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6bG9hZEVmZmVjdHNTZXR0aW5ncygKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3RTZXR0aW5ncywgaW50IG5FZmZlY3RzKSB7Ci0gICAgQUxPR1YoImxvYWRFZmZlY3RzU2V0dGluZ3MiKTsKLSAgICByZXR1cm4gbVBsYXllci0+bG9hZEVmZmVjdHNTZXR0aW5ncyhwRWZmZWN0U2V0dGluZ3MsIG5FZmZlY3RzKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmxvYWRBdWRpb01peFNldHRpbmdzKAotICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncykgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvclBsYXllcjogbG9hZEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICByZXR1cm4gbVBsYXllci0+bG9hZEF1ZGlvTWl4U2V0dGluZ3MocEF1ZGlvTWl4U2V0dGluZ3MpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKAotICAgIE00T1NBX0NvbnRleHQgcEF1ZGlvTWl4UENNRmlsZUhhbmRsZSkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yUGxheWVyOiBsb2FkQXVkaW9NaXhTZXR0aW5ncyIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRBdWRpb01peFBDTUZpbGVIYW5kbGUocEF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbSgKLSAgICBNNE9TQV9VSW50MzIgYXVkaW9NaXhTdG9yeUJvYXJkVFMsCi0gICAgTTRPU0FfVUludDMyIGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICBNNE9TQV9VSW50MzIgcHJpbWFyeVRyYWNrVm9sVmFsdWUpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclBsYXllcjogbG9hZEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oYXVkaW9NaXhTdG9yeUJvYXJkVFMsCi0gICAgIGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwgcHJpbWFyeVRyYWNrVm9sVmFsdWUpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0UGxheWJhY2tCZWdpblRpbWUodWludDMyX3QgbXNlYykgewotICAgIEFMT0dWKCJzZXRQbGF5YmFja0JlZ2luVGltZSIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRQbGF5YmFja0JlZ2luVGltZShtc2VjKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFBsYXliYWNrRW5kVGltZSh1aW50MzJfdCBtc2VjKSB7Ci0gICAgQUxPR1YoInNldFBsYXliYWNrRW5kVGltZSIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRQbGF5YmFja0VuZFRpbWUobXNlYyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRTdG9yeWJvYXJkU3RhcnRUaW1lKHVpbnQzMl90IG1zZWMpIHsKLSAgICBBTE9HVigic2V0U3Rvcnlib2FyZFN0YXJ0VGltZSIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRTdG9yeWJvYXJkU3RhcnRUaW1lKG1zZWMpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKHVpbnQzMl90IGNiSW50ZXJ2YWwpIHsKLSAgICBBTE9HVigic2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbChjYkludGVydmFsKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldE1lZGlhUmVuZGVyaW5nTW9kZSgKLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbW9kZSwKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpIHsKLQotICAgIEFMT0dWKCJzZXRNZWRpYVJlbmRlcmluZ01vZGUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0TWVkaWFSZW5kZXJpbmdNb2RlKG1vZGUsIG91dHB1dFZpZGVvU2l6ZSk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpyZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCkgewotICAgIEFMT0dWKCJyZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEltYWdlQ2xpcFByb3BlcnRpZXMoCi0gICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgIHJldHVybiBtUGxheWVyLT5zZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHdpZHRoLCBoZWlnaHQpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cmVhZEZpcnN0VmlkZW9GcmFtZSgpIHsKLSAgICByZXR1cm4gbVBsYXllci0+cmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0TGFzdFJlbmRlcmVkVGltZU1zKHVpbnQzMl90ICpsYXN0UmVuZGVyZWRUaW1lTXMpIHsKLSAgICBtUGxheWVyLT5nZXRMYXN0UmVuZGVyZWRUaW1lTXMobGFzdFJlbmRlcmVkVGltZU1zKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2luayBpbnRlcmZhY2UgKi8KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIlZlQXVkaW9TaW5rIgotCi1pbnQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6Om1NaW5CdWZmZXJDb3VudCA9IDQ7Ci1ib29sIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjptSXNPbkVtdWxhdG9yID0gZmFsc2U7Ci0KLVZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpWZUF1ZGlvT3V0cHV0KCkKLSAgICA6IG1DYWxsYmFjayhOVUxMKSwKLSAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSB7Ci0gICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgbUxlZnRWb2x1bWUgPSAxLjA7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gMS4wOwotICAgIG1MYXRlbmN5ID0gMDsKLSAgICBtTXNlY3NQZXJGcmFtZSA9IDA7Ci0gICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOwotICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Ci19Ci0KLVZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojp+VmVBdWRpb091dHB1dCgpIHsKLSAgICBjbG9zZSgpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpzZXRNaW5CdWZmZXJDb3VudCgpIHsKLQotICAgIG1Jc09uRW11bGF0b3IgPSBmYWxzZTsKLSAgICBtTWluQnVmZmVyQ291bnQgPSA0OwotfQotCi1ib29sIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojppc09uRW11bGF0b3IoKSB7Ci0KLSAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwotICAgIHJldHVybiBtSXNPbkVtdWxhdG9yOwotfQotCi1pbnQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldE1pbkJ1ZmZlckNvdW50KCkgewotCi0gICAgc2V0TWluQnVmZmVyQ291bnQoKTsKLSAgICByZXR1cm4gbU1pbkJ1ZmZlckNvdW50OwotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpidWZmZXJTaXplKCkgY29uc3QgewotCi0gICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCkgKiBmcmFtZVNpemUoKTsKLX0KLQotc3NpemVfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6ZnJhbWVDb3VudCgpIGNvbnN0IHsKLQotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpOwotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpjaGFubmVsQ291bnQoKSBjb25zdAotewotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+Y2hhbm5lbENvdW50KCk7Ci19Ci0KLXNzaXplX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmZyYW1lU2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZVNpemUoKTsKLX0KLQotdWludDMyX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmxhdGVuY3kgKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUxhdGVuY3k7Ci19Ci0KLWZsb2F0IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojptc2Vjc1BlckZyYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbU1zZWNzUGVyRnJhbWU7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0IHsKLQotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqd3JpdHRlbikgY29uc3QgewotCi0gICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqd3JpdHRlbiA9IG1OdW1GcmFtZXNXcml0dGVuOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6Om9wZW4oCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKSB7Ci0KLSAgICBtQ2FsbGJhY2sgPSBjYjsKLSAgICBtQ2FsbGJhY2tDb29raWUgPSBjb29raWU7Ci0KLSAgICAvLyBDaGVjayBhcmd1bWVudCAiYnVmZmVyQ291bnQiIGFnYWluc3QgdGhlIG1pbmludW0gYnVmZmVyIGNvdW50Ci0gICAgaWYgKGJ1ZmZlckNvdW50IDwgbU1pbkJ1ZmZlckNvdW50KSB7Ci0gICAgICAgIEFMT0dWKCJidWZmZXJDb3VudCAoJWQpIGlzIHRvbyBzbWFsbCBhbmQgaW5jcmVhc2VkIHRvICVkIiwKLSAgICAgICAgICAgIGJ1ZmZlckNvdW50LCBtTWluQnVmZmVyQ291bnQpOwotICAgICAgICBidWZmZXJDb3VudCA9IG1NaW5CdWZmZXJDb3VudDsKLQotICAgIH0KLSAgICBBTE9HVigib3BlbigldSwgJWQsICVkLCAlZCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGZvcm1hdCwgYnVmZmVyQ291bnQpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgY2xvc2UoKTsKLSAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBpbnQgZnJhbWVDb3VudDsKLQotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBtU3RyZWFtVHlwZSkgIT0KLSAgICAgTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIG1TdHJlYW1UeXBlKSAhPQotICAgICBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBmcmFtZUNvdW50ID0gKHNhbXBsZVJhdGUqYWZGcmFtZUNvdW50KmJ1ZmZlckNvdW50KS9hZlNhbXBsZVJhdGU7Ci0KLSAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7Ci0gICAgICAgIHN3aXRjaChjaGFubmVsQ291bnQpIHsKLSAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPEF1ZGlvVHJhY2s+IHQ7Ci0gICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlciwKLSAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgfQotCi0gICAgaWYgKCh0ID09IDApIHx8ICh0LT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2siKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgQUxPR1YoInNldFZvbHVtZSIpOwotICAgIHQtPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICBtTXNlY3NQZXJGcmFtZSA9IDEuZTMgLyAoZmxvYXQpIHNhbXBsZVJhdGU7Ci0gICAgbUxhdGVuY3kgPSB0LT5sYXRlbmN5KCk7Ci0gICAgbVRyYWNrID0gdDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpzdGFydCgpIHsKLQotICAgIEFMT0dWKCJzdGFydCIpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVRyYWNrLT5zdGFydCgpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtVHJhY2stPmdldFBvc2l0aW9uKCZtTnVtRnJhbWVzV3JpdHRlbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OnNub29wV3JpdGUoCi0gICAgY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotICAgIC8vIFZpc3VhbGl6YXRpb24gYnVmZmVycyBub3Qgc3VwcG9ydGVkCi0gICAgcmV0dXJuOwotCi19Ci0KLXNzaXplX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OndyaXRlKAotICAgICBjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0KLSAgICBMT0dfRkFUQUxfSUYobUNhbGxiYWNrICE9IE5VTEwsICJEb24ndCBjYWxsIHdyaXRlIGlmIHN1cHBseWluZyBhIGNhbGxiYWNrLiIpOwotCi0gICAgLy9BTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHNub29wV3JpdGUoYnVmZmVyLCBzaXplKTsKLSAgICAgICAgc3NpemVfdCByZXQgPSBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIG1OdW1GcmFtZXNXcml0dGVuICs9IHJldCAvIDQ7IC8vIGFzc3VtZSAxNiBiaXQgc3RlcmVvCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpzdG9wKCkgewotCi0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+c3RvcCgpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpmbHVzaCgpIHsKLQotICAgIEFMT0dWKCJmbHVzaCIpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5mbHVzaCgpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpwYXVzZSgpIHsKLQotICAgIEFMT0dWKCJWZUF1ZGlvT3V0cHV0OjpwYXVzZSIpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5wYXVzZSgpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpjbG9zZSgpIHsKLQotICAgIEFMT0dWKCJjbG9zZSIpOwotICAgIG1UcmFjay5jbGVhcigpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLQotICAgIEFMT0dWKCJzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnQsIHJpZ2h0KTsKLSAgICBtTGVmdFZvbHVtZSA9IGxlZnQ7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Q2FsbGJhY2tXcmFwcGVyKAotICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKmNvb2tpZSwgdm9pZCAqaW5mbykgewotICAgIC8vQUxPR1YoIlZlQXVkaW9PdXRwdXQ6OmNhbGxiYWNrd3JhcHBlciIpOwotICAgIGlmIChldmVudCAhPSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFZlQXVkaW9PdXRwdXQgKm1lID0gKFZlQXVkaW9PdXRwdXQgKiljb29raWU7Ci0gICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLQotICAgIHNpemVfdCBhY3R1YWxTaXplID0gKCptZS0+bUNhbGxiYWNrKSgKLSAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAotICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX0ZJTExfQlVGRkVSKTsKLQotICAgIGJ1ZmZlci0+c2l6ZSA9IGFjdHVhbFNpemU7Ci0KLSAgICBpZiAoYWN0dWFsU2l6ZSA+IDApIHsKLSAgICAgICAgbWUtPnNub29wV3JpdGUoYnVmZmVyLT5yYXcsIGFjdHVhbFNpemUpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgcmVzdWx0LmFwcGVuZCgiIFZlQXVkaW9PdXRwdXRcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRS0xLCAiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKLSAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLTEsICIgIG1zZWMgcGVyIGZyYW1lKCVmKSwgbGF0ZW5jeSAoJWQpXG4iLAotICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIG1MYXRlbmN5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5kdW1wKGZkLCBhcmdzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1pbnQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpIGNvbnN0IHsKLQotICAgIHJldHVybiBtU2Vzc2lvbklkOwotfQotCi11aW50MzJfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKLSAgICBpZiAobU1zZWNzUGVyRnJhbWUgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuICh1aW50MzJfdCkoMS5lMyAvIG1Nc2Vjc1BlckZyYW1lKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjhjMTI1NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9WSURFT0VESVRPUl9QTEFZRVJfSAotI2RlZmluZSBBTkRST0lEX1ZJREVPRURJVE9SX1BMQVlFUl9ICi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNYWluLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaCIKLSNpbmNsdWRlICJOYXRpdmVXaW5kb3dSZW5kZXJlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBQcmV2aWV3UGxheWVyOwotCi1jbGFzcyBWaWRlb0VkaXRvclBsYXllciA6IHB1YmxpYyBNZWRpYVBsYXllckludGVyZmFjZSB7Ci0gICAgcHVibGljOgotICAgIGNsYXNzIFZlQXVkaW9PdXRwdXQ6IHB1YmxpYyBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luawotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlQXVkaW9PdXRwdXQoKTsKLSAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgflZlQXVkaW9PdXRwdXQoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFkeSgpIGNvbnN0IHsgcmV0dXJuIG1UcmFjayAhPSBOVUxMOyB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHJlYWx0aW1lKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBidWZmZXJTaXplKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lQ291bnQoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lU2l6ZSgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCopIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIG9wZW4oCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGZsdXNoKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHBhdXNlKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHZvaWQgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgeyBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7IH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwotCi0gICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIGlzT25FbXVsYXRvcigpOwotICAgICAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBnZXRNaW5CdWZmZXJDb3VudCgpOwotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Ci0gICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlcigKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKm1lLCB2b2lkICppbmZvKTsKLQotICAgICAgICBzcDxBdWRpb1RyYWNrPiAgICAgICAgICBtVHJhY2s7Ci0gICAgICAgIEF1ZGlvQ2FsbGJhY2sgICAgICAgICAgIG1DYWxsYmFjazsKLSAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29va2llOwotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKLSAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKLSAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWU7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1MYXRlbmN5OwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwotICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBtSXNPbkVtdWxhdG9yOwotICAgICAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBtTWluQnVmZmVyQ291bnQ7IC8vIDEyIGZvciBlbXVsYXRvcjsgb3RoZXJ3aXNlIDQKLQotICAgICAgICBwdWJsaWM6Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuOwotICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBzbm9vcFdyaXRlKGNvbnN0IHZvaWQqLCBzaXplX3QpOwotICAgIH07Ci0KLXB1YmxpYzoKLSAgICBWaWRlb0VkaXRvclBsYXllcihOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIpOwotICAgIHZpcnR1YWwgflZpZGVvRWRpdG9yUGxheWVyKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVBc3luYygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0gICAgdmlydHVhbCBib29sIGlzUGxheWluZygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKGludCBtc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb29waW5nKGludCBsb29wKTsKLSAgICB2aXJ0dWFsIHBsYXllcl90eXBlIHBsYXllclR5cGUoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUxvY2soKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUxvY2soKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3Jkcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxvYWRFZmZlY3RzU2V0dGluZ3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0U2V0dGluZ3MsIGludCBuRWZmZWN0cyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxvYWRBdWRpb01peFNldHRpbmdzKAotICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IHBBdWRpb01peFBDTUZpbGVIYW5kbGUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgeCwgTTRPU0FfVUludDMyIHksIE00T1NBX1VJbnQzMiB6KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tCZWdpblRpbWUodWludDMyX3QgbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja0VuZFRpbWUodWludDMyX3QgbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdG9yeWJvYXJkU3RhcnRUaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKHVpbnQzMl90IGNiSW50ZXJ2YWwpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYVJlbmRlcmluZ01vZGUoTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG91dHB1dFZpZGVvU2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEltYWdlQ2xpcFByb3BlcnRpZXModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRmlyc3RWaWRlb0ZyYW1lKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXN0UmVuZGVyZWRUaW1lTXModWludDMyX3QgKmxhc3RSZW5kZXJlZFRpbWVNcyk7Ci0KLSAgICBzdGF0dXNfdCBzZXRBdWRpb1BsYXllcihWaWRlb0VkaXRvckF1ZGlvUGxheWVyICphdWRpb1BsYXllcik7Ci1wcml2YXRlOgotICAgIFByZXZpZXdQbGF5ZXIgICAgICAgKm1QbGF5ZXI7Ci0gICAgc3A8VmVBdWRpb091dHB1dD4gICAgbVZlQXVkaW9TaW5rOwotCi0gICAgVmlkZW9FZGl0b3JQbGF5ZXIoY29uc3QgVmlkZW9FZGl0b3JQbGF5ZXIgJik7Ci0gICAgVmlkZW9FZGl0b3JQbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBWaWRlb0VkaXRvclBsYXllciAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9WSURFT0VESVRPUl9QTEFZRVJfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzY2QzZDAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlByZXZpZXdDb250cm9sbGVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaCIKLSNpbmNsdWRlICJQcmV2aWV3UmVuZGVyZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNpbmNsdWRlICJNNE9TQV9UaHJlYWQuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotCi1WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKCkKLSAgICA6IG1DdXJyZW50UGxheWVyKDApLAotICAgICAgbVRocmVhZENvbnRleHQoTlVMTCksCi0gICAgICBtUGxheWVyU3RhdGUoVmVQbGF5ZXJJZGxlKSwKLSAgICAgIG1QcmVwYXJlUmVxZXN0KE00T1NBX0ZBTFNFKSwKLSAgICAgIG1DbGlwTGlzdChOVUxMKSwKLSAgICAgIG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZCgwKSwKLSAgICAgIG1OdW1iZXJDbGlwc1RvUHJldmlldygwKSwKLSAgICAgIG1TdGFydGluZ0NsaXBJbmRleCgwKSwKLSAgICAgIG1QcmV2aWV3TG9vcGluZyhNNE9TQV9GQUxTRSksCi0gICAgICBtQ2FsbEJhY2tBZnRlckZyYW1lQ250KDApLAotICAgICAgbUVmZmVjdHNTZXR0aW5ncyhOVUxMKSwKLSAgICAgIG1OdW1iZXJFZmZlY3RzKDApLAotICAgICAgbUN1cnJlbnRDbGlwTnVtYmVyKC0xKSwKLSAgICAgIG1DbGlwVG90YWxEdXJhdGlvbigwKSwKLSAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QoVklERU9fRUZGRUNUX05PTkUpLAotICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmcoTlVMTCksCi0gICAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKE5VTEwpLAotICAgICAgbVRhcmdldChOVUxMKSwKLSAgICAgIG1KbmlDb29raWUoTlVMTCksCi0gICAgICBtSm5pQ2FsbGJhY2soTlVMTCksCi0gICAgICBtQ3VycmVudFBsYXllZER1cmF0aW9uKDApLAotICAgICAgbUN1cnJlbnRDbGlwRHVyYXRpb24oMCksCi0gICAgICBtVmlkZW9TdG9yeUJvYXJkVGltZU1zVXB0b0ZpcnN0UHJldmlld0NsaXAoMCksCi0gICAgICBtT3ZlcmxheVN0YXRlKE9WRVJMQVlfQ0xFQVIpLAotICAgICAgbUFjdGl2ZVBsYXllckluZGV4KDApLAotICAgICAgbU91dHB1dFZpZGVvV2lkdGgoMCksCi0gICAgICBtT3V0cHV0VmlkZW9IZWlnaHQoMCksCi0gICAgICBiU3RvcFRocmVhZEluUHJvZ3Jlc3MoZmFsc2UpLAotICAgICAgbVNlbVRocmVhZFdhaXQoTlVMTCkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyIik7Ci0gICAgbVJlbmRlcmluZ01vZGUgPSBNNHhWU1Nfa0JsYWNrQm9yZGVyczsKLSAgICBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IGZhbHNlOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7ICsraSkgewotICAgICAgICBtVmVQbGF5ZXJbaV0gPSBOVUxMOwotICAgIH0KLX0KLQotVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6flZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIoKSB7Ci0gICAgQUxPR1YoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyIik7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gU3RvcCB0aGUgdGhyZWFkIGlmIGl0cyBzdGlsbCBydW5uaW5nCi0gICAgaWYobVRocmVhZENvbnRleHQgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jU3RvcChtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVigiflZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6IGVycm9yIDB4JXggXAotICAgICAgICAgICAgaW4gdHJ5aW5nIHRvIHN0b3AgdGhyZWFkIiwgZXJyKTsKLSAgICAgICAgICAgIC8vIENvbnRpbnVlIGV2ZW4gaWYgZXJyb3IKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNDbG9zZShtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiflZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6IGVycm9yIDB4JXggXAotICAgICAgICAgICAgaW4gdHJ5aW5nIHRvIGNsb3NlIHRocmVhZCIsICh1bnNpZ25lZCBpbnQpIGVycik7Ci0gICAgICAgICAgICAvLyBDb250aW51ZSBldmVuIGlmIGVycm9yCi0gICAgICAgIH0KLQotICAgICAgICBtVGhyZWFkQ29udGV4dCA9IE5VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgcGxheWVySW5zdD0wOyBwbGF5ZXJJbnN0PGtUb3RhbE51bVBsYXllckluc3RhbmNlczsKLSAgICAgICAgIHBsYXllckluc3QrKykgewotICAgICAgICBpZihtVmVQbGF5ZXJbcGxheWVySW5zdF0gIT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoImNsZWFyaW5nIG1WZVBsYXllciAlZCIsIHBsYXllckluc3QpOwotICAgICAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihtQ2xpcExpc3QgIT0gTlVMTCkgewotICAgICAgICAvLyBDbGVhbiB1cAotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckNsaXBzSW5TdG9yeUJvYXJkO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYobUNsaXBMaXN0W2ldLT5wRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnBGaWxlID0gTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJlZShtQ2xpcExpc3RbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUobUNsaXBMaXN0KTsKLSAgICAgICAgbUNsaXBMaXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtRWZmZWN0c1NldHRpbmdzKSB7Ci0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhKTsKLQotICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpIHsKLSAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWRDbG9zZSAobUF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0gICAgICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUJhY2tncm91bmRBdWRpb1NldHRpbmcpOwotICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobVRhcmdldCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtT3ZlcmxheVN0YXRlID0gT1ZFUkxBWV9DTEVBUjsKLQotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciByZXR1cm5zIik7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpsb2FkRWRpdFNldHRpbmdzKAotICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncyxNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogYmdtU2V0dGluZ3MpIHsKLQotICAgIE00T1NBX1VJbnQzMiBpID0gMCwgaUNsaXBEdXJhdGlvbiA9IDAsIHJnYlNpemUgPSAwOwotICAgIE00VklGSV9VSW50OCAqdG1wID0gTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJsb2FkRWRpdFNldHRpbmdzIik7Ci0gICAgQUxPR1YoImxvYWRFZGl0U2V0dGluZ3MgQ2hhbm5lbHMgPSAlZCwgc2FtcGxpbmcgRnJlcSAlZCIsCi0gICAgICAgICAgYmdtU2V0dGluZ3MtPnVpTmJDaGFubmVscywgYmdtU2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgICk7Ci0gICAgICAgICAgYmdtU2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAzMjAwMDsKLQotICAgIEFMT0dWKCJsb2FkRWRpdFNldHRpbmdzIENoYW5uZWxzID0gJWQsIHNhbXBsaW5nIEZyZXEgJWQiLAotICAgICAgICAgIGJnbVNldHRpbmdzLT51aU5iQ2hhbm5lbHMsIGJnbVNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICApOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBDbGVhbiB1cCBhbnkgcHJldmlvdXMgRWRpdCBzZXR0aW5ncyBiZWZvcmUgbG9hZGluZyBuZXcgb25lcwotICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLQotICAgIGlmKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpIHsKLSAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWRDbG9zZSAobUF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0gICAgICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyk7Ci0gICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtQ2xpcExpc3QgIT0gTlVMTCkgewotICAgICAgICAvLyBDbGVhbiB1cAotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckNsaXBzSW5TdG9yeUJvYXJkO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYobUNsaXBMaXN0W2ldLT5wRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnBGaWxlID0gTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJlZShtQ2xpcExpc3RbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUobUNsaXBMaXN0KTsKLSAgICAgICAgbUNsaXBMaXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtRWZmZWN0c1NldHRpbmdzKSB7Ci0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhKTsKLQotICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUNsaXBMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkID0gcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgICAgIEFMT0dWKCJsb2FkRWRpdFNldHRpbmdzOiAjIG9mIENsaXBzID0gJWQiLCBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQpOwotCi0gICAgICAgIG1DbGlwTGlzdCA9IChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqKSpwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyKikiTHZQUCwgY29weSBvZiBwQ2xpcExpc3QiKTsKLQotICAgICAgICBpZihOVUxMID09IG1DbGlwTGlzdCkgewotICAgICAgICAgICAgQUxPR0UoImxvYWRFZGl0U2V0dGluZ3M6IE1hbGxvYyBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKW1DbGlwTGlzdCwwLAotICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqKSpwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcik7Ci0KLSAgICAgICAgZm9yKGk9MDtpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyO2krKykgewotCi0gICAgICAgICAgICAvLyBBbGxvY2F0ZSBjdXJyZW50IGNsaXAKLSAgICAgICAgICAgIG1DbGlwTGlzdFtpXSA9Ci0gICAgICAgICAgICAgKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpLE00VlMsKE00T1NBX0NoYXIqKSJjbGlwIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKG1DbGlwTGlzdFtpXSA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVkaXRTZXR0aW5nczogQWxsb2NhdGlvbiBlcnJvciBmb3IgbUNsaXBMaXN0WyVkXSIsIChpbnQpaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ29weSBwbGFpbiBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1DbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLAotICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSk7Ci0KLSAgICAgICAgICAgIGlmKE5VTEwgIT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKSB7Ci0gICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT5wRmlsZSA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmZpbGVQYXRoU2l6ZSwgTTRWUywKLSAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopInBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBtQ2xpcExpc3RbaV0tPnBGaWxlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZGl0U2V0dGluZ3MgOiBFUlJPUiBhbGxvY2F0aW5nIGZpbGVuYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmZpbGVQYXRoU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiTlVMTCBmaWxlIHBhdGgiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgZHVyYXRpb24gb2YgYWxsIGNsaXBzCi0gICAgICAgICAgICBpQ2xpcER1cmF0aW9uID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSAtCi0gICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgICAgICBtQ2xpcFRvdGFsRHVyYXRpb24gPSBtQ2xpcFRvdGFsRHVyYXRpb24raUNsaXBEdXJhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKG1FZmZlY3RzU2V0dGluZ3MgPT0gTlVMTCkgewotICAgICAgICBtTnVtYmVyRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotICAgICAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5nczogbU51bWJlckVmZmVjdHMgPSAlZCIsIG1OdW1iZXJFZmZlY3RzKTsKLQotICAgICAgICBpZihtTnVtYmVyRWZmZWN0cyAhPSAwKSB7Ci0gICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgIG1OdW1iZXJFZmZlY3RzKnNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpLAotICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiZWZmZWN0cyBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVmZmVjdHNTZXR0aW5nczogQWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopbUVmZmVjdHNTZXR0aW5ncywwLAotICAgICAgICAgICAgIG1OdW1iZXJFZmZlY3RzKnNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJFZmZlY3RzO2krKykgewotCi0gICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggPSBOVUxMOwotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBUZXh0QnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSYobUVmZmVjdHNTZXR0aW5nc1tpXSksCi0gICAgICAgICAgICAgICAgICh2b2lkICopJihwU2V0dGluZ3MtPkVmZmVjdHNbaV0pLAotICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSk7Ci0KLSAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHBGcmFtaW5nIFJHQiBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImx2cHAgZnJhbWluZyBidWZmZXIiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZmZlY3RzU2V0dGluZ3M6QWxsb2MgZXJyb3IgZm9yIHBGcmFtaW5nQnVmIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgcGFjX2RhdGEgKFJHQikKLSAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjU2NSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZ2JTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfaGVpZ2h0KjI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigKLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnJnYlR5cGUgPT0gTTRWU1MzR1BQX2tSR0I4ODgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJnYlNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9oZWlnaHQqMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOiB3cm9uZyBSR0IgdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocmdiU2l6ZSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiZnJhbWluZyBidWZmZXIgcGFjX2RhdGEiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZih0bXAgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZmZlY3RzU2V0dGluZ3M6QWxsb2MgZXJyb3IgcEZyYW1pbmdCdWYgcGFjIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcEZyYW1pbmdCdWZmZXIqLwotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhID0gdG1wOwotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X2hlaWdodDsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3N0cmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9zdHJpZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfdG9wbGVmdDsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZCA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZTsKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIHBGcmFtaW5nIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+cGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICByZ2JTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucmdiVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5yZ2JUeXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9PSBOVUxMKSB7Ci0KLSAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmcgPSAoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgc2l6ZW9mKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKSwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIqKSJMdlBQLCBjb3B5IG9mIGJnbVNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoTlVMTCA9PSBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZykgewotICAgICAgICAgICAgQUxPR0UoImxvYWRFZGl0U2V0dGluZ3M6IG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nIE1hbGxvYyBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbXNldCgodm9pZCAqKW1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLCAwLHNpemVvZihNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyopKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopbUJhY2tncm91bmRBdWRpb1NldHRpbmcsICh2b2lkICopYmdtU2V0dGluZ3MsIHNpemVvZihNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncykpOwotCi0gICAgICAgIGlmICggbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnBGaWxlICE9IE00T1NBX05VTEwgKSB7Ci0KLSAgICAgICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT5wRmlsZSA9IChNNE9TQV9Wb2lkKikgYmdtU2V0dGluZ3MtPnBQQ01GaWxlUGF0aDsKLSAgICAgICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT51aU5iQ2hhbm5lbHMgPSAyOwotICAgICAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAzMjAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE9wZW4gdGhlIEJHIGZpbGUKLSAgICAgICAgaWYgKCBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+cEZpbGUgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkT3BlbigmbUF1ZGlvTWl4UENNRmlsZUhhbmRsZSwKLSAgICAgICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+cEZpbGUsIE00T1NBX2tGaWxlUmVhZCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzOiBtQmFja2dyb3VuZEF1ZGlvIFBDTSBGaWxlIG9wZW4gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIG1PdXRwdXRWaWRlb1NpemUgPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgIG1GcmFtZVN0ci5wQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBBTE9HVigic2V0U3VyZmFjZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtU3VyZmFjZSA9IHN1cmZhY2U7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzdGFydFByZXZpZXcoCi0gICAgTTRPU0FfVUludDMyIGZyb21NUywgTTRPU0FfSW50MzIgdG9NcywgTTRPU0FfVUludDE2IGNhbGxCYWNrQWZ0ZXJGcmFtZUNvdW50LAotICAgIE00T1NBX0Jvb2wgbG9vcCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLCBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IDA7Ci0gICAgQUxPR1YoInN0YXJ0UHJldmlldyIpOwotCi0gICAgaWYoZnJvbU1TID4gKE00T1NBX1VJbnQzMil0b01zKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6IGZyb21NUyA+IHRvTXMiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZih0b01zID09IDApIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0UHJldmlldzogdG9NcyBpcyAwIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLy8gSWYgYWxyZWFkeSBzdGFydGVkLCB0aGVuIHN0b3AgcHJldmlldyBmaXJzdAotICAgIGZvcihpbnQgcGxheWVySW5zdD0wOyBwbGF5ZXJJbnN0PGtUb3RhbE51bVBsYXllckluc3RhbmNlczsgcGxheWVySW5zdCsrKSB7Ci0gICAgICAgIGlmKG1WZVBsYXllcltwbGF5ZXJJbnN0XSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBzdG9wcGluZyBwcmV2aW91c2x5IHN0YXJ0ZWQgcHJldmlldyBwbGF5YmFjayIpOwotICAgICAgICAgICAgc3RvcFByZXZpZXcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgcmVuZGVyUHJldmlldyB3YXMgY2FsbGVkIHByZXZpb3VzbHksIHRoZW4gZGVsZXRlIFJlbmRlcmVyIG9iamVjdCBmaXJzdAotICAgIGlmKG1UYXJnZXQgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBkZWxldGUgcHJldmlvdXMgUHJldmlld1JlbmRlcmVyIik7Ci0gICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgQXVkaW8gcGxheWVyIHRvIGJlIHVzZWQgZm9yIGVudGlyZQotICAgIC8vIHN0b3J5Ym9hcmQgZHVyYXRpb24KLSAgICBtVkVBdWRpb1NpbmsgPSBuZXcgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQoKTsKLSAgICBtVkVBdWRpb1BsYXllciA9IG5ldyBWaWRlb0VkaXRvckF1ZGlvUGxheWVyKG1WRUF1ZGlvU2luayk7Ci0gICAgbVZFQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4U2V0dGluZ3MobUJhY2tncm91bmRBdWRpb1NldHRpbmcpOwotICAgIG1WRUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFBDTUZpbGVIYW5kbGUobUF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0KLSAgICAvLyBDcmVhdGUgVmlkZW8gUmVuZGVyZXIgdG8gYmUgdXNlZCBmb3IgdGhlIGVudGlyZSBzdG9yeWJvYXJkIGR1cmF0aW9uLgotICAgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKG1PdXRwdXRWaWRlb1NpemUsICZ3aWR0aCwgJmhlaWdodCk7Ci0gICAgbU5hdGl2ZVdpbmRvd1JlbmRlcmVyID0gbmV3IE5hdGl2ZVdpbmRvd1JlbmRlcmVyKG1TdXJmYWNlLCB3aWR0aCwgaGVpZ2h0KTsKLQotICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IGxvb3AgPSAlZCIsIGxvb3ApOwotICAgIG1QcmV2aWV3TG9vcGluZyA9IGxvb3A7Ci0KLSAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBjYWxsQmFja0FmdGVyRnJhbWVDb3VudCA9ICVkIiwgY2FsbEJhY2tBZnRlckZyYW1lQ291bnQpOwotICAgIG1DYWxsQmFja0FmdGVyRnJhbWVDbnQgPSBjYWxsQmFja0FmdGVyRnJhbWVDb3VudDsKLQotICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7IHBsYXllckluc3QrKykgewotICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0gPSBuZXcgVmlkZW9FZGl0b3JQbGF5ZXIobU5hdGl2ZVdpbmRvd1JlbmRlcmVyKTsKLSAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6RXJyb3IgY3JlYXRpbmcgVmlkZW9FZGl0b3JQbGF5ZXIgJWQiLHBsYXllckluc3QpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IG9iamVjdCBjcmVhdGVkIik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zZXROb3RpZnlDYWxsYmFjayh0aGlzLChub3RpZnlfY2FsbGJhY2tfZilub3RpZnkpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBub3RpZnkgY2FsbGJhY2sgc2V0Iik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5sb2FkRWZmZWN0c1NldHRpbmdzKG1FZmZlY3RzU2V0dGluZ3MsCi0gICAgICAgICBtTnVtYmVyRWZmZWN0cyk7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IGVmZmVjdHMgc2V0dGluZ3MgbG9hZGVkIik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5sb2FkQXVkaW9NaXhTZXR0aW5ncyhtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyk7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IEF1ZGlvTWl4U2V0dGluZ3Mgc2V0dGluZ3MgbG9hZGVkIik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zZXRBdWRpb01peFBDTUZpbGVIYW5kbGUobUF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IEF1ZGlvTWl4UENNRmlsZUhhbmRsZSBzZXQiKTsKLQotICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPnNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCgKLSAgICAgICAgIG1DYWxsQmFja0FmdGVyRnJhbWVDbnQpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBzZXRQcm9ncmVzc0NhbGxCYWNrSW50ZXJ2YWwiKTsKLSAgICB9Ci0KLSAgICBtUGxheWVyU3RhdGUgPSBWZVBsYXllcklkbGU7Ci0gICAgbVByZXBhcmVSZXFlc3QgPSBNNE9TQV9GQUxTRTsKLQotICAgIGlmKGZyb21NUyA9PSAwKSB7Ci0gICAgICAgIG1DdXJyZW50Q2xpcE51bWJlciA9IC0xOwotICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lID0gbUNsaXBMaXN0WzBdLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IGZyb21NUz0lZCIsIGZyb21NUyk7Ci0gICAgICAgIGlmKGZyb21NUyA+PSBtQ2xpcFRvdGFsRHVyYXRpb24pIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6IGZyb21NUyA+PSBtQ2xpcFRvdGFsRHVyYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDtpKyspIHsKLSAgICAgICAgICAgIGlmKGZyb21NUyA8IChpSW5jcmVtZW50ZWREdXJhdGlvbiArIChtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSAtCi0gICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRvIDEgaW5kZXggYmVsb3csCi0gICAgICAgICAgICAgICAgLy8gYXMgdGhyZWFkUHJvY2VzcyBmaXJzdCBpbmNyZW1lbnRzIHRoZSBjbGlwIGluZGV4Ci0gICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gcHJvY2Vzc2VzIGNsaXAgaW4gdGhyZWFkIGxvb3AKLSAgICAgICAgICAgICAgICBtQ3VycmVudENsaXBOdW1iZXIgPSBpLTE7Ci0gICAgICAgICAgICAgICAgQUxPR0QoInN0YXJ0UHJldmlldzptQ3VycmVudENsaXBOdW1iZXIgPSAlZCBmcm9tTVM9JWQiLGksZnJvbU1TKTsKLQotICAgICAgICAgICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgdmFsdWUKLSAgICAgICAgICAgICAgICBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSA9IG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBTZXQgY29ycmVjdCBiZWdpbiB0aW1lIHRvIHN0YXJ0IHBsYXliYWNrCi0gICAgICAgICAgICAgICAgaWYoKGZyb21NUyttQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSA+Ci0gICAgICAgICAgICAgICAgKGlJbmNyZW1lbnRlZER1cmF0aW9uK21DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lICsKLSAgICAgICAgICAgICAgICAgICAgIChmcm9tTVMgLSBpSW5jcmVtZW50ZWREdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaUluY3JlbWVudGVkRHVyYXRpb24gPSBpSW5jcmVtZW50ZWREdXJhdGlvbiArCi0gICAgICAgICAgICAgICAgIChtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSAtIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcCA9IGlJbmNyZW1lbnRlZER1cmF0aW9uOwotICAgIH0KLQotICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7IHBsYXllckluc3QrKykgewotICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKGZyb21NUywKLSAgICAgICAgIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lLAotICAgICAgICAgbUNsaXBMaXN0W2ldLT5DbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2UpOwotCi0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6c2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCBzZXQgJWQgY3V0dGltZSBcCi0gICAgICAgICAlZCIsIGZyb21NUywgbUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWUpOwotICAgIH0KLQotICAgIG1TdGFydGluZ0NsaXBJbmRleCA9IG1DdXJyZW50Q2xpcE51bWJlcisxOwotCi0gICAgLy8gU3RhcnQgcGxheWluZyB3aXRoIHBsYXllciBpbnN0YW5jZSAwCi0gICAgbUN1cnJlbnRQbGF5ZXIgPSAwOwotICAgIG1BY3RpdmVQbGF5ZXJJbmRleCA9IDA7Ci0KLSAgICBpZih0b01zID09IC0xKSB7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IFByZXZpZXcgdGlsbCBlbmQgb2Ygc3Rvcnlib2FyZCIpOwotICAgICAgICBtTnVtYmVyQ2xpcHNUb1ByZXZpZXcgPSBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7Ci0gICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgdmFsdWUKLSAgICAgICAgbUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWUgPQotICAgICAgICAgbUNsaXBMaXN0W21OdW1iZXJDbGlwc1RvUHJldmlldy0xXS0+dWlFbmRDdXRUaW1lOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogdG9Ncz0lZCIsIHRvTXMpOwotICAgICAgICBpZigoTTRPU0FfVUludDMyKXRvTXMgPiBtQ2xpcFRvdGFsRHVyYXRpb24pIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6IHRvTXMgPiBtQ2xpcFRvdGFsRHVyYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IDA7Ci0KLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDtpKyspIHsKLSAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpdG9NcyA8PSAoaUluY3JlbWVudGVkRHVyYXRpb24gKwotICAgICAgICAgICAgIChtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSAtIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpKSkgewotICAgICAgICAgICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgdmFsdWUKLSAgICAgICAgICAgICAgICBtTGFzdFByZXZpZXdDbGlwRW5kVGltZSA9IG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lOwotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZW5kIGN1dCB0aW1lIG9mIGNsaXAgaW5kZXggaSB0byB0b01zCi0gICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPSB0b01zOwotCi0gICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNsaXBzIHRvIGJlIHByZXZpZXdlZCBpcyBmcm9tIGluZGV4IDAgdG8gaQotICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBieSAxIGFzIGkgc3RhcnRzIGZyb20gMAotICAgICAgICAgICAgICAgIG1OdW1iZXJDbGlwc1RvUHJldmlldyA9IGkrMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlJbmNyZW1lbnRlZER1cmF0aW9uID0gaUluY3JlbWVudGVkRHVyYXRpb24gKwotICAgICAgICAgICAgICAgICAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE9wZW4gdGhlIHRocmVhZCBzZW1hcGhvcmUKLSAgICBNNE9TQV9zZW1hcGhvcmVPcGVuKCZtU2VtVGhyZWFkV2FpdCwgMSk7Ci0KLSAgICAvLyBPcGVuIHRoZSBwcmV2aWV3IHByb2Nlc3MgdGhyZWFkCi0gICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY09wZW4oJm1UaHJlYWRDb250ZXh0LCAoTTRPU0FfVGhyZWFkRG9JdCl0aHJlYWRQcm9jKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgQUxPR0UoIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6TTRPU0FfdGhyZWFkU3luY09wZW4gZXJyb3IgJWQiLCAoaW50KSBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgc3RhY2tzaXplCi0gICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbihtVGhyZWFkQ29udGV4dCwgTTRPU0FfVGhyZWFkU3RhY2tTaXplLAotICAgICAoTTRPU0FfRGF0YU9wdGlvbikga1ByZXZpZXdUaHJlYWRTdGFja1NpemUpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiB0aHJlYWRTeW5jU2V0T3B0aW9uIGVycm9yICVkIiwgKGludCkgZXJyKTsKLSAgICAgICAgTTRPU0FfdGhyZWFkU3luY0Nsb3NlKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgbVRocmVhZENvbnRleHQgPSBOVUxMOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICAvLyBTdGFydCB0aGUgdGhyZWFkCi0gICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNTdGFydChtVGhyZWFkQ29udGV4dCwgKE00T1NBX1ZvaWQqKXRoaXMpOwotICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgQUxPR0UoIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6IHRocmVhZFN5bmNTdGFydCBlcnJvciAlZCIsIChpbnQpIGVycik7Ci0gICAgICAgIE00T1NBX3RocmVhZFN5bmNDbG9zZShtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIG1UaHJlYWRDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgYlN0b3BUaHJlYWRJblByb2dyZXNzID0gZmFsc2U7Ci0KLSAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBwcm9jZXNzIHRocmVhZCBzdGFydGVkIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX1VJbnQzMiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzdG9wUHJldmlldygpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICB1aW50MzJfdCBsYXN0UmVuZGVyZWRGcmFtZVRpbWVNcyA9IDA7Ci0gICAgQUxPR1YoInN0b3BQcmV2aWV3Iik7Ci0KLSAgICAvLyBTdG9wIHRoZSB0aHJlYWQKLSAgICBpZihtVGhyZWFkQ29udGV4dCAhPSBOVUxMKSB7Ci0gICAgICAgIGJTdG9wVGhyZWFkSW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9ja1NlbSk7Ci0gICAgICAgICAgICBpZiAobVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZVBvc3QobVNlbVRocmVhZFdhaXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY1N0b3AobVRocmVhZENvbnRleHQpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1YoInN0b3BQcmV2aWV3OiBlcnJvciAweCV4IGluIHRyeWluZyB0byBzdG9wIHRocmVhZCIsIGVycik7Ci0gICAgICAgICAgICAvLyBDb250aW51ZSBldmVuIGlmIGVycm9yCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jQ2xvc2UobVRocmVhZENvbnRleHQpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoInN0b3BQcmV2aWV3OiBlcnJvciAweCV4IGluIHRyeWluZyB0byBjbG9zZSB0aHJlYWQiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgICAgICAgICAvLyBDb250aW51ZSBldmVuIGlmIGVycm9yCi0gICAgICAgIH0KLQotICAgICAgICBtVGhyZWFkQ29udGV4dCA9IE5VTEw7Ci0gICAgfQotCi0gICAgLy8gQ2xvc2UgdGhlIHNlbWFwaG9yZSBmaXJzdAotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrU2VtKTsKLSAgICAgICAgaWYobVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgZXJyID0gTTRPU0Ffc2VtYXBob3JlQ2xvc2UobVNlbVRocmVhZFdhaXQpOwotICAgICAgICAgICAgQUxPR1YoInN0b3BQcmV2aWV3OiBjbG9zZSBzZW1hcGhvcmUgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIG1TZW1UaHJlYWRXYWl0ID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7IHBsYXllckluc3QrKykgewotICAgICAgICBpZihtVmVQbGF5ZXJbcGxheWVySW5zdF0gIT0gTlVMTCkgewotICAgICAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdLT5pc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzdG9wIHRoZSBwbGF5ZXIgZmlyc3QiKTsKLSAgICAgICAgICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwbGF5ZXJJbnN0ID09IG1BY3RpdmVQbGF5ZXJJbmRleCkgewotICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbGFzdCByZW5kZXJlZCBmcmFtZSB0aW1lIHN0YW1wCi0gICAgICAgICAgICAgICAgbVZlUGxheWVyW21BY3RpdmVQbGF5ZXJJbmRleF0tPmdldExhc3RSZW5kZXJlZFRpbWVNcygmbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL1RoaXMgaXMgdXNlZCB0byBzeW5jcm9uaXplIG9uU3RyZWFtRG9uZSgpIGluIFByZXZpZXdQbGF5ZXIgYW5kCi0gICAgICAgICAgICAvL3N0b3BQcmV2aWV3KCkgaW4gUHJldmlld0NvbnRyb2xsZXIKLSAgICAgICAgICAgIHNwPFZpZGVvRWRpdG9yUGxheWVyPiB0ZW1wID0gbVZlUGxheWVyW3BsYXllckluc3RdOwotICAgICAgICAgICAgdGVtcC0+YWNxdWlyZUxvY2soKTsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9wUHJldmlldzogY2xlYXJpbmcgbVZlUGxheWVyIik7Ci0gICAgICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0uY2xlYXIoKTsKLSAgICAgICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XSA9IE5VTEw7Ci0gICAgICAgICAgICB0ZW1wLT5yZWxlYXNlTG9jaygpOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJzdG9wUHJldmlldzogY2xlYXIgYXVkaW9TaW5rIGFuZCBhdWRpb1BsYXllciIpOwotICAgIG1WRUF1ZGlvU2luay5jbGVhcigpOwotICAgIGlmIChtVkVBdWRpb1BsYXllcikgewotICAgICAgICBkZWxldGUgbVZFQXVkaW9QbGF5ZXI7Ci0gICAgICAgIG1WRUF1ZGlvUGxheWVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBkZWxldGUgbU5hdGl2ZVdpbmRvd1JlbmRlcmVyOwotICAgIG1OYXRpdmVXaW5kb3dSZW5kZXJlciA9IE5VTEw7Ci0KLSAgICAvLyBJZiBpbWFnZSBmaWxlIHBsYXlpbmcsIHRoZW4gZnJlZSB0aGUgYnVmZmVyIHBvaW50ZXIKLSAgICBpZihtRnJhbWVTdHIucEJ1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUobUZyYW1lU3RyLnBCdWZmZXIpOwotICAgICAgICBtRnJhbWVTdHIucEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLy8gUmVzZXQgb3JpZ2luYWwgYmVnaW4gY3V0dGltZSBvZiBmaXJzdCBwcmV2aWV3ZWQgY2xpcCovCi0gICAgbUNsaXBMaXN0W21TdGFydGluZ0NsaXBJbmRleF0tPnVpQmVnaW5DdXRUaW1lID0gbUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWU7Ci0gICAgLy8gUmVzZXQgb3JpZ2luYWwgZW5kIGN1dHRpbWUgb2YgbGFzdCBwcmV2aWV3ZWQgY2xpcCovCi0gICAgbUNsaXBMaXN0W21OdW1iZXJDbGlwc1RvUHJldmlldy0xXS0+dWlFbmRDdXRUaW1lID0gbUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWU7Ci0KLSAgICBtUGxheWVyU3RhdGUgPSBWZVBsYXllcklkbGU7Ci0gICAgbVByZXBhcmVSZXFlc3QgPSBNNE9TQV9GQUxTRTsKLQotICAgIG1DdXJyZW50UGxheWVkRHVyYXRpb24gPSAwOwotICAgIG1DdXJyZW50Q2xpcER1cmF0aW9uID0gMDsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IE00eFZTU19rQmxhY2tCb3JkZXJzOwotICAgIG1PdXRwdXRWaWRlb1dpZHRoID0gMDsKLSAgICBtT3V0cHV0VmlkZW9IZWlnaHQgPSAwOwotCi0gICAgQUxPR1YoInN0b3BQcmV2aWV3KCkgbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMgJWxkIiwgbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMpOwotICAgIHJldHVybiBsYXN0UmVuZGVyZWRGcmFtZVRpbWVNczsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OmNsZWFyU3VyZmFjZSgKLSAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVJbmZvKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZVN0ciA9IHBGcmFtZUluZm87Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dEJ1ZmZlcldpZHRoID0wLCBvdXRwdXRCdWZmZXJIZWlnaHQ9MDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwbGFuZU91dFszXTsKLSAgICBBTE9HVigiSW5zaWRlIHByZXZpZXcgY2xlYXIgZnJhbWUiKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBEZWxldGUgcHJldmlvdXMgcmVuZGVyZXIgaW5zdGFuY2UKLSAgICBpZihtVGFyZ2V0ICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgIH0KLQotICAgIG91dHB1dEJ1ZmZlcldpZHRoID0gcEZyYW1lU3RyLT51aUZyYW1lV2lkdGg7Ci0gICAgb3V0cHV0QnVmZmVySGVpZ2h0ID0gcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0OwotCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVuZGVyZXIKLSAgICBpZihtVGFyZ2V0ID09IE5VTEwpIHsKLQotICAgICAgICBtVGFyZ2V0ID0gUHJldmlld1JlbmRlcmVyOjpDcmVhdGVQcmV2aWV3UmVuZGVyZXIoCi0gICAgICAgICAgICBzdXJmYWNlLAotICAgICAgICAgICAgb3V0cHV0QnVmZmVyV2lkdGgsIG91dHB1dEJ1ZmZlckhlaWdodCk7Ci0KLSAgICAgICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBjYW5ub3QgY3JlYXRlIFByZXZpZXdSZW5kZXJlciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gT3V0IHBsYW5lCi0gICAgdWludDhfdCogb3V0QnVmZmVyOwotICAgIHNpemVfdCBvdXRCdWZmZXJTdHJpZGUgPSAwOwotCi0gICAgQUxPR1YoImRvTWVkaWFSZW5kZXJpbmcgQ0FMTCBnZXRCdWZmZXIoKSIpOwotICAgIG1UYXJnZXQtPmdldEJ1ZmZlcllWMTIoJm91dEJ1ZmZlciwgJm91dEJ1ZmZlclN0cmlkZSk7Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dCBZVVY0MjAgcGxhbmUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFlWMTIgZm9ybWF0Ci0gICAgLy9JbiBZVjEyIGZvcm1hdCwgc2l6ZXMgbXVzdCBiZSBldmVuCi0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZVdpZHRoID0gKChvdXRwdXRCdWZmZXJXaWR0aCArMSk+PjEpPDwxOwotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVIZWlnaHQgPSAoKG91dHB1dEJ1ZmZlckhlaWdodCsxKT4+MSk8PDE7Ci0KLSAgICBwcmVwYXJlWVYxMkltYWdlUGxhbmUocGxhbmVPdXQsIHl2MTJQbGFuZVdpZHRoLCB5djEyUGxhbmVIZWlnaHQsCi0gICAgIChNNE9TQV9VSW50MzIpb3V0QnVmZmVyU3RyaWRlLCAoTTRWSUZJX1VJbnQ4ICopb3V0QnVmZmVyKTsKLQotICAgIC8qIEZpbGwgdGhlIHN1cmZhY2Ugd2l0aCBibGFjayBmcmFtZSAqLwotICAgIG1lbXNldCgodm9pZCAqKXBsYW5lT3V0WzBdLnBhY19kYXRhLDB4MDAscGxhbmVPdXRbMF0udV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVPdXRbMF0udV9oZWlnaHQgKiAxLjUpOwotICAgIG1lbXNldCgodm9pZCAqKXBsYW5lT3V0WzFdLnBhY19kYXRhLDEyOCxwbGFuZU91dFsxXS51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZU91dFsxXS51X2hlaWdodCk7Ci0gICAgbWVtc2V0KCh2b2lkICopcGxhbmVPdXRbMl0ucGFjX2RhdGEsMTI4LHBsYW5lT3V0WzJdLnVfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZU91dFsyXS51X2hlaWdodCk7Ci0KLSAgICBtVGFyZ2V0LT5yZW5kZXJZVjEyKCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnJlbmRlclByZXZpZXdGcmFtZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAotICAgICAgICAgICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVJbmZvLAotICAgICAgICAgICAgVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyAqcEN1cnJFZGl0SW5mbykgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLCBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IDAsIHRuVGltZU1zPTAsIGZyYW1lc2l6ZSA9MDsKLSAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZVN0ciA9IHBGcmFtZUluZm87Ci0gICAgTTRWSUZJX1VJbnQ4ICpwaXhlbEFycmF5ID0gTlVMTDsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKHBDdXJyRWRpdEluZm8gIT0gTlVMTCkgewotICAgICAgICBwQ3VyckVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IC0xOwotICAgIH0KLSAgICAvLyBEZWxldGUgcHJldmlvdXMgcmVuZGVyZXIgaW5zdGFuY2UKLSAgICBpZihtVGFyZ2V0ICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1PdXRwdXRWaWRlb1dpZHRoID09IDApIHsKLSAgICAgICAgbU91dHB1dFZpZGVvV2lkdGggPSBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aDsKLSAgICB9Ci0KLSAgICBpZihtT3V0cHV0VmlkZW9IZWlnaHQgPT0gMCkgewotICAgICAgICBtT3V0cHV0VmlkZW9IZWlnaHQgPSBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQ7Ci0gICAgfQotCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVuZGVyZXIKLSAgICBpZihtVGFyZ2V0ID09IE5VTEwpIHsKLSAgICAgICAgIG1UYXJnZXQgPSBQcmV2aWV3UmVuZGVyZXI6OkNyZWF0ZVByZXZpZXdSZW5kZXJlcigKLSAgICAgICAgICAgIHN1cmZhY2UsCi0gICAgICAgICAgICBtT3V0cHV0VmlkZW9XaWR0aCwgbU91dHB1dFZpZGVvSGVpZ2h0KTsKLQotICAgICAgICBpZihtVGFyZ2V0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGNhbm5vdCBjcmVhdGUgUHJldmlld1JlbmRlcmVyIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwaXhlbEFycmF5ID0gTlVMTDsKLQotICAgIC8vIEFwcGx5IHJvdGF0aW9uIGlmIHJlcXVpcmVkCi0gICAgaWYgKHBGcmFtZVN0ci0+dmlkZW9Sb3RhdGlvbkRlZ3JlZSAhPSAwKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5VmlkZW9Sb3RhdGlvbigoTTRPU0FfVm9pZCAqKXBGcmFtZVN0ci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoLCBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQsCi0gICAgICAgICAgICAgICAgICBwRnJhbWVTdHItPnZpZGVvUm90YXRpb25EZWdyZWUpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGNhbm5vdCByb3RhdGUgdmlkZW8sIGVyciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIC8vIFZpZGVvIHJvdGF0aW9uIGRvbmUuCi0gICAgICAgICAgIC8vIFN3YXAgd2lkdGggYW5kIGhlaWdodCBpZiA5MCBvciAyNzAgZGVncmVlcwotICAgICAgICAgICBpZiAocEZyYW1lU3RyLT52aWRlb1JvdGF0aW9uRGVncmVlICE9IDE4MCkgewotICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wID0gcEZyYW1lU3RyLT51aUZyYW1lV2lkdGg7Ci0gICAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCA9IHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodDsKLSAgICAgICAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodCA9IHRlbXA7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBQb3N0cHJvY2Vzc2luZyAoYXBwbHkgdmlkZW8gZWZmZWN0KQotICAgIGlmKHBGcmFtZVN0ci0+YkFwcGx5RWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLQotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiBlZmZlY3Qgc3RhcnR0aW1lIG1hdGNoZXMgdGhlIGNsaXAgYmVpbmcgcHJldmlld2VkCi0gICAgICAgICAgICBpZigobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA8IHBGcmFtZVN0ci0+Y2xpcEJlZ2luQ3V0VGltZSkKLSAgICAgICAgICAgICB8fChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lID49IHBGcmFtZVN0ci0+Y2xpcEVuZEN1dFRpbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3QgZG9lc24ndCBiZWxvbmcgdG8gdGhpcyBjbGlwLCBjaGVjayBuZXh0IG9uZQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPD0gcEZyYW1lU3RyLT50aW1lTXMpICYmCi0gICAgICAgICAgICAoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUrbUVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PQotICAgICAgICAgICAgIHBGcmFtZVN0ci0+dGltZU1zKSAmJiAobUVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgc2V0VmlkZW9FZmZlY3RUeXBlKG1FZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlLCBUUlVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHNldFZpZGVvRWZmZWN0VHlwZShtRWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSwgRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9Qcm92aWRlIHRoZSBvdmVybGF5IFVwZGF0ZSBpbmRpY2F0aW9uIHdoZW4gdGhlcmUgaXMgYW4gb3ZlcmxheSBlZmZlY3QKLSAgICAgICAgaWYgKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRlJBTUlORykgewotICAgICAgICAgICAgTTRPU0FfVUludDMyIGluZGV4OwotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCAmPSB+VklERU9fRUZGRUNUX0ZSQU1JTkc7IC8vbmV2ZXIgYXBwbHkgZnJhbWluZyBoZXJlLgotCi0gICAgICAgICAgICAvLyBGaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkKLSAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1OdW1iZXJFZmZlY3RzOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZigobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlTdGFydFRpbWUgPD0gcEZyYW1lSW5mby0+dGltZU1zKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpRHVyYXRpb24pID49IHBGcmFtZUluZm8tPnRpbWVNcykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChpbmRleCA8IG1OdW1iZXJFZmZlY3RzKSAmJiAocEN1cnJFZGl0SW5mbyAhPSBOVUxMKSkgewotICAgICAgICAgICAgICAgIHBDdXJyRWRpdEluZm8tPm92ZXJsYXlTZXR0aW5nc0luZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkZyYW1pbmcgaW5kZXggPSAlZCIsIGluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk5vIGZyYW1pbmcgZWZmZWN0cyBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobUN1cnJlbnRWaWRlb0VmZmVjdCAhPSBWSURFT19FRkZFQ1RfTk9ORSkgewotICAgICAgICAgICAgZXJyID0gYXBwbHlWaWRlb0VmZmVjdCgoTTRPU0FfVm9pZCAqKXBGcmFtZVN0ci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLCBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCwKLSAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQsIHBGcmFtZVN0ci0+dGltZU1zLAotICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcGl4ZWxBcnJheSk7Ci0KLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTogYXBwbHlWaWRlb0VmZmVjdCBlcnJvciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICAgICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGZyZWUocGl4ZWxBcnJheSk7Ci0gICAgICAgICAgICAgICAgcGl4ZWxBcnJheSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBBcHBseSB0aGUgcmVuZGVyaW5nIG1vZGUKLSAgICAgICAgICAgIGVyciA9IGRvSW1hZ2VSZW5kZXJpbmdNb2RlKChNNE9TQV9Wb2lkICopcEZyYW1lU3RyLT5wQnVmZmVyLAotICAgICAgICAgICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsIHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoLAotICAgICAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodCwgKE00T1NBX1ZvaWQgKilwaXhlbEFycmF5KTsKLQotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOmRvSW1hZ2VSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgICAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZnJlZShwaXhlbEFycmF5KTsKLSAgICAgICAgICAgICAgICBwaXhlbEFycmF5ID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvLyBBcHBseSB0aGUgcmVuZGVyaW5nIG1vZGUKLSAgICAgICAgZXJyID0gZG9JbWFnZVJlbmRlcmluZ01vZGUoKE00T1NBX1ZvaWQgKilwRnJhbWVTdHItPnBCdWZmZXIsCi0gICAgICAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLCBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCwKLSAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodCwgKE00T1NBX1ZvaWQgKilwaXhlbEFycmF5KTsKLQotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTogZG9JbWFnZVJlbmRlcmluZ01vZGUgZXJyb3IgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgICAgICAgICBmcmVlKHBpeGVsQXJyYXkpOwotICAgICAgICAgICAgcGl4ZWxBcnJheSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbVRhcmdldC0+cmVuZGVyWVYxMigpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX1ZvaWQgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c2V0Sm5pQ2FsbGJhY2sodm9pZCogY29va2llLAotICAgIGpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QgY2FsbGJhY2tGY3QpIHsKLSAgICAvL0FMT0dWKCJzZXRKbmlDYWxsYmFjayIpOwotICAgIG1KbmlDb29raWUgPSBjb29raWU7Ci0gICAgbUpuaUNhbGxiYWNrID0gY2FsbGJhY2tGY3Q7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpwcmVwYXJlUGxheWVyKAotICAgIHZvaWQqIHBhcmFtLCBpbnQgcGxheWVySW5zdGFuY2UsIGludCBpbmRleCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqcENvbnRyb2xsZXIgPQotICAgICAoVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqKXBhcmFtOwotCi0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IGluc3RhbmNlICVkIGZpbGUgJWQiLCBwbGF5ZXJJbnN0YW5jZSwgaW5kZXgpOwotCi0gICAgY29uc3QgY2hhciogZmlsZU5hbWUgPSAoY29uc3QgY2hhciopIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5wRmlsZTsKLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0RGF0YVNvdXJjZShmaWxlTmFtZSwgTlVMTCk7Ci0KLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0RGF0YVNvdXJjZSBpbnN0YW5jZSAlcyIsCi0gICAgIChjb25zdCBjaGFyICopcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnBGaWxlKTsKLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRWaWRlb1N1cmZhY2UoCi0gICAgIHBDb250cm9sbGVyLT5tU3VyZmFjZSk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldFZpZGVvU3VyZmFjZSIpOwotCi0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldE1lZGlhUmVuZGVyaW5nTW9kZSgKLSAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgIHBDb250cm9sbGVyLT5tT3V0cHV0VmlkZW9TaXplKTsKLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0TWVkaWFSZW5kZXJpbmdNb2RlIik7Ci0KLSAgICBpZigoTTRPU0FfVUludDMyKWluZGV4ID09IHBDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXgpIHsKLSAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldFBsYXliYWNrQmVnaW5UaW1lKAotICAgICAgICBwQ29udHJvbGxlci0+bUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldFBsYXliYWNrQmVnaW5UaW1lKAotICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUpOwotICAgIH0KLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0UGxheWJhY2tCZWdpblRpbWUoJWQpIiwKLSAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lKTsKLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRQbGF5YmFja0VuZFRpbWUoCi0gICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUVuZEN1dFRpbWUpOwotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXRQbGF5YmFja0VuZFRpbWUoJWQpIiwKLSAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpRW5kQ3V0VGltZSk7Ci0KLSAgICBpZihwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoLAotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzIik7Ci0gICAgfQotCi0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnByZXBhcmUoKTsKLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogcHJlcGFyZWQiKTsKLQotICAgIGlmKHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSA+IDApIHsKLSAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNlZWtUbygKLSAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSk7Ci0KLSAgICAgICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNlZWtUbyglZCkiLAotICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICB9Ci0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXJdLT5zZXRBdWRpb1BsYXllcihwQ29udHJvbGxlci0+bVZFQXVkaW9QbGF5ZXIpOwotCi0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnJlYWRGaXJzdFZpZGVvRnJhbWUoKTsKLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogcmVhZEZpcnN0VmlkZW9GcmFtZSBvZiBjbGlwIik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6dGhyZWFkUHJvYyhNNE9TQV9Wb2lkKiBwYXJhbSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0ludDMyIGluZGV4ID0gMDsKLSAgICBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICpwQ29udHJvbGxlciA9Ci0gICAgIChWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICopcGFyYW07Ci0KLSAgICBBTE9HVigiaW5zaWRlIHRocmVhZFByb2MiKTsKLSAgICBpZihwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID09IFZlUGxheWVySWRsZSkgewotICAgICAgICAocENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcikrKzsKLQotICAgICAgICBBTE9HRCgidGhyZWFkUHJvYzogcGxheWluZyBmaWxlIGluZGV4ICVkIHRvdGFsIGNsaXBzICVkIiwKLSAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIsIHBDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXcpOwotCi0gICAgICAgIGlmKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciA+PQotICAgICAgICAgcENvbnRyb2xsZXItPm1OdW1iZXJDbGlwc1RvUHJldmlldykgewotCi0gICAgICAgICAgICBBTE9HRCgiQWxsIGNsaXBzIHByZXZpZXdlZCIpOwotCi0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyID0gMDsKLQotICAgICAgICAgICAgaWYocENvbnRyb2xsZXItPm1QcmV2aWV3TG9vcGluZyA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXg7Ci0KLSAgICAgICAgICAgICAgICBBTE9HRCgiUHJldmlldyBsb29waW5nIFRSVUUsIHJlc3RhcnRpbmcgZnJvbSBjbGlwIGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgc3RvcnkgYm9hcmQgdGltZXN0YW1wIGluc2lkZSB0aGUgcGxheWVyCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgcGxheWVySW5zdD0wOyBwbGF5ZXJJbnN0PGtUb3RhbE51bVBsYXllckluc3RhbmNlczsKLSAgICAgICAgICAgICAgICAgcGxheWVySW5zdCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdF0tPnJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZW5kQXJncyA9IDA7Ci0gICAgICAgICAgICAgICAgaWYocENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwgTVNHX1RZUEVfUFJFVklFV19FTkQsICZlbmRBcmdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9IFZlUGxheWVyQXV0b1N0b3A7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXNldCBvcmlnaW5hbCBiZWdpbiBjdXR0aW1lIG9mIGZpcnN0IHByZXZpZXdlZCBjbGlwCi0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4XS0+dWlCZWdpbkN1dFRpbWUgPQotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWU7Ci0gICAgICAgICAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgZW5kIGN1dHRpbWUgb2YgbGFzdCBwcmV2aWV3ZWQgY2xpcAotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1OdW1iZXJDbGlwc1RvUHJldmlldy0xXS0+dWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1MYXN0UHJldmlld0NsaXBFbmRUaW1lOwotCi0gICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgd2FybmluZyB0byBNNE9TQSB0aHJlYWQgaGFuZGxlcgotICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhyZWFkIGlzIG1vdmVkIGZyb20gZXhlY3V0aW5nIHN0YXRlIHRvIG9wZW4gc3RhdGUKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRleD1wQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyOwotICAgICAgICBpZigoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPT0gcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleCkgewotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24gKz0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwOwotCi0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwRHVyYXRpb24gPQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAtIHBDb250cm9sbGVyLT5tRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZTsKLQotICAgICAgICAgICAgcHJlcGFyZVBsYXllcigodm9pZCopcENvbnRyb2xsZXIsIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllciwgaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24gKz0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwRHVyYXRpb247Ci0KLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlFbmRDdXRUaW1lIC0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyXS0+c2V0U3Rvcnlib2FyZFN0YXJ0VGltZSgKLSAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uKTsKLSAgICAgICAgQUxPR1YoInRocmVhZFByb2M6IHNldFN0b3J5Ym9hcmRTdGFydFRpbWUiKTsKLQotICAgICAgICAvLyBTZXQgdGhlIG5leHQgY2xpcCBkdXJhdGlvbiBmb3IgQXVkaW8gbWl4IGhlcmUKLSAgICAgICAgaWYoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyICE9IHBDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXgpIHsKLQotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXJdLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbSgKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbiwKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvVm9sdW1lUGVyY2VudGFnZSk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJ0aHJlYWRQcm9jOiBzZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbSBmcm9tTVMgJWQgXAotICAgICAgICAgICAgIENsaXBCZWdpblRpbWUgJWQiLCBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbiArCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+Q2xpcFByb3BlcnRpZXMudWlDbGlwQXVkaW9Wb2x1bWVQZXJjZW50YWdlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBDYXB0dXJlIHRoZSBhY3RpdmUgcGxheWVyIGJlaW5nIHVzZWQKLSAgICAgICAgcENvbnRyb2xsZXItPm1BY3RpdmVQbGF5ZXJJbmRleCA9IHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcjsKLQotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcl0tPnN0YXJ0KCk7Ci0gICAgICAgIEFMT0dWKCJ0aHJlYWRQcm9jOiBzdGFydGVkIik7Ci0KLSAgICAgICAgcENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9IFZlUGxheWVyQnVzeTsKLQotICAgIH0gZWxzZSBpZihwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID09IFZlUGxheWVyQXV0b1N0b3ApIHsKLSAgICAgICAgQUxPR1YoIlByZXZpZXcgY29tcGxldGVkLi5hdXRvIHN0b3AgdGhlIHBsYXllciIpOwotICAgIH0gZWxzZSBpZiAoKHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPT0gVmVQbGF5ZXJCdXN5KSAmJiAocENvbnRyb2xsZXItPm1QcmVwYXJlUmVxZXN0KSkgewotICAgICAgICAvLyBQcmVwYXJlIHRoZSBwbGF5ZXIgaGVyZQotICAgICAgICBwQ29udHJvbGxlci0+bVByZXBhcmVSZXFlc3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgcHJlcGFyZVBsYXllcigodm9pZCopcENvbnRyb2xsZXIsIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllciwKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIrMSk7Ci0gICAgICAgIGlmIChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgZXJyID0gTTRPU0Ffc2VtYXBob3JlV2FpdChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQsCi0gICAgICAgICAgICAgICAgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghcENvbnRyb2xsZXItPmJTdG9wVGhyZWFkSW5Qcm9ncmVzcykgewotICAgICAgICAgICAgQUxPR1YoInRocmVhZFByb2M6IHN0YXRlIGJ1c3kuLi53YWl0IGZvciBzZW0iKTsKLSAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZVdhaXQocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0LAotICAgICAgICAgICAgICAgICBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc2VtIHdhaXQgcmV0dXJuZWQgZXJyID0gMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgLy9BbHdheXMgcmV0dXJuIE00Tk9fRVJST1IgdG8gZW5zdXJlIHRoZSB0aHJlYWQga2VlcHMgcnVubmluZwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6Om5vdGlmeSgKLSAgICB2b2lkKiBjb29raWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikKLXsKLSAgICBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICpwQ29udHJvbGxlciA9Ci0gICAgIChWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICopY29va2llOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgdWludDMyX3QgY2xpcER1cmF0aW9uID0gMDsKLSAgICBzd2l0Y2ggKG1zZykgewotICAgICAgICBjYXNlIE1FRElBX05PUDogLy8gaW50ZXJmYWNlIHRlc3QgbWVzc2FnZQotICAgICAgICAgICAgQUxPR1YoIk1FRElBX05PUCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUVESUFfUFJFUEFSRUQ6Ci0gICAgICAgICAgICBBTE9HVigiTUVESUFfUFJFUEFSRUQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HRCgibm90aWZ5Ok1FRElBX1BMQVlCQUNLX0NPTVBMRVRFLCBtQ3VycmVudENsaXBOdW1iZXIgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpOwotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9IFZlUGxheWVySWRsZTsKLQotICAgICAgICAgICAgLy9zZW5kIHByb2dyZXNzIGNhbGxiYWNrIHdpdGggbGFzdCBmcmFtZSB0aW1lc3RhbXAKLSAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciA9PQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjbGlwRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgIC0gcENvbnRyb2xsZXItPm1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xpcER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAtIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgcGxheWVkRHVyYXRpb24gPSBjbGlwRHVyYXRpb24rcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb247Ci0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwgTVNHX1RZUEVfUFJPR1JFU1NfSU5ESUNBVElPTiwKLSAgICAgICAgICAgICAgICAgJnBsYXllZER1cmF0aW9uKTsKLQotICAgICAgICAgICAgaWYgKChwQ29udHJvbGxlci0+bU92ZXJsYXlTdGF0ZSA9PSBPVkVSTEFZX1VQREFURSkgJiYKLSAgICAgICAgICAgICAgICAoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyICE9Ci0gICAgICAgICAgICAgICAgKHBDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXctMSkpKSB7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyAqcEVkaXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgKFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiQ3VycmVudCBFZGl0IGluZm8iKTsKLSAgICAgICAgICAgICAgICBwRWRpdEluZm8tPm92ZXJsYXlTZXR0aW5nc0luZGV4ID0gZXh0MjsKLSAgICAgICAgICAgICAgICBwRWRpdEluZm8tPmNsaXBJbmRleCA9IHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXI7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPT0gT1ZFUkxBWV9DTEVBUjsKLSAgICAgICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKHBDb250cm9sbGVyLT5tSm5pQ29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19UWVBFX09WRVJMQVlfQ0xFQVIsIHBFZGl0SW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZyZWUocEVkaXRJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2socENvbnRyb2xsZXItPm1Mb2NrU2VtKTsKLSAgICAgICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE1FRElBX0VSUk9SOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZXJyX3ZhbCA9IGV4dDE7Ci0gICAgICAgICAgLy8gQWx3YXlzIGxvZyBlcnJvcnMuCi0gICAgICAgICAgLy8gZXh0MTogTWVkaWEgZnJhbWV3b3JrIGVycm9yIGNvZGUuCi0gICAgICAgICAgLy8gZXh0MjogSW1wbGVtZW50YXRpb24gZGVwZW5kYW50IGVycm9yIGNvZGUuCi0gICAgICAgICAgICBBTE9HRSgiTUVESUFfRVJST1I7IGVycm9yICglZCwgJWQpIiwgZXh0MSwgZXh0Mik7Ci0gICAgICAgICAgICBpZihwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKHBDb250cm9sbGVyLT5tSm5pQ29va2llLAotICAgICAgICAgICAgICAgICBNU0dfVFlQRV9QTEFZRVJfRVJST1IsICZlcnJfdmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTUVESUFfSU5GTzoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGluZm9fdmFsID0gZXh0MjsKLSAgICAgICAgICAgIC8vIGV4dDE6IE1lZGlhIGZyYW1ld29yayBlcnJvciBjb2RlLgotICAgICAgICAgICAgLy8gZXh0MjogSW1wbGVtZW50YXRpb24gZGVwZW5kYW50IGVycm9yIGNvZGUuCi0gICAgICAgICAgICAvL0FMT0dXKCJNRURJQV9JTkZPOyBpbmZvL3dhcm5pbmcgKCVkLCAlZCkiLCBleHQxLCBleHQyKTsKLSAgICAgICAgICAgIGlmKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsCi0gICAgICAgICAgICAgICAgIE1TR19UWVBFX1BST0dSRVNTX0lORElDQVRJT04sICZpbmZvX3ZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE1FRElBX1NFRUtfQ09NUExFVEU6Ci0gICAgICAgICAgICBBTE9HVigiTUVESUFfU0VFS19DT01QTEVURTsgUmVjZWl2ZWQgc2VlayBjb21wbGV0ZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUVESUFfQlVGRkVSSU5HX1VQREFURToKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9CVUZGRVJJTkdfVVBEQVRFOyBidWZmZXJpbmcgJWQiLCBleHQxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1FRElBX1NFVF9WSURFT19TSVpFOgotICAgICAgICAgICAgQUxPR1YoIk1FRElBX1NFVF9WSURFT19TSVpFOyBOZXcgdmlkZW8gc2l6ZSAlZCB4ICVkIiwgZXh0MSwgZXh0Mik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxpbnQ+KDB4QUFBQUFBQUEpOgotICAgICAgICAgICAgQUxPR1YoIlZJREVPIFBMQVlCQUNLIEFMTU9TVCBvdmVyLCBwcmVwYXJlIG5leHQgcGxheWVyIik7Ci0gICAgICAgICAgICAvLyBTZWxlY3QgbmV4dCBwbGF5ZXIgYW5kIHByZXBhcmUgaXQKLSAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY2xpcCBhZnRlciB0aGlzIG9uZQotICAgICAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpKHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIrMSkgPAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXcpIHsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVByZXBhcmVSZXFlc3QgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcisrOwotICAgICAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIgPj0ga1RvdGFsTnVtUGxheWVySW5zdGFuY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllciA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIGZpcnN0IGNsaXAgdG8gYmUgcGxheWVkCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2socENvbnRyb2xsZXItPm1Mb2NrU2VtKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxpbnQ+KDB4QkJCQkJCQkIpOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVklERU8gUExBWUJBQ0ssIFVwZGF0ZSBPdmVybGF5Iik7Ci0gICAgICAgICAgICBpbnQgb3ZlcmxheUluZGV4ID0gZXh0MjsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8gKnBFZGl0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgIChWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8pLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkN1cnJlbnQgRWRpdCBpbmZvIik7Ci0gICAgICAgICAgICAvL2V4dDEgPSAxOyBzdGFydCB0aGUgb3ZlcmxheSBkaXNwbGF5Ci0gICAgICAgICAgICAvLyAgICAgPSAyOyBDbGVhciB0aGUgb3ZlcmxheS4KLSAgICAgICAgICAgIHBFZGl0SW5mby0+b3ZlcmxheVNldHRpbmdzSW5kZXggPSBleHQyOwotICAgICAgICAgICAgcEVkaXRJbmZvLT5jbGlwSW5kZXggPSBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyOwotICAgICAgICAgICAgQUxPR1YoInBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPSAlZCIscENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcik7Ci0gICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dDEgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bU92ZXJsYXlTdGF0ZSA9IE9WRVJMQVlfVVBEQVRFOwotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKHBDb250cm9sbGVyLT5tSm5pQ29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1RZUEVfT1ZFUkxBWV9VUERBVEUsIHBFZGl0SW5mbyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPSBPVkVSTEFZX0NMRUFSOwotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKHBDb250cm9sbGVyLT5tSm5pQ29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1RZUEVfT1ZFUkxBWV9DTEVBUiwgcEVkaXRJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHBFZGl0SW5mbyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoInVucmVjb2duaXplZCBtZXNzYWdlOiAoJWQsICVkLCAlZCkiLCBtc2csIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnNldFZpZGVvRWZmZWN0VHlwZSgKLSAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHR5cGUsIE00T1NBX0Jvb2wgZW5hYmxlKSB7Ci0KLSAgICBNNE9TQV9VSW50MzIgZWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0KLSAgICAvLyBtYXAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0byBsb2NhbCBlbnVtCi0gICAgc3dpdGNoKHR5cGUpIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZBREVGUk9NQkxBQ0s7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0JMQUNLQU5EV0hJVEU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfUElOSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW46Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfR1JFRU47Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX1NFUElBOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9ORUdBVElWRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZzoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GUkFNSU5HOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZJRlRJRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfQ09MT1JfUkdCMTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0dSQURJRU5UOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYoZW5hYmxlID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgLy8gSWYgYWxyZWFkeSBzZXQsIHRoZW4gbm8gbmVlZCB0byBzZXQgYWdhaW4KLSAgICAgICAgaWYoIShtQ3VycmVudFZpZGVvRWZmZWN0ICYgZWZmZWN0KSkKLSAgICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgfD0gZWZmZWN0OwotICAgICAgICAgICAgaWYoZWZmZWN0ID09IFZJREVPX0VGRkVDVF9GSUZUSUVTKSB7Ci0gICAgICAgICAgICAgICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlICB7Ci0gICAgICAgIC8vIFJlc2V0IG9ubHkgaWYgYWxyZWFkeSBzZXQKLSAgICAgICAgaWYobUN1cnJlbnRWaWRlb0VmZmVjdCAmIGVmZmVjdCkKLSAgICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgJj0gfmVmZmVjdDsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OmFwcGx5VmlkZW9FZmZlY3QoCi0gICAgTTRPU0FfVm9pZCAqIGRhdGFQdHIsIE00T1NBX1VJbnQzMiBjb2xvckZvcm1hdCwgTTRPU0FfVUludDMyIHZpZGVvV2lkdGgsCi0gICAgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0LCBNNE9TQV9VSW50MzIgdGltZU1zLCBNNE9TQV9Wb2lkKiBvdXRQdHIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHZlUG9zdFByb2Nlc3NQYXJhbXMgcG9zdFByb2Nlc3NQYXJhbXM7Ci0KLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy52aWRCdWZmZXIgPSAoTTRWSUZJX1VJbnQ4KilkYXRhUHRyOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLnZpZGVvV2lkdGggPSB2aWRlb1dpZHRoOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLnZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMudGltZU1zID0gdGltZU1zOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLnRpbWVPZmZzZXQgPSAwOyAvL1NpbmNlIHRpbWVNUyBhbHJlYWR5IHRha2VzIGNhcmUgb2Ygb2Zmc2V0IGluIHRoaXMgY2FzZQotICAgIHBvc3RQcm9jZXNzUGFyYW1zLmVmZmVjdHNTZXR0aW5ncyA9IG1FZmZlY3RzU2V0dGluZ3M7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMubnVtYmVyRWZmZWN0cyA9IG1OdW1iZXJFZmZlY3RzOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLm91dFZpZGVvV2lkdGggPSBtT3V0cHV0VmlkZW9XaWR0aDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5vdXRWaWRlb0hlaWdodCA9IG1PdXRwdXRWaWRlb0hlaWdodDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5jdXJyZW50VmlkZW9FZmZlY3QgPSBtQ3VycmVudFZpZGVvRWZmZWN0OwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLnJlbmRlcmluZ01vZGUgPSBtUmVuZGVyaW5nTW9kZTsKLSAgICBpZihtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgIHBvc3RQcm9jZXNzUGFyYW1zLmlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICBwb3N0UHJvY2Vzc1BhcmFtcy5pc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotICAgIC8vcG9zdFByb2Nlc3NQYXJhbXMucmVuZGVyZXIgPSBtVGFyZ2V0OwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLm92ZXJsYXlGcmFtZVJHQkJ1ZmZlciA9IE5VTEw7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMub3ZlcmxheUZyYW1lWVVWQnVmZmVyID0gTlVMTDsKLQotICAgIG1UYXJnZXQtPmdldEJ1ZmZlcllWMTIoJihwb3N0UHJvY2Vzc1BhcmFtcy5wT3V0QnVmZmVyKSwgJihwb3N0UHJvY2Vzc1BhcmFtcy5vdXRCdWZmZXJTdHJpZGUpKTsKLQotICAgIGVyciA9IGFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGUoJnBvc3RQcm9jZXNzUGFyYW1zLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c2V0UHJldmlld0ZyYW1lUmVuZGVyaW5nTW9kZSgKLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbW9kZSwgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKSB7Ci0KLSAgICBBTE9HVigic2V0TWVkaWFSZW5kZXJpbmdNb2RlOiBvdXRwdXRWaWRlb1NpemUgPSAlZCIsIG91dHB1dFZpZGVvU2l6ZSk7Ci0gICAgbVJlbmRlcmluZ01vZGUgPSBtb2RlOwotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgLyogZ2V0IHRoZSB2aWRlbyB3aWR0aCBhbmQgaGVpZ2h0IGJ5IHJlc29sdXRpb24gKi8KLSAgICBlcnIgPSBnZXRWaWRlb1NpemVCeVJlc29sdXRpb24ob3V0cHV0VmlkZW9TaXplLAotICAgICAgICAgICAgICAmbU91dHB1dFZpZGVvV2lkdGgsICZtT3V0cHV0VmlkZW9IZWlnaHQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OmRvSW1hZ2VSZW5kZXJpbmdNb2RlKAotICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLCBNNE9TQV9VSW50MzIgY29sb3JGb3JtYXQsIE00T1NBX1VJbnQzMiB2aWRlb1dpZHRoLAotICAgIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodCwgTTRPU0FfVm9pZCogb3V0UHRyKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwbGFuZUluWzNdLCBwbGFuZU91dFszXTsKLSAgICBNNFZJRklfVUludDggKmluQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgb3V0cHV0QnVmZmVyV2lkdGggPTAsIG91dHB1dEJ1ZmZlckhlaWdodD0wOwotCi0gICAgLy9mcmFtZVNpemUgPSAodmlkZW9XaWR0aCp2aWRlb0hlaWdodCozKSA+PiAxOwotICAgIGluQnVmZmVyID0gKE00T1NBX1VJbnQ4ICopZGF0YVB0cjsKLQotICAgIC8vIEluIHBsYW5lCi0gICAgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUocGxhbmVJbiwgdmlkZW9XaWR0aCwKLSAgICAgIHZpZGVvSGVpZ2h0LCAoTTRWSUZJX1VJbnQ4ICopaW5CdWZmZXIsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0KTsKLQotICAgIG91dHB1dEJ1ZmZlcldpZHRoID0gbU91dHB1dFZpZGVvV2lkdGg7Ci0gICAgb3V0cHV0QnVmZmVySGVpZ2h0ID0gbU91dHB1dFZpZGVvSGVpZ2h0OwotCi0gICAgLy8gT3V0IHBsYW5lCi0gICAgdWludDhfdCogb3V0QnVmZmVyOwotICAgIHNpemVfdCBvdXRCdWZmZXJTdHJpZGUgPSAwOwotCi0gICAgQUxPR1YoImRvTWVkaWFSZW5kZXJpbmcgQ0FMTCBnZXRCdWZmZXIoKSIpOwotICAgIG1UYXJnZXQtPmdldEJ1ZmZlcllWMTIoJm91dEJ1ZmZlciwgJm91dEJ1ZmZlclN0cmlkZSk7Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dCBZVVY0MjAgcGxhbmUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFlWMTIgZm9ybWF0Ci0gICAgLy9JbiBZVjEyIGZvcm1hdCwgc2l6ZXMgbXVzdCBiZSBldmVuCi0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZVdpZHRoID0gKChtT3V0cHV0VmlkZW9XaWR0aCArMSk+PjEpPDwxOwotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVIZWlnaHQgPSAoKG1PdXRwdXRWaWRlb0hlaWdodCsxKT4+MSk8PDE7Ci0KLSAgICBwcmVwYXJlWVYxMkltYWdlUGxhbmUocGxhbmVPdXQsIHl2MTJQbGFuZVdpZHRoLCB5djEyUGxhbmVIZWlnaHQsCi0gICAgIChNNE9TQV9VSW50MzIpb3V0QnVmZmVyU3RyaWRlLCAoTTRWSUZJX1VJbnQ4ICopb3V0QnVmZmVyKTsKLQotICAgIGVyciA9IGFwcGx5UmVuZGVyaW5nTW9kZShwbGFuZUluLCBwbGFuZU91dCwgbVJlbmRlcmluZ01vZGUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJkb0ltYWdlUmVuZGVyaW5nTW9kZTogYXBwbHlSZW5kZXJpbmdNb2RlIHJldHVybmVkIGVycj0weCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi19IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3NTZmMzIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9WRV9QUkVWSUVXQ09OVFJPTExFUl9ICi0jZGVmaW5lIEFORFJPSURfVkVfUFJFVklFV0NPTlRST0xMRVJfSAotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JQbGF5ZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclRvb2xzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gQ2FsbGJhY2sgbWVjaGFuaXNtIGZyb20gUHJldmlld0NvbnRyb2xsZXIgdG8gSm5pICAqLwotdHlwZWRlZiB2b2lkICgqam5pX3Byb2dyZXNzX2NhbGxiYWNrX2ZjdCkodm9pZCogY29va2llLCBNNE9TQV9VSW50MzIgbXNnVHlwZSwgdm9pZCAqYXJnYyk7Ci0KLXN0cnVjdCBTdXJmYWNlOwotc3RydWN0IFByZXZpZXdSZW5kZXJlcjsKLQotY2xhc3MgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciB7Ci0KLXB1YmxpYzoKLSAgICBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKCk7Ci0gICAgflZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIoKTsKLQotICAgIE00T1NBX0VSUiBsb2FkRWRpdFNldHRpbmdzKAotICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzLAotICAgICAgICAgICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIGJnbVNldHRpbmdzKTsKLQotICAgIE00T1NBX0VSUiBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKLQotICAgIE00T1NBX0VSUiBzdGFydFByZXZpZXcoCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgZnJvbU1TLCBNNE9TQV9JbnQzMiB0b01zLAotICAgICAgICAgICAgTTRPU0FfVUludDE2IGNhbGxCYWNrQWZ0ZXJGcmFtZUNvdW50LAotICAgICAgICAgICAgTTRPU0FfQm9vbCBsb29wKSA7Ci0KLSAgICBNNE9TQV9VSW50MzIgc3RvcFByZXZpZXcoKTsKLQotICAgIE00T1NBX0VSUiByZW5kZXJQcmV2aWV3RnJhbWUoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSwKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbywKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8gKnBDdXJyRWRpdEluZm8pOwotCi0gICAgTTRPU0FfRVJSIGNsZWFyU3VyZmFjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlLAotICAgICAgICAgICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVJbmZvKTsKLQotICAgIE00T1NBX1ZvaWQgc2V0Sm5pQ2FsbGJhY2soCi0gICAgICAgICAgICB2b2lkKiBjb29raWUsCi0gICAgICAgICAgICBqbmlfcHJvZ3Jlc3NfY2FsbGJhY2tfZmN0IGNhbGxiYWNrRmN0KTsKLQotICAgIHN0YXR1c190IHNldFByZXZpZXdGcmFtZVJlbmRlcmluZ01vZGUoCi0gICAgICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbW9kZSwKLSAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG91dHB1dFZpZGVvU2l6ZSk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtUb3RhbE51bVBsYXllckluc3RhbmNlcyA9IDIsCi0gICAgICAgIGtQcmV2aWV3VGhyZWFkU3RhY2tTaXplID0gNjU1MzYsCi0gICAgfTsKLQotICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgIFZlUGxheWVySWRsZSA9IDAsCi0gICAgICAgIFZlUGxheWVyQnVzeSwKLSAgICAgICAgVmVQbGF5ZXJBdXRvU3RvcAotICAgIH0gUGxheWVyU3RhdGU7Ci0KLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBPVkVSTEFZX1VQREFURSA9IDAsCi0gICAgICAgIE9WRVJMQVlfQ0xFQVIKLSAgICB9IE92ZXJsYXlTdGF0ZTsKLQotICAgIHNwPFZpZGVvRWRpdG9yUGxheWVyPiBtVmVQbGF5ZXJba1RvdGFsTnVtUGxheWVySW5zdGFuY2VzXTsKLSAgICBpbnQgbUN1cnJlbnRQbGF5ZXI7ICAvLyBwbGF5ZXIgaW5zdGFuY2UgY3VycmVudGx5IGJlaW5nIHVzZWQKLSAgICBzcDxTdXJmYWNlPiAgbVN1cmZhY2U7Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBNNE9TQV9Db250ZXh0IG1UaHJlYWRDb250ZXh0OwotICAgIFBsYXllclN0YXRlIG1QbGF5ZXJTdGF0ZTsKLSAgICBNNE9TQV9Cb29sICAgIG1QcmVwYXJlUmVxZXN0OwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKiptQ2xpcExpc3Q7Ci0gICAgTTRPU0FfVUludDMyIG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDsKLSAgICBNNE9TQV9VSW50MzIgbU51bWJlckNsaXBzVG9QcmV2aWV3OwotICAgIE00T1NBX1VJbnQzMiBtU3RhcnRpbmdDbGlwSW5kZXg7Ci0gICAgTTRPU0FfQm9vbCBtUHJldmlld0xvb3Bpbmc7Ci0gICAgTTRPU0FfVUludDMyIG1DYWxsQmFja0FmdGVyRnJhbWVDbnQ7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBtRWZmZWN0c1NldHRpbmdzOwotICAgIE00T1NBX1VJbnQzMiBtTnVtYmVyRWZmZWN0czsKLSAgICBNNE9TQV9JbnQzMiBtQ3VycmVudENsaXBOdW1iZXI7Ci0gICAgTTRPU0FfVUludDMyIG1DbGlwVG90YWxEdXJhdGlvbjsKLSAgICBNNE9TQV9VSW50MzIgbUN1cnJlbnRWaWRlb0VmZmVjdDsKLSAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogbUJhY2tncm91bmRBdWRpb1NldHRpbmc7Ci0gICAgTTRPU0FfQ29udGV4dCBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlOwotICAgIFByZXZpZXdSZW5kZXJlciAqbVRhcmdldDsKLSAgICBNNE9TQV9Db250ZXh0IG1KbmlDb29raWU7Ci0gICAgam5pX3Byb2dyZXNzX2NhbGxiYWNrX2ZjdCBtSm5pQ2FsbGJhY2s7Ci0gICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyIG1GcmFtZVN0cjsKLSAgICBNNE9TQV9VSW50MzIgbUN1cnJlbnRQbGF5ZWREdXJhdGlvbjsKLSAgICBNNE9TQV9VSW50MzIgbUN1cnJlbnRDbGlwRHVyYXRpb247Ci0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgbU91dHB1dFZpZGVvU2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgbUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWU7Ci0gICAgTTRPU0FfVUludDMyIG1MYXN0UHJldmlld0NsaXBFbmRUaW1lOwotICAgIE00T1NBX1VJbnQzMiBtVmlkZW9TdG9yeUJvYXJkVGltZU1zVXB0b0ZpcnN0UHJldmlld0NsaXA7Ci0gICAgT3ZlcmxheVN0YXRlIG1PdmVybGF5U3RhdGU7Ci0gICAgaW50IG1BY3RpdmVQbGF5ZXJJbmRleDsKLQotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtUmVuZGVyaW5nTW9kZTsKLSAgICB1aW50MzJfdCBtT3V0cHV0VmlkZW9XaWR0aDsKLSAgICB1aW50MzJfdCBtT3V0cHV0VmlkZW9IZWlnaHQ7Ci0gICAgYm9vbCBiU3RvcFRocmVhZEluUHJvZ3Jlc3M7Ci0gICAgTTRPU0FfQ29udGV4dCBtU2VtVGhyZWFkV2FpdDsKLSAgICBib29sIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkOwotCi0gICAgc3A8VmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ+IG1WRUF1ZGlvU2luazsKLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICptVkVBdWRpb1BsYXllcjsKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlciogbU5hdGl2ZVdpbmRvd1JlbmRlcmVyOwotCi0gICAgTTRWSUZJX1VJbnQ4KiAgbUZyYW1lUkdCQnVmZmVyOwotICAgIE00VklGSV9VSW50OCogIG1GcmFtZVlVVkJ1ZmZlcjsKLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrU2VtOwotCi0KLSAgICBzdGF0aWMgTTRPU0FfRVJSIHByZXBhcmVQbGF5ZXIodm9pZCogcGFyYW0sIGludCBwbGF5ZXJJbnN0YW5jZSwgaW50IGluZGV4KTsKLSAgICBzdGF0aWMgTTRPU0FfRVJSIHRocmVhZFByb2MoTTRPU0FfVm9pZCogcGFyYW0pOwotICAgIHN0YXRpYyB2b2lkIG5vdGlmeSh2b2lkKiBjb29raWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0Mik7Ci0KLSAgICB2b2lkIHNldFZpZGVvRWZmZWN0VHlwZShNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHR5cGUsIE00T1NBX0Jvb2wgZW5hYmxlKTsKLQotICAgIE00T1NBX0VSUiBhcHBseVZpZGVvRWZmZWN0KAotICAgICAgICAgICAgTTRPU0FfVm9pZCAqIGRhdGFQdHIsIE00T1NBX1VJbnQzMiBjb2xvckZvcm1hdCwKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB2aWRlb1dpZHRoLCBNNE9TQV9VSW50MzIgdmlkZW9IZWlnaHQsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdGltZU1zLCBNNE9TQV9Wb2lkKiBvdXRQdHIpOwotCi0gICAgTTRPU0FfRVJSIGRvSW1hZ2VSZW5kZXJpbmdNb2RlKAotICAgICAgICAgICAgTTRPU0FfVm9pZCAqIGRhdGFQdHIsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgY29sb3JGb3JtYXQsIE00T1NBX1VJbnQzMiB2aWRlb1dpZHRoLAotICAgICAgICAgICAgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0LCBNNE9TQV9Wb2lkKiBvdXRQdHIpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZSEKLSAgICBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKGNvbnN0IFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgJik7Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAmb3BlcmF0b3I9KAotICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAmKTsKLX07Ci0KLX0KLQotI2VuZGlmIC8vIEFORFJPSURfVkVfUFJFVklFV0NPTlRST0xMRVJfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yU1JDLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmJlYWJmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yU1JDLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJWaWRlb0VkaXRvclNSQyIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlICJWaWRlb0VkaXRvclNSQy5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotVmlkZW9FZGl0b3JTUkM6OlZpZGVvRWRpdG9yU1JDKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yU1JDICVwKCVwKSIsIHRoaXMsIHNvdXJjZS5nZXQoKSk7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0RlZmF1bHRTYW1wbGluZ0ZyZXFlbmN5SHogPSBrRnJlcTMyMDAwSHo7Ci0gICAgbVNvdXJjZSA9IHNvdXJjZTsKLSAgICBtUmVzYW1wbGVyID0gTlVMTDsKLSAgICBtQ2hhbm5lbENudCA9IDA7Ci0gICAgbVNhbXBsZVJhdGUgPSAwOwotICAgIG1PdXRwdXRTYW1wbGVSYXRlID0ga0RlZmF1bHRTYW1wbGluZ0ZyZXFlbmN5SHo7Ci0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtSW5pdGlhbFRpbWVTdGFtcFVzID0gLTE7Ci0gICAgbUFjY3VPdXRCdWZmZXJTaXplICA9IDA7Ci0gICAgbVNlZWtUaW1lVXMgPSAtMTsKLSAgICBtQnVmZmVyID0gTlVMTDsKLSAgICBtTGVmdG92ZXIgPSAwOwotICAgIG1Gb3JtYXRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgbVN0b3BQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVNlZWtNb2RlID0gUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzsKLQotICAgIC8vIElucHV0IFNvdXJjZSB2YWxpZGF0aW9uCi0gICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0gICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSk7Ci0KLSAgICAvLyBTZXQgdGhlIG1ldGFkYXRhIG9mIHRoZSBvdXRwdXQgYWZ0ZXIgcmVzYW1wbGluZy4KLSAgICBtT3V0cHV0Rm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgIG1PdXRwdXRGb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrRGVmYXVsdFNhbXBsaW5nRnJlcWVuY3lIeik7Ci0gICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMik7ICAvLyBhbHdheXMgc3RlcmVvCi19Ci0KLVZpZGVvRWRpdG9yU1JDOjp+VmlkZW9FZGl0b3JTUkMoKSB7Ci0gICAgQUxPR1YoIn5WaWRlb0VkaXRvclNSQyAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICBzdG9wKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yU1JDOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgQUxPR1YoInN0YXJ0ICVwKCVwKSIsIHRoaXMsIG1Tb3VyY2UuZ2V0KCkpOwotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICAvLyBTZXQgcmVzYW1wbGVyIGlmIHJlcXVpcmVkCi0gICAgY2hlY2tBbmRTZXRSZXNhbXBsZXIoKTsKLQotICAgIG1TZWVrVGltZVVzID0gLTE7Ci0gICAgbVNlZWtNb2RlID0gUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzsKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgbVNvdXJjZS0+c3RhcnQoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JTUkM6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AgJXAoJXApIiwgdGhpcywgbVNvdXJjZS5nZXQoKSk7Ci0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG1CdWZmZXIpIHsKLSAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0gICAgbVNvdXJjZS0+c3RvcCgpOwotICAgIGlmIChtUmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1SZXNhbXBsZXI7Ci0gICAgICAgIG1SZXNhbXBsZXIgPSBOVUxMOwotICAgIH0KLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbUluaXRpYWxUaW1lU3RhbXBVcyA9IC0xOwotICAgIG1BY2N1T3V0QnVmZmVyU2l6ZSA9IDA7Ci0gICAgbUxlZnRvdmVyID0gMDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IFZpZGVvRWRpdG9yU1JDOjpnZXRGb3JtYXQoKSB7Ci0gICAgQUxPR1YoImdldEZvcm1hdCIpOwotICAgIHJldHVybiBtT3V0cHV0Rm9ybWF0OwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXJfb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIEFMT0dWKCJyZWFkICVwKCVwKSIsIHRoaXMsIG1Tb3VyY2UuZ2V0KCkpOwotICAgICpidWZmZXJfb3V0ID0gTlVMTDsKLQotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgaWYgKG1SZXNhbXBsZXIpIHsKLSAgICAgICAgLy8gU3RvcmUgdGhlIHNlZWsgcGFyYW1ldGVycwotICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0gUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzsKLSAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJyZWFkIFNlZWsgJWxsZCIsIHNlZWtUaW1lVXMpOwotICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSBzZWVrVGltZVVzOwotICAgICAgICAgICAgbVNlZWtNb2RlID0gbW9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGFzayBmb3IgMTAyNCBmcmFtZXMgaW4gb3V0cHV0Ci0gICAgICAgIC8vIHJlc2FtcGxlciBvdXRwdXQgaXMgYWx3YXlzIDIgY2hhbm5lbHMgYW5kIDMyIGJpdHMKLSAgICAgICAgY29uc3Qgc2l6ZV90IGtPdXRwdXRGcmFtZUNvdW50ID0gMTAyNDsKLSAgICAgICAgY29uc3Qgc2l6ZV90IGtCeXRlcyA9IGtPdXRwdXRGcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQzMl90KTsKLSAgICAgICAgaW50MzJfdCAqcFRtcEJ1ZmZlciA9IChpbnQzMl90ICopY2FsbG9jKDEsIGtCeXRlcyk7Ci0gICAgICAgIGlmICghcFRtcEJ1ZmZlcikgewotICAgICAgICAgICAgQUxPR0UoImNhbGxvYyBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5OiAlZCBieXRlcyIsIGtCeXRlcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzYW1wbGUgdG8gdGFyZ2V0IHF1YWxpdHkKLSAgICAgICAgbVJlc2FtcGxlci0+cmVzYW1wbGUocFRtcEJ1ZmZlciwga091dHB1dEZyYW1lQ291bnQsIHRoaXMpOwotCi0gICAgICAgIGlmIChtU3RvcFBlbmRpbmcpIHsKLSAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgIG1TdG9wUGVuZGluZyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hhbmdlIHJlc2FtcGxlciBhbmQgcmV0cnkgaWYgZm9ybWF0IGNoYW5nZSBoYXBwZW5lZAotICAgICAgICBpZiAobUZvcm1hdENoYW5nZWQpIHsKLSAgICAgICAgICAgIG1Gb3JtYXRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBjaGVja0FuZFNldFJlc2FtcGxlcigpOwotICAgICAgICAgICAgZnJlZShwVG1wQnVmZmVyKTsKLSAgICAgICAgICAgIHJldHVybiByZWFkKGJ1ZmZlcl9vdXQsIE5VTEwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQnVmZmVyCi0gICAgICAgIGludDMyX3Qgb3V0QnVmZmVyU2l6ZSA9IGtPdXRwdXRGcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgTWVkaWFCdWZmZXIqIG91dEJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihvdXRCdWZmZXJTaXplKTsKLQotICAgICAgICAvLyBDb252ZXJ0IGJhY2sgdG8gMiBjaGFubmVscyBhbmQgMTYgYml0cwotICAgICAgICBkaXRoZXJBbmRDbGFtcCgKLSAgICAgICAgICAgICAgICAoaW50MzJfdCAqKSgodWludDhfdCopb3V0QnVmZmVyLT5kYXRhKCkgKyBvdXRCdWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgICAgICBwVG1wQnVmZmVyLCBrT3V0cHV0RnJhbWVDb3VudCk7Ci0gICAgICAgIGZyZWUocFRtcEJ1ZmZlcik7Ci0KLSAgICAgICAgLy8gQ29tcHV0ZSBhbmQgc2V0IHRoZSBuZXcgdGltZXN0YW1wCi0gICAgICAgIHNwPE1ldGFEYXRhPiB0byA9IG91dEJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgICAgIGludDY0X3QgdG90YWxPdXREdXJhdGlvblVzID0gKG1BY2N1T3V0QnVmZmVyU2l6ZSAqIDEwMDAwMDApIC8gKG1PdXRwdXRTYW1wbGVSYXRlICogMiAqIDIpOwotICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IG1Jbml0aWFsVGltZVN0YW1wVXMgKyB0b3RhbE91dER1cmF0aW9uVXM7Ci0gICAgICAgIHRvLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIGFjY3VtdWxhdGUgc2l6ZQotICAgICAgICBtQWNjdU91dEJ1ZmZlclNpemUgKz0gb3V0QnVmZmVyU2l6ZTsKLSAgICAgICAgKmJ1ZmZlcl9vdXQgPSBvdXRCdWZmZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gUmVzYW1wbGluZyBub3QgcmVxdWlyZWQuIFJlYWQgYW5kIHBhc3MtdGhyb3VnaC4KLSAgICAgICAgTWVkaWFCdWZmZXIgKmFCdWZmZXI7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJmFCdWZmZXIsIG9wdGlvbnMpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVigicmVhZCByZXR1cm5zIGVyciA9ICVkIiwgZXJyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICAgICAgY2hlY2tBbmRTZXRSZXNhbXBsZXIoKTsKLSAgICAgICAgICAgIHJldHVybiByZWFkKGJ1ZmZlcl9vdXQsIE5VTEwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRU9TIG9yIHNvbWUgb3RoZXIgZXJyb3IKLSAgICAgICAgaWYoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICAqYnVmZmVyX291dCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICpidWZmZXJfb3V0ID0gYUJ1ZmZlcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yU1JDOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwgaW50NjRfdCBwdHMpIHsKLSAgICBBTE9HVigiZ2V0TmV4dEJ1ZmZlciAlZCwgY2hhbiA9ICVkIiwgcEJ1ZmZlci0+ZnJhbWVDb3VudCwgbUNoYW5uZWxDbnQpOwotICAgIHVpbnQzMl90IGRvbmUgPSAwOwotICAgIHVpbnQzMl90IHdhbnQgPSBwQnVmZmVyLT5mcmFtZUNvdW50ICogbUNoYW5uZWxDbnQgKiAyOwotICAgIHBCdWZmZXItPnJhdyA9IG1hbGxvYyh3YW50KTsKLQotICAgIHdoaWxlIChtU3RhcnRlZCAmJiB3YW50ID4gMCkgewotICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBkYXRhIGxlZnQsIHJlYWQgYSBuZXcgYnVmZmVyLgotICAgICAgICBpZiAoIW1CdWZmZXIpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIHNlZWssIHJlc2V0IHRoZSBpbml0aWFsIHRpbWUgc3RhbXAgYW5kIGFjY3VtdWxhdGVkIHRpbWUKLSAgICAgICAgICAgIFJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgICAgICBpZiAobVNlZWtUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlcCBjYWNoZU1vcmVfbCBTZWVrIHJlcXVlc3RlZCA9ICVsbGQiLCB0aGlzLCBtU2Vla1RpbWVVcyk7Ci0gICAgICAgICAgICAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPSBtU2Vla01vZGU7Ci0gICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMsIG1vZGUpOwotICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzID0gLTE7Ci0gICAgICAgICAgICAgICAgbUluaXRpYWxUaW1lU3RhbXBVcyA9IC0xOwotICAgICAgICAgICAgICAgIG1BY2N1T3V0QnVmZmVyU2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJm1CdWZmZXIsICZvcHRpb25zKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGZyZWUocEJ1ZmZlci0+cmF3KTsKLSAgICAgICAgICAgICAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOwotICAgICAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZ2V0TmV4dEJ1ZmZlcjogc291cmNlIHJlYWQgcmV0dXJuZWQgSU5GT19GT1JNQVRfQ0hBTkdFRCIpOwotICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgY2Fubm90IHN3aXRjaCB0byBhIG5ldyBBdWRpb1Jlc2FtcGxlciBiZWNhdXNlCi0gICAgICAgICAgICAgICAgLy8gd2UgYXJlIGluIGEgY2FsbGJhY2sgY2FsbGVkIGJ5IHRoZSBBdWRpb1Jlc2FtcGxlciBpdHNlbGYuIFNvCi0gICAgICAgICAgICAgICAgLy8ganVzdCByZW1lbWJlciB0aGUgZmFjdCB0aGF0IHRoZSBmb3JtYXQgaGFzIGNoYW5nZWQsIGFuZCBsZXQKLSAgICAgICAgICAgICAgICAvLyByZWFkKCkgaGFuZGxlcyB0aGlzLgotICAgICAgICAgICAgICAgIG1Gb3JtYXRDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFT1Mgb3Igc29tZSBvdGhlciBlcnJvcgotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dWKCJFT1Mgb3Igc29tZSBlcnI6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgY2FsbCBzdG9wKCkgaGVyZSBiZWNhdXNlIHN0b3AoKSB3aWxsIHJlbGVhc2UgdGhlCi0gICAgICAgICAgICAgICAgLy8gQXVkaW9SZXNhbXBsZXIsIGFuZCB3ZSBhcmUgaW4gYSBjYWxsYmFjayBvZiB0aGUgQXVkaW9SZXNhbXBsZXIuCi0gICAgICAgICAgICAgICAgLy8gU28ganVzdCByZW1lbWJlciB0aGUgZmFjdCBhbmQgbGV0IHJlYWQoKSBjYWxsIHN0b3AoKS4KLSAgICAgICAgICAgICAgICBtU3RvcFBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIpOwotICAgICAgICAgICAgbUxlZnRvdmVyID0gbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobUluaXRpYWxUaW1lU3RhbXBVcyA9PSAtMSkgewotICAgICAgICAgICAgICAgIGludDY0X3QgY3VyVFM7Ci0gICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZyb20gPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKLSAgICAgICAgICAgICAgICBmcm9tLT5maW5kSW50NjQoa0tleVRpbWUsICZjdXJUUyk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNldHRpbmcgbUluaXRpYWxUaW1lU3RhbXBVcyB0byAlbGxkIiwgbUluaXRpYWxUaW1lU3RhbXBVcyk7Ci0gICAgICAgICAgICAgICAgbUluaXRpYWxUaW1lU3RhbXBVcyA9IGN1clRTOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IGNvcHkgZGF0YSB0byB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgdWludDMyX3QgdG9kbyA9IG1MZWZ0b3ZlcjsKLSAgICAgICAgaWYgKHRvZG8gPiB3YW50KSB7Ci0gICAgICAgICAgICB0b2RvID0gd2FudDsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQ4X3QqIGVuZCA9ICh1aW50OF90KiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKQotICAgICAgICAgICAgICAgICsgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIG1lbWNweSgodWludDhfdCopcEJ1ZmZlci0+cmF3ICsgZG9uZSwgZW5kIC0gbUxlZnRvdmVyLCB0b2RvKTsKLSAgICAgICAgZG9uZSArPSB0b2RvOwotICAgICAgICB3YW50IC09IHRvZG87Ci0gICAgICAgIG1MZWZ0b3ZlciAtPSB0b2RvOwotCi0gICAgICAgIC8vIFJlbGVhc2UgTWVkaWFCdWZmZXIgYXMgc29vbiBhcyBwb3NzaWJsZS4KLSAgICAgICAgaWYgKG1MZWZ0b3ZlciA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBkb25lIC8gKG1DaGFubmVsQ250ICogMik7Ci0gICAgQUxPR1YoImdldE5leHRCdWZmZXIgZG9uZSAlZCIsIHBCdWZmZXItPmZyYW1lQ291bnQpOwotICAgIHJldHVybiBPSzsKLX0KLQotCi12b2lkIFZpZGVvRWRpdG9yU1JDOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikgewotICAgIEFMT0dWKCJyZWxlYXNlQnVmZmVyOiAlcCIsIHBCdWZmZXIpOwotICAgIGZyZWUocEJ1ZmZlci0+cmF3KTsKLSAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOwotICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOwotfQotCi12b2lkIFZpZGVvRWRpdG9yU1JDOjpjaGVja0FuZFNldFJlc2FtcGxlcigpIHsKLSAgICBBTE9HVigiY2hlY2tBbmRTZXRSZXNhbXBsZXIiKTsKLQotICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBrVW5pdHlHYWluID0gMHgxMDAwOwotICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotICAgIENIRUNLKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpOwotCi0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtQ2hhbm5lbENudCkpOwotCi0gICAgLy8gSWYgYSByZXNhbXBsZXIgZXhpc3RzLCBkZWxldGUgaXQgZmlyc3QKLSAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtUmVzYW1wbGVyOwotICAgICAgICBtUmVzYW1wbGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBDbGVhciBwcmV2aW91cyBidWZmZXIKLSAgICBpZiAobUJ1ZmZlcikgewotICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtU2FtcGxlUmF0ZSAhPSBtT3V0cHV0U2FtcGxlUmF0ZSB8fCBtQ2hhbm5lbENudCAhPSAyKSB7Ci0gICAgICAgIEFMT0dWKCJSZXNhbXBsaW5nIHJlcXVpcmVkICglZCA9PiAlZCBIeiwgIyBjaGFubmVscyA9ICVkKSIsCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbU91dHB1dFNhbXBsZVJhdGUsIG1DaGFubmVsQ250KTsKLQotICAgICAgICBtUmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIDE2IC8qIGJpdCBkZXB0aCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dFNhbXBsZVJhdGUpOwotICAgICAgICBDSEVDSyhtUmVzYW1wbGVyKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShrVW5pdHlHYWluLCBrVW5pdHlHYWluKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiUmVzYW1wbGluZyBub3QgcmVxdWlyZWQgKCVkID0+ICVkIEh6LCAjIGNoYW5uZWxzID0gJWQpIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtT3V0cHV0U2FtcGxlUmF0ZSwgbUNoYW5uZWxDbnQpOwotICAgIH0KLX0KLQotfSAvL25hbWVzcGNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTcwN2Q0ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yU1JDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+Ci0jaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgTWVkaWFCdWZmZXI7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yU1JDIDogcHVibGljIE1lZGlhU291cmNlICwgcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgewotCi1wdWJsaWM6Ci0gICAgVmlkZW9FZGl0b3JTUkMoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCAoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCAoCi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcik7Ci0KLSAgICAvLyBTYW1wbGluZyBmcmVxZW5jaWVzCi0gICAgZW51bSB7Ci0gICAgICAgIGtGcmVxODAwMEh6ICA9IDgwMDAsCi0gICAgICAgIGtGcmVxMTEwMjVIeiA9IDExMDI1LAotICAgICAgICBrRnJlcTEyMDAwSHogPSAxMjAwMCwKLSAgICAgICAga0ZyZXExNjAwMEh6ID0gMTYwMDAsCi0gICAgICAgIGtGcmVxMjIwNTBIeiA9IDIyMDUwLAotICAgICAgICBrRnJlcTI0MDAwSHogPSAyNDAwMCwKLSAgICAgICAga0ZyZXEzMjAwMEh6ID0gMzIwMDAsCi0gICAgICAgIGtGcmVxNDQxMDBIeiA9IDQ0MTAwLAotICAgICAgICBrRnJlcTQ4MDAwSHogPSA0ODAwMCwKLSAgICB9OwotCi1wcm90ZWN0ZWQgOgotICAgIHZpcnR1YWwgflZpZGVvRWRpdG9yU1JDKCk7Ci0KLXByaXZhdGU6Ci0gICAgQXVkaW9SZXNhbXBsZXIgKm1SZXNhbXBsZXI7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgaW50IG1DaGFubmVsQ250OwotICAgIGludCBtU2FtcGxlUmF0ZTsKLSAgICBpbnQzMl90IG1PdXRwdXRTYW1wbGVSYXRlOwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgc3A8TWV0YURhdGE+IG1PdXRwdXRGb3JtYXQ7Ci0KLSAgICBNZWRpYUJ1ZmZlciogbUJ1ZmZlcjsKLSAgICBpbnQzMl90IG1MZWZ0b3ZlcjsKLSAgICBib29sIG1Gb3JtYXRDaGFuZ2VkOwotICAgIGJvb2wgbVN0b3BQZW5kaW5nOwotCi0gICAgaW50NjRfdCBtSW5pdGlhbFRpbWVTdGFtcFVzOwotICAgIGludDY0X3QgbUFjY3VPdXRCdWZmZXJTaXplOwotCi0gICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbVNlZWtNb2RlOwotCi0gICAgVmlkZW9FZGl0b3JTUkMoKTsKLSAgICB2b2lkIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0KLSAgICAvLyBEb24ndCBjYWxsIG1lCi0gICAgVmlkZW9FZGl0b3JTUkMoY29uc3QgVmlkZW9FZGl0b3JTUkMmKTsKLSAgICBWaWRlb0VkaXRvclNSQyAmb3BlcmF0b3I9KGNvbnN0IFZpZGVvRWRpdG9yU1JDICYpOwotCi19OwotCi19IC8vbmFtZXNwY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmI5ZmQ2MC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzg4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLSNpbmNsdWRlICJQcmV2aWV3UmVuZGVyZXIuaCIKLS8qKyBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLS8qLSBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLQotY29uc3QgTTRWSUZJX1VJbnQ4ICAgTTRWSUZJX0NsaXBUYWJsZVsxMjU2XQotPSB7Ci0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsCi0weDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLAotMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKLTB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsCi0weDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLCAweDIzLAotMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwKLTB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsCi0weDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDNiLAotMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywKLTB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsCi0weDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLCAweDUxLCAweDUyLCAweDUzLAotMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwKLTB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsCi0weDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLAotMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywKLTB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsCi0weDdjLCAweDdkLCAweDdlLCAweDdmLCAweDgwLCAweDgxLCAweDgyLCAweDgzLAotMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwKLTB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsCi0weDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweDliLAotMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywKLTB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YWIsCi0weGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLCAweGIxLCAweGIyLCAweGIzLAotMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwKLTB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsCi0weGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGNiLAotMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywKLTB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsCi0weGRjLCAweGRkLCAweGRlLCAweGRmLCAweGUwLCAweGUxLCAweGUyLCAweGUzLAotMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwKLTB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsCi0weGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZiLAotMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCi19OwotCi0vKiBEaXZpc2lvbiB0YWJsZSBmb3IgKCA2NTUzNS94ICk7IHggPSAwIHRvIDUxMiAqLwotY29uc3QgTTRWSUZJX1VJbnQxNiAgTTRWSUZJX0RpdlRhYmxlWzUxMl0KLT0gewotMCwgNjU1MzUsIDMyNzY4LCAyMTg0NSwgMTYzODQsIDEzMTA3LCAxMDkyMiwgOTM2MiwKLTgxOTIsIDcyODEsIDY1NTMsIDU5NTcsIDU0NjEsIDUwNDEsIDQ2ODEsIDQzNjksCi00MDk2LCAzODU1LCAzNjQwLCAzNDQ5LCAzMjc2LCAzMTIwLCAyOTc4LCAyODQ5LAotMjczMCwgMjYyMSwgMjUyMCwgMjQyNywgMjM0MCwgMjI1OSwgMjE4NCwgMjExNCwKLTIwNDgsIDE5ODUsIDE5MjcsIDE4NzIsIDE4MjAsIDE3NzEsIDE3MjQsIDE2ODAsCi0xNjM4LCAxNTk4LCAxNTYwLCAxNTI0LCAxNDg5LCAxNDU2LCAxNDI0LCAxMzk0LAotMTM2NSwgMTMzNywgMTMxMCwgMTI4NSwgMTI2MCwgMTIzNiwgMTIxMywgMTE5MSwKLTExNzAsIDExNDksIDExMjksIDExMTAsIDEwOTIsIDEwNzQsIDEwNTcsIDEwNDAsCi0xMDI0LCAxMDA4LCA5OTIsIDk3OCwgOTYzLCA5NDksIDkzNiwgOTIzLAotOTEwLCA4OTcsIDg4NSwgODczLCA4NjIsIDg1MSwgODQwLCA4MjksCi04MTksIDgwOSwgNzk5LCA3ODksIDc4MCwgNzcxLCA3NjIsIDc1MywKLTc0NCwgNzM2LCA3MjgsIDcyMCwgNzEyLCA3MDQsIDY5NywgNjg5LAotNjgyLCA2NzUsIDY2OCwgNjYxLCA2NTUsIDY0OCwgNjQyLCA2MzYsCi02MzAsIDYyNCwgNjE4LCA2MTIsIDYwNiwgNjAxLCA1OTUsIDU5MCwKLTU4NSwgNTc5LCA1NzQsIDU2OSwgNTY0LCA1NjAsIDU1NSwgNTUwLAotNTQ2LCA1NDEsIDUzNywgNTMyLCA1MjgsIDUyNCwgNTIwLCA1MTYsCi01MTIsIDUwOCwgNTA0LCA1MDAsIDQ5NiwgNDkyLCA0ODksIDQ4NSwKLTQ4MSwgNDc4LCA0NzQsIDQ3MSwgNDY4LCA0NjQsIDQ2MSwgNDU4LAotNDU1LCA0NTEsIDQ0OCwgNDQ1LCA0NDIsIDQzOSwgNDM2LCA0MzQsCi00MzEsIDQyOCwgNDI1LCA0MjIsIDQyMCwgNDE3LCA0MTQsIDQxMiwKLTQwOSwgNDA3LCA0MDQsIDQwMiwgMzk5LCAzOTcsIDM5NCwgMzkyLAotMzkwLCAzODcsIDM4NSwgMzgzLCAzODEsIDM3OCwgMzc2LCAzNzQsCi0zNzIsIDM3MCwgMzY4LCAzNjYsIDM2NCwgMzYyLCAzNjAsIDM1OCwKLTM1NiwgMzU0LCAzNTIsIDM1MCwgMzQ4LCAzNDYsIDM0NCwgMzQzLAotMzQxLCAzMzksIDMzNywgMzM2LCAzMzQsIDMzMiwgMzMwLCAzMjksCi0zMjcsIDMyNiwgMzI0LCAzMjIsIDMyMSwgMzE5LCAzMTgsIDMxNiwKLTMxNSwgMzEzLCAzMTIsIDMxMCwgMzA5LCAzMDcsIDMwNiwgMzA0LAotMzAzLCAzMDIsIDMwMCwgMjk5LCAyOTcsIDI5NiwgMjk1LCAyOTMsCi0yOTIsIDI5MSwgMjg5LCAyODgsIDI4NywgMjg2LCAyODQsIDI4MywKLTI4MiwgMjgxLCAyODAsIDI3OCwgMjc3LCAyNzYsIDI3NSwgMjc0LAotMjczLCAyNzEsIDI3MCwgMjY5LCAyNjgsIDI2NywgMjY2LCAyNjUsCi0yNjQsIDI2MywgMjYyLCAyNjEsIDI2MCwgMjU5LCAyNTgsIDI1NywKLTI1NiwgMjU1LCAyNTQsIDI1MywgMjUyLCAyNTEsIDI1MCwgMjQ5LAotMjQ4LCAyNDcsIDI0NiwgMjQ1LCAyNDQsIDI0MywgMjQyLCAyNDEsCi0yNDAsIDI0MCwgMjM5LCAyMzgsIDIzNywgMjM2LCAyMzUsIDIzNCwKLTIzNCwgMjMzLCAyMzIsIDIzMSwgMjMwLCAyMjksIDIyOSwgMjI4LAotMjI3LCAyMjYsIDIyNSwgMjI1LCAyMjQsIDIyMywgMjIyLCAyMjIsCi0yMjEsIDIyMCwgMjE5LCAyMTksIDIxOCwgMjE3LCAyMTcsIDIxNiwKLTIxNSwgMjE0LCAyMTQsIDIxMywgMjEyLCAyMTIsIDIxMSwgMjEwLAotMjEwLCAyMDksIDIwOCwgMjA4LCAyMDcsIDIwNiwgMjA2LCAyMDUsCi0yMDQsIDIwNCwgMjAzLCAyMDIsIDIwMiwgMjAxLCAyMDEsIDIwMCwKLTE5OSwgMTk5LCAxOTgsIDE5NywgMTk3LCAxOTYsIDE5NiwgMTk1LAotMTk1LCAxOTQsIDE5MywgMTkzLCAxOTIsIDE5MiwgMTkxLCAxOTEsCi0xOTAsIDE4OSwgMTg5LCAxODgsIDE4OCwgMTg3LCAxODcsIDE4NiwKLTE4NiwgMTg1LCAxODUsIDE4NCwgMTg0LCAxODMsIDE4MywgMTgyLAotMTgyLCAxODEsIDE4MSwgMTgwLCAxODAsIDE3OSwgMTc5LCAxNzgsCi0xNzgsIDE3NywgMTc3LCAxNzYsIDE3NiwgMTc1LCAxNzUsIDE3NCwKLTE3NCwgMTczLCAxNzMsIDE3MiwgMTcyLCAxNzIsIDE3MSwgMTcxLAotMTcwLCAxNzAsIDE2OSwgMTY5LCAxNjgsIDE2OCwgMTY4LCAxNjcsCi0xNjcsIDE2NiwgMTY2LCAxNjUsIDE2NSwgMTY1LCAxNjQsIDE2NCwKLTE2MywgMTYzLCAxNjMsIDE2MiwgMTYyLCAxNjEsIDE2MSwgMTYxLAotMTYwLCAxNjAsIDE1OSwgMTU5LCAxNTksIDE1OCwgMTU4LCAxNTcsCi0xNTcsIDE1NywgMTU2LCAxNTYsIDE1NiwgMTU1LCAxNTUsIDE1NCwKLTE1NCwgMTU0LCAxNTMsIDE1MywgMTUzLCAxNTIsIDE1MiwgMTUyLAotMTUxLCAxNTEsIDE1MSwgMTUwLCAxNTAsIDE0OSwgMTQ5LCAxNDksCi0xNDgsIDE0OCwgMTQ4LCAxNDcsIDE0NywgMTQ3LCAxNDYsIDE0NiwKLTE0NiwgMTQ1LCAxNDUsIDE0NSwgMTQ0LCAxNDQsIDE0NCwgMTQ0LAotMTQzLCAxNDMsIDE0MywgMTQyLCAxNDIsIDE0MiwgMTQxLCAxNDEsCi0xNDEsIDE0MCwgMTQwLCAxNDAsIDE0MCwgMTM5LCAxMzksIDEzOSwKLTEzOCwgMTM4LCAxMzgsIDEzNywgMTM3LCAxMzcsIDEzNywgMTM2LAotMTM2LCAxMzYsIDEzNSwgMTM1LCAxMzUsIDEzNSwgMTM0LCAxMzQsCi0xMzQsIDEzNCwgMTMzLCAxMzMsIDEzMywgMTMyLCAxMzIsIDEzMiwKLTEzMiwgMTMxLCAxMzEsIDEzMSwgMTMxLCAxMzAsIDEzMCwgMTMwLAotMTMwLCAxMjksIDEyOSwgMTI5LCAxMjksIDEyOCwgMTI4LCAxMjgKLX07Ci0KLWNvbnN0IE00VklGSV9JbnQzMiAgY29uc3Rfc3RvcmFnZTFbOF0KLT0gewotMHgwMDAwMjU2OCwgMHgwMDAwMzM0MywweDAwMDAwNjQ5LDB4MDAwMDBkMGYsIDB4MDAwMEQ4NkMsIDB4MDAwMEQ4M0IsIDB4MDAwMTAwMDAsIDB4MDAwMTAwMDAKLX07Ci0KLWNvbnN0IE00VklGSV9JbnQzMiAgY29uc3Rfc3RvcmFnZVs4XQotPSB7Ci0weDAwMDAyNTY4LCAweDAwMDAzMzQzLCAweDFCRjgwMCwgMHgwMDAwMDY0OSwgMHgwMDAwMGQwZiwgMHgxMTAxODAsIDB4NDBjZiwgMHgyMkJFMDAKLX07Ci0KLQotY29uc3QgTTRWSUZJX1VJbnQxNiAgKk00VklGSV9EaXZUYWJsZV96ZXJvCi0gPSAmTTRWSUZJX0RpdlRhYmxlWzBdOwotCi1jb25zdCBNNFZJRklfVUludDggICAqTTRWSUZJX0NsaXBUYWJsZV96ZXJvCi0gPSAmTTRWSUZJX0NsaXBUYWJsZVs1MDBdOwotCi1NNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hclRvWVVWNDIwU2VtaXBsYW5hcih2b2lkICp1c2VyX2RhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApIHsKLQotICAgIE00VklGSV9VSW50MzIgaTsKLSAgICBNNFZJRklfVUludDggKnBfYnVmX3NyYywgKnBfYnVmX2Rlc3QsICpwX2J1Zl9zcmNfdSwgKnBfYnVmX3NyY192OwotICAgIE00VklGSV9VSW50OCAgICByZXR1cm5fY29kZSA9IE00VklGSV9PSzsKLQotICAgIC8qIHRoZSBmaWx0ZXIgaXMgaW1wbGVtZW50ZWQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSB3aWR0aCBpcyBlcXVhbCB0byBzdHJpZGUgKi8KLSAgICBpZihQbGFuZUluWzBdLnVfd2lkdGggIT0gUGxhbmVJblswXS51X3N0cmlkZSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTlZBTElEX1BBUkFNOwotCi0gICAgLyogVGhlIGlucHV0IFkgUGxhbmUgaXMgdGhlIHNhbWUgYXMgdGhlIG91dHB1dCBZIFBsYW5lICovCi0gICAgcF9idWZfc3JjID0gJihQbGFuZUluWzBdLnBhY19kYXRhW1BsYW5lSW5bMF0udV90b3BsZWZ0XSk7Ci0gICAgcF9idWZfZGVzdCA9ICYoUGxhbmVPdXRbMF0ucGFjX2RhdGFbUGxhbmVPdXRbMF0udV90b3BsZWZ0XSk7Ci0gICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwodm9pZCAqKXBfYnVmX3NyYyAsCi0gICAgICAgIFBsYW5lT3V0WzBdLnVfd2lkdGggKiBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0KLSAgICAvKiBUaGUgVSBhbmQgViBjb21wb25lbnRzIGFyZSBwbGFuYXIuIFRoZSBuZWVkIHRvIGJlIG1hZGUgaW50ZXJsZWF2ZWQgKi8KLSAgICBwX2J1Zl9zcmNfdSA9ICYoUGxhbmVJblsxXS5wYWNfZGF0YVtQbGFuZUluWzFdLnVfdG9wbGVmdF0pOwotICAgIHBfYnVmX3NyY192ID0gJihQbGFuZUluWzJdLnBhY19kYXRhW1BsYW5lSW5bMl0udV90b3BsZWZ0XSk7Ci0gICAgcF9idWZfZGVzdCAgPSAmKFBsYW5lT3V0WzFdLnBhY19kYXRhW1BsYW5lT3V0WzFdLnVfdG9wbGVmdF0pOwotCi0gICAgZm9yKGkgPSAwOyBpIDwgUGxhbmVPdXRbMV0udV93aWR0aCpQbGFuZU91dFsxXS51X2hlaWdodDsgaSsrKQotICAgIHsKLSAgICAgICAgKnBfYnVmX2Rlc3QrKyA9ICpwX2J1Zl9zcmNfdSsrOwotICAgICAgICAqcF9idWZfZGVzdCsrID0gKnBfYnVmX3NyY192Kys7Ci0gICAgfQotICAgIHJldHVybiByZXR1cm5fY29kZTsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKSB7Ci0KLSAgICAgTTRWSUZJX1VJbnQzMiBpOwotICAgICBNNFZJRklfVUludDggKnBfYnVmX3NyYywgKnBfYnVmX2Rlc3QsICpwX2J1Zl9zcmNfdSwgKnBfYnVmX3NyY192OwotICAgICBNNFZJRklfVUludDggKnBfYnVmX2Rlc3RfdSwqcF9idWZfZGVzdF92LCpwX2J1Zl9zcmNfdXY7Ci0gICAgIE00VklGSV9VSW50OCAgICAgcmV0dXJuX2NvZGUgPSBNNFZJRklfT0s7Ci0KLSAgICAgLyogdGhlIGZpbHRlciBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHdpZHRoIGlzIGVxdWFsIHRvIHN0cmlkZSAqLwotICAgICBpZihQbGFuZUluWzBdLnVfd2lkdGggIT0gUGxhbmVJblswXS51X3N0cmlkZSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTlZBTElEX1BBUkFNOwotCi0gICAgIC8qIFRoZSBpbnB1dCBZIFBsYW5lIGlzIHRoZSBzYW1lIGFzIHRoZSBvdXRwdXQgWSBQbGFuZSAqLwotICAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bMF0ucGFjX2RhdGFbUGxhbmVJblswXS51X3RvcGxlZnRdKTsKLSAgICAgcF9idWZfZGVzdCA9ICYoUGxhbmVPdXRbMF0ucGFjX2RhdGFbUGxhbmVPdXRbMF0udV90b3BsZWZ0XSk7Ci0gICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsKHZvaWQgKilwX2J1Zl9zcmMgLAotICAgICAgICAgUGxhbmVPdXRbMF0udV93aWR0aCAqIFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLQotICAgICAvKiBUaGUgVSBhbmQgViBjb21wb25lbnRzIGFyZSBwbGFuYXIuIFRoZSBuZWVkIHRvIGJlIG1hZGUgaW50ZXJsZWF2ZWQgKi8KLSAgICAgcF9idWZfc3JjX3V2ID0gJihQbGFuZUluWzFdLnBhY19kYXRhW1BsYW5lSW5bMV0udV90b3BsZWZ0XSk7Ci0gICAgIHBfYnVmX2Rlc3RfdSAgPSAmKFBsYW5lT3V0WzFdLnBhY19kYXRhW1BsYW5lT3V0WzFdLnVfdG9wbGVmdF0pOwotICAgICBwX2J1Zl9kZXN0X3YgID0gJihQbGFuZU91dFsyXS5wYWNfZGF0YVtQbGFuZU91dFsyXS51X3RvcGxlZnRdKTsKLQotICAgICBmb3IoaSA9IDA7IGkgPCBQbGFuZU91dFsxXS51X3dpZHRoKlBsYW5lT3V0WzFdLnVfaGVpZ2h0OyBpKyspCi0gICAgIHsKLSAgICAgICAgKnBfYnVmX2Rlc3RfdSsrID0gKnBfYnVmX3NyY191disrOwotICAgICAgICAqcF9idWZfZGVzdF92KysgPSAqcF9idWZfc3JjX3V2Kys7Ci0gICAgIH0KLSAgICAgcmV0dXJuIHJldHVybl9jb2RlOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gYXBwbHkgYSBjb2xvciBlZmZlY3Qgb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICBQbGFuZUluICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gIE00VklGSV9PSzogIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKSB7Ci0KLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLSAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QqIENvbG9yQ29udGV4dCA9IChNNHhWU1NfQ29sb3JTdHJ1Y3QqKXBGdW5jdGlvbkNvbnRleHQ7Ci0KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKQotICAgIHsKLSAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICYoUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhW1BsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLQotICAgICAgICBwX2J1Zl9kZXN0ID0KLSAgICAgICAgICYoUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENocm9taW5hbmNlICovCi0gICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEgfHwgcGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vc3dpdGNoICgoTTRPU0FfVUludDMyKXBGdW5jdGlvbkNvbnRleHQpIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlOgotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDEyOCwKLSAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rOgotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDI1NSwKLSAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwwLAotICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhOgotICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTE3LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTM5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOgotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYgciA9IDAsZyA9IDAsYiA9IDAseSA9IDAsdSA9IDAsdiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgZ2V0IHRoZSByLCBnLCBiKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDAwMWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZyA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDdlMCk+PjU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHhmODAwKT4+MTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gVTE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gVjE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYgciA9IDAsZyA9IDAsYiA9IDAseSA9IDAsdSA9IDAsdiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgZ2V0IHRoZSByLCBnLCBiKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDAwMWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZyA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDdlMCk+PjU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHhmODAwKT4+MTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qZm9yIGNvbG9yIGdyYWRhdGlvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICBiID0gKE00T1NBX1VJbnQxNikoIGIgLSAoKGIqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnID0gKE00T1NBX1VJbnQxNikoZyAtICgoZyppKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoTTRPU0FfVUludDE2KShyIC0gKChyKmkpL1BsYW5lSW5bcGxhbmVfbnVtYmVyXS51X2hlaWdodCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKmtlZXAgeSwgYnV0IHJlcGxhY2UgdSBhbmQgdiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LChNNE9TQV9VSW50OCl1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IFYxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LChNNE9TQV9VSW50OCl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VklGSV9JTlZBTElEX1BBUkFNOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTHVtaW5hbmNlICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9zd2l0Y2ggKChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkvLyBjb21tZW50ZWQgYmVjYXVzZSBhIHN0cnVjdHVyZSBmb3IgdGhlIGVmZmVjdHMgY29udGV4dCBleGlzdAotICAgICAgICAgICAgICAgIHN3aXRjaCAoQ29sb3JDb250ZXh0LT5jb2xvckVmZmVjdFR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7aisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZfZGVzdFtqXSA9IDI1NSAtIHBfYnVmX3NyY1tqXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfYnVmX3NyYyArPSBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gYWRkIGEgZml4ZWQgb3IgYW5pbWF0ZWQgaW1hZ2Ugb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICBQbGFuZUluICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gIE00VklGSV9PSzogIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZygKLSAgICAgICAgICAgIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluWzNdLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LCBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApIHsKLQotICAgIE00VklGSV9VSW50MzIgeCx5OwotCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1kgPSBQbGFuZUluWzBdLnBhY19kYXRhOwotICAgIE00VklGSV9VSW50OCAqcF9pbl9VID0gUGxhbmVJblsxXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBfaW5fViA9IFBsYW5lSW5bMl0ucGFjX2RhdGE7Ci0KLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogRnJhbWluZyA9IE00T1NBX05VTEw7Ci0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGN1cnJlbnRGcmFtaW5nID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfVUludDggKkZyYW1pbmdSR0IgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRWSUZJX1VJbnQ4ICpwX291dDA7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX291dDE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX291dDI7Ci0KLSAgICBNNFZJRklfVUludDMyIHRvcGxlZnRbMl07Ci0KLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDEgPQotICAgICAoTTRPU0FfVUludDgpKChUUkFOU1BBUkVOVF9DT0xPUiAmIDB4RkYwMCk+PjgpOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MiA9IChNNE9TQV9VSW50OClUUkFOU1BBUkVOVF9DT0xPUjsKLQotI2lmbmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKil1c2VyRGF0YTsKLSAgICBjdXJyZW50RnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKUZyYW1pbmctPnBDdXJyZW50OwotICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nLT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBGcmFtaW5nID0KLSAgICAgKE00eFZTU19GcmFtaW5nU3RydWN0ICopKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+YUZyYW1pbmdDdHg7Ci0gICAgaWYoRnJhbWluZyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Y2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGKHVzZXJEYXRhKTsKLSAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmc6IFwKLSAgICAgICAgICAgICAgICBFcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBGcmFtaW5nID0KLSAgICAgICAgIChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFGcmFtaW5nQ3R4OwotICAgICAgICAvKiBJbml0aWFsaXplcyBmaXJzdCBHSUYgdGltZSAqLwotICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lID0KLSAgICAgICAgICBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICB9Ci0gICAgY3VycmVudEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKilGcmFtaW5nOwotICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nLT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwX2luX1kgKz0gUGxhbmVJblswXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9VICs9IFBsYW5lSW5bMV0udV90b3BsZWZ0OwotICAgIHBfaW5fViArPSBQbGFuZUluWzJdLnVfdG9wbGVmdDsKLQotICAgIHBfb3V0MCA9IFBsYW5lT3V0WzBdLnBhY19kYXRhOwotICAgIHBfb3V0MSA9IFBsYW5lT3V0WzFdLnBhY19kYXRhOwotICAgIHBfb3V0MiA9IFBsYW5lT3V0WzJdLnBhY19kYXRhOwotCi0gICAgLyoqCi0gICAgICogRGVwZW5kaW5nIG9uIHRpbWUsIGluaXRpYWxpemUgRnJhbWluZyBmcmFtZSB0byB1c2UgKi8KLSAgICBpZihGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID09IC0xKQotICAgIHsKLSAgICAgICAgRnJhbWluZy0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBjdXJyZW50IGNsaXAgdGltZSBoYXMgcmVhY2ggdGhlIGR1cmF0aW9uIG9mIG9uZSBmcmFtZSBvZiB0aGUgZnJhbWluZyBwaWN0dXJlCi0gICAgICogd2UgbmVlZCB0byBzdGVwIHRvIG5leHQgZnJhbWluZyBwaWN0dXJlICovCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBpZigoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5iX2FuaW1hdGVkID09IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICB3aGlsZSgoKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Y3VycmVudF9naWZfdGltZSArIGN1cnJlbnRGcmFtaW5nLT5kdXJhdGlvbikgPCBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSkKLSAgICAgICAgewotICAgICAgICAgICAgKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Y2xpcFRpbWUgPQotICAgICAgICAgICAgIHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUYodXNlckRhdGEpOwotICAgICAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzogRXJyb3IgaW4gTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoY3VycmVudEZyYW1pbmctPmR1cmF0aW9uICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Y3VycmVudF9naWZfdGltZSArPSBjdXJyZW50RnJhbWluZy0+ZHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Y3VycmVudF9naWZfdGltZSArPQotICAgICAgICAgICAgICAgICBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSAtIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+YUZyYW1pbmdDdHg7Ci0gICAgICAgICAgICBjdXJyZW50RnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKUZyYW1pbmc7Ci0gICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0jZWxzZQotICAgICAgICAgICAgRnJhbWluZy0+cEN1cnJlbnQgPSBjdXJyZW50RnJhbWluZy0+cE5leHQ7Ci0gICAgICAgICAgICBjdXJyZW50RnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCopRnJhbWluZy0+cEN1cnJlbnQ7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLSAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgRnJhbWluZ1JHQiA9IGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKLSAgICB0b3BsZWZ0WzBdID0gY3VycmVudEZyYW1pbmctPnRvcGxlZnRfeDsKLSAgICB0b3BsZWZ0WzFdID0gY3VycmVudEZyYW1pbmctPnRvcGxlZnRfeTsKLQotICAgIGZvciggeD0wIDt4IDwgUGxhbmVJblswXS51X2hlaWdodCA7IHgrKykKLSAgICB7Ci0gICAgICAgIGZvciggeT0wIDt5IDwgUGxhbmVJblswXS51X3dpZHRoIDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRvIGhhbmRsZSBmcmFtaW5nIHdpdGggaW5wdXQgc2l6ZSAhPSBvdXRwdXQgc2l6ZQotICAgICAgICAgICAgICogRnJhbWluZyBpcyBhcHBseWVkIGlmIGNvb3JkaW5hdGVzIG1hdGNoZXMgYmV0d2VlbiBmcmFtaW5nL3RvcGxlZnQgYW5kIGlucHV0IHBsYW5lICovCi0gICAgICAgICAgICBpZiggeSA8ICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCkgICYmCi0gICAgICAgICAgICAgICAgeSA+PSB0b3BsZWZ0WzBdICYmCi0gICAgICAgICAgICAgICAgeCA8ICh0b3BsZWZ0WzFdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQpICYmCi0gICAgICAgICAgICAgICAgeCA+PSB0b3BsZWZ0WzFdKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9GbG9hdCBhbHBoYUJsZW5kaW5nID0gMTsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKiBhbHBoYUJsZW5kaW5nU3RydWN0ID0KLSAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hbHBoYUJsZW5kaW5nU3RydWN0OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyogYWxwaGFCbGVuZGluZ1N0cnVjdCA9Ci0gICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyopKChNNHhWU1NfRnJhbWluZ1N0cnVjdCopdXNlckRhdGEpLT5hbHBoYUJsZW5kaW5nU3RydWN0OwotI2VuZGlmIC8vI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgICAgICBpZihhbHBoYUJsZW5kaW5nU3RydWN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPCAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUqMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gKChNNE9TQV9GbG9hdCkoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0KSpwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MvKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyAvPSAxMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gKE00T1NBX1VJbnQzMikoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSAmJiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPCAxMDAwIC0gKE00T1NBX1VJbnQzMikoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoTTRPU0FfRmxvYXQpKChNNE9TQV9GbG9hdClhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZS8xMDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocFByb2dyZXNzLT51aVByb2dyZXNzID49IDEwMDAgLSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9ICgoTTRPU0FfRmxvYXQpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlIC0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQpKSooMTAwMCAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgLz0gMTAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqLwotCi0gICAgICAgICAgICAgICAgaWYoKCooRnJhbWluZ1JHQik9PXRyYW5zcGFyZW50MSkgJiYgKCooRnJhbWluZ1JHQisxKT09dHJhbnNwYXJlbnQyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9KCoocF9pbl9VKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsxXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9KCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0oKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSsoeS10b3BsZWZ0WzBdKSsoeC10b3BsZWZ0WzFdKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSkpKmFscGhhQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpKz0oKihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPSgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhKygoeS10b3BsZWZ0WzBdKT4+MSkrKCh4LXRvcGxlZnRbMV0pPj4xKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSkpKmFscGhhQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKSs9KCoocF9pbl9VKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsxXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9KCooY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGErKCh5LXRvcGxlZnRbMF0pPj4xKSsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlKSkqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpKz0oKihwX2luX1YrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzJdLnVfc3RyaWRlKSkqKDEtYWxwaGFCbGVuZGluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKCBQbGFuZUluWzBdLnVfd2lkdGggPCAodG9wbGVmdFswXSArIGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnVfd2lkdGgpICYmCi0gICAgICAgICAgICAgICAgICAgIHkgPT0gUGxhbmVJblswXS51X3dpZHRoLTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZ1JHQiArIDIgKiAodG9wbGVmdFswXSArIGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggLSBQbGFuZUluWzBdLnVfd2lkdGggKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JHQiA9IEZyYW1pbmdSR0IgKyAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogSnVzdCBjb3B5IGlucHV0IHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9KihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9KihwX2luX1YrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzJdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgaWYocFByb2dyZXNzLT5iSXNMYXN0ID09IE00T1NBX1RSVUUKLSAgICAgICAgJiYgKE00T1NBX0Jvb2wpKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Yl9Jc0ZpbGVHaWYgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIE00eFZTU19pbnRlcm5hbERlY29kZUdJRl9DbGVhbmluZygoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSk7Ci0gICAgfQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIG1ha2UgYSB2aWRlbyBsb29rIGFzIGlmIGl0IHdhcyB0YWtlbiBpbiB0aGUgZmlmdGllcwotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YSAgICAgICAoSU4pIENvbnRleHQKLSAqIEBwYXJhbSAgIHBQbGFuZUluICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dCAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgTTRWSUZJX09LOiAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwRmlmdGllc0RhdGEsIHBQbGFuZU91dCBvciBwUHJvZ3Jlc3MgYXJlIE5VTEwgKERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcygKLSAgICBNNE9TQV9Wb2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LCBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQgKQotewotICAgIE00VklGSV9VSW50MzIgeCwgeSwgeFNoaWZ0OwotICAgIE00VklGSV9VSW50OCAqcEluWSA9IHBQbGFuZUluWzBdLnBhY19kYXRhOwotICAgIE00VklGSV9VSW50OCAqcE91dFksICpwSW5ZYmVnaW47Ci0gICAgTTRWSUZJX1VJbnQ4ICpwSW5DciwqIHBPdXRDcjsKLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotCi0gICAgLyogSW50ZXJuYWwgY29udGV4dCovCi0gICAgTTR4VlNTX0ZpZnRpZXNTdHJ1Y3QqIHBfRmlmdGllc0RhdGEgPSAoTTR4VlNTX0ZpZnRpZXNTdHJ1Y3QgKilwVXNlckRhdGE7Ci0KLSAgICAvKiBJbml0aWFsaXplIGlucHV0IC8gb3V0cHV0IHBsYW5lIHBvaW50ZXJzICovCi0gICAgcEluWSArPSBwUGxhbmVJblswXS51X3RvcGxlZnQ7Ci0gICAgcE91dFkgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcEluWWJlZ2luICA9IHBJblk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSByYW5kb20gKi8KLSAgICBpZihwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lIDwgMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX3JhbmRJbml0KCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiopJihwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X3dpZHRoKTw8IDIpOwotICAgICAgICBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyogQ2hvb3NlIHJhbmRvbSB2YWx1ZXMgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBkdXJhdGlvbiBvZiBhIHBhcnRpYWwgZWZmZWN0ICovCi0gICAgZWxzZSBpZiggKHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lIC0gcF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSkgPiBwX0ZpZnRpZXNEYXRhLT5maWZ0aWVzRWZmZWN0RHVyYXRpb24pCi0gICAgewotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiopJihwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfaGVpZ2h0KSA+PiA0KTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIqKSYocF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV93aWR0aCk8PCAyKTsKLSAgICAgICAgcF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qIFB1dCBpbiBTZXBpYSB0aGUgY2hyb21pbmFuY2UgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDE7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKQotICAgIHsKLSAgICAgICAgcEluQ3IgID0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSAgKyBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLSAgICAgICAgcE91dENyID0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgxID09IHBsYW5lX251bWJlcikKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDExNyxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBVIHZhbHVlICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dENyLCAxMzkscFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsgLyogViB2YWx1ZSAqLwotCi0gICAgICAgICAgICBwSW5DciAgKz0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBPdXRDciArPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdGhlIG5ldyBwaXhlbHMgdmFsdWVzICovCi0gICAgZm9yKCB4ID0gMCA7IHggPCBwUGxhbmVJblswXS51X2hlaWdodCA7IHgrKykKLSAgICB7Ci0gICAgICAgIE00VklGSV9VSW50OCAqcF9vdXRZdG1wLCAqcF9pbll0bXA7Ci0KLSAgICAgICAgLyogQ29tcHV0ZSB0aGUgeFNoaWZ0IChyYW5kb20gdmFsdWUpICovCi0gICAgICAgIGlmICgwID09IChwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlICUgNSApKQotICAgICAgICAgICAgeFNoaWZ0ID0gKHggKyBwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlICkgJSAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSAxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgeFNoaWZ0ID0gKHggKyAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSBwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlKSApICUgKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gMSk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgKi8KLSAgICAgICAgcF9vdXRZdG1wID0gcE91dFkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHlTaGlmdCBvZiAxIHBpeGVsICovCi0gICAgICAgIHBfaW5ZdG1wICA9IHBJblliZWdpbiArICh4U2hpZnQgKiBwUGxhbmVJblswXS51X3N0cmlkZSk7ICAvKiBBcHBseSB0aGUgeFNoaWZ0ICovCi0KLSAgICAgICAgZm9yKCB5ID0gMCA7IHkgPCBwUGxhbmVJblswXS51X3dpZHRoIDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTZXQgWSB2YWx1ZSAqLwotICAgICAgICAgICAgaWYgKHhTaGlmdCA+IChwUGxhbmVJblswXS51X2hlaWdodCAtIDQpKQotICAgICAgICAgICAgICAgICpwX291dFl0bXAgPSA0MDsgICAgICAgIC8qIEFkZCBzb21lIGhvcml6b250YWwgYmxhY2sgbGluZXMgYmV0d2VlbiB0aGUgdHdvIHBhcnRzIG9mIHRoZSBpbWFnZSAqLwotICAgICAgICAgICAgZWxzZSBpZiAoIHkgPT0gcF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpCi0gICAgICAgICAgICAgICAgKnBfb3V0WXRtcCA9IDkwOyAgICAgICAgLyogQWRkIGEgcmFuZG9tIHZlcnRpY2FsIGxpbmUgZm9yIHRoZSBidWxrICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnBfb3V0WXRtcCA9ICpwX2luWXRtcDsKLQotCi0gICAgICAgICAgICAvKiBHbyB0byB0aGUgbmV4dCBwaXhlbCAqLwotICAgICAgICAgICAgcF9vdXRZdG1wKys7Ci0gICAgICAgICAgICBwX2luWXRtcCsrOwotCi0gICAgICAgICAgICAvKiBSZXN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgZm9yIHRoZSBsYXN0IHBpeGVsKi8KLSAgICAgICAgICAgIGlmICh5ID09IChwUGxhbmVJblswXS51X3dpZHRoIC0gMikpCi0gICAgICAgICAgICAgICAgcF9vdXRZdG1wID0gcE91dFk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBHbyB0byB0aGUgbmV4dCBsaW5lICovCi0gICAgICAgIHBPdXRZICs9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi11bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsdW1fZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCAqcF9zcmMsICpwX2Rlc3QsICpwX3NyY19saW5lLCAqcF9kZXN0X2xpbmU7Ci0gICAgdW5zaWduZWQgY2hhciAqcF9jc3JjLCAqcF9jZGVzdCwgKnBfY3NyY19saW5lLCAqcF9jZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGxvbmcgcGl4X3NyYzsKLSAgICB1bnNpZ25lZCBsb25nIHVfb3V0cHgsIHVfb3V0cHgyOwotICAgIHVuc2lnbmVkIGxvbmcgdV93aWR0aCwgdV9zdHJpZGUsIHVfc3RyaWRlX291dCx1X2hlaWdodCwgcGl4OwotICAgIGxvbmcgaSwgajsKLQotICAgIC8qIGNvcHkgb3IgZmlsdGVyIGNocm9tYSAqLwotICAgIHVfd2lkdGggPSBwbGFuZV9pblsxXS51X3dpZHRoOwotICAgIHVfaGVpZ2h0ID0gcGxhbmVfaW5bMV0udV9oZWlnaHQ7Ci0gICAgdV9zdHJpZGUgPSBwbGFuZV9pblsxXS51X3N0cmlkZTsKLSAgICB1X3N0cmlkZV9vdXQgPSBwbGFuZV9vdXRbMV0udV9zdHJpZGU7Ci0gICAgcF9jZGVzdF9saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX291dFsxXS5wYWNfZGF0YVtwbGFuZV9vdXRbMV0udV90b3BsZWZ0XTsKLSAgICBwX2NzcmNfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsxXS5wYWNfZGF0YVtwbGFuZV9pblsxXS51X3RvcGxlZnRdOwotCi0gICAgaWYgKGx1bV9mYWN0b3IgPiAyNTYpCi0gICAgewotICAgICAgICBwX2NkZXN0ID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX291dFsyXS5wYWNfZGF0YVtwbGFuZV9vdXRbMl0udV90b3BsZWZ0XTsKLSAgICAgICAgcF9jc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzJdLnBhY19kYXRhW3BsYW5lX2luWzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIC8qIGNvcHkgY2hyb21hICovCi0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9jZGVzdF9saW5lLCAodm9pZCAqKXBfY3NyY19saW5lLCB1X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2NkZXN0LCAodm9pZCAqKXBfY3NyYywgdV93aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2NkZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jZGVzdCArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgICAgIHBfY3NyYyArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBmaWx0ZXIgY2hyb21hICovCi0gICAgICAgIHBpeCA9ICgxMDI0IC0gbHVtX2ZhY3RvcikgPDwgNzsKLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwX2NkZXN0ID0gcF9jZGVzdF9saW5lOwotICAgICAgICAgICAgcF9jc3JjID0gcF9jc3JjX2xpbmU7Ci0gICAgICAgICAgICBmb3IgKGkgPSB1X3dpZHRoOyBpICE9IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcF9jZGVzdCsrID0gKChwaXggKyAoKnBfY3NyYysrICYgMHhGRikgKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2NkZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICAgICAgcF9jZGVzdF9saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX291dFsyXS5wYWNfZGF0YVtwbGFuZV9vdXRbMl0udV90b3BsZWZ0XTsKLSAgICAgICAgcF9jc3JjX2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMl0ucGFjX2RhdGFbcGxhbmVfaW5bMl0udV90b3BsZWZ0XTsKLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwX2NkZXN0ID0gcF9jZGVzdF9saW5lOwotICAgICAgICAgICAgcF9jc3JjID0gcF9jc3JjX2xpbmU7Ci0gICAgICAgICAgICBmb3IgKGkgPSB1X3dpZHRoOyBpICE9IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcF9jZGVzdCsrID0gKChwaXggKyAoKnBfY3NyYyAmIDB4RkYpICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIGFwcGx5IGx1bWEgZmFjdG9yICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzBdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblswXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IChwbGFuZV9pblswXS51X3N0cmlkZSA+PiAxKTsKLSAgICB1X3N0cmlkZV9vdXQgPSAocGxhbmVfb3V0WzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHBfZGVzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfb3V0WzBdLnBhY19kYXRhW3BsYW5lX291dFswXS51X3RvcGxlZnRdOwotICAgIHBfc3JjID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9pblswXS5wYWNfZGF0YVtwbGFuZV9pblswXS51X3RvcGxlZnRdOwotICAgIHBfZGVzdF9saW5lID0gcF9kZXN0OwotICAgIHBfc3JjX2xpbmUgPSBwX3NyYzsKLQotICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICB7Ci0gICAgICAgIHBfZGVzdCA9IHBfZGVzdF9saW5lOwotICAgICAgICBwX3NyYyA9IHBfc3JjX2xpbmU7Ci0gICAgICAgIGZvciAoaSA9ICh1X3dpZHRoID4+IDEpOyBpICE9IDA7IGktLSkKLSAgICAgICAgewotICAgICAgICAgICAgcGl4X3NyYyA9ICh1bnNpZ25lZCBsb25nKSAqcF9zcmMrKzsKLSAgICAgICAgICAgIHBpeCA9IHBpeF9zcmMgJiAweEZGOwotICAgICAgICAgICAgdV9vdXRweCA9ICgocGl4ICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpOwotICAgICAgICAgICAgcGl4ID0gKChwaXhfc3JjICYgMHhGRjAwKSA+PiA4KTsKLSAgICAgICAgICAgIHVfb3V0cHgyID0gKCgocGl4ICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpPDwgOCkgOwotICAgICAgICAgICAgKnBfZGVzdCsrID0gKHVuc2lnbmVkIHNob3J0KSAodV9vdXRweDIgfCB1X291dHB4KTsKLSAgICAgICAgfQotICAgICAgICBwX2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgIHBfc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbiBSR0I1NjUgcGxhbmUgdG8gWVVWNDIwIHBsYW5hcgotICogQG5vdGUgICAgSXQgaXMgdXNlZCBvbmx5IGZvciBmcmFtaW5nIGVmZmVjdAotICogICAgICAgICAgSXQgYWxsb2NhdGVzIG91dHB1dCBZVVYgcGxhbmVzCi0gKiBAcGFyYW0gICBmcmFtaW5nQ3R4ICAoSU4pIFRoZSBmcmFtaW5nIHN0cnVjdCBjb250YWluaW5nIGlucHV0IFJHQjU2NSBwbGFuZQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogQWxsb2NhdGlvbiBlcnJvciAobm8gbW9yZSBtZW1vcnkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgb3V0cHV0IFlVViBwbGFuZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLCAoTTRPU0FfQ2hhciopIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogT3V0cHV0IHBsYW5lIFlVViIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0OwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfc3RyaWRlID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGgqZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCozKT4+MSwgTTRWUywgKE00T1NBX0NoYXIqKSJBbGxvYyBmb3IgdGhlIENvbnZlcnRpb24gb3V0cHV0IFlVViIpOzsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgKyBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0OwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGlucHV0IFJHQiA1NjUgdG8gWVVWIDQyMCB0byBiZSBhYmxlIHRvIG1lcmdlIGl0IHdpdGggb3V0cHV0IHZpZGVvIGluIGZyYW1pbmcgZWZmZWN0ICovCi0gICAgZXJyID0gTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAoTTRPU0FfTlVMTCwgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiwgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIHdpdGggUkdCIGJ1ZmZlci4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQjg4OHRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbiBSR0I4ODggcGxhbmUgdG8gWVVWNDIwIHBsYW5hcgotICogQG5vdGUgICAgSXQgaXMgdXNlZCBvbmx5IGZvciBmcmFtaW5nIGVmZmVjdAotICogICAgICAgICAgSXQgYWxsb2NhdGVzIG91dHB1dCBZVVYgcGxhbmVzCi0gKiBAcGFyYW0gICBmcmFtaW5nQ3R4ICAoSU4pIFRoZSBmcmFtaW5nIHN0cnVjdCBjb250YWluaW5nIGlucHV0IFJHQjg4OCBwbGFuZQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogQWxsb2NhdGlvbiBlcnJvciAobm8gbW9yZSBtZW1vcnkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0I4ODh0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgb3V0cHV0IFlVViBwbGFuZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLCAoTTRPU0FfQ2hhciopIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogT3V0cHV0IHBsYW5lIFlVViIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0OwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfc3RyaWRlID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGgqZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCozKT4+MSwgTTRWUywgKE00T1NBX0NoYXIqKSJBbGxvYyBmb3IgdGhlIENvbnZlcnRpb24gb3V0cHV0IFlVViIpOzsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgKyBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0OwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGlucHV0IFJHQjg4OCB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZyBlZmZlY3QgKi8KLSAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiwgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIHdpdGggUkdCIGJ1ZmZlci4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGF1dGhvciAgUGF0cmljZSBNYXJ0aW5leiAvIFBoaWxpcHMgRGlnaXRhbCBOZXR3b3JrcyAtIE1QNE5ldAotICogQGJyaWVmICAgdHJhbnNmb3JtIFJHQjU2NSBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBub3RlICAgIENvbnZlcnQgUkdCNTY1IHRvIFlVVjQyMCwKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICogICAgICAgICAgICAgICAgICBHZXQgNCBSR0Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICogICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICogICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBTcGVjaWZpYyBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFJHQjU2NSBQbGFuZQotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvICBZVVY0MjAgYnVmZmVyIFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IFlVViBQbGFuZSBoZWlnaHQgaXMgT0RECi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIFlVViBQbGFuZSB3aWR0aCBpcyBPREQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotICAgIE00VklGSV9VSW50OCBjb3VudF9udWxsPTA7Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgaGVpZ2h0IGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfaGVpZ2h0ICE9IHBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0PDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBsYW5lcyB3aWR0aCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X3dpZHRoICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsyXS51X3dpZHRoPDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfeV9kYXRhID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfcmdibl9kYXRhICAgPSBwUGxhbmVJbi0+cGFjX2RhdGEgKyBwUGxhbmVJbi0+dV90b3BsZWZ0OwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlMl9ZID0gdTMyX3N0cmlkZV9ZIDw8IDE7Ci0gICAgdTMyX3N0cmlkZV9VID0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IHBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlXzJyZ2IgPSB1MzJfc3RyaWRlX3JnYiA8PCAxOwotCi0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X3JnYm4gPSBwdThfcmdibl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBSR0IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9yZ2JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0KLSAgICAgICAgICAgIC8qIFVucGFjayBSR0I1NjUgdG8gOGJpdCBSLCBHLCBCICovCi0gICAgICAgICAgICAvKiAoeCx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCx1MTZfcGl4MSk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTAsaTMyX2cxMCxpMzJfcjEwLHUxNl9waXgyKTsKLSAgICAgICAgICAgIC8qICh4LHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsdTE2X3BpeDMpOwotICAgICAgICAgICAgLyogKHgrMSx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTEsaTMyX2cxMSxpMzJfcjExLHUxNl9waXg0KTsKLSAgICAgICAgICAgIC8qIElmIFJHQiBpcyB0cmFuc3BhcmVudCBjb2xvciAoMCwgNjMsIDApLCB3ZSB0cmFuc2Zvcm0gaXQgdG8gd2hpdGUgKDMxLDYzLDMxKSAqLwotICAgICAgICAgICAgaWYoaTMyX2IwMCA9PSAwICYmIGkzMl9nMDAgPT0gNjMgJiYgaTMyX3IwMCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDAgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAwID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjEwID09IDAgJiYgaTMyX2cxMCA9PSA2MyAmJiBpMzJfcjEwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IxMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMTAgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMDEgPT0gMCAmJiBpMzJfZzAxID09IDYzICYmIGkzMl9yMDEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMSA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IxMSA9PSAwICYmIGkzMl9nMTEgPT0gNjMgJiYgaTMyX3IxMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMTEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjExID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiB2YWx1ZSB0byBZVVYgKi8KLSAgICAgICAgICAgIGkzMl91MDAgPSBVMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfdjAwID0gVjE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAwID0gWTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMCA9IFkxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDEgPSBZMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTExID0gWTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotCi0gICAgICAgICAgICAvKiBTdG9yZSBsdW1pbmFuY2UgZGF0YSAqLwotICAgICAgICAgICAgcHU4X3luWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAwOwotICAgICAgICAgICAgcHU4X3luWzFdID0gKE00VklGSV9VSW50OClpMzJfeTEwOwotICAgICAgICAgICAgcHU4X3lzWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAxOwotICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotICAgICAgICAgICAgKnB1OF91ID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICpwdThfdiA9IChNNFZJRklfVUludDgpKChpMzJfdjAwICsgaTMyX3YwMSArIGkzMl92MTAgKyBpMzJfdjExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IGNvbHVtbiAqLwotICAgICAgICAgICAgcHU4X3JnYm4gKz0gKENTVF9SR0JfMTZfU0laRTw8MSk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgY3VycmVudCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeW4gKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95cyArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIFUgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgLyogVXBkYXRlIFYgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF92ICsrOwotICAgICAgICB9IC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgLyogUHJlcGFyZSBwb2ludGVycyBmb3IgdGhlIG5leHQgcm93ICovCi0gICAgICAgIHB1OF95X2RhdGEgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgKz0gdTMyX3N0cmlkZV9WOwotICAgICAgICBwdThfcmdibl9kYXRhICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVByb3RvOgotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci1BdXRob3I6ICAgICBQYXRyaWNlIE1hcnRpbmV6IC8gUGhpbGlwcyBEaWdpdGFsIE5ldHdvcmtzIC0gTVA0TmV0Ci1QdXJwb3NlOiAgICBmaWxsaW5nIG9mIHRoZSBZVVY0MjAgcGxhbmUgZnJvbSBhIEJHUjI0IHBsYW5lCi1BYnN0cmFjdDogICBMb29wIG9uIGVhY2ggcm93ICggMiByb3dzIGJ5IDIgcm93cyApCi0gICAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoIDIgY29sIGJ5IDIgY29sICkKLSAgICAgICAgICAgICAgICAgICAgR2V0IDQgQkdSIHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhIGFuZCBidWlsZCA0IG91dHB1dCBZIHNhbXBsZXMgYW5kIGVhY2ggc2luZ2xlIFUgJiBWIGRhdGEKLSAgICAgICAgICAgICAgICBlbmQgbG9vcCBvbiBjb2wKLSAgICAgICAgICAgIGVuZCBsb29wIG9uIHJvdwotCi1JbjogICAgICAgICBSR0IyNCBwbGFuZQotSW5PdXQ6ICAgICAgbm9uZQotT3V0OiAgICAgICAgYXJyYXkgb2YgMyBNNFZJRklfSW1hZ2VQbGFuZSBzdHJ1Y3R1cmVzCi1Nb2RpZmllZDogICBNTDogUkdCIGZ1bmN0aW9uIG1vZGlmaWVkIHRvIEJHUi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00VklGSV9VSW50OCBNNFZJRklfUkdCODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVPdXRbM10pCi17Ci0KLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX1ksIHUzMl9zdHJpZGUyX1ksIHUzMl9zdHJpZGVfVSwgdTMyX3N0cmlkZV9WLCB1MzJfc3RyaWRlX3JnYiwgdTMyX3N0cmlkZV8ycmdiOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY29sLCB1MzJfcm93OwotCi0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9yMDAsIGkzMl9yMDEsIGkzMl9yMTAsIGkzMl9yMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9nMDAsIGkzMl9nMDEsIGkzMl9nMTAsIGkzMl9nMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9iMDAsIGkzMl9iMDEsIGkzMl9iMTAsIGkzMl9iMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl95MDAsIGkzMl95MDEsIGkzMl95MTAsIGkzMl95MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl91MDAsIGkzMl91MDEsIGkzMl91MTAsIGkzMl91MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl92MDAsIGkzMl92MDEsIGkzMl92MTAsIGkzMl92MTE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeW4sICpwdThfeXMsICpwdThfdSwgKnB1OF92OwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3lfZGF0YSwgKnB1OF91X2RhdGEsICpwdThfdl9kYXRhOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3JnYm5fZGF0YSwgKnB1OF9yZ2JuOwotCi0gICAgLyogY2hlY2sgc2l6ZXMgKi8KLSAgICBpZiggKFBsYW5lSW4tPnVfaGVpZ2h0ICE9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X2hlaWdodCAhPSAoUGxhbmVPdXRbMV0udV9oZWlnaHQ8PDEpKSB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKFBsYW5lT3V0WzJdLnVfaGVpZ2h0PDwxKSkpCi0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0KLSAgICBpZiggKFBsYW5lSW4tPnVfd2lkdGggIT0gUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSAgIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X3dpZHRoICE9IChQbGFuZU91dFsyXS51X3dpZHRoPDwxKSkpCi0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLQotCi0gICAgLyogc2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfeV9kYXRhICA9IFBsYW5lT3V0WzBdLnBhY19kYXRhICsgUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgID0gUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSAgPSBQbGFuZU91dFsyXS5wYWNfZGF0YSArIFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIGlkZW0gZm9yIGlucHV0IGJ1ZmZlciAqLwotICAgIHB1OF9yZ2JuX2RhdGEgICA9IFBsYW5lSW4tPnBhY19kYXRhICsgUGxhbmVJbi0+dV90b3BsZWZ0OwotCi0gICAgLyogZ2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGggICA9IFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCAgPSBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIC8qIHNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gZWFjaCBvdXRwdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kgPSBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlMl9ZPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YgPSBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIC8qIGlkZW0gZm9yIGlucHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9yZ2IgPSBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlXzJyZ2IgPSB1MzJfc3RyaWRlX3JnYiA8PCAxOwotCi0gICAgLyogbG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlLCBpbnB1dCBjb29yZGluYXRlcyBhcmUgZXN0aW1hdGVkIGZyb20gb3V0cHV0IG9uZXMgKi8KLSAgICAvKiB0d28gWVVWIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHQgO3UzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiB1cGRhdGUgd29ya2luZyBwb2ludGVycyAqLwotICAgICAgICBwdThfeW4gID0gcHU4X3lfZGF0YTsKLSAgICAgICAgcHU4X3lzICA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLQotICAgICAgICBwdThfdSAgID0gcHU4X3VfZGF0YTsKLSAgICAgICAgcHU4X3YgICA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X3JnYm49IHB1OF9yZ2JuX2RhdGE7Ci0KLSAgICAgICAgLyogbG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlKi8KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogZ2V0IFJHQiBzYW1wbGVzIG9mIDQgcGl4ZWxzICovCi0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCwgcHU4X3JnYm4sIDApOwotICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTAsIHB1OF9yZ2JuLCBDU1RfUkdCXzI0X1NJWkUpOwotICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEsIHB1OF9yZ2JuLCB1MzJfc3RyaWRlX3JnYik7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSwgcHU4X3JnYm4sIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8yNF9TSVpFKTsKLQotICAgICAgICAgICAgaTMyX3UwMCA9IFUyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfeTAwID0gWTI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOyAgICAgICAvKiBtYXRyaXggbHVtaW5hbmNlICovCi0gICAgICAgICAgICBwdThfeW5bMF09IChNNFZJRklfVUludDgpaTMyX3kwMDsKLQotICAgICAgICAgICAgaTMyX3UxMCA9IFUyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl92MTAgPSBWMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfeTEwID0gWTI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgcHU4X3luWzFdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0KLSAgICAgICAgICAgIGkzMl91MDEgPSBVMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfdjAxID0gVjI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3kwMSA9IFkyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIHB1OF95c1swXT0gKE00VklGSV9VSW50OClpMzJfeTAxOwotCi0gICAgICAgICAgICBpMzJfdTExID0gVTI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3YxMSA9IFYyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl95MTEgPSBZMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgICpwdThfdSAgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ICA9IChNNFZJRklfVUludDgpKChpMzJfdjAwICsgaTMyX3YwMSArIGkzMl92MTAgKyBpMzJfdjExICsgMikgPj4gMik7Ci0KLSAgICAgICAgICAgIHB1OF9yZ2JuICAgICs9ICAoQ1NUX1JHQl8yNF9TSVpFPDwxKTsKLSAgICAgICAgICAgIHB1OF95biAgICAgICs9IDI7Ci0gICAgICAgICAgICBwdThfeXMgICAgICArPSAyOwotCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIHB1OF92ICsrOwotICAgICAgICB9IC8qIGVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgcHU4X3lfZGF0YSAgICAgICs9IHUzMl9zdHJpZGUyX1k7Ci0gICAgICAgIHB1OF91X2RhdGEgICAgICArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgICAgICArPSB1MzJfc3RyaWRlX1Y7Ci0gICAgICAgIHB1OF9yZ2JuX2RhdGEgICArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0vKiogWVVWNDIwIHRvIFlVVjQyMCAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1lVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFRyYW5zZm9ybSBZVVY0MjAgaW1hZ2UgdG8gYSBZVVY0MjAgaW1hZ2UuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBTcGVjaWZpYyBEYXRhIChVbnVzZWQgLSBjb3VsZCBiZSBOVUxMKQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVYgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gWVVWIFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIHBsYW5lIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiBwbGFuZSB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvWVVWNDIwKHZvaWQgKnVzZXJfZGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJblszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICkKLXsKLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaTsKLSAgICBNNFZJRklfVUludDggKnBfYnVmX3NyYywgKnBfYnVmX2Rlc3Q7Ci0KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKQotICAgIHsKLSAgICAgICAgcF9idWZfc3JjID0gJihQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW1BsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsICh2b2lkICopcF9idWZfc3JjICxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgcF9idWZfc3JjICs9IFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0gUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGF1dGhvciAgRGF2aWQgRGFuYSAoUEhJTElQUyBTb2Z0d2FyZSkKLSAqIEBicmllZiAgIFJlc2l6ZXMgWVVWNDIwIFBsYW5hciBwbGFuZS4KLSAqIEBub3RlICAgIEJhc2ljIHN0cnVjdHVyZSBvZiB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKHN0ZXAgMikKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uIChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgICAgIEdldCBmb3VyIFkgc2FtcGxlcyBhbmQgMSBVICYgViBzYW1wbGUKLSAqICAgICAgICAgICAgICAgICAgUmVzaXplIHRoZSBZIHdpdGggY29ycmVzcG9uaW5nIFUgYW5kIFYgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgWVVWIGluIHRoZSBvdXB1dCBwbGFuZQotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVY0MjAgKFBsYW5hcikgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gWVVWNDIwIChQbGFuYXIpIHBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9kYXRhX2luLCAqcHU4X2RhdGFfb3V0LCAqcHU4ZHVtOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcGxhbmU7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfaW4sIHUzMl9zdHJpZGVfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9pbmMsIHUzMl95X2luYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW0sIHUzMl95X2FjY3VtLCB1MzJfeF9hY2N1bV9zdGFydDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeV9mcmFjOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9mcmFjOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfdGVtcF92YWx1ZTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfdG9wOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY19ib3R0b207Ci0KLSAgICBNNFZJRklfVUludDggICAgdThXZmxhZyA9IDA7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIHU4SGZsYWcgPSAwOwotICAgIE00VklGSV9VSW50MzIgICBsb29wID0gMDsKLQotCi0gICAgLyoKLSAgICAgSWYgaW5wdXQgd2lkdGggaXMgZXF1YWwgdG8gb3V0cHV0IHdpZHRoIGFuZCBpbnB1dCBoZWlnaHQgZXF1YWwgdG8KLSAgICAgb3V0cHV0IGhlaWdodCB0aGVuIE00VklGSV9ZVVY0MjB0b1lVVjQyMCBpcyBjYWxsZWQuCi0gICAgKi8KLSAgICBpZiAoKHBQbGFuZUluWzBdLnVfaGVpZ2h0ID09IHBQbGFuZU91dFswXS51X2hlaWdodCkgJiYKLSAgICAgICAgICAgICAgKHBQbGFuZUluWzBdLnVfd2lkdGggPT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9ZVVY0MjB0b1lVVjQyMChwVXNlckRhdGEsIHBQbGFuZUluLCBwUGxhbmVPdXQpOwotICAgIH0KLQotICAgIC8qIENoZWNrIGZvciB0aGUgWVVWIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW5bMF0udV9oZWlnaHQpID09IEZBTFNFKSAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXRbMF0udV9oZWlnaHQpID09IEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgaWYgKChJU19FVkVOKHBQbGFuZUluWzBdLnVfd2lkdGgpID09IEZBTFNFKSB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXRbMF0udV93aWR0aCkgPT0gRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIExvb3Agb24gcGxhbmVzICovCi0gICAgZm9yKHUzMl9wbGFuZSA9IDA7dTMyX3BsYW5lIDwgUExBTkVTO3UzMl9wbGFuZSsrKQotICAgIHsKLSAgICAgICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0gICAgICAgIHB1OF9kYXRhX2luICAgICA9IHBQbGFuZUluW3UzMl9wbGFuZV0ucGFjX2RhdGEgKyBwUGxhbmVJblt1MzJfcGxhbmVdLnVfdG9wbGVmdDsKLSAgICAgICAgcHU4X2RhdGFfb3V0ICAgID0gcFBsYW5lT3V0W3UzMl9wbGFuZV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkganVtcCBjb3JyZXNwb25kaW5nIHRvIGEgcm93IGp1bXAgKi8KLSAgICAgICAgdTMyX3N0cmlkZV9pbiAgID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3N0cmlkZTsKLSAgICAgICAgdTMyX3N0cmlkZV9vdXQgID0gcFBsYW5lT3V0W3UzMl9wbGFuZV0udV9zdHJpZGU7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgICAgICB1MzJfd2lkdGhfaW4gICAgPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfd2lkdGg7Ci0gICAgICAgIHUzMl9oZWlnaHRfaW4gICA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV9oZWlnaHQ7Ci0KLSAgICAgICAgdTMyX3dpZHRoX291dCAgID0gcFBsYW5lT3V0W3UzMl9wbGFuZV0udV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9vdXQgID0gcFBsYW5lT3V0W3UzMl9wbGFuZV0udV9oZWlnaHQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgRm9yIHRoZSBjYXNlICwgd2lkdGhfb3V0ID0gd2lkdGhfaW4gLCBzZXQgdGhlIGZsYWcgdG8gYXZvaWQKLSAgICAgICAgYWNjZXNzaW5nIG9uZSBjb2x1bW4gYmV5b25kIHRoZSBpbnB1dCB3aWR0aC5JbiB0aGlzIGNhc2UgdGhlIGxhc3QKLSAgICAgICAgY29sdW1uIGlzIHJlcGxpY2F0ZWQgZm9yIHByb2Nlc3NpbmcKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPT0gdTMyX3dpZHRoX2luKSB7Ci0gICAgICAgICAgICB1MzJfd2lkdGhfb3V0ID0gdTMyX3dpZHRoX291dC0xOwotICAgICAgICAgICAgdThXZmxhZyA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfaW5jICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2luYyAgID0gKHUzMl93aWR0aF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICBGb3IgdGhlIGNhc2UgLCBoZWlnaHRfb3V0ID0gaGVpZ2h0X2luICwgc2V0IHRoZSBmbGFnIHRvIGF2b2lkCi0gICAgICAgIGFjY2Vzc2luZyBvbmUgcm93IGJleW9uZCB0aGUgaW5wdXQgaGVpZ2h0LkluIHRoaXMgY2FzZSB0aGUgbGFzdAotICAgICAgICByb3cgaXMgcmVwbGljYXRlZCBmb3IgcHJvY2Vzc2luZwotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPT0gdTMyX2hlaWdodF9pbikgewotICAgICAgICAgICAgdTMyX2hlaWdodF9vdXQgPSB1MzJfaGVpZ2h0X291dC0xOwotICAgICAgICAgICAgdThIZmxhZyA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2luYyAgID0gKCh1MzJfaGVpZ2h0X2luIC0gMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfaW5jID0gKHUzMl9oZWlnaHRfaW4gKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUKLSAgICAgICAgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl95X2luYyA+PSBNQVhfU0hPUlQpCi0gICAgICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgIG9uIHRoZSAxNiBoaWdoIGJpdHMgYW5kIHRoZSBmcmFjdGlvbmFsIG9uIHRoZSAxNSBsb3cgYml0cwotICAgICAgICAqLwotICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSB1MzJfeV9pbmMgJiAweGZmZmY7Ci0KLSAgICAgICAgICAgIGlmICghdTMyX3lfYWNjdW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBNQVhfU0hPUlQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHUzMl95X2FjY3VtID4+PSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSAwOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlCi0gICAgICAgIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfeF9pbmMgPj0gTUFYX1NIT1JUKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfaGVpZ2h0ID0gdTMyX2hlaWdodF9vdXQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZAotICAgICAgICB0aGVuIHVzZXMgdGhhdCByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb253IGVhY2ggY29sdW1uLgotICAgICAgICBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQgY29tYmluYXRpb24KLSAgICAgICAgb2YgaXRzIGZvdXIgbmVpZ2hib3VycyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6Ci0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKSsKLSAgICAgICAgZihwKyYscSsxKVIoMS1hKVIoYi0xKSB3aXRoICBSKHgpID0gLyB4KzEgIC0xID08IHggPTwgMCBcIDEteAotICAgICAgICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYil3ZWlnaHRpbmcgY29lZmZpY2llbnQgaXMgdGhlIGRpc3RhbmNlCi0gICAgICAgIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICAgICAqLwotCi0gICAgICAgIGRvIHsgLyogU2NhbiBhbGwgdGhlIHJvdyAqLwotCi0gICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtPj4xMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSB1MzJfeF9hY2N1bV9zdGFydDsKLQotICAgICAgICAgICAgdTMyX3dpZHRoID0gdTMyX3dpZHRoX291dDsKLQotICAgICAgICAgICAgZG8geyAvKiBTY2FuIGFsb25nIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIHUzMl9zdHJpZGVfaW47Ci0gICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl94X2luYzsKLSAgICAgICAgICAgIH0gd2hpbGUoLS11MzJfd2lkdGgpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgVGhpcyB1OFdmbGFnIGZsYWcgZ2V0cyBpbiB0byBlZmZlY3QgaWYgaW5wdXQgYW5kIG91dHB1dAotICAgICAgICAgICAgICAgd2lkdGggaXMgc2FtZSwgYW5kIGhlaWdodCBtYXkgYmUgZGlmZmVyZW50LiBTbyBwcmV2aW91cwotICAgICAgICAgICAgICAgcGl4ZWwgaXMgcmVwbGljYXRlZCBoZXJlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHU4V2ZsYWcpIHsKLSAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0ID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHU4ZHVtID0gKHB1OF9kYXRhX291dC11MzJfd2lkdGhfb3V0KTsKLSAgICAgICAgICAgIHB1OF9kYXRhX291dCA9IHB1OF9kYXRhX291dCArIHUzMl9zdHJpZGVfb3V0IC0gdTMyX3dpZHRoX291dDsKLQotICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSArPSB1MzJfeV9pbmM7Ci0gICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KSB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiB1MzJfc3RyaWRlX2luOwotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSgtLXUzMl9oZWlnaHQpOwotCi0gICAgICAgIC8qCi0gICAgICAgIFRoaXMgdThIZmxhZyBmbGFnIGdldHMgaW4gdG8gZWZmZWN0IGlmIGlucHV0IGFuZCBvdXRwdXQgaGVpZ2h0Ci0gICAgICAgIGlzIHNhbWUsIGFuZCB3aWR0aCBtYXkgYmUgZGlmZmVyZW50LiBTbyBwcmV2aW91cyBwaXhlbCByb3cgaXMKLSAgICAgICAgcmVwbGljYXRlZCBoZXJlCi0gICAgICAgICovCi0gICAgICAgIGlmICh1OEhmbGFnKSB7Ci0gICAgICAgICAgICBmb3IobG9vcCA9MDsgbG9vcCA8ICh1MzJfd2lkdGhfb3V0K3U4V2ZsYWcpOyBsb29wKyspIHsKLSAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KSpwdThkdW0rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLU00T1NBX0VSUiBhcHBseVJlbmRlcmluZ01vZGUoTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0LCBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbWVkaWFSZW5kZXJpbmcpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBpZihtZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa1Jlc2l6aW5nKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGwgdGhlIHJlc2l6ZSBmaWx0ZXIuIEZyb20gdGhlIGludGVybWVkaWF0ZSBmcmFtZSB0byB0aGUgZW5jb2RlciBpbWFnZSBwbGFuZSAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwUGxhbmVJbiwgcFBsYW5lT3V0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBNNFZpRmlsUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRBSVJfUGFyYW1zIFBhcmFtczsKLSAgICAgICAgTTRPU0FfQ29udGV4dCBtX2Fpcl9jb250ZXh0OwotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXNUZW1wWzNdOwotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lVGVtcDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVkgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lVSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVWID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWSA9IE5VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVUgPSBOVUxMOwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVWID0gTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAgICAgLyp0byBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgICAgIC8qSW5pdGlhbGl6ZSBBSVIgUGFyYW1zKi8KLSAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAwOwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZUluLT51X2hlaWdodDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwUGxhbmVJbi0+dV93aWR0aDsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgUGFyYW1zLm1fYk91dHB1dFN0cmlwZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgIE1lZGlhIHJlbmRlcmluZzogQmxhY2sgYm9yZGVycyovCi0gICAgICAgIGlmKG1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rQmxhY2tCb3JkZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsKHBQbGFuZU91dFswXS51X2hlaWdodCpwUGxhbmVPdXRbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSxVX1BMQU5FX0JPUkRFUl9WQUxVRSwocFBsYW5lT3V0WzFdLnVfaGVpZ2h0KnBQbGFuZU91dFsxXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLChwUGxhbmVPdXRbMl0udV9oZWlnaHQqcFBsYW5lT3V0WzJdLnVfc3RyaWRlKSk7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzJdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZSA9IHBQbGFuZU91dFsyXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIC8qIEFsbG9jYXRlcyBwbGFuIGluIGxvY2FsIGltYWdlIHBsYW5lIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQsIE00VlMsIChNNE9TQV9DaGFyKikiYXBwbHlSZW5kZXJpbmdNb2RlOiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyWSIpIDsKLSAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gYXBwbHlSZW5kZXJpbmdNb2RlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQsIE00VlMsIChNNE9TQV9DaGFyKikiYXBwbHlSZW5kZXJpbmdNb2RlOiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyVSIpIDsKLSAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciBhbGxvYyBpbiBhcHBseVJlbmRlcmluZ01vZGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJWIikgOwotICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIGFwcGx5UmVuZGVyaW5nTW9kZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEluUGxhbmVZID0gcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICBwSW5QbGFuZVUgPSBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhIDsKLSAgICAgICAgICAgIHBJblBsYW5lViA9IHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhLFlfUExBTkVfQk9SREVSX1ZBTFVFLChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEsVV9QTEFORV9CT1JERVJfVkFMVUUsKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSxWX1BMQU5FX0JPUkRFUl9WQUxVRSwocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlKSk7Ci0KLSAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwUGxhbmVJbi0+dV9oZWlnaHQgKiBwUGxhbmVPdXQtPnVfd2lkdGgpIC9wUGxhbmVJbi0+dV93aWR0aCkgPD0gcFBsYW5lT3V0LT51X2hlaWdodCkvL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA8IFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qaXQgaXMgaGVpZ2h0IHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBvbiB0aGUgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKE00T1NBX1VJbnQzMikoKHBQbGFuZUluLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aCkgL3BQbGFuZUluLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpKnBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKnBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKnBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyppdCBpcyB3aWR0aCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGUqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChNNE9TQV9VSW50MzIpKChwUGxhbmVJbi0+dV93aWR0aCAqIHBQbGFuZU91dC0+dV9oZWlnaHQpIC9wUGxhbmVJbi0+dV9oZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpPj4xKSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0gKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGgtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGgtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKldpZHRoIGFuZCBoZWlnaHQgaGF2ZSB0byBiZSBldmVuKi8KLSAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAvKkNoZWNrIHRoYXQgdmFsdWVzIGFyZSBjb2hlcmVudCovCi0gICAgICAgICAgICBpZihQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPT0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPT0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGxhbmVUZW1wID0gcEltYWdlUGxhbmVzVGVtcDsKLQotCi0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgTWVkaWEgcmVuZGVyaW5nOiBDcm9wcGluZyovCi0gICAgICAgIGlmKG1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rQ3JvcHBpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDxQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypoZWlnaHQgd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoTTRPU0FfVUludDMyKSgoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKSgocFBsYW5lSW4tPnVfaGVpZ2h0IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qd2lkdGggd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggKiBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpIC9QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikoKHBQbGFuZUluLT51X3dpZHRoIC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKT4+MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGxhbmVUZW1wID0gcFBsYW5lT3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBlcnIgPSBNNEFJUl9jcmVhdGUoJm1fYWlyX2NvbnRleHQsIE00QUlSX2tZVVY0MjBQKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImFwcGx5UmVuZGVyaW5nTW9kZTogRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8MzsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGVyciA9IE00QUlSX2NvbmZpZ3VyZShtX2Fpcl9jb250ZXh0LCAmUGFyYW1zKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImFwcGx5UmVuZGVyaW5nTW9kZTogRXJyb3Igd2hlbiBjb25maWd1cmluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChtX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8MzsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNEFJUl9nZXQobV9haXJfY29udGV4dCwgcFBsYW5lSW4sIHBQbGFuZVRlbXApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImFwcGx5UmVuZGVyaW5nTW9kZTogRXJyb3Igd2hlbiBnZXR0aW5nIEFJUiBwbGFuZTogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKG1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rQmxhY2tCb3JkZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFswXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVksICh2b2lkICopcEluUGxhbmVZLCBwUGxhbmVPdXRbMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVZICs9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVkgKz0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMV0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVVLCAodm9pZCAqKXBJblBsYW5lVSwgcFBsYW5lT3V0WzFdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lVSArPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVVICs9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lViwgKHZvaWQgKilwSW5QbGFuZVYsIHBQbGFuZU91dFsyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVYgKz0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lViArPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvcihpPTA7IGk8MzsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2Fpcl9jb250ZXh0ICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAobV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBtX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8vVE9ETzogcmVtb3ZlIHRoaXMgY29kZSBhZnRlciBsaW5rIHdpdGggdmlkZW9hcnRpc3QgbGliCi0vKiBNNEFJUiBjb2RlKi8KLSNkZWZpbmUgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSNkZWZpbmUgTTRBSVJfWVVWNDIwQV9GT1JNQVRfU1VQUE9SVEVECi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBJTEFUSU9OIENIRUNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIE00QUlSX1lVVjQyMF9GT1JNQVRfU1VQUE9SVEVECi0jaWZuZGVmIE00QUlSX0JHUjU2NV9GT1JNQVRfU1VQUE9SVEVECi0jaWZuZGVmIE00QUlSX1JHQjU2NV9GT1JNQVRfU1VQUE9SVEVECi0jaWZuZGVmIE00QUlSX0JHUjg4OF9GT1JNQVRfU1VQUE9SVEVECi0jaWZuZGVmIE00QUlSX1JHQjg4OF9GT1JNQVRfU1VQUE9SVEVECi0jaWZuZGVmIE00QUlSX0pQR19GT1JNQVRfU1VQUE9SVEVECi0KLSNlcnJvciAiUGxlYXNlIGRlZmluZSBhdCBsZWFzdCBvbmUgaW5wdXQgZm9ybWF0IGZvciB0aGUgQUlSIGNvbXBvbmVudCIKLQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIE00QUlSIElOVEVSTkFMIFRZUEVTIERFRklOSVRJT05TICoqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICBNNEFJUl9TdGF0ZXMKLSAqIEBicmllZiAgICAgICBUaGUgZm9sbG93aW5nIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGludGVybmFsIHN0YXRlcyBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00QUlSX2tDcmVhdGVkLCAgICAgICAgIC8qKjwgU3RhdGUgYWZ0ZXIgTTRBSVJfY3JlYXRlIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00QUlSX2tDb25maWd1cmVkICAgICAgICAgICAvKio8IFN0YXRlIGFmdGVyIE00QUlSX2NvbmZpZ3VyZSBoYXMgYmVlbiBjYWxsZWQgKi8KLX1NNEFJUl9TdGF0ZXM7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgdGhlIEFJUi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00QUlSX1N0YXRlcyAgICAgICAgICAgICAgICBtX3N0YXRlOyAgICAgICAgICAgIC8qKjwgSW50ZXJuYWwgc3RhdGUgKi8KLSAgICBNNEFJUl9JbnB1dEZvcm1hdFR5cGUgICBtX2lucHV0Rm9ybWF0OyAgICAgIC8qKjwgSW5wdXQgZm9ybWF0IGxpa2UgWVVWNDIwUGxhbmFyLCBSR0I1NjUsIEpQRywgZXRjIC4uLiAqLwotICAgIE00QUlSX1BhcmFtcyAgICAgICAgICAgIG1fcGFyYW1zOyAgICAgICAgICAgLyoqPCBDdXJyZW50IGlucHV0IFBhcmFtZXRlciBvZiAgdGhlIHByb2Nlc3NpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9pbmNbNF07ICAgICAgIC8qKjwgcmF0aW8gYmV0d2VlbiBpbnB1dCBhbmQgb3VwdXQgd2lkdGggZm9yIFlVViAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2luY1s0XTsgICAgICAgLyoqPCByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXB1dCBoZWlnaHQgZm9yIFlVViAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0WzRdOyAgIC8qKjwgaG9yaXpvbnRhbCBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnRbNF07ICAgLyoqPCBWZXJ0aWNhbCBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfYWNjdW1bNF07ICAgICAvKio8IHNhdmUgb2YgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2FjY3VtWzRdOyAgICAgLyoqPCBzYXZlIG9mIHZlcnRpY2FsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDgqICAgICAgICAgICAgcHU4X2RhdGFfaW5bNF07ICAgICAgICAgLyoqPCBTYXZlIG9mIGlucHV0IHBsYW5lIHBvaW50ZXJzIGluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3Byb2NSb3dzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHByb2Nlc3NlZCByb3dzLCB1c2VkIGluIHN0cmlwZSBtb2RlIG9ubHkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX2JPbmx5Q29weTsgICAgICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBqdXN0IHBlcmZvcm0gYSBjb3B5IG9yIGEgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYkZsaXBYOyAgICAgICAgICAgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZyB0byByZXZlcnQgcHJvY2Vzc2luZyBvcmRlciBpbiBYIGNvb3JkaW5hdGVzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9iRmxpcFk7ICAgICAgICAgICAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZyBwcm9jZXNzaW5nIHRvIHJldmVydCBwcm9jZXNzaW5nIG9yZGVyIGluIFkgY29vcmRpbmF0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX2JSZXZlcnRYWTsgICAgICAgICAgICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IFggYW5kIFkgcHJvY2Vzc2luZyBvcmRlciAoKy05MMKwIHJvdGF0aW9uKSAqLwotfU00QUlSX0ludGVybmFsQ29udGV4dDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNQUNST1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUocmV0dmFsLCBwb2ludGVyKSBpZiAoKHBvaW50ZXIpID09IE00T1NBX05VTEwpIHJldHVybiAoKE00T1NBX0VSUikocmV0dmFsKSk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgUFVCTElDIEFQSSBJTVBMRU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCi0gKiBAYXV0aG9yICBBcm5hdWQgQ29sbGFyZAotICogQGJyaWVmICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgQUlSLgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgKElOL09VVCkgQWRkcmVzcyBvZiB0aGUgY29udGV4dCB0byBjcmVhdGUKLSAqIEBwYXJhbSAgIGlucHV0Rm9ybWF0OiAgICAoSU4pIGlucHV0IGZvcm1hdCB0eXBlLgotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuIEludmFsaWQgZm9ybWF0VHlwZQotICogQHJldHVybiAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IGlzIGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQsTTRBSVJfSW5wdXRGb3JtYXRUeXBlIGlucHV0Rm9ybWF0KQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SIDsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gTTRPU0FfTlVMTCA7Ci0gICAgLyogQ2hlY2sgdGhhdCB0aGUgYWRkcmVzcyBvbiB0aGUgY29udGV4dCBpcyBub3QgTlVMTCAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgLyogSW50ZXJuYWwgQ29udGV4dCBjcmVhdGlvbiAqLwotICAgIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNEFJUl9JbnRlcm5hbENvbnRleHQpLCBNNEFJUiwgKE00T1NBX0NoYXIqKSJBSVIgaW50ZXJuYWwgY29udGV4dCIpIDsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9BTExPQywgcEMpIDsKLQotCi0gICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGZvcm1hdCBpcyBzdXBwb3J0ZWQgKi8KLSAgICBzd2l0Y2goaW5wdXRGb3JtYXQpCi0gICAgewotI2lmZGVmIE00QUlSX1lVVjQyMF9GT1JNQVRfU1VQUE9SVEVECi0gICAgICAgIGNhc2UgTTRBSVJfa1lVVjQyMFA6Ci0gICAgICAgIGJyZWFrIDsKLSNlbmRpZgotI2lmZGVmIE00QUlSX1lVVjQyMEFfRk9STUFUX1NVUFBPUlRFRAotICAgICAgICBjYXNlIE00QUlSX2tZVVY0MjBBUDoKLSAgICAgICAgYnJlYWsgOwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9BSVJfRk9STUFUX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgICAgICBnb3RvIE00QUlSX2NyZWF0ZV9jbGVhbnVwIDsKLSAgICB9Ci0KLSAgICAvKio8IFNhdmUgaW5wdXQgZm9ybWF0IGFuZCB1cGRhdGUgc3RhdGUgKi8KLSAgICBwQy0+bV9pbnB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OwotICAgIHBDLT5tX3N0YXRlID0gTTRBSVJfa0NyZWF0ZWQ7Ci0KLSAgICAvKiBSZXR1cm4gdGhlIGNvbnRleHQgdG8gdGhlIGNhbGxlciAqLwotICAgICpwQ29udGV4dCA9IHBDIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotTTRBSVJfY3JlYXRlX2NsZWFudXA6Ci0gICAgLyogRXJyb3IgbWFuYWdlbWVudCA6IHdlIGRlc3Ryb3kgdGhlIGNvbnRleHQgaWYgbmVlZGVkICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQykKLSAgICB7Ci0gICAgICAgIGZyZWUocEMpIDsKLSAgICB9Ci0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKLQotICAgIHJldHVybiBlcnIgOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGF1dGhvciAgQXJuYXVkIENvbGxhcmQKLSAqIEBicmllZiAgICAgICBUaGlzIGZ1bmN0aW9uIGRlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIgY29tcG9uZW50Ci0gKiBAcGFyYW0gICBwQ29udGV4dDogICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlIHRvIGRlc3Ryb3kKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgTTRFUlJfU1RBVEU6IEludGVybmFsIHN0YXRlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZnVuY3Rpb24gY2FsbC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0IDsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZigoTTRBSVJfa0NyZWF0ZWQgIT0gcEMtPm1fc3RhdGUpJiYoTTRBSVJfa0NvbmZpZ3VyZWQgIT0gcEMtPm1fc3RhdGUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLSAgICBmcmVlKHBDKSA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0KLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jb25maWd1cmUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRBSVJfUGFyYW1zKiBwUGFyYW1zKQotICogQGJyaWVmICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBjb25maWd1cmUgdGhlIEFJUi4KLSAqIEBub3RlICAgIEl0IHdpbGwgc2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGNvb3JkaW5hdGVzIGFuZCBzaXplcywKLSAqICAgICAgICAgIGFuZCBpbmRpY2F0ZXMgaWYgd2Ugd2lsbCBwcm9jZWVkIGluIHN0cmlwZSBvciBub3QuCi0gKiAgICAgICAgICBJbiBjYXNlIGEgTTRBSVJfZ2V0IGluIHN0cmlwZSBtb2RlIHdhcyBvbiBnb2luZywgaXQgd2lsbCBjYW5jZWwgdGhpcyBwcmV2aW91cyBwcm9jZXNzaW5nCi0gKiAgICAgICAgICBhbmQgcmVzZXQgdGhlIGdldCBwcm9jZXNzLgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQotICogQHBhcmFtICAgcFBhcmFtcy0+bV9iT3V0cHV0U3RyaXBlOihJTikgU3RyaXBlIG1vZGUuCi0gKiBAcGFyYW0gICBwUGFyYW1zLT5tX2lucHV0Q29vcmQ6ICAoSU4pIFgsWSBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQuCi0gKiBAcGFyYW0gICBwUGFyYW1zLT5tX2lucHV0U2l6ZTogICAoSU4pIGlucHV0IFJPSSBzaXplLgotICogQHBhcmFtICAgcFBhcmFtcy0+bV9vdXRwdXRTaXplOiAgKElOKSBvdXRwdXQgc2l6ZS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICBNNEVSUl9BSVJfRk9STUFUX05PVF9TVVBQT1JURUQ6IHRoZSByZXF1ZXN0ZWQgaW5wdXQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi17Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0IDsKLSAgICBNNE9TQV9VSW50MzIgICAgaSx1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00T1NBX1VJbnQzMiAgICBuYl9wbGFuZXM7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICBpZihNNEFJUl9rWVVWNDIwQVAgPT0gcEMtPm1faW5wdXRGb3JtYXQpCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSAzOwotICAgIH0KLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZigoTTRBSVJfa0NyZWF0ZWQgIT0gcEMtPm1fc3RhdGUpJiYoTTRBSVJfa0NvbmZpZ3VyZWQgIT0gcEMtPm1fc3RhdGUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKiBTYXZlIHBhcmFtZXRlcnMgKi8KLSAgICBwQy0+bV9wYXJhbXMgPSAqcFBhcmFtczsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgaW5wdXQmb3V0cHV0IHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICAgICAgaWYoICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpICAgIHx8Ci0gICAgICAgICAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkmMHgxKSkKLSAgICAgICAgewotICAgICAgICAgcmV0dXJuIE00RVJSX0FJUl9JTExFR0FMX0ZSQU1FX1NJWkU7Ci0gICAgICAgIH0KLQotICAgIGlmKCAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSYweDEpICAgIHx8Ci0gICAgICAgICAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotICAgIGlmKCgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpID09IChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAmJigocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSA9PSAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpKQotICAgIHsKLSAgICAgICAgLyoqPCBObyByZXNpemUgaW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGp1c3QgY29weSBpbnB1dCBpbiBvdXRwdXQgKi8KLSAgICAgICAgcEMtPm1fYk9ubHlDb3B5ID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm1fYk9ubHlDb3B5ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqPCBJbml0aWFsaXplIGludGVybmFsIHZhcmlhYmxlcyB1c2VkIGZvciByZXNpemUgZmlsdGVyICovCi0gICAgICAgIGZvcihpPTA7aTxuYl9wbGFuZXM7aSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHUzMl93aWR0aF9pbiA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg6KHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKzEpPj4xOwotICAgICAgICAgICAgdTMyX2hlaWdodF9pbiA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0OihwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfd2lkdGhfb3V0ID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg6KHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl9oZWlnaHRfb3V0ID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KzEpPj4xOwotCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSBob3Jpem9udGFsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiB3aWR0aC4qLwotICAgICAgICAgICAgICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9pbmNbaV0gICA9ICgodTMyX3dpZHRoX2luLTEpICogMHgxMDAwMCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2luY1tpXSAgID0gKHUzMl93aWR0aF9pbiAqIDB4MTAwMDApIC8gKHUzMl93aWR0aF9vdXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodC4qLwotICAgICAgICAgICAgICAgIGlmICh1MzJfaGVpZ2h0X291dCA+PSB1MzJfaGVpZ2h0X2luKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2luY1tpXSAgID0gKCh1MzJfaGVpZ2h0X2luIC0gMSkgKiAweDEwMDAwKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2luY1tpXSA9ICh1MzJfaGVpZ2h0X2luICogMHgxMDAwMCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl95X2luY1tpXSA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgdGhlIGZyYWN0aW9ubmFsIHBhcnQsIGFzc2ltdW5nIHRoYXQgaW50ZWdlciAgcGFydCBpcyBjb2RlZAotICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cwotICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPSBwQy0+dTMyX3lfaW5jW2ldICYgMHhmZmZmOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPSAweDEwMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID4+PSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKio8IFRha2UgaW50byBhY2NvdW50IHRoYXQgWSBjb29yZGluYXRlIGNhbiBiZSBvZGQKLSAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gcHV0IGEgMC41IG9mZnNldAotICAgICAgICAgICAgICAgICAgICBmb3IgVSBhbmQgViBwbGFuZSBhcyB0aGVyZSBhIDIgdGltZXMgc3ViLXNhbXBsZWQgdnMgWSovCi0gICAgICAgICAgICAgICAgaWYoKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV95JjB4MSkmJigoaT09MSl8fChpPT0yKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gKz0gMHg4MDAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeF9pbmNbaV0gPj0gMHgxMDAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA9IHBDLT51MzJfeF9pbmNbaV0gJiAweGZmZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPj49IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKjwgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBYIGNvb3JkaW5hdGUgY2FuIGJlIG9kZAotICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgYSAwLjUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgIGZvciBVIGFuZCBWIHBsYW5lIGFzIHRoZXJlIGEgMiB0aW1lcyBzdWItc2FtcGxlZCB2cyBZKi8KLSAgICAgICAgICAgICAgICBpZigocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3gmMHgxKSYmKChpPT0xKXx8KGk9PTIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSArPSAweDgwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqPCBSZXNldCB2YXJpYWJsZSB1c2VkIGZvciBzdHJpcGUgbW9kZSAqLwotICAgIHBDLT5tX3Byb2NSb3dzID0gMDsKLQotICAgIC8qKjwgSW5pdGlhbGl6ZSB2YXIgZm9yIFgvWSBwcm9jZXNzaW5nIG9yZGVyIGFjY29yZGluZyB0byBvcmllbnRhdGlvbiAqLwotICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX0ZBTFNFOwotICAgIHN3aXRjaChwUGFyYW1zLT5tX291dHB1dE9yaWVudGF0aW9uKQotICAgIHsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQ6Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbUxlZnQ6Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbToKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICAvKio8IFVwZGF0ZSBzdGF0ZSAqLwotICAgIHBDLT5tX3N0YXRlID0gTTRBSVJfa0NvbmZpZ3VyZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfZ2V0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0KQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgdGhlIHJlcXVlc3RlZCByZXNpemVkIGFyZWEgb2YgaW50ZXJlc3QgYWNjb3JkaW5nIHRvIHNldHRpbmdzCi0gKiAgICAgICAgICBwcm92aWRlZCBpbiBNNEFJUl9jb25maWd1cmUuCi0gKiBAbm90ZSAgICBJbiBjYXNlIHRoZSBpbnB1dCBmb3JtYXQgdHlwZSBpcyBKUEVHLCBpbnB1dCBwbGFuZShzKQotICogICAgICAgICAgaW4gcEluIGlzIG5vdCB1c2VkLiBJbiBub3JtYWwgbW9kZSwgZGltZW5zaW9uIHNwZWNpZmllZCBpbiBvdXRwdXQgcGxhbmUocykgc3RydWN0dXJlIG11c3QgYmUgdGhlCi0gKiAgICAgICAgICBzYW1lIHRoYW4gdGhlIG9uZSBzcGVjaWZpZWQgaW4gTTRBSVJfY29uZmlndXJlLiBJbiBzdHJpcGUgbW9kZSwgb25seSB0aGUgd2lkdGggd2lsbCBiZSB0aGUgc2FtZSwKLSAqICAgICAgICAgIGhlaWdodCB3aWxsIGJlIHRha2VuIGFzIHRoZSBzdHJpcGUgaGVpZ2h0ICh0eXBpY2FsbHkgMTYpLgotICogICAgICAgICAgSW4gbm9ybWFsIG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbCBvbmNlIHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgcGljdHVyZS4gSW4gc3RyaXBlIG1vZGUsIGl0IGlzIGNhbGxlZAotICogICAgICAgICAgZm9yIGVhY2ggc3RyaXBlIHRpbGwgdGhlIHdob2xlIHBpY3R1cmUgaGFzIGJlZW4gcmV0cmlldmVkLGFuZCAgdGhlIHBvc2l0aW9uIG9mIHRoZSBvdXRwdXQgc3RyaXBlIGluIHRoZSBvdXRwdXQgcGljdHVyZQotICogICAgICAgICAgaXMgaW50ZXJuYWxseSBpbmNyZW1lbnRlZCBhdCBlYWNoIHN0ZXAuCi0gKiAgICAgICAgICBBbnkgY2FsbCB0byBNNEFJUl9jb25maWd1cmUgZHVyaW5nIHN0cmlwZSBwcm9jZXNzIHdpbGwgcmVzZXQgdGhpcyBvbmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBpY3R1cmUuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICBwSW46ICAgICAgICAgICAgKElOKSBQbGFuZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbnB1dCBQbGFuZShzKS4KLSAqIEBwYXJhbSAgIHBPdXQ6ICAgICAgIChJTi9PVVQpICBQbGFuZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBvdXRwdXQgUGxhbmUocykuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi17Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0IDsKLSAgICBNNE9TQV9VSW50MzIgaSxqLGssdTMyX3hfZnJhYyx1MzJfeV9mcmFjLHUzMl94X2FjY3VtLHUzMl95X2FjY3VtLHUzMl9zaGlmdDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9kYXRhX2luLCAqcHU4X2RhdGFfaW5fb3JnLCAqcHU4X2RhdGFfaW5fdG1wLCAqcHU4X2RhdGFfb3V0OwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X3NyY190b3A7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbTsKLSAgICBNNE9TQV9VSW50MzIgICAgdTMyX3RlbXBfdmFsdWU7Ci0gICAgTTRPU0FfSW50MzIgaTMyX3RtcF9vZmZzZXQ7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKLQotCi0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICAvKio8IENoZWNrIHN0YXRlICovCi0gICAgaWYoTTRBSVJfa0NvbmZpZ3VyZWQgIT0gcEMtPm1fc3RhdGUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgaWYoTTRBSVJfa1lVVjQyMEFQID09IHBDLT5tX2lucHV0Rm9ybWF0KQotICAgIHsKLSAgICAgICAgbmJfcGxhbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbmJfcGxhbmVzID0gMzsKLSAgICB9Ci0KLSAgICAvKio8IExvb3Agb24gZWFjaCBQbGFuZSAqLwotICAgIGZvcihpPTA7aTxuYl9wbGFuZXM7aSsrKQotICAgIHsKLQotICAgICAgICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0KLSAgICAgICAgdTMyX3NoaWZ0ID0gKChpPT0wKXx8KGk9PTMpKT8wOjE7IC8qKjwgRGVwZW5kIG9uIEx1bWEgb3IgQ2hyb21hICovCi0KLSAgICAgICAgaWYoKE00T1NBX0ZBTFNFID09IHBDLT5tX3BhcmFtcy5tX2JPdXRwdXRTdHJpcGUpfHwoKE00T1NBX1RSVUUgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSkmJigwID09IHBDLT5tX3Byb2NSb3dzKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgRm9yIGlucHV0LCB0YWtlIGNhcmUgYWJvdXQgUk9JICovCi0gICAgICAgICAgICBwdThfZGF0YV9pbiAgICAgPSBwSW5baV0ucGFjX2RhdGEgKyBwSW5baV0udV90b3BsZWZ0ICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV94Pj51MzJfc2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICArIChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feSA+PiB1MzJfc2hpZnQpICogcEluW2ldLnVfc3RyaWRlOwotCi0gICAgICAgICAgICAvKiogR28gYXQgZW5kIG9mIGxpbmUvY29sdW1uIGluIGNhc2UgWC9ZIHNjYW5uaW5nIGlzIGZsaXBwZWQgKi8KLSAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9ICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj51MzJfc2hpZnQpIC0xIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fYkZsaXBZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9ICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj51MzJfc2hpZnQpIC0xKSAqIHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqPCBJbml0aWFsaXplIGFjY3VtdWxhdG9ycyBpbiBjYXNlIHdlIGFyZSB1c2luZyBpdCAoYmlsaW5lYXIgaW50ZXJwb2xhdGlvbikgKi8KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+bV9iT25seUNvcHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldID0gcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldOwotICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBJbiBjYXNlIG9mIHN0cmlwZSBtb2RlIGZvciBvdGhlciB0aGFuIGZpcnN0IHN0cmlwZSwgd2UgbmVlZCB0byByZWNvdmVyIGlucHV0IHBvaW50ZXIgZnJvbSBpbnRlcm5hbCBjb250ZXh0ICovCi0gICAgICAgICAgICBwdThfZGF0YV9pbiA9IHBDLT5wdThfZGF0YV9pbltpXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgSW4gZXZlcnkgbW9kZSwgb3V0cHV0IGRhdGEgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBwbGFuZSAqLwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSBwT3V0W2ldLnBhY19kYXRhICsgcE91dFtpXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgLyoqPCBJbml0aWFsaXplIGlucHV0IG9mZnNldCBhcHBsaWVkIGFmdGVyIGVhY2ggcGl4ZWwgKi8KLSAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBZKQotICAgICAgICB7Ci0gICAgICAgICAgICBpMzJfdG1wX29mZnNldCA9IHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkzMl90bXBfb2Zmc2V0ID0gLXBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgSW4gdGhpcyBjYXNlLCBubyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGlzIG5lZWRlZCBhcyBpbnB1dCBhbmQgb3V0cHV0IGRpbWVuc2lvbnMgYXJlIHRoZSBzYW1lICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBObyArLTkwwrAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKio8IE5vIGZsaXAgb24gWCBhYnNjaXNzYSAqLwotICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbG9jX2hlaWdodCA9IHBPdXRbaV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbG9jX3dpZHRoID0gcE91dFtpXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxvY19zdHJpZGUgPSBwSW5baV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajxsb2NfaGVpZ2h0OyBqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29weSBvbmUgd2hvbGUgbGluZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcHU4X2RhdGFfb3V0LCAodm9pZCAqKXB1OF9kYXRhX2luLCBsb2Nfd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gbG9jX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiAtPSBsb2Nfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHBpeGVsIG9mIDEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAqcHU4X2RhdGFfaW4tLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSAocE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9IHBPdXRbaV0udV93aWR0aCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKio8IEhlcmUgd2UgaGF2ZSBhICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wID0gcHU4X2RhdGFfaW47Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcGl4ZWwgb2YgMSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9ICpwdThfZGF0YV9pbl90bXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIGlucHV0IHBvaW50ZXIgaW4gb3JkZXIgdG8gZ28gdG8gbmV4dC9wYXN0IGxpbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX3RtcCArPSBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSAocE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiAtLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKio8IEJpbGluZWFyIGludGVycG9sYXRpb24gKi8KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgaWYoMyAhPSBpKSAgLyoqPCBvdGhlciB0aGFuIGFscGhhIHBsYW5lICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKk5vICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHUzMl94X2FjY3VtID4+IDE2KSkgLTEgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl95X2FjY3VtW2ldPj4xNikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3lfYWNjdW1baV0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAvKiogKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fb3JnID0gcHU4X2RhdGFfaW47Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAocEMtPnUzMl94X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KSkgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gKz0gcEMtPnUzMl94X2luY1tpXTsKLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luX29yZzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0vKiogMyAhPSBpICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvKipObyArLTkwwrAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9IChwQy0+dTMyX3lfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtID0gcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldOwotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtICh1MzJfeF9hY2N1bSA+PiAxNikpIC0xIDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfYWNjdW1baV0+PjE2KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeV9hY2N1bVtpXSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gLyoqPCBNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkgKi8KLSAgICAgICAgICAgIC8qKiArLTkwwrAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bVtpXSArPSBwQy0+dTMyX3hfaW5jW2ldOwotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW5fb3JnOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gLyoqPCBNNE9TQV9UUlVFID09IHBDLT5tX2JSZXZlcnRYWSAqLwotICAgICAgICB9LyoqIDMgPT0gaSAqLwotICAgICAgICAgICAgfQotICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUsIHNhdmUgY3VycmVudCBpbnB1dCBwb2ludGVyICovCi0gICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnB1OF9kYXRhX2luW2ldID0gcHU4X2RhdGFfaW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFVwZGF0ZSBudW1iZXIgb2YgcHJvY2Vzc2VkIHJvd3MsIHJlc2V0IGl0IGlmIHdlIGhhdmUgZmluaXNoZWQgd2l0aCB0aGUgd2hvbGUgcHJvY2Vzc2luZyAqLwotICAgIHBDLT5tX3Byb2NSb3dzICs9IHBPdXRbMF0udV9oZWlnaHQ7Ci0gICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgIHsKLSAgICAgICAgaWYocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA8PSBwQy0+bV9wcm9jUm93cykgICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPD0gcEMtPm1fcHJvY1Jvd3MpIHBDLT5tX3Byb2NSb3dzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0KLX0KLS8qKyBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTHZHZXRJbWFnZVRodW1iTmFpbChNNE9TQV9VQ2hhciAqZmlsZU5hbWUsIE00T1NBX1ZvaWQgKipwQnVmZmVyKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBnaXZlcyBZVVY0MjAgYnVmZmVyIG9mIGEgZ2l2ZW4gaW1hZ2UgZmlsZSAoaW4gYXJnYjg4OCBmb3JtYXQpCi0gKiBATm90ZTogVGhlIGNhbGxlciBvZiB0aGUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgdG8gZnJlZSB0aGUgeXV2IGJ1ZmZlciBhbGxvY2F0ZWQKLSAqIEBwYXJhbSAgIGZpbGVOYW1lOiAgICAgICAoSU4pIFBhdGggdG8gdGhlIGZpbGVuYW1lIG9mIHRoZSBpbWFnZSBhcmdiIGRhdGEKLSAqIEBwYXJhbSAgIGhlaWdodDogICAgIChJTikgSGVpZ2h0IG9mIHRoZSBpbWFnZQotICogQHBhcmFtICAgICB3aWR0aDogICAgICAgICAgICAgKE9VVCkgcEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSB5dXYgZGF0YSBhZGRyZXNzIG5lZWRzIHRvIGJlIHJldHVybmVkLgotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IGlmIHRoZSBmaWxlIHBhc3NlZCBkb2VzIG5vdCBleGlzdHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIEx2R2V0SW1hZ2VUaHVtYk5haWwoY29uc3QgY2hhciAqZmlsZU5hbWUsIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVm9pZCAqKnBCdWZmZXIpIHsKLQotICAgIE00VklGSV9JbWFnZVBsYW5lIHJnYlBsYW5lLCAqeXV2UGxhbmU7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9hcmdiID0gKHdpZHRoICogaGVpZ2h0ICogNCk7IC8vIGFyZ2IgZGF0YQotICAgIE00T1NBX0NvbnRleHQgbEltYWdlRmlsZUZwICA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9VSW50OCAqcFRtcERhdGEgPSAoTTRPU0FfVUludDgqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplX2FyZ2IsIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgYXJnYiBkYXRhIik7Ci0gICAgaWYocFRtcERhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgICAgLyoqIFJlYWQgdGhlIGFyZ2IgZGF0YSBmcm9tIHRoZSBwYXNzZWQgZmlsZS4gKi8KLSAgICBNNE9TQV9FUlIgbGVyciA9IE00T1NBX2ZpbGVSZWFkT3BlbigmbEltYWdlRmlsZUZwLCAoTTRPU0FfVm9pZCAqKSBmaWxlTmFtZSwgTTRPU0Ffa0ZpbGVSZWFkKTsKLQotICAgIGlmKChsZXJyICE9IE00Tk9fRVJST1IpIHx8IChsSW1hZ2VGaWxlRnAgPT0gTTRPU0FfTlVMTCkpCi0gICAgewotICAgICAgICBBTE9HRSgiTFZQcmV2aWV3Q29udHJvbGxlcjogQ2FuIG5vdCBvcGVuIHRoZSBmaWxlICIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOwotICAgIH0KLSAgICBsZXJyID0gTTRPU0FfZmlsZVJlYWREYXRhKGxJbWFnZUZpbGVGcCwgKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGxlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIEFMT0dFKCJMVlByZXZpZXdDb250cm9sbGVyOiBjYW4gbm90IHJlYWQgdGhlIGRhdGEgIik7Ci0gICAgICAgIE00T1NBX2ZpbGVSZWFkQ2xvc2UobEltYWdlRmlsZUZwKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHJldHVybiBsZXJyOwotICAgIH0KLSAgICBNNE9TQV9maWxlUmVhZENsb3NlKGxJbWFnZUZpbGVGcCk7Ci0KLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gKHdpZHRoICogaGVpZ2h0ICogMyk7IC8vU2l6ZSBvZiBZVVY0MjAgZGF0YS4KLSAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemUsIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKiBSZW1vdmUgdGhlIGFscGhhIGNoYW5uZWwgKi8KLSAgICBmb3IgKE00T1NBX1VJbnQzMiBpPTAsIGogPSAwOyBpIDwgZnJhbWVTaXplX2FyZ2I7IGkrKykgewotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSBwVG1wRGF0YVtpXTsKLSAgICAgICAgaisrOwotICAgIH0KLSAgICBmcmVlKHBUbXBEYXRhKTsKLQotI2lmZGVmIEZJTEVfRFVNUAotICAgIEZJTEUgKmZwID0gZm9wZW4oIi9zZGNhcmQvSW5wdXQvdGVzdF9yZ2IucmF3IiwgIndiIik7Ci0gICAgaWYoZnAgPT0gTlVMTCkKLSAgICAgICAgQUxPR0UoIkVycm9ycyBmaWxlIGNhbiBub3QgYmUgY3JlYXRlZCIpOwotICAgIGVsc2UgewotICAgICAgICBmd3JpdGUocmdiUGxhbmUucGFjX2RhdGEsIGZyYW1lU2l6ZSwgMSwgZnApOwotICAgICAgICBmY2xvc2UoZnApOwotICAgIH0KLSNlbmRpZgotICAgICAgICByZ2JQbGFuZS51X2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgcmdiUGxhbmUudV93aWR0aCA9IHdpZHRoOwotICAgICAgICByZ2JQbGFuZS51X3N0cmlkZSA9IHdpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgeXV2UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICAgICAgeXV2UGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHl1dlBsYW5lWzBdLnVfd2lkdGggPSB3aWR0aDsKLSAgICAgICAgeXV2UGxhbmVbMF0udV9zdHJpZGUgPSB3aWR0aDsKLSAgICAgICAgeXV2UGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgeXV2UGxhbmVbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoeXV2UGxhbmVbMF0udV9oZWlnaHQgKiB5dXZQbGFuZVswXS51X3dpZHRoICogMS41LCBNNFZTLCAoTTRPU0FfQ2hhciopImltYWdlQ2xpcCBZVVYgZGF0YSIpOwotCi0gICAgICAgIHl1dlBsYW5lWzFdLnVfaGVpZ2h0ID0geXV2UGxhbmVbMF0udV9oZWlnaHQgPj4xOwotICAgICAgICB5dXZQbGFuZVsxXS51X3dpZHRoID0geXV2UGxhbmVbMF0udV93aWR0aCA+PiAxOwotICAgICAgICB5dXZQbGFuZVsxXS51X3N0cmlkZSA9IHl1dlBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgIHl1dlBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHl1dlBsYW5lWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKHl1dlBsYW5lWzBdLnBhY19kYXRhICsgeXV2UGxhbmVbMF0udV9oZWlnaHQgKiB5dXZQbGFuZVswXS51X3dpZHRoKTsKLQotICAgICAgICB5dXZQbGFuZVsyXS51X2hlaWdodCA9IHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID4+MTsKLSAgICAgICAgeXV2UGxhbmVbMl0udV93aWR0aCA9IHl1dlBsYW5lWzBdLnVfd2lkdGggPj4gMTsKLSAgICAgICAgeXV2UGxhbmVbMl0udV9zdHJpZGUgPSB5dXZQbGFuZVsyXS51X3dpZHRoOwotICAgICAgICB5dXZQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB5dXZQbGFuZVsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSh5dXZQbGFuZVsxXS5wYWNfZGF0YSArIHl1dlBsYW5lWzFdLnVfaGVpZ2h0ICogeXV2UGxhbmVbMV0udV93aWR0aCk7Ci0KLQotICAgICAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lLCB5dXZQbGFuZSk7Ci0gICAgICAgIC8vZXJyID0gTTRWSUZJX0JHUjg4OHRvWVVWNDIwKE00T1NBX05VTEwsICZyZ2JQbGFuZSwgeXV2UGxhbmUpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLQotICAgICAgICAvL0FMT0dFKCJSR0IgdG8gWVVWIGRvbmUiKTsKLSNpZmRlZiBGSUxFX0RVTVAKLSAgICAgICAgRklMRSAqZnAxID0gZm9wZW4oIi9zZGNhcmQvSW5wdXQvdGVzdF95dXYucmF3IiwgIndiIik7Ci0gICAgICAgIGlmKGZwMSA9PSBOVUxMKQotICAgICAgICAgICAgQUxPR0UoIkVycm9ycyBmaWxlIGNhbiBub3QgYmUgY3JlYXRlZCIpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZ3cml0ZSh5dXZQbGFuZVswXS5wYWNfZGF0YSwgeXV2UGxhbmVbMF0udV9oZWlnaHQgKiB5dXZQbGFuZVswXS51X3dpZHRoICogMS41LCAxLCBmcDEpOwotICAgICAgICAgICAgZmNsb3NlKGZwMSk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICAqcEJ1ZmZlciA9IHl1dlBsYW5lWzBdLnBhY19kYXRhOwotICAgICAgICBmcmVlKHl1dlBsYW5lKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLX0KLU00T1NBX1ZvaWQgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRWSUZJX1VJbnQ4ICpidWZmZXIsCi0gICAgTTRPU0FfVUludDMyIHJlcG9ydGVkV2lkdGgsIE00T1NBX1VJbnQzMiByZXBvcnRlZEhlaWdodCkgewotCi0gICAgLy9ZIHBsYW5lCi0gICAgcGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgIHBsYW5lWzBdLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHBsYW5lWzBdLnVfc3RyaWRlID0gcmVwb3J0ZWRXaWR0aDsKLSAgICBwbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzBdLnBhY19kYXRhID0gYnVmZmVyOwotCi0gICAgLy8gVSBwbGFuZQotICAgIHBsYW5lWzFdLnVfd2lkdGggPSB3aWR0aC8yOwotICAgIHBsYW5lWzFdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVbMV0udV9zdHJpZGUgPSByZXBvcnRlZFdpZHRoID4+IDE7Ci0gICAgcGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVsxXS5wYWNfZGF0YSA9IGJ1ZmZlcisocmVwb3J0ZWRXaWR0aCpyZXBvcnRlZEhlaWdodCk7Ci0KLSAgICAvLyBWIFBsYW5lCi0gICAgcGxhbmVbMl0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVbMl0udV9oZWlnaHQgPSBoZWlnaHQvMjsKLSAgICBwbGFuZVsyXS51X3N0cmlkZSA9IHJlcG9ydGVkV2lkdGggPj4gMTsKLSAgICBwbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzJdLnBhY19kYXRhID0gcGxhbmVbMV0ucGFjX2RhdGEgKyAoKHJlcG9ydGVkV2lkdGgvMikqKHJlcG9ydGVkSGVpZ2h0LzIpKTsKLX0KLQotTTRPU0FfVm9pZCBwcmVwYXJlWVYxMkltYWdlUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHN0cmlkZSwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcikgewotCi0gICAgLy9ZIHBsYW5lCi0gICAgcGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgIHBsYW5lWzBdLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHBsYW5lWzBdLnVfc3RyaWRlID0gc3RyaWRlOwotICAgIHBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMF0ucGFjX2RhdGEgPSBidWZmZXI7Ci0KLSAgICAvLyBVIHBsYW5lCi0gICAgcGxhbmVbMV0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVbMV0udV9oZWlnaHQgPSBoZWlnaHQvMjsKLSAgICBwbGFuZVsxXS51X3N0cmlkZSA9IGFuZHJvaWQ6OlByZXZpZXdSZW5kZXJlcjo6QUxJR04ocGxhbmVbMF0udV9zdHJpZGUvMiwgMTYpOwotICAgIHBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMV0ucGFjX2RhdGEgPSAoYnVmZmVyCi0gICAgICAgICAgICAgICAgKyBwbGFuZVswXS51X2hlaWdodCAqIHBsYW5lWzBdLnVfc3RyaWRlCi0gICAgICAgICAgICAgICAgKyAocGxhbmVbMF0udV9oZWlnaHQvMikgKiBhbmRyb2lkOjpQcmV2aWV3UmVuZGVyZXI6OkFMSUdOKCgKLSAgICAgICAgICAgICAgICAgcGxhbmVbMF0udV9zdHJpZGUgLyAyKSwgMTYpKTsKLQotICAgIC8vIFYgUGxhbmUKLSAgICBwbGFuZVsyXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZVsyXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lWzJdLnVfc3RyaWRlID0gYW5kcm9pZDo6UHJldmlld1JlbmRlcmVyOjpBTElHTihwbGFuZVswXS51X3N0cmlkZS8yLCAxNik7Ci0gICAgcGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVsyXS5wYWNfZGF0YSA9IChidWZmZXIgKwotICAgICBwbGFuZVswXS51X2hlaWdodCAqIGFuZHJvaWQ6OlByZXZpZXdSZW5kZXJlcjo6QUxJR04ocGxhbmVbMF0udV9zdHJpZGUsIDE2KSk7Ci0KLQotfQotCi1NNE9TQV9Wb2lkIHN3YXBJbWFnZVBsYW5lcygKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lT3V0LAotICAgIE00VklGSV9VSW50OCAqYnVmZmVyMSwgTTRWSUZJX1VJbnQ4ICpidWZmZXIyKSB7Ci0KLSAgICBwbGFuZUluWzBdLnVfaGVpZ2h0ID0gcGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0gICAgcGxhbmVJblswXS51X3dpZHRoID0gcGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICBwbGFuZUluWzBdLnVfc3RyaWRlID0gcGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgcGxhbmVJblswXS51X3RvcGxlZnQgPSBwbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcGxhbmVJblswXS5wYWNfZGF0YSA9IHBsYW5lT3V0WzBdLnBhY19kYXRhOwotCi0gICAgLyoqCi0gICAgICogVSBwbGFuZSAqLwotICAgIHBsYW5lSW5bMV0udV93aWR0aCA9IHBsYW5lT3V0WzFdLnVfd2lkdGg7Ci0gICAgcGxhbmVJblsxXS51X2hlaWdodCA9IHBsYW5lT3V0WzFdLnVfaGVpZ2h0OwotICAgIHBsYW5lSW5bMV0udV9zdHJpZGUgPSBwbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICBwbGFuZUluWzFdLnVfdG9wbGVmdCA9IHBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwbGFuZUluWzFdLnBhY19kYXRhID0gcGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgLyoqCi0gICAgICogViBQbGFuZSAqLwotICAgIHBsYW5lSW5bMl0udV93aWR0aCA9IHBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgcGxhbmVJblsyXS51X2hlaWdodCA9IHBsYW5lT3V0WzJdLnVfaGVpZ2h0OwotICAgIHBsYW5lSW5bMl0udV9zdHJpZGUgPSBwbGFuZU91dFsyXS51X3N0cmlkZTsKLSAgICBwbGFuZUluWzJdLnVfdG9wbGVmdCA9IHBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLSAgICBwbGFuZUluWzJdLnBhY19kYXRhID0gcGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICBpZihwbGFuZU91dFswXS5wYWNfZGF0YSA9PSAoTTRWSUZJX1VJbnQ4KilidWZmZXIxKQotICAgIHsKLSAgICAgICAgcGxhbmVPdXRbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilidWZmZXIyOwotICAgICAgICBwbGFuZU91dFsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKShidWZmZXIyICsKLSAgICAgICAgIHBsYW5lT3V0WzBdLnVfd2lkdGgqcGxhbmVPdXRbMF0udV9oZWlnaHQpOwotCi0gICAgICAgIHBsYW5lT3V0WzJdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKGJ1ZmZlcjIgKwotICAgICAgICAgcGxhbmVPdXRbMF0udV93aWR0aCpwbGFuZU91dFswXS51X2hlaWdodCArCi0gICAgICAgICBwbGFuZU91dFsxXS51X3dpZHRoKnBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcGxhbmVPdXRbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilidWZmZXIxOwotICAgICAgICBwbGFuZU91dFsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKShidWZmZXIxICsKLSAgICAgICAgIHBsYW5lT3V0WzBdLnVfd2lkdGgqcGxhbmVPdXRbMF0udV9oZWlnaHQpOwotCi0gICAgICAgIHBsYW5lT3V0WzJdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKGJ1ZmZlcjEgKwotICAgICAgICAgcGxhbmVPdXRbMF0udV93aWR0aCpwbGFuZU91dFswXS51X2hlaWdodCArCi0gICAgICAgICBwbGFuZU91dFsxXS51X3dpZHRoKnBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICB9Ci0KLX0KLQotTTRPU0FfVm9pZCBjb21wdXRlUGVyY2VudGFnZURvbmUoCi0gICAgTTRPU0FfVUludDMyIGN0c01zLCBNNE9TQV9VSW50MzIgZWZmZWN0U3RhcnRUaW1lTXMsCi0gICAgTTRPU0FfVUludDMyIGVmZmVjdER1cmF0aW9uLCBNNE9TQV9Eb3VibGUgKnBlcmNlbnRhZ2VEb25lKSB7Ci0KLSAgICBNNE9TQV9Eb3VibGUgdmlkZW9FZmZlY3RUaW1lID0wOwotCi0gICAgLy8gQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgdmlkZW9FZmZlY3RUaW1lID0KLSAgICAgKE00T1NBX0ludDMyKShjdHNNcysgMC41KSAtIGVmZmVjdFN0YXJ0VGltZU1zOwotCi0gICAgLy8gVG8gY2FsY3VsYXRlICUsIHN1YnN0cmFjdCB0aW1lSW5jcmVtZW50Ci0gICAgLy8gYmVjYXVzZSBlZmZlY3Qgc2hvdWxkIGZpbmlzaCBvbiB0aGUgbGFzdCBmcmFtZQotICAgIC8vIHdoaWNoIGlzIGZyb20gQ1RTID0gKGVvZi10aW1lSW5jcmVtZW50KSB0aWxsIENUUyA9IGVvZgotICAgICpwZXJjZW50YWdlRG9uZSA9Ci0gICAgIHZpZGVvRWZmZWN0VGltZSAvICgoTTRPU0FfRmxvYXQpZWZmZWN0RHVyYXRpb24pOwotCi0gICAgaWYoKnBlcmNlbnRhZ2VEb25lIDwgMC4wKSAqcGVyY2VudGFnZURvbmUgPSAwLjA7Ci0gICAgaWYoKnBlcmNlbnRhZ2VEb25lID4gMS4wKSAqcGVyY2VudGFnZURvbmUgPSAxLjA7Ci0KLX0KLQotCi1NNE9TQV9Wb2lkIGNvbXB1dGVQcm9ncmVzc0ZvclZpZGVvRWZmZWN0KAotICAgIE00T1NBX1VJbnQzMiBjdHNNcywgTTRPU0FfVUludDMyIGVmZmVjdFN0YXJ0VGltZU1zLAotICAgIE00T1NBX1VJbnQzMiBlZmZlY3REdXJhdGlvbiwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MqIGV4dFByb2dyZXNzKSB7Ci0KLSAgICBNNE9TQV9Eb3VibGUgcGVyY2VudGFnZURvbmUgPTA7Ci0KLSAgICBjb21wdXRlUGVyY2VudGFnZURvbmUoY3RzTXMsIGVmZmVjdFN0YXJ0VGltZU1zLCBlZmZlY3REdXJhdGlvbiwgJnBlcmNlbnRhZ2VEb25lKTsKLQotICAgIGV4dFByb2dyZXNzLT51aVByb2dyZXNzID0gKE00T1NBX1VJbnQzMikoIHBlcmNlbnRhZ2VEb25lICogMTAwMCApOwotICAgIGV4dFByb2dyZXNzLT51aU91dHB1dFRpbWUgPSAoTTRPU0FfVUludDMyKShjdHNNcyArIDAuNSk7Ci0gICAgZXh0UHJvZ3Jlc3MtPnVpQ2xpcFRpbWUgPSBleHRQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIGV4dFByb2dyZXNzLT5iSXNMYXN0ID0gTTRPU0FfRkFMU0U7Ci19Ci0KLU00T1NBX0VSUiBwcmVwYXJlRnJhbWluZ1N0cnVjdHVyZSgKLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCwKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIGVmZmVjdHNTZXR0aW5ncywgTTRPU0FfVUludDMyIGluZGV4LAotICAgIE00VklGSV9VSW50OCogb3ZlcmxheVJHQiwgTTRWSUZJX1VJbnQ4KiBvdmVybGF5WVVWKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8vIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbgotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MucEZyYW1pbmdCdWZmZXI7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGggJiB+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ICYgfjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE5VTEw7Ci0KLSAgICBmcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IGVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlEdXJhdGlvbjsKLSAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPSBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudG9wbGVmdF94OwotICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9IGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgZnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0KLSAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0KLSAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICBzaXplb2YoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcpLCBNNFZTLAotICAgICAgKE00T1NBX0NoYXIqKSJhbHBoYSBibGVuZGluZyBzdHJ1Y3QiKTsKLQotICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9Ci0gICAgIGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSA9Ci0gICAgIGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZTsKLQotICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZDsKLQotICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZTsKLQotICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQ7Ci0KLSAgICAvLyBJZiBuZXcgT3ZlcmxheSBidWZmZXIsIGNvbnZlcnQgZnJvbSBSR0IgdG8gWVVWCi0gICAgaWYoKG92ZXJsYXlSR0IgIT0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpIHx8IChvdmVybGF5WVVWID09IE5VTEwpICkgewotCi0gICAgICAgIC8vIElmIFlVViBidWZmZXIgZXhpc3RzLCBkZWxldGUgaXQKLSAgICAgICAgaWYob3ZlcmxheVlVViAhPSBOVUxMKSB7Ci0gICAgICAgICAgIGZyZWUob3ZlcmxheVlVVik7Ci0gICAgICAgICAgIG92ZXJsYXlZVVYgPSBOVUxMOwotICAgICAgICB9Ci0gICAgaWYoZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnJnYlR5cGUgPT0gTTRWU1MzR1BQX2tSR0I1NjUpIHsKLSAgICAgICAgLy8gSW5wdXQgUkdCNTY1IHBsYW5lIGlzIHByb3ZpZGVkLAotICAgICAgICAvLyBsZXQncyBjb252ZXJ0IGl0IHRvIFlVVjQyMCwgYW5kIHVwZGF0ZSBmcmFtaW5nIHN0cnVjdHVyZQotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eCk7Ci0gICAgfQotICAgIGVsc2UgaWYoZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnJnYlR5cGUgPT0gTTRWU1MzR1BQX2tSR0I4ODgpIHsKLSAgICAgICAgLy8gSW5wdXQgUkdCODg4IHBsYW5lIGlzIHByb3ZpZGVkLAotICAgICAgICAvLyBsZXQncyBjb252ZXJ0IGl0IHRvIFlVVjQyMCwgYW5kIHVwZGF0ZSBmcmFtaW5nIHN0cnVjdHVyZQotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCODg4dG9ZVVYoZnJhbWluZ0N0eCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgICAgICBvdmVybGF5WVVWID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YTsKLSAgICAgICAgb3ZlcmxheVJHQiA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotCi0gICAgfQotICAgIGVsc2UgewotICAgICAgICBBTE9HVigiIFlVViBidWZmZXIgcmV1c2UiKTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLCAoTTRPU0FfQ2hhciopIllVViIpOwotCi0gICAgICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopb3ZlcmxheVlVVjsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhICsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQ7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSArCi0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0OwotCi0gICAgICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICBmcmFtaW5nQ3R4LT5wcmV2aWV3T2Zmc2V0Q2xpcFRpbWUgPSAtMTsKLQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgYXBwbHlDb2xvckVmZmVjdChNNHhWU1NfVmlkZW9FZmZlY3RUeXBlIGNvbG9yRWZmZWN0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIsIE00T1NBX1VJbnQxNiByZ2JDb2xvckRhdGEpIHsKLQotICAgIE00eFZTU19Db2xvclN0cnVjdCBjb2xvckNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBjb2xvckNvbnRleHQuY29sb3JFZmZlY3RUeXBlID0gY29sb3JFZmZlY3Q7Ci0gICAgY29sb3JDb250ZXh0LnJnYjE2Q29sb3JEYXRhID0gcmdiQ29sb3JEYXRhOwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcigKLSAgICAgKE00T1NBX1ZvaWQgKikmY29sb3JDb250ZXh0LCBwbGFuZUluLCBwbGFuZU91dCwgTlVMTCwKLSAgICAgY29sb3JFZmZlY3QpOwotCi0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1YoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IoJWQpIGVycm9yICVkIiwKLSAgICAgICAgICAgIGNvbG9yRWZmZWN0LCBlcnIpOwotCi0gICAgICAgIGlmKE5VTEwgIT0gYnVmZmVyMSkgewotICAgICAgICAgICAgZnJlZShidWZmZXIxKTsKLSAgICAgICAgICAgIGJ1ZmZlcjEgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmKE5VTEwgIT0gYnVmZmVyMikgewotICAgICAgICAgICAgZnJlZShidWZmZXIyKTsKLSAgICAgICAgICAgIGJ1ZmZlcjIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gVGhlIG91dCBwbGFuZSBub3cgYmVjb21lcyB0aGUgaW4gcGxhbmUgZm9yIGFkZGluZyBvdGhlciBlZmZlY3RzCi0gICAgc3dhcEltYWdlUGxhbmVzKHBsYW5lSW4sIHBsYW5lT3V0LCBidWZmZXIxLCBidWZmZXIyKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBhcHBseUx1bWFFZmZlY3QoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB2aWRlb0VmZmVjdCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lT3V0LAotICAgIE00VklGSV9VSW50OCAqYnVmZmVyMSwgTTRWSUZJX1VJbnQ4ICpidWZmZXIyLCBNNE9TQV9JbnQzMiBsdW1fZmFjdG9yKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGVyciA9IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoCi0gICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUqKXBsYW5lSW4sKE00VmlDb21JbWFnZVBsYW5lKilwbGFuZU91dCwKLSAgICAgICAgIGx1bV9mYWN0b3IsIE5VTEwpOwotCi0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIk00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoJWQpIGVycm9yICVkIiwgdmlkZW9FZmZlY3QsIChpbnQpZXJyKTsKLQotICAgICAgICBpZihOVUxMICE9IGJ1ZmZlcjEpIHsKLSAgICAgICAgICAgIGZyZWUoYnVmZmVyMSk7Ci0gICAgICAgICAgICBidWZmZXIxPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmKE5VTEwgIT0gYnVmZmVyMikgewotICAgICAgICAgICAgZnJlZShidWZmZXIyKTsKLSAgICAgICAgICAgIGJ1ZmZlcjI9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgb3V0IHBsYW5lIG5vdyBiZWNvbWVzIHRoZSBpbiBwbGFuZSBmb3IgYWRkaW5nIG90aGVyIGVmZmVjdHMKLSAgICBzd2FwSW1hZ2VQbGFuZXMocGxhbmVJbiwgcGxhbmVPdXQsKE00VklGSV9VSW50OCAqKWJ1ZmZlcjEsCi0gICAgIChNNFZJRklfVUludDggKilidWZmZXIyKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBhcHBseUVmZmVjdHNBbmRSZW5kZXJpbmdNb2RlKHZlUG9zdFByb2Nlc3NQYXJhbXMgKnBhcmFtcywKLSAgICBNNE9TQV9VSW50MzIgcmVwb3J0ZWRXaWR0aCwgTTRPU0FfVUludDMyIHJlcG9ydGVkSGVpZ2h0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwbGFuZUluWzNdLCBwbGFuZU91dFszXTsKLSAgICBNNFZJRklfVUludDggKmZpbmFsT3V0cHV0QnVmZmVyID0gTlVMTCwgKnRlbXBPdXRwdXRCdWZmZXI9IE5VTEw7Ci0gICAgTTRPU0FfRG91YmxlIHBlcmNlbnRhZ2VEb25lID0wOwotICAgIE00T1NBX0ludDMyIGx1bV9mYWN0b3I7Ci0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgZXh0UHJvZ3Jlc3M7Ci0gICAgTTR4VlNTX0ZpZnRpZXNTdHJ1Y3QgZmlmdGllc0N0eDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMCwgaT0wOwotCi0gICAgZnJhbWVTaXplID0gKHBhcmFtcy0+dmlkZW9XaWR0aCpwYXJhbXMtPnZpZGVvSGVpZ2h0KjMpID4+IDE7Ci0KLSAgICBmaW5hbE91dHB1dEJ1ZmZlciA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemUsIE00VlMsCi0gICAgIChNNE9TQV9DaGFyKikoImx2cHAgZmluYWxPdXRwdXRCdWZmZXIiKSk7Ci0KLSAgICBpZihmaW5hbE91dHB1dEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJhcHBseUVmZmVjdHNBbmRSZW5kZXJpbmdNb2RlOiBtYWxsb2MgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIGFsbG9jYXRlIHRoZSB0ZW1wT3V0cHV0QnVmZmVyCi0gICAgdGVtcE91dHB1dEJ1ZmZlciA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgKChwYXJhbXMtPnZpZGVvSGVpZ2h0KnBhcmFtcy0+dmlkZW9XaWR0aCozKT4+MSksIE00VlMsIChNNE9TQV9DaGFyKikoImx2cHAgY29sb3JCdWZmZXIiKSk7Ci0KLSAgICBpZih0ZW1wT3V0cHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGU6IG1hbGxvYyBlcnJvciB0ZW1wT3V0cHV0QnVmZmVyIik7Ci0gICAgICAgIGlmKE5VTEwgIT0gZmluYWxPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgIGZyZWUoZmluYWxPdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgZmluYWxPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSBJbiBwbGFuZQotICAgIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKHBsYW5lSW4sIHBhcmFtcy0+dmlkZW9XaWR0aCwgcGFyYW1zLT52aWRlb0hlaWdodCwKLSAgICAgICBwYXJhbXMtPnZpZEJ1ZmZlciwgcmVwb3J0ZWRXaWR0aCwgcmVwb3J0ZWRIZWlnaHQpOwotCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgT3V0IHBsYW5lCi0gICAgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUocGxhbmVPdXQsIHBhcmFtcy0+dmlkZW9XaWR0aCwgcGFyYW1zLT52aWRlb0hlaWdodCwKLSAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgcGFyYW1zLT52aWRlb1dpZHRoLCBwYXJhbXMtPnZpZGVvSGVpZ2h0KTsKLQotICAgIC8vIFRoZSBwbGFuZUluIGNvbnRhaW5zIHRoZSBZVVY0MjAgaW5wdXQgZGF0YSB0byBwb3N0cHJvY2Vzc2luZyBub2RlCi0gICAgLy8gYW5kIHBsYW5lT3V0IHdpbGwgY29udGFpbiB0aGUgWVVWNDIwIGRhdGEgd2l0aCBlZmZlY3QKLSAgICAvLyBJbiBlYWNoIHN1Y2Nlc3NpdmUgaWYgY29uZGl0aW9uLCBhcHBseSBmaWx0ZXIgdG8gc3VjY2Vzc2l2ZQotICAgIC8vIG91dHB1dCBZVVYgZnJhbWUgc28gdGhhdCBjb25jdXJyZW50IGVmZmVjdHMgYXJlIGJvdGggYXBwbGllZAotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfQkxBQ0tBTkRXSElURSkgewotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUsCi0gICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCAwKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9QSU5LKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluaywKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0dSRUVOKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4sCi0gICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCAwKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9TRVBJQSkgewotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfTkVHQVRJVkUpIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZSwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0dSQURJRU5UKSB7Ci0gICAgICAgIC8vIGZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudCwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlSZ2IxNklucHV0Q29sb3IpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0NPTE9SX1JHQjE2KSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYsCi0gICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpUmdiMTZJbnB1dENvbG9yKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9GSUZUSUVTKSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllcykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZihpIDwgcGFyYW1zLT5udW1iZXJFZmZlY3RzKSB7Ci0gICAgICAgICAgICBjb21wdXRlUHJvZ3Jlc3NGb3JWaWRlb0VmZmVjdChwYXJhbXMtPnRpbWVNcywKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSwKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uLCAmZXh0UHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICBpZihwYXJhbXMtPmlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBmaWZ0aWVzQ3R4LnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpZnRpZXNDdHguZmlmdGllc0VmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAxMDAwL3BhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlOwotCi0gICAgICAgICAgICBmaWZ0aWVzQ3R4LnNoaWZ0UmFuZG9tVmFsdWUgPSAwOwotICAgICAgICAgICAgZmlmdGllc0N0eC5zdHJpcGVSYW5kb21WYWx1ZSA9IDA7Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcygKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSZmaWZ0aWVzQ3R4LCBwbGFuZUluLCBwbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMpOwotCi0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMgZXJyb3IgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gZmluYWxPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShmaW5hbE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSB0ZW1wT3V0cHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUodGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGUgb3V0IHBsYW5lIG5vdyBiZWNvbWVzIHRoZSBpbiBwbGFuZSBmb3IgYWRkaW5nIG90aGVyIGVmZmVjdHMKLSAgICAgICAgICAgIHN3YXBJbWFnZVBsYW5lcyhwbGFuZUluLCBwbGFuZU91dCwoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRlJBTUlORykgewotCi0gICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0IGZyYW1pbmdDdHg7Ci0gICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZykgewotICAgICAgICAgICAgICAgIGlmKChwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA8PSBwYXJhbXMtPnRpbWVNcyArIHBhcmFtcy0+dGltZU9mZnNldCkgJiYKLSAgICAgICAgICAgICAgICAgICAoKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lKwotICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbikgPj0gcGFyYW1zLT50aW1lTXMgKyBwYXJhbXMtPnRpbWVPZmZzZXQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihpIDwgcGFyYW1zLT5udW1iZXJFZmZlY3RzKSB7Ci0gICAgICAgICAgICBjb21wdXRlUHJvZ3Jlc3NGb3JWaWRlb0VmZmVjdChwYXJhbXMtPnRpbWVNcywKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSwKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uLCAmZXh0UHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICBlcnIgPSBwcmVwYXJlRnJhbWluZ1N0cnVjdHVyZSgmZnJhbWluZ0N0eCwKLSAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzLCBpLCBwYXJhbXMtPm92ZXJsYXlGcmFtZVJHQkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIHBhcmFtcy0+b3ZlcmxheUZyYW1lWVVWQnVmZmVyKTsKLQotICAgICAgICAgICAgaWYoZXJyID09IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoCi0gICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKikmZnJhbWluZ0N0eCwgcGxhbmVJbiwgcGxhbmVPdXQsICZleHRQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LmFscGhhQmxlbmRpbmdTdHJ1Y3QpOwotCi0gICAgICAgICAgICBpZihmcmFtaW5nQ3R4LkZyYW1pbmdZdXYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC5GcmFtaW5nWXV2KTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LkZyYW1pbmdZdXYgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9JZiBwcmVwYXJlRnJhbWluZ1N0cnVjdHVyZSAvIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZwotICAgICAgICAgICAgLy8gcmV0dXJuZWQgZXJyb3IsIHRoZW4gcmV0dXJuIGZyb20gZnVuY3Rpb24KLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0KLSAgICAgICAgICAgICAgICBpZihOVUxMICE9IGZpbmFsT3V0cHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoZmluYWxPdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gdGVtcE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIG91dCBwbGFuZSBub3cgYmVjb21lcyB0aGUgaW4gcGxhbmUgZm9yIGFkZGluZyBvdGhlciBlZmZlY3RzCi0gICAgICAgICAgICBzd2FwSW1hZ2VQbGFuZXMocGxhbmVJbiwgcGxhbmVPdXQsKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZBREVGUk9NQkxBQ0spIHsKLSAgICAgICAgLyogZmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ki8KLSAgICAgICAgZm9yKGk9MDtpPHBhcmFtcy0+bnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIGlmKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVGcm9tQmxhY2spCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpIDwgcGFyYW1zLT5udW1iZXJFZmZlY3RzKSB7Ci0gICAgICAgICAgICBjb21wdXRlUGVyY2VudGFnZURvbmUocGFyYW1zLT50aW1lTXMsCi0gICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUsCi0gICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbiwgJnBlcmNlbnRhZ2VEb25lKTsKLQotICAgICAgICAgICAgLy8gQ29tcHV0ZSB3aGVyZSB3ZSBhcmUgaW4gdGhlIGVmZmVjdCAoc2NhbGUgaXMgMC0+MTAyNCkKLSAgICAgICAgICAgIGx1bV9mYWN0b3IgPSAoTTRPU0FfSW50MzIpKCBwZXJjZW50YWdlRG9uZSAqIDEwMjQgKTsKLSAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBkYXJrZW5pbmcgZWZmZWN0Ci0gICAgICAgICAgICBlcnIgPSBhcHBseUx1bWFFZmZlY3QoTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjaywKLSAgICAgICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgbHVtX2ZhY3Rvcik7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9GQURFVE9CTEFDSykgewotICAgICAgICAvLyBGaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkKLSAgICAgICAgZm9yKGk9MDtpPHBhcmFtcy0+bnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIGlmKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQZXJjZW50YWdlRG9uZShwYXJhbXMtPnRpbWVNcywKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSwKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uLCAmcGVyY2VudGFnZURvbmUpOwotCi0gICAgICAgICAgICAvLyBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KQotICAgICAgICAgICAgbHVtX2ZhY3RvciA9IChNNE9TQV9JbnQzMikoICgxLjAtcGVyY2VudGFnZURvbmUpICogMTAyNCApOwotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QKLSAgICAgICAgICAgIGVyciA9IGFwcGx5THVtYUVmZmVjdChNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjaywKLSAgICAgICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgbHVtX2ZhY3Rvcik7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HVigiZG9NZWRpYVJlbmRlcmluZyBDQUxMIGdldEJ1ZmZlcigpIik7Ci0gICAgLy8gU2V0IHRoZSBvdXRwdXQgWVVWNDIwIHBsYW5lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBZVjEyIGZvcm1hdAotICAgIC8vIFcgJiBIIGV2ZW4KLSAgICAvLyBZVlUgaW5zdGVhZCBvZiBZVVYKLSAgICAvLyBhbGlnbiBidWZmZXJzIG9uIDMyIGJpdHMKLQotICAgIC8vIFkgcGxhbmUKLSAgICAvL2luIFlWMTIgZm9ybWF0LCBzaXplcyBtdXN0IGJlIGV2ZW4KLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lV2lkdGggPSAoKHBhcmFtcy0+b3V0VmlkZW9XaWR0aCArMSk+PjEpPDwxOwotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVIZWlnaHQgPSAoKHBhcmFtcy0+b3V0VmlkZW9IZWlnaHQrMSk+PjEpPDwxOwotCi0gICAgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKHBsYW5lT3V0LCB5djEyUGxhbmVXaWR0aCwgeXYxMlBsYW5lSGVpZ2h0LAotICAgICAoTTRPU0FfVUludDMyKXBhcmFtcy0+b3V0QnVmZmVyU3RyaWRlLCAoTTRWSUZJX1VJbnQ4ICopcGFyYW1zLT5wT3V0QnVmZmVyKTsKLQotICAgIGVyciA9IGFwcGx5UmVuZGVyaW5nTW9kZShwbGFuZUluLCBwbGFuZU91dCwgcGFyYW1zLT5yZW5kZXJpbmdNb2RlKTsKLQotICAgIGlmKE00T1NBX05VTEwgIT0gZmluYWxPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgZnJlZShmaW5hbE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIGZpbmFsT3V0cHV0QnVmZmVyPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihNNE9TQV9OVUxMICE9IHRlbXBPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgZnJlZSh0ZW1wT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgdGVtcE91dHB1dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dWKCJkb1ZpZGVvUG9zdFByb2Nlc3Npbmc6IGFwcGx5UmVuZGVyaW5nTW9kZSByZXR1cm5lZCBlcnI9JWQiLGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1hbmRyb2lkOjpzdGF0dXNfdCBnZXRWaWRlb1NpemVCeVJlc29sdXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgcmVzb2x1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFdpZHRoLCB1aW50MzJfdCAqcEhlaWdodCkgewotCi0gICAgdWludDMyX3QgZnJhbWVXaWR0aCwgZnJhbWVIZWlnaHQ7Ci0KLSAgICBpZiAocFdpZHRoID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImdldFZpZGVvRnJhbWVTaXplQnlSZXNvbHV0aW9uIGludmFsaWQgcG9pbnRlciBmb3IgcFdpZHRoIik7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChwSGVpZ2h0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImdldFZpZGVvRnJhbWVTaXplQnlSZXNvbHV0aW9uIGludmFsaWQgcG9pbnRlciBmb3IgcEhlaWdodCIpOwotICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN3aXRjaCAocmVzb2x1dGlvbikgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAxMjg7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTYwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSAxMjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMTQ0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAzMjA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDI0MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAzNTI7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDI4ODsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQToKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA2NDA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gODAwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDcyMDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA2NDA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDM2MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gODU0OwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjgwXzcyMDoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAxMjgwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAxMDgwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s5NjBfNzIwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDk2MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDE5MjA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDEwODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIHZpZGVvIHJlc29sdXRpb24gJWQuIiwgcmVzb2x1dGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgIH0KLQotICAgICpwV2lkdGggPSBmcmFtZVdpZHRoOwotICAgICpwSGVpZ2h0ID0gZnJhbWVIZWlnaHQ7Ci0KLSAgICByZXR1cm4gYW5kcm9pZDo6T0s7Ci19Ci0KLU00VklGSV9VSW50OCBNNFZJRklfUm90YXRlOTBMZWZ0WVVWNDIwdG9ZVVY0MjAodm9pZCogcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLSAgICBNNFZJRklfVUludDMyIGksaiwgdV9zdHJpZGU7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotCi0gICAgLyoqPCBMb29wIG9uIFksVSBhbmQgViBwbGFuZXMgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKSB7Ci0gICAgICAgIC8qKjwgR2V0IGFkcmVzc2VzIG9mIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIC8qKjwgQXMgd2UgaGF2ZSBhIC05MMKwIHJvdGF0aW9uLCBmaXJzdCBuZWVkZWQgcGl4ZWwgaXMgdGhlIHVwcGVyLXJpZ2h0IG9uZSAqLwotICAgICAgICBwX2J1Zl9zcmMgPQotICAgICAgICAgICAgJihwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSkgKwotICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0IC0gMSA7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgICAgJihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgdV9zdHJpZGUgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAvKio8IExvb3Agb24gb3V0cHV0IHJvd3MgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBhbGwgb3V0cHV0IHBpeGVscyBpbiBhIHJvdyAqLwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7IGorKykgewotICAgICAgICAgICAgICAgICpwX2J1Zl9kZXN0Kys9ICpwX2J1Zl9zcmM7Ci0gICAgICAgICAgICAgICAgcF9idWZfc3JjICs9IHVfc3RyaWRlOyAgLyoqPCBHbyB0byB0aGUgbmV4dCByb3cgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqPCBHbyBvbiBuZXh0IHJvdyBvZiB0aGUgb3V0cHV0IGZyYW1lICovCi0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9Ci0gICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUgLSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotICAgICAgICAgICAgLyoqPCBHbyB0byBuZXh0IHBpeGVsIGluIHRoZSBsYXN0IHJvdyBvZiB0aGUgaW5wdXQgZnJhbWUqLwotICAgICAgICAgICAgcF9idWZfc3JjIC09Ci0gICAgICAgICAgICAgICAgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAqIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGggKyAxIDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLU00VklGSV9VSW50OCBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpIHsKLQotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGosIHVfc3RyaWRlOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLQotICAgIC8qKjwgTG9vcCBvbiBZLFUgYW5kIFYgcGxhbmVzICovCi0gICAgZm9yIChwbGFuZV9udW1iZXIgPSAwOyBwbGFuZV9udW1iZXIgPCAzOyBwbGFuZV9udW1iZXIrKykgewotICAgICAgICAvKio8IEdldCBhZHJlc3NlcyBvZiBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAvKio8IEFzIHdlIGhhdmUgYSArOTDCsCByb3RhdGlvbiwgZmlyc3QgbmVlZGVkIHBpeGVsIGlzIHRoZSBsZWZ0LWRvd24gb25lICovCi0gICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAgICAmKHBQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKSArCi0gICAgICAgICAgICAgKHBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGUgKiAocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCAtIDEpKTsKLSAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAgICAmKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICB1X3N0cmlkZSA9IHBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgIC8qKjwgTG9vcCBvbiBvdXRwdXQgcm93cyAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgLyoqPCBMb29wIG9uIGFsbCBvdXRwdXQgcGl4ZWxzIGluIGEgcm93ICovCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QrKz0gKnBfYnVmX3NyYzsKLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgLT0gdV9zdHJpZGU7ICAvKio8IEdvIHRvIHRoZSBwcmV2aW91cyByb3cgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqPCBHbyBvbiBuZXh0IHJvdyBvZiB0aGUgb3V0cHV0IGZyYW1lICovCi0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9Ci0gICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUgLSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotICAgICAgICAgICAgLyoqPCBHbyB0byBuZXh0IHBpeGVsIGluIHRoZSBsYXN0IHJvdyBvZiB0aGUgaW5wdXQgZnJhbWUqLwotICAgICAgICAgICAgcF9idWZfc3JjICs9Ci0gICAgICAgICAgICAgICAgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAqIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGggKzEgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLSAgICBNNFZJRklfVUludDMyIGksajsKLSAgICBNNFZJRklfVUludDggKnBfYnVmX3NyYywgKnBfYnVmX2Rlc3QsIHRlbXBfcGl4MTsKLQotICAgIC8qKjwgTG9vcCBvbiBZLFUgYW5kIFYgcGxhbmVzICovCi0gICAgZm9yIChwbGFuZV9udW1iZXIgPSAwOyBwbGFuZV9udW1iZXIgPCAzOyBwbGFuZV9udW1iZXIrKykgewotICAgICAgICAvKio8IEdldCBhZHJlc3NlcyBvZiBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICBwX2J1Zl9zcmMgPQotICAgICAgICAgICAgJihwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgICAgJihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLQotICAgICAgICAvKio8IElmIHBQbGFuZUluID0gcFBsYW5lT3V0LCB0aGUgYWxnb3JpdGhtIHdpbGwgYmUgZGlmZmVyZW50ICovCi0gICAgICAgIGlmIChwX2J1Zl9zcmMgPT0gcF9idWZfZGVzdCkgewotICAgICAgICAgICAgLyoqPCBHZXQgQWRkcmVzcyBvZiBsYXN0IHBpeGVsIGluIHRoZSBsYXN0IHJvdyBvZiB0aGUgZnJhbWUgKi8KLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSoocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQtMSkgKwotICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoIC0gMTsKLQotICAgICAgICAgICAgLyoqPCBXZSBsb29wIChoZWlnaHQvMikgdGltZXMgb24gdGhlIHJvd3MuCi0gICAgICAgICAgICAgKiBJbiBjYXNlIHVfaGVpZ2h0IGlzIG9kZCwgdGhlIHJvdyBhdCB0aGUgbWlkZGxlIG9mIHRoZSBmcmFtZQotICAgICAgICAgICAgICogaGFzIHRvIGJlIHByb2Nlc3NlZCBhcyBtdXN0IGJlIG1pcnJvcmVkICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKChwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodCk+PjEpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBfcGl4MT0gKnBfYnVmX2Rlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICpwX2J1Zl9kZXN0LS09ICpwX2J1Zl9zcmM7Ci0gICAgICAgICAgICAgICAgICAgICpwX2J1Zl9zcmMrKyA9IHRlbXBfcGl4MTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBHbyBvbiBuZXh0IHJvdyBpbiB0b3Agb2YgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKz0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUgLSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIC8qKjwgR28gdG8gdGhlIGxhc3QgcGl4ZWwgaW4gcHJldmlvdXMgcm93IGluIGJvdHRvbSBvZiBmcmFtZSovCi0gICAgICAgICAgICAgICAgcF9idWZfZGVzdCAtPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKjwgTWlycm9yIG1pZGRsZSByb3cgaW4gY2FzZSBoZWlnaHQgaXMgb2RkICovCi0gICAgICAgICAgICBpZiAoKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0JTIpIT0gMCkgewotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAgICAgICAgICAgICYocFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKz0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUqKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0Pj4xKTsKLSAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0ID0KLSAgICAgICAgICAgICAgICAgICAgcF9idWZfc3JjICsgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgIC8qKjwgV2UgbG9vcCB1X3dpZHRoLzIgdGltZXMgb24gdGhpcyByb3cuCi0gICAgICAgICAgICAgICAgICogIEluIGNhc2UgdV93aWR0aCBpcyBvZGQsIHRoZSBwaXhlbCBhdCB0aGUgbWlkZGxlIG9mIHRoaXMgcm93Ci0gICAgICAgICAgICAgICAgICogcmVtYWlucyB1bmNoYW5nZWQgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg+PjEpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcF9waXgxPSAqcF9idWZfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QtLT0gKnBfYnVmX3NyYzsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX3NyYysrID0gdGVtcF9waXgxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qKjwgR2V0IEFkZHJlc3Mgb2YgbGFzdCBwaXhlbCBpbiB0aGUgbGFzdCByb3cgb2YgdGhlIG91dHB1dCBmcmFtZSAqLwotICAgICAgICAgICAgcF9idWZfZGVzdCArPQotICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlKihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodC0xKSArCi0gICAgICAgICAgICAgICAgIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCAtIDE7Ci0KLSAgICAgICAgICAgIC8qKjwgTG9vcCBvbiByb3dzICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QtLT0gKnBfYnVmX3NyYysrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKjwgR28gb24gbmV4dCByb3cgaW4gdG9wIG9mIGlucHV0IGZyYW1lICovCi0gICAgICAgICAgICAgICAgcF9idWZfc3JjICs9Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGUgLSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIC8qKjwgR28gdG8gbGFzdCBwaXhlbCBvZiBwcmV2aW91cyByb3cgaW4gYm90dG9tIG9mIGlucHV0IGZyYW1lKi8KLSAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0IC09Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlIC0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLU00T1NBX0VSUiBhcHBseVZpZGVvUm90YXRpb24oTTRPU0FfVm9pZCogcEJ1ZmZlciwgTTRPU0FfVUludDMyIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgcm90YXRpb24pIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBsYW5lSW5bM10sIHBsYW5lT3V0WzNdOwotCi0gICAgaWYgKHBCdWZmZXIgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBBTE9HRSgiYXBwbHlWaWRlb1JvdGF0aW9uOiBOVUxMIGlucHV0IGZyYW1lIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIE00T1NBX1VJbnQ4KiBvdXRQdHIgPSAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICh3aWR0aCpoZWlnaHQqMS41KSwgTTRWUywgKE00T1NBX0NoYXIqKSgicm90YXRpb24gb3V0IHB0ciIpKTsKLSAgICBpZiAob3V0UHRyID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIEluIHBsYW5lCi0gICAgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUocGxhbmVJbiwgd2lkdGgsCi0gICAgICAgIGhlaWdodCwgKE00VklGSV9VSW50OCAqKXBCdWZmZXIsIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgLy8gT3V0IHBsYW5lCi0gICAgaWYgKHJvdGF0aW9uICE9IDE4MCkgewotICAgICAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZU91dCwgaGVpZ2h0LAotICAgICAgICAgICAgd2lkdGgsIG91dFB0ciwgaGVpZ2h0LCB3aWR0aCk7Ci0gICAgfQotCi0gICAgc3dpdGNoKHJvdGF0aW9uKSB7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBsYW5lSW4sIHBsYW5lT3V0KTsKLSAgICAgICAgICAgIG1lbWNweShwQnVmZmVyLCAodm9pZCAqKW91dFB0ciwgKHdpZHRoKmhlaWdodCoxLjUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTgwOgotICAgICAgICAgICAgLy8gSW4gcGxhbmUgcm90YXRpb24sIHNvIHBsYW5lT3V0ID0gcGxhbmVJbgotICAgICAgICAgICAgTTRWSUZJX1JvdGF0ZTE4MFlVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBsYW5lSW4sIHBsYW5lSW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyNzA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBMZWZ0WVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcGxhbmVJbiwgcGxhbmVPdXQpOwotICAgICAgICAgICAgbWVtY3B5KHBCdWZmZXIsICh2b2lkICopb3V0UHRyLCAod2lkdGgqaGVpZ2h0KjEuNSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIHJvdGF0aW9uIHBhcmFtICVkIiwgKGludClyb3RhdGlvbik7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBmcmVlKCh2b2lkICopb3V0UHRyKTsKLSAgICByZXR1cm4gZXJyOwotCi19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliNDY0ZGEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9WRV9UT09MU19ICi0jZGVmaW5lIEFORFJPSURfVkVfVE9PTFNfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAiTTRWSUZJX0NsaXAuaCIKLSNpbmNsdWRlICJNNFZGTF90cmFuc2l0aW9uLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00eFZTU19BUEkuaCIKLSNpbmNsdWRlICJNNHhWU1NfSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLSNpbmNsdWRlICJQcmV2aWV3UmVuZGVyZXIuaCIKLQotI2RlZmluZSBNRURJQV9SRU5ERVJJTkdfSU5WQUxJRCAyNTUKLSNkZWZpbmUgVFJBTlNQQVJFTlRfQ09MT1IgMHg3RTAKLSNkZWZpbmUgTFVNX0ZBQ1RPUl9NQVggMTAKLWVudW0gewotICAgIFZJREVPX0VGRkVDVF9OT05FICAgICAgICAgICAgICAgPSAwLAotICAgIFZJREVPX0VGRkVDVF9CTEFDS0FORFdISVRFICAgICAgPSAxLAotICAgIFZJREVPX0VGRkVDVF9QSU5LICAgICAgICAgICAgICAgPSAyLAotICAgIFZJREVPX0VGRkVDVF9HUkVFTiAgICAgICAgICAgICAgPSA0LAotICAgIFZJREVPX0VGRkVDVF9TRVBJQSAgICAgICAgICAgICAgPSA4LAotICAgIFZJREVPX0VGRkVDVF9ORUdBVElWRSAgICAgICAgICAgPSAxNiwKLSAgICBWSURFT19FRkZFQ1RfRlJBTUlORyAgICAgICAgICAgID0gMzIsCi0gICAgVklERU9fRUZGRUNUX0ZJRlRJRVMgICAgICAgICAgICA9IDY0LAotICAgIFZJREVPX0VGRkVDVF9DT0xPUl9SR0IxNiAgICAgICAgPSAxMjgsCi0gICAgVklERU9fRUZGRUNUX0dSQURJRU5UICAgICAgICAgICA9IDI1NiwKLSAgICBWSURFT19FRkZFQ1RfRkFERUZST01CTEFDSyAgICAgID0gNTEyLAotICAgIFZJREVPX0VGRkVDVF9GQURFVE9CTEFDSyAgICAgICAgPSAyMDQ4LAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00VklGSV9VSW50OCAqdmlkQnVmZmVyOwotICAgIE00T1NBX1VJbnQzMiB2aWRlb1dpZHRoOwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodDsKLSAgICBNNE9TQV9VSW50MzIgdGltZU1zOwotICAgIE00T1NBX1VJbnQzMiB0aW1lT2Zmc2V0OyAvL2hhcyB0aGUgZHVyYXRpb24gb2YgY2xpcHMgcGxheWVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoZSBmbGFnIHNoYWxsIGJlIHVzZWQgZm9yIEZyYW1pbmcuCi0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBlZmZlY3RzU2V0dGluZ3M7Ci0gICAgTTRPU0FfVUludDMyIG51bWJlckVmZmVjdHM7Ci0gICAgTTRPU0FfVUludDMyIG91dFZpZGVvV2lkdGg7Ci0gICAgTTRPU0FfVUludDMyIG91dFZpZGVvSGVpZ2h0OwotICAgIE00T1NBX1VJbnQzMiBjdXJyZW50VmlkZW9FZmZlY3Q7Ci0gICAgTTRPU0FfQm9vbCBpc0ZpZnRpZXNFZmZlY3RTdGFydGVkOwotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlOwotICAgIHVpbnQ4X3QgKnBPdXRCdWZmZXI7Ci0gICAgc2l6ZV90IG91dEJ1ZmZlclN0cmlkZTsKLSAgICBNNFZJRklfVUludDgqICBvdmVybGF5RnJhbWVSR0JCdWZmZXI7Ci0gICAgTTRWSUZJX1VJbnQ4KiAgb3ZlcmxheUZyYW1lWVVWQnVmZmVyOwotfSB2ZVBvc3RQcm9jZXNzUGFyYW1zOwotCi1NNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hclRvWVVWNDIwU2VtaXBsYW5hcih2b2lkICp1c2VyX2RhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKTsKLU00VklGSV9VSW50OCBNNFZJRklfU2VtaXBsYW5hcllVVjQyMHRvWVVWNDIwKHZvaWQgKnVzZXJfZGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCk7Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQgKTsKLQotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyggTTRPU0FfVm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQgKTsKLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwgdW5zaWduZWQgbG9uZyBsdW1fZmFjdG9yLCB2b2lkICp1c2VyX2RhdGEpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KTsKLU00VklGSV9VSW50OCAgICBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQjg4OHRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KTsKLU00VklGSV9VSW50OCBNNFZJRklfUkdCODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVPdXRbM10pOwotCi0vKisgSGFuZGxlIHRoZSBpbWFnZSBmaWxlcyBoZXJlICovCi1NNE9TQV9FUlIgTHZHZXRJbWFnZVRodW1iTmFpbChjb25zdCBjaGFyICpmaWxlTmFtZSwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9Wb2lkICoqcEJ1ZmZlcik7Ci0vKi0gSGFuZGxlIHRoZSBpbWFnZSBmaWxlcyBoZXJlICovCi0KLU00T1NBX0VSUiBhcHBseVJlbmRlcmluZ01vZGUoTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0LCBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbWVkaWFSZW5kZXJpbmcpOwotCi0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKTsKLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi1NNE9TQV9Wb2lkIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKE00VklGSV9JbWFnZVBsYW5lICpwbGFuZSwKLSAgICBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00VklGSV9VSW50OCAqYnVmZmVyLAotICAgIE00T1NBX1VJbnQzMiByZXBvcnRlZFdpZHRoLCBNNE9TQV9VSW50MzIgcmVwb3J0ZWRIZWlnaHQpOwotCi1NNE9TQV9Wb2lkIHByZXBhcmVZVjEySW1hZ2VQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmUsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgc3RyaWRlLCBNNFZJRklfVUludDggKmJ1ZmZlcik7Ci0KLU00T1NBX1ZvaWQgc3dhcEltYWdlUGxhbmVzKAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIpOwotCi1NNE9TQV9Wb2lkIGNvbXB1dGVQZXJjZW50YWdlRG9uZSgKLSAgICAgTTRPU0FfVUludDMyIGN0c01zLCBNNE9TQV9VSW50MzIgZWZmZWN0U3RhcnRUaW1lTXMsCi0gICAgIE00T1NBX1VJbnQzMiBlZmZlY3REdXJhdGlvbiwgTTRPU0FfRG91YmxlICpwZXJjZW50YWdlRG9uZSk7Ci0KLU00T1NBX1ZvaWQgY29tcHV0ZVByb2dyZXNzRm9yVmlkZW9FZmZlY3QoCi0gICAgIE00T1NBX1VJbnQzMiBjdHNNcywgTTRPU0FfVUludDMyIGVmZmVjdFN0YXJ0VGltZU1zLAotICAgICBNNE9TQV9VSW50MzIgZWZmZWN0RHVyYXRpb24sIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzKiBleHRQcm9ncmVzcyk7Ci0KLU00T1NBX0VSUiBwcmVwYXJlRnJhbWluZ1N0cnVjdHVyZSgKLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCwKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIGVmZmVjdHNTZXR0aW5ncywgTTRPU0FfVUludDMyIGluZGV4LAotICAgIE00VklGSV9VSW50OCogb3ZlcmxheVJHQiwgTTRWSUZJX1VJbnQ4KiBvdmVybGF5WVVWKTsKLQotTTRPU0FfRVJSIGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX1ZpZGVvRWZmZWN0VHlwZSBjb2xvckVmZmVjdCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lT3V0LAotICAgIE00VklGSV9VSW50OCAqYnVmZmVyMSwgTTRWSUZJX1VJbnQ4ICpidWZmZXIyLCBNNE9TQV9VSW50MTYgcmdiQ29sb3JEYXRhKTsKLQotTTRPU0FfRVJSIGFwcGx5THVtYUVmZmVjdChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHZpZGVvRWZmZWN0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIsIE00T1NBX0ludDMyIGx1bV9mYWN0b3IpOwotCi1NNE9TQV9FUlIgYXBwbHlFZmZlY3RzQW5kUmVuZGVyaW5nTW9kZSh2ZVBvc3RQcm9jZXNzUGFyYW1zICpwYXJhbXMsCi0gICAgTTRPU0FfVUludDMyIHJlcG9ydGVkV2lkdGgsIE00T1NBX1VJbnQzMiByZXBvcnRlZEhlaWdodCk7Ci0KLWFuZHJvaWQ6OnN0YXR1c190IGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbihNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSByZXNvbHV0aW9uLAotICAgIHVpbnQzMl90ICpwV2lkdGgsIHVpbnQzMl90ICpwSGVpZ2h0KTsKLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MFJpZ2h0WVVWNDIwdG9ZVVY0MjAodm9pZCogcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00VklGSV9VSW50OCBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAodm9pZCogcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00T1NBX0VSUiBhcHBseVZpZGVvUm90YXRpb24oTTRPU0FfVm9pZCogcEJ1ZmZlciwKLSAgICBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiByb3RhdGlvbik7Ci0jZW5kaWYgLy8gQU5EUk9JRF9WRV9UT09MU19ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9vc2FsL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzNzM3NmQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyX29wdGltLmgKLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgZm9yIFN5bWJpYW4KLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdG8gcmVhZCBhIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLQotI2lmbmRlZiBNNE9TQV9GSUxFUkVBREVSX09QVElNX0gKLSNkZWZpbmUgTTRPU0FfRklMRVJFQURFUl9PUFRJTV9ICi0KLSNkZWZpbmUgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0KLS8qKi8KLSNpZm5kZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIE00T1NBX1ZvaWQqICAgICAgICAoKnBGY3RQdHJfT3BlbikoIE00T1NBX1ZvaWQqIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm8gKTsKLSAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uICgqcEZjdFB0cl9SZWFkKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1NlZWspKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm8gKTsKLSAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uICgqcEZjdFB0cl9UZWxsKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm8gKTsKLSAgICAgICAgTTRPU0FfSW50MzIgICAgICAgICgqcEZjdFB0cl9DbG9zZSkoIE00T1NBX1ZvaWQqIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9Wb2lkICAgICAgICAgKCpwRmN0UHRyX0FjY2Vzc1R5cGUpKCBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3NfSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIEZpbGVNb2RlQWNjZXNzX091dCApOwotCi0gICAgfSBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0cjsKLSNlbmRpZgotLyoqLwotCi0KLS8qIFJlYWRlciBBUEkgOiBidWZmZXJpemVkIGZ1bmN0aW9ucyAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0oIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLSNlbHNlCi0gICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSggTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHIgKkZTKTsKLSNlbmRpZgotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWREYXRhX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHNpemUgKTsKLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gKTsKLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQgKTsKLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZEdldE9wdGlvbl9vcHRpbSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICpvcHRpb25WYWx1ZSApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUgKTsKLQotI2VuZGlmIC8qIE00T1NBX0ZJTEVSRUFERVJfT1BUSU1fSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTFZfTWFjcm9zLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9NYWNyb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjhkN2U4NS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9NYWNyb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICAgICAgIExWX01hY3Jvcy5oCi0qIEBwYXIgICAgICAgIE5YUCBTb2Z0d2FyZQotKiBAYnJpZWYgICAgTWFjcm9zIGRlZmluaXRpb24gZm9yIFNtYXJ0cGhvbmUgdGVhbQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBMVl9NQUNST1NfSAotI2RlZmluZSBMVl9NQUNST1NfSAotCi0vKi0tLS0tLS0tLS0tLSovCi0vKiAgICBJTkNMVURFUyAgKi8KLS8qLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENIRUNLX1BUUihmY3QsIHAsIGVyciwgZXJyVmFsdWUpCi0qIEBub3RlICAgIFRoaXMgbWFjcm8gY2hlY2tzIHRoZSB2YWx1ZSBwLiBJZiBpdCBpcyBOVUxMLCBpdCBzZXRzIHRoZSB2YXJpYWJsZSBlcnIKLSogICAgICAgICAgIHRvIGVyclZhbHVlIGFuZCBqdW1wcyB0byB0aGUgbGFiZWwgPGZjdD5fY2xlYW5VcC4gQSB0cmFjZSBpcyBkaXNwbGF5ZWQKLSogICAgICAgICAgIHNpZ25hbGxpbmcgdGhlIGVycm9yLCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgdGhlIGxpbmUgbnVtYmVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDSEVDS19QVFIoZmN0LCBwLCBlcnIsIGVyclZhbHVlKSBcCi17IFwKLSAgICBpZihNNE9TQV9OVUxMID09IChwKSkgXAotICAgIHsgXAotICAgICAgICAoZXJyKSA9IChlcnJWYWx1ZSkgOyBcCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKChNNE9TQV9DaGFyKikiIiAjZmN0ICIoTCVkKTogIiAjcCAiIGlzIE5VTEwsIHJldHVybmluZyAiICNlcnJWYWx1ZSAiIixfX0xJTkVfXykgOyBcCi0gICAgICAgIGdvdG8gZmN0IyNfY2xlYW5VcDsgXAotICAgIH0gXAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENIRUNLX0VSUihmY3QsIGVycikKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjaGVja3MgdGhlIHZhbHVlIGVyci4gSWYgaXQgaXMgbm90IE5VTEwsIGEgdHJhY2UgaXMgZGlzcGxheWVkCi0qICAgICAgICAgICBzaWduYWxsaW5nIHRoZSBlcnJvciwgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZSBsaW5lIG51bWJlci4gVGhlIG1hY3JvCi0qICAgICAgICAgICBqdW1wcyB0byB0aGUgbGFiZWwgPGZjdD5fY2xlYW5VcC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQ0hFQ0tfRVJSKGZjdCwgZXJyKSBcCi17IFwKLSAgICBpZihNNE5PX0VSUk9SICE9IChlcnIpKSBcCi0gICAgeyBcCi0gICAgICAgIE00T1NBX1RSQUNFMV8yKChNNE9TQV9DaGFyKikiISEhICIgI2ZjdCAiKEwlZCk6IEVSUk9SIDB4JS44eCByZXR1cm5lZCIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sZXJyKSA7IFwKLSAgICAgICAgZ290byBmY3QjI19jbGVhblVwOyBcCi0gICAgfSBcCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDSEVDS19FUlIoZmN0LCBlcnIpCi0qIEBub3RlICAgIFRoaXMgbWFjcm8gY29tcGFyZXMgYSBjdXJyZW50IHN0YXRlIHdpdGggYSBzdGF0ZSB2YWx1ZS4gSWYgdGhleSBhcmUgZGlmZmVyZW50LAotKiAgICAgICAgICAgZXJyIGlzIHNldCB0byBNNEVSUl9TVEFURS4KLSogICAgICAgICAgIEEgdHJhY2UgaXMgZGlzcGxheWVkIHNpZ25hbGxpbmcgdGhlIGVycm9yLCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgdGhlIGxpbmUgbnVtYmVyLgotKiAgICAgICAgICAgVGhlIG1hY3JvIGp1bXBzIHRvIHRoZSBsYWJlbCA8ZmN0Pl9jbGVhblVwLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSAgICBDSEVDS19TVEFURShmY3QsIHN0YXRlVmFsdWUsIHN0YXRlKSBcCi17IFwKLSAgICBpZigoc3RhdGVWYWx1ZSkgIT0gKHN0YXRlKSkgXAotICAgIHsgXAotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiIiAjZmN0ICIgY2FsbGVkIGluIGJhZCBzdGF0ZSAlZCIsIHN0YXRlKSA7IFwKLSAgICAgICAgKGVycikgPSBNNEVSUl9TVEFURSA7IFwKLSAgICAgICAgZ290byBmY3QjI19jbGVhblVwOyBcCi0gICAgfSBcCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogU0FGRV9GUkVFKHApCi0qIEBub3RlICAgIFRoaXMgbWFjcm8gY2hlY2tzIHRoZSB2YWx1ZSBvZiBwIGlzIG5vdCBOVUxMLiBJZiBpdCBpcyBOVUxMLCBpdCBkb2VzCi0qICAgICAgICAgICBub3RoaW5nLiBFbHNlLCBwIGlzIGRlIGFsbG9jYXRlZCBhbmQgc2V0IHRvIE5VTEwuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNBRkVfRlJFRShwKSBcCi17IFwKLSAgICBpZihNNE9TQV9OVUxMICE9IChwKSkgXAotICAgIHsgXAotICAgICAgICBmcmVlKChwKSkgOyBcCi0gICAgICAgIChwKSA9IE00T1NBX05VTEwgOyBcCi0gICAgfSBcCi19Ci0KLQotCi0jZW5kaWYgLyotLS0gIExWX01BQ1JPU19IIC0tLSovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NoYXJTdGFyLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DaGFyU3Rhci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjMxNmYwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NoYXJTdGFyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9DaGFyU3Rhci5oCi0gKiBAaW5ncm91cAotICogQGJyaWVmICAgICAgICBleHRlcm5hbCBBUEkgb2YgdGhlIENoYXIgU3RhciBzZXQgb2YgZnVuY3Rpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9DSEFSU1RBUl9ICi0jZGVmaW5lIE00T1NBX0NIQVJTVEFSX0gKLQotLyogZ2VuZXJhbCBPU0FMIHR5cGVzIGFuZCBwcm90b3R5cGVzIGluY2x1c2lvbiAgICAgICAgICAgICAgICAgICAgICAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgotCi0vKiB0eXBlcyBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX2tjaHJEZWMgID0gMHgwMSwKLSAgIE00T1NBX2tjaHJIZXhhID0gMHgwMiwKLSAgIE00T1NBX2tjaHJPY3QgID0gMHgwMwotfSBNNE9TQV9jaHJOdW1CYXNlOwotCi0vKiBlcnJvciBhbmQgd2FybmluZyBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE00RVJSX0NIUl9TVFJfT1ZFUkZMT1cgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRPU0FfQ0hBUlNUQVIsMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0NIUl9DT05WX0ZBSUxFRCAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRPU0FfQ0hBUlNUQVIsMHgwMDAwMDIpCi0jZGVmaW5lIE00V0FSX0NIUl9OT1RfRk9VTkQgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRPU0FfQ0hBUlNUQVIsMHgwMDAwMDEpCi0jZGVmaW5lIE00V0FSX0NIUl9OVU1fUkFOR0UgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRPU0FfQ0hBUlNUQVIsMHgwMDAwMDIpCi0jZGVmaW5lIE00V0FSX0NIUl9ORUdBVElWRSAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRPU0FfQ0hBUlNUQVIsMHgwMDAwMDMpCi0KLS8qIHByb3RvdHlwZXMgb2YgdGhlIENoYXIgU3RhciBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyTkNvcHkgICAgICAgICAgKE00T1NBX0NoYXIgICAqc3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKnN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGVuMkNvcHkpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJBcmVJZGVudGljYWwgICAoTTRPU0FfQ2hhciAgICpzdHJJbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqc3RySW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sICAqcmVzdWx0KTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDMyICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockdldFVJbnQxNiAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYgKnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqc3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJTUHJpbnRmICAgICAgICAgKE00T1NBX0NoYXIgICpzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzdHJPdXRNYXhMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2xvY2suaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Nsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyZWE2OTYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0Nsb2NrLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBjbG9jayBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfQ0xPQ0tfSAotI2RlZmluZSBNNE9TQV9DTE9DS19ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotCi0KLSNkZWZpbmUgTTRXQVJfVElNRVNDQUxFX1RPT19CSUcgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRPU0FfQ0xPQ0ssMHgwMDAwMDEpIC8qKjwgVGltZSBwcmVjaXNpb24gdG9vIGhpZ2ggZm9yIHRoZSBzeXN0ZW0qLwotI2RlZmluZSBNNEVSUl9DTE9DS19CQURfUkVGX1lFQVIgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DTE9DSywweDAwMDAwMSkgLyoqPCBJbnB1dCB5ZWFyIG9mIHJlZmVyZW5jZSBpcyBuZWl0aGVyIDE5MDAsIG5vciAxOTcwIG5vciAyMDAwKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0NMT0NLX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jbG9ja0dldFRpbWUoTTRPU0FfVGltZSogcFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGltZXNjYWxlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qTTRPU0FfQ0xPQ0tfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NvcmVJRC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ29yZUlELmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxNzI4MDAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ29yZUlELmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRPU0FfQ29yZUlELmgKLSAqIEBicmllZiAgZGVmaW5lcyB0aGUgdW5pcXVlcyBjb21wb25lbnQgaWRlbnRpZmllcnMgdXNlZCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQKLSAqICAgICAgICAgYW5kIG9wdGlvbklEIG1lY2hhbmlzbQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRPU0FfQ09SRUlEX0hfXwotI2RlZmluZSBfX000T1NBX0NPUkVJRF9IX18KLQotLyogQ29yZUlkIGFyZSBkZWZpbmVkIG9uIDE0IGJpdHMgKi8KLS8qIHdlIHN0YXJ0IGZyb20gMHgwMTAwLCBsb3dlciB2YWx1ZXMgYXJlIHJlc2VydmVkIGZvciBvc2FsIGNvcmUgY29tcG9uZW50cyAqLwotCi0vKiByZWFkZXIgc2hlbGxzKi8KLSNkZWZpbmUgTTRSRUFERVJfQ09NTU9OICAgICAweDAxMDAKLSNkZWZpbmUgTTRSRUFERVJfQVZJICAgICAgICAweDAxMDEKLSNkZWZpbmUgTTRSRUFERVJfQU1SICAgICAgICAweDAxMDIKLSNkZWZpbmUgTTRSRUFERVJfM0dQICAgICAgICAweDAxMDMKLSNkZWZpbmUgTTRSRUFERVJfTkVUICAgICAgICAweDAxMDQKLSNkZWZpbmUgTTRSRUFERVJfM0dQX0hUVFAgICAweDAxMDUKLSNkZWZpbmUgTTRSRUFERVJfTVAzICAgICAgICAweDAxMDYKLSNkZWZpbmUgTTRSRUFERVJfV0FWICAgICAgICAweDAxMDcKLSNkZWZpbmUgTTRSRUFERVJfTUlESSAgICAgICAweDAxMDgKLSNkZWZpbmUgTTRSRUFERVJfQVNGICAgICAgICAweDAxMDkKLSNkZWZpbmUgTTRSRUFERVJfUkVBTCAgICAgICAgMHgwMTBBCi0jZGVmaW5lIE00UkVBREVSX0FBQyAgICAgICAgMHgwMTBCCi0jZGVmaW5lIE00UkVBREVSX0ZMRVggICAgICAgIDB4MDEwQwotI2RlZmluZSBNNFJFQURFUl9CQkEgICAgICAgIDB4MDEwRAotI2RlZmluZSBNNFJFQURFUl9TWU5USEVTSVNfQVVESU8gICAgMHgwMTBFCi0jZGVmaW5lIE00UkVBREVSX0pQRUcgICAgICAgIDB4MDEwRgotCi0KLS8qIHdyaXRlciBzaGVsbHMqLwotI2RlZmluZSBNNFdSSVRFUl9DT01NT04gICAgIDB4MDExMAotI2RlZmluZSBNNFdSSVRFUl9BVkkgICAgICAgIDB4MDExMQotI2RlZmluZSBNNFdSSVRFUl9BTVIgICAgICAgIDB4MDExMgotI2RlZmluZSBNNFdSSVRFUl8zR1AgICAgICAgIDB4MDExMwotI2RlZmluZSBNNFdSSVRFUl9KUEVHICAgICAgICAweDAxMTYKLSNkZWZpbmUgTTRXUklURVJfTVAzICAgICAgICAweDAxMTcKLQotLyogZGVjb2RlciBzaGVsbHMgKi8KLSNkZWZpbmUgTTRERUNPREVSX0NPTU1PTiAgICAweDAxMjAKLSNkZWZpbmUgTTRERUNPREVSX0pQRUcgICAgICAweDAxMjEKLSNkZWZpbmUgTTRERUNPREVSX01QRUc0ICAgICAweDAxMjIKLSNkZWZpbmUgTTRERUNPREVSX0FVRElPICAgICAweDAxMjMKLSNkZWZpbmUgTTRERUNPREVSX0FWQyAgICAgICAweDAxMjQKLSNkZWZpbmUgTTRERUNPREVSX01JREkgICAgICAweDAxMjUKLSNkZWZpbmUgTTRERUNPREVSX1dNQSAgICAgICAgMHgwMTI2Ci0jZGVmaW5lIE00REVDT0RFUl9XTVYgICAgICAgIDB4MDEyNwotI2RlZmluZSBNNERFQ09ERVJfUk1WICAgICAgICAweDAxMjgKLSNkZWZpbmUgTTRERUNPREVSX1JNQSAgICAgICAgMHgwMTI5Ci0jZGVmaW5lIE00REVDT0RFUl9BQUMgICAgICAgMHgwMTJBCi0jZGVmaW5lIE00REVDT0RFUl9CRUFUQlJFVyAgMHgwMTJCCi0jZGVmaW5lIE00REVDT0RFUl9FWFRFUk5BTCAgMHgwMTJDCi0KLS8qIGVuY29kZXIgc2hlbGxzICovCi0jZGVmaW5lIE00RU5DT0RFUl9DT01NT04gICAgMHgwMTMwCi0jZGVmaW5lIE00RU5DT0RFUl9KUEVHICAgICAgMHgwMTMxCi0jZGVmaW5lIE00RU5DT0RFUl9NUEVHNCAgICAgMHgwMTMyCi0jZGVmaW5lIE00RU5DT0RFUl9BVURJTyAgICAgMHgwMTMzCi0jZGVmaW5lIE00RU5DT0RFUl9WSURfTlVMTCAgMHgwMTM0Ci0jZGVmaW5lIE00RU5DT0RFUl9NSlBFRyAgICAgICAgMHgwMTM1Ci0jZGVmaW5lIE00RU5DT0RFUl9NUDMgICAgICAgIDB4MDEzNgotI2RlZmluZSBNNEVOQ09ERVJfSDI2NCAgICAgICAgMHgwMTM3Ci0jZGVmaW5lIE00RU5DT0RFUl9BQUMgICAgICAgIDB4MDEzOAotI2RlZmluZSBNNEVOQ09ERVJfQU1STkIgICAgICAgIDB4MDEzOQotI2RlZmluZSBNNEVOQ09ERVJfQVVEX05VTEwgIDB4MDEzQQotI2RlZmluZSBNNEVOQ09ERVJfRVhURVJOQUwgIDB4MDEzQgotCi0vKiBjb3JlcyAqLwotI2RlZmluZSBNNEpQR19ERUNPREVSICAgICAgIDB4MDE0MAotI2RlZmluZSBNNEpQR19FTkNPREVSICAgICAgIDB4MDE0MQotCi0jZGVmaW5lIE00TVA0X0RFQ09ERVIgICAgICAgMHgwMTQyCi0jZGVmaW5lIE00TVA0X0VOQ09ERVIgICAgICAgMHgwMTQzCi0KLSNkZWZpbmUgTTRBVklfQ09NTU9OICAgICAgICAweDAxNDQKLSNkZWZpbmUgTTRBVklfUkVBREVSICAgICAgICAweDAxNDUKLSNkZWZpbmUgTTRBVklfV1JJVEVSICAgICAgICAweDAxNDYKLQotI2RlZmluZSBNNEhUVFBfRU5HSU5FICAgICAgIDB4MDE0NwotCi0jZGVmaW5lIE00T1NBX1RNUEZJTEUgICAgICAgMHgwMTQ4Ci0jZGVmaW5lIE00VE9PTF9USU1FUiAgICAgICAgMHgwMTQ5Ci0KLSNkZWZpbmUgTTRBTVJfUkVBREVSICAgICAgICAweDAxNEEKLQotI2RlZmluZSBNNE1QM19SRUFERVIgICAgICAgIDB4MDE0QgotCi0jZGVmaW5lIE00V0FWX1JFQURFUiAgICAgICAgMHgwMTRDCi0jZGVmaW5lIE00V0FWX1dSSVRFUiAgICAgICAgMHgwMTRECi0jZGVmaW5lIE00V0FWX0NPTU1PTiAgICAgICAgMHgwMTRFCi0KLSNkZWZpbmUgTTRBRFRTX1JFQURFUiAgICAgICAgMHgwMTRGCi0jZGVmaW5lIE00QURJRl9SRUFERVIgICAgICAgIDB4MDE2QQotCi0jZGVmaW5lIE00U1BTICAgICAgICAgICAgICAgMHgwMTUwCi0jZGVmaW5lIE00RVhJRl9ERUNPREVSICAgICAgMHgwMTUxCi0jZGVmaW5lIE00RVhJRl9FTkNPREVSICAgICAgMHgwMTUyCi0jZGVmaW5lIE00R0lGX0RFQ09ERVIgICAgICAgMHgwMTUzCi0jZGVmaW5lIE00R0lGX0VOQ09ERVIgICAgICAgMHgwMTU0Ci0jZGVmaW5lIE00UE5HX0RFQ09ERVIgICAgICAgMHgwMTU1Ci0jZGVmaW5lIE00UE5HX0VOQ09ERVIgICAgICAgMHgwMTU2Ci0jZGVmaW5lIE00V0JNUF9ERUNPREVSICAgICAgMHgwMTU3Ci0jZGVmaW5lIE00V0JNUF9FTkNPREVSICAgICAgMHgwMTU4Ci0KLSNkZWZpbmUgTTRBTVJfV1JJVEVSICAgICAgICAweDAxNTkgICAgLyoqPCBubyByb29tIHRvIHB1dCBpdCBhbG9uZyBNNEFNUl9SRUFERVIgKi8KLQotCi0jZGVmaW5lIE00QVZDX0RFQ09ERVIgICAgICAgMHgwMTVBCi0jZGVmaW5lIE00QVZDX0VOQ09ERVIgICAgICAgMHgwMTVCCi0KLSNkZWZpbmUgTTRBU0ZfUkVBREVSICAgICAgICAweDAxNUMKLSNkZWZpbmUgTTRXTURSTV9BR0VOVCAgICAgICAgMHgwMTVECi0jZGVmaW5lIE00TUlESV9SRUFERVIgICAgICAgIDB4MDE2MiAgICAvKio8IG5vIHJvb20gYmVmb3JlIHRoZSBwcmVzZW50ZXJzICovCi0jZGVmaW5lIE00Uk1fUkVBREVSICAgICAgICAgMHgxNjMKLSNkZWZpbmUgTTRSTVZfREVDT0RFUiAgICAgICAgMHgxNjQKLSNkZWZpbmUgTTRSTUFfREVDT0RFUiAgICAgICAgMHgxNjUKLQotI2RlZmluZSBNNFRPT0xfWE1MICAgICAgICAgICAgMHgwMTY2Ci0jZGVmaW5lIE00VE9PTF9FRlIgICAgICAgICAgICAweDAxNjcgICAgLyoqPCBEZWNyeXB0aW9uIG1vZHVsZSBmb3IgVmlkZW8gQXJ0aXN0ICovCi0jZGVmaW5lIE00SUFMX0ZUTiAgICAgICAgICAgIDB4MDE2OCAgICAvKiBGVE4gaW1wbGVtZW50YXRpb24gb2YgdGhlIElBTCAqLwotI2RlZmluZSBNNEZUTiAgICAgICAgICAgICAgICAweDAxNjkgICAgLyogRlROIGxpYnJhcnkgKi8KLQotLyogcHJlc2VudGVyICovCi0jZGVmaW5lIE00UFJFU0VOVEVSX0FVRElPICAgMHgwMTYwCi0jZGVmaW5lIE00UFJFU0VOVEVSX1ZJREVPICAgMHgwMTYxCi0KLS8qIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlcyAodnBzLCBldGMuLikqLwotI2RlZmluZSBNNFZQUyAgICAgICAgICAgICAgIDB4MDE3MAotI2RlZmluZSBNNFZUUyAgICAgICAgICAgICAgIDB4MDE3MQotI2RlZmluZSBNNFZYUyAgICAgICAgICAgICAgIDB4MDE3MgotI2RlZmluZSBNNENBTExCQUNLICAgICAgICAgIDB4MDE3MwotI2RlZmluZSBNNFZFUyAgICAgICAgICAgICAgIDB4MDE3NAotI2RlZmluZSBNNFBSRVBST0NFU1NfVklERU8gIDB4MDE3NQotI2RlZmluZSBNNEdSQUJfQVVESU8gICAgICAgIDB4MDE3NgotI2RlZmluZSBNNEdSQUJfVklERU8gICAgICAgIDB4MDE3NwotI2RlZmluZSBNNFZTU0FWSSAgICAgICAgICAgIDB4MDE3OAotI2RlZmluZSBNNFZTUzNHUFAgICAgICAgICAgIDB4MDE3OQotI2RlZmluZSBNNFBUTzNHUFAgICAgICAgICAgIDB4MDE3QQotI2RlZmluZSBNNFBWWF9QQVJTRVIgICAgICAgIDB4MDE3QgotI2RlZmluZSBNNFZDUyAgICAgICAgICAgICAgICAweDAxN0MKLSNkZWZpbmUgTTRNQ1MgICAgICAgICAgICAgICAgMHgwMTdECi0jZGVmaW5lIE00TU5NQyAgICAgICAgICAgICAgICAweDAxODAgICAgLyoqPCBtbm0gY29udHJvbGxlciAqLwotI2RlZmluZSBNNFRURVhUX1BBUlNFUiAgICAgIDB4MDE4MSAgICAvKio8IHRpbWVkIHRleHQgKi8KLSNkZWZpbmUgTTRNTSAgICAgICAgICAgICAgICAweDAxODIgICAgLyoqPCBNdXNpYyBtYW5hZ2VyICovCi0jZGVmaW5lIE00TURQICAgICAgICAgICAgICAgIDB4MDE4MyAgICAvKio8IE1ldGFkYXRhIHBhcnNlciAqLwotI2RlZmluZSBNNE1NU1FMQ09SRSAgICAgICAgICAgIDB4MDE4NAotI2RlZmluZSBNNFZQU0lMICAgICAgICAgICAgICAgIDB4MDE4NQotI2RlZmluZSBNNEZJTEVJTCAgICAgICAgICAgIDB4MDE4NiAvKiBJTCBmaWxlIEludGVyZmFjZSAqLwotI2RlZmluZSBNNE1VICAgICAgICAgICAgICAgIDB4MDE4NwotI2RlZmluZSBNNFZFRSAgICAgICAgICAgICAgICAweDAxODggIC8qKjwgVmlkZW8gZWZmZWN0IGVuZ2luZSAqLwotI2RlZmluZSBNNFZBICAgICAgICAgICAgICAgIDB4MDE4OSAvKiBWaWRlb0FydGlzdCAqLwotI2RlZmluZSBNNEpUUyAgICAgICAgICAgICAgICAweDAxOEEKLSNkZWZpbmUgTTRKVFNJTCAgICAgICAgICAgICAgICAweDAxOEIKLSNkZWZpbmUgTTRBSVIgICAgICAgICAgICAgICAgMHgwMThDICAvKio8IEFJUiAqLwotI2RlZmluZSBNNFNQRSAgICAgICAgICAgICAgICAweDAxOEQgIC8qKjwgU3RpbGwgcGljdHVyZSBlZGl0b3IgKi8KLSNkZWZpbmUgTTRWUyAgICAgICAgICAgICAgICAweDAxOEUgICAgLyoqPCBWaWRlbyBTdHVkaW8gKHhWU1MpICovCi0jZGVmaW5lIE00VkVTSUwgICAgICAgICAgICAgICAgMHgwMThGICAgIC8qKjwgVkVTIGlsICovCi0jZGVmaW5lIE00SUQzICAgICAgICAgICAgICAgIDB4MDE5MCAgICAvKio8IElEMyBUYWcgTW9kdWxlICovCi0jZGVmaW5lIE00U0MgICAgICAgICAgICAgICAgMHgwMTkxICAgIC8qKjwgTWVkaWEgU2Nhbm5lciAqLwotI2RlZmluZSBNNFRHICAgICAgICAgICAgICAgIDB4MDE5MiAgLyoqPCBUaHVtYm5haWwgR2VuZXJhdG9yKi8KLSNkZWZpbmUgTTRUUyAgICAgICAgICAgICAgICAweDAxOTMgICAgLyoqPCBUaHVtYm5haWwgc3RvcmFnZSAqLwotI2RlZmluZSBNNE1CICAgICAgICAgICAgICAgIDB4MDE5NCAgICAvKio8IE1lZGlhIGJyb3dzZXIgKi8KLQotLyogaGlnaCBsZXZlbCBhcHBsaWNhdGlvbiAodGVzdCBvciBjbGllbnQgYXBwKSAqLwotI2RlZmluZSBNNEFQUExJICAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBNNFZBX0FQUExJICAgICAgICAgICAgMHgwMjAxICAgIC8qKjwgVmlkZW8gQXJ0aXN0IHRlc3QgYXBwbGljYXRpb24gKi8KLQotLyogZXh0ZXJuYWwgY29tcG9uZW50cyAoSFcgdmlkZW8gY29kZWNzLCBldGMuKSAqLwotI2RlZmluZSBNNFZEX0VYVEVSTkFMICAgICAgICAweDAzMDAKLSNkZWZpbmUgTTRWRV9FWFRFUk5BTCAgICAgICAgMHgwMzAxCi0KLQotLyogcHJpb3JpdHkgdG8gY29tYmluZSB3aXRoIG1vZHVsZSBpZHMgKi8KLSNkZWZpbmUgTTRISUdIX1BSSU9SSVRZICAgICAweEMwMDAKLSNkZWZpbmUgTTRNRURJVU1fUFJJT1JJVFkgICAweDgwMDAKLSNkZWZpbmUgTTRMT1dfUFJJT1JJVFkgICAgICAweDQwMDAKLSNkZWZpbmUgTTRERUZBVUxUX1BSSU9SSVRZICAweDAwMDAKLQotCi0jZW5kaWYgLypfX000T1NBX0NPUkVJRF9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9EZWJ1Zy5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODI2YWI1MS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9EZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0RlYnVnLmgKLSAqIEBicmllZiAgICAgICAgRGVidWcgYW5kIFRyYWNlIE1hY3JvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgX000T1NBX0RFQlVHX0hfCi0jZGVmaW5lIF9NNE9TQV9ERUJVR19IXwotCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0KLS8qIGRlZmF1dCB2YWx1ZSwgZGVmaW5lZCBvbmx5IGlmIG5vdCBkZWZpbmVkIGFscmVhZHkuICovCi0jaWZuZGVmIE00VFJBQ0VfSUQKLSNkZWZpbmUgTTRUUkFDRV9JRCBNNFVOS05PV05fQ09SRUlECi0jZW5kaWYgLyogTTRUUkFDRV9JRCB1bmRlZmluZWQgKi8KLQotCi0jZGVmaW5lIE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMIDAKLQotI2lmbmRlZiBNNE9TQV9ERUJVR19MRVZFTAotI2RlZmluZSBNNE9TQV9ERUJVR19MRVZFTCAgICAgICAwCi0jZW5kaWYKLQotCi0jZGVmaW5lIE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMIDAKLQotI2lmbmRlZiBNNE9TQV9UUkFDRV9MRVZFTAotI2RlZmluZSBNNE9TQV9UUkFDRV9MRVZFTCAgICAgICAwCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotCi0jaWYgKE00T1NBX0RFQlVHX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAxKQotCi0vKiBEZWJ1ZyBtYWNyb3MgKi8KLWV4dGVybiBNNE9TQV9Wb2lkIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oTTRPU0FfVUludDMyIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZ0NvbmRpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSIHJldHVybmVkRXJyb3IpOwotCi0KLSNkZWZpbmUgTTRPU0FfREVCVUdfSUZ4KGNvbmQsIGVycm9yQ29kZSwgbXNnLCBsZXZlbClcCi0gICAgICBpZihjb25kKVwKLSAgICAgIHtcCi0gICAgICAgICBNNE9TQV9ERUJVR190cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sIGxldmVsLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSNjb25kLCAoTTRPU0FfQ2hhciopbXNnLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yQ29kZSkpO1wKLSAgICAgICAgIHJldHVybihlcnJvckNvZGUpO1wKLSAgICAgIH0KLQotI2RlZmluZSBNNE9TQV9ERUJVRyhlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR190cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sIDEsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopI2Vycm9yQ29kZSwgKE00T1NBX0NoYXIqKW1zZyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvckNvZGUpKTsKLQotI2Vsc2UgLyooTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpKi8KLQotCi0jZGVmaW5lIE00T1NBX0RFQlVHKGVycm9yQ29kZSwgbXNnKQotCi0jZW5kaWYgLyooTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpKi8KLQotCi0KLSNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpCi0gI2RlZmluZSBNNE9TQV9ERUJVR19JRjEoY29uZCwgZXJyb3JDb2RlLCBtc2cpXAotICAgICAgICAgTTRPU0FfREVCVUdfSUZ4KGNvbmQsIGVycm9yQ29kZSwgbXNnLCAxKQotI2Vsc2UKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMShjb25kLCBlcnJvckNvZGUsIG1zZykKLSNlbmRpZiAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkqLwotCi0KLSNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMikgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDIpCi0gI2RlZmluZSBNNE9TQV9ERUJVR19JRjIoY29uZCwgZXJyb3JDb2RlLCBtc2cpXAotICAgICAgICAgTTRPU0FfREVCVUdfSUZ4KGNvbmQsIGVycm9yQ29kZSwgbXNnLCAyKQotI2Vsc2UKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMihjb25kLCBlcnJvckNvZGUsIG1zZykKLSNlbmRpZiAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMikqLwotCi0KLSNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMykgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDMpCi0gI2RlZmluZSBNNE9TQV9ERUJVR19JRjMoY29uZCwgZXJyb3JDb2RlLCBtc2cpXAotICAgICAgICAgTTRPU0FfREVCVUdfSUZ4KGNvbmQsIGVycm9yQ29kZSwgbXNnLCAzKQotI2Vsc2UKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMyhjb25kLCBlcnJvckNvZGUsIG1zZykKLSNlbmRpZiAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMykqLwotCi0KLQotLyogVHJhY2UgbWFjcm9zICovCi0KLSNpZiAoTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpCi0KLWV4dGVybiBNNE9TQV9Wb2lkIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oTTRPU0FfVUludDMyIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db3JlSUQgY29yZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZ01zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICk7Ci0KLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF8wKG1zZywgbGV2ZWwpXAotICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCwgKE00T1NBX0NoYXIqKW1zZyk7Ci0KLQotI2RlZmluZSBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgbGV2ZWwpXAotICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Db3JlSUQpTTRUUkFDRV9JRCwgbGV2ZWwsIChNNE9TQV9DaGFyKiltc2csIHBhcmFtMSk7Ci0KLQotI2RlZmluZSBNNE9TQV9UUkFDRXhfMihtc2csIHBhcmFtMSwgcGFyYW0yLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF8zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgbGV2ZWwpXAotICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCwgKE00T1NBX0NoYXIqKW1zZyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMSxwYXJhbTIsIHBhcmFtMyk7Ci0KLQotI2RlZmluZSBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgbGV2ZWwpXAotICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKiltc2csIHBhcmFtMSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpOwotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgbGV2ZWwpXAotICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKiltc2csIHBhcmFtMSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSk7Ci0KLSNlbmRpZiAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMSkqLwotCi0KLQotI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMSkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzAobXNnKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzAobXNnLCAxKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8xKG1zZywgcGFyYW0xKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzEobXNnLCBwYXJhbTEsIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzIobXNnLCBwYXJhbTEsIHBhcmFtMilcCi0gICAgICAgIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCAxKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFMV80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcCi0gICAgICAgIE00T1NBX1RSQUNFeF81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUsIDEpCi0KLSNlbHNlIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKSovCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzAobXNnKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMShtc2csIHBhcmFtMSkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzIobXNnLCBwYXJhbTEsIHBhcmFtMikKLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSkKLQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKSovCi0KLQotI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMikKLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzAobXNnKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzAobXNnLCAyKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8xKG1zZywgcGFyYW0xKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzEobXNnLCBwYXJhbTEsIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzIobXNnLCBwYXJhbTEsIHBhcmFtMilcCi0gICAgICAgIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCAyKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFMl80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcCi0gICAgICAgIE00T1NBX1RSQUNFeF81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUsIDIpCi0KLSNlbHNlIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAyKSovCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzAobXNnKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMShtc2csIHBhcmFtMSkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzIobXNnLCBwYXJhbTEsIHBhcmFtMikKLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSkKLSNlbmRpZiAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMikqLwotCi0KLSNpZiAoTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMykgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDMpCi0jZGVmaW5lIE00T1NBX1RSQUNFM18wKG1zZylcCi0gICAgICAgIE00T1NBX1RSQUNFeF8wKG1zZywgMykKLQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMShtc2csIHBhcmFtMSlcCi0gICAgICAgIE00T1NBX1RSQUNFeF8xKG1zZywgcGFyYW0xLCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM18yKG1zZywgcGFyYW0xLCBwYXJhbTIpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMihtc2csIHBhcmFtMSwgcGFyYW0yLCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM18zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMylcCi0gICAgICAgIE00T1NBX1RSQUNFeF8zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgMykKLQotI2RlZmluZSBNNE9TQV9UUkFDRTNfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNClcCi0gICAgICAgIE00T1NBX1RSQUNFeF80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM181KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01LCAzKQotCi0jZWxzZSAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMykqLwotCi0jZGVmaW5lIE00T1NBX1RSQUNFM18wKG1zZykKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzEobXNnLCBwYXJhbTEpCi0jZGVmaW5lIE00T1NBX1RSQUNFM18yKG1zZywgcGFyYW0xLCBwYXJhbTIpCi0jZGVmaW5lIE00T1NBX1RSQUNFM18zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMykKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpCi0jZGVmaW5lIE00T1NBX1RSQUNFM181KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpCi0KLSNlbmRpZiAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMykqLwotCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9NNE9TQV9ERUJVR19IXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FcnJvci5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzVjMzE3Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0Vycm9yLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBEZWZpbml0aW9uIG9mIGNvbW1vbiBlcnJvciB0eXBlcwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgY29udGFpbnMgbWFjcm9zIHRvIGdlbmVyYXRlIGFuZCBhbmFseXplIGVycm9yIGNvZGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX0VSUk9SX0gKLSNkZWZpbmUgTTRPU0FfRVJST1JfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqIE00T1NBX0VSUiBpcyBhIDMyIGJpdHMgdW5zaWduZWQgaW50ZWdlci4KLSAqIFRvIHNvcnQgcmV0dXJuZWQgY29kZSwgYSBzcGVjaWZpYyBuYW1pbmcgY29udmVudGlvbiBtdXN0IGJlIGZvbGxvd2VkOgotICogLSBTZXZlcml0eSAoMiBiaXRzKTogSXQgbWF5IGJyIGVpdGhlciAwYjAwIChubyBlcnJvciksIDBiMDEgKHdhcm5pbmcpIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAwYjAxIChmYXRhbCBlcnJvcikKLSAqIC0gQ29yZSBJRCAoMTQgYml0cyk6IEl0IGlzIGEgdW5pcXVlIElEIGZvciBlYWNoIGNvcmUgY29tcG9uZW50Ci0gKiAtIEVycm9ySUQgKDE2IGJpdHMpOiBJdCBpcyB0aGUgc3BlY2lmaWMgZXJyb3IgY29kZQotCi0gKiBFQUNIIENPUkUgQ09NUE9ORU5UIEZVTkNUSU9OIFNIT1VMRCBSRVRVUk4gQU4gTTRPU0FfRVJSCi0qLwotdHlwZWRlZiBNNE9TQV9VSW50MzIgICBNNE9TQV9FUlI7Ci0KLSNkZWZpbmUgTTRfT0sgICAgIDAKLSNkZWZpbmUgTTRfV0FSICAgIDEKLSNkZWZpbmUgTTRfRVJSICAgIDIKLQotCi0vKiBNYWNybyB0byBwcm9jZXNzIE00T1NBX0VSUiAqLwotCi0vKiogVGhpcyBtYWNybyB0ZXN0cyBpZiB0aGUgcHJvdmlkZWQgTTRPU0FfRVJSIGlzIGEgd2FybmluZyBvciBub3QqLwotI2RlZmluZSBNNE9TQV9FUlJfSVNfV0FSTklORyhlcnJvcikgICAoKCgoZXJyb3IpPj4zMCkgPT0gTTRfV0FSKSA/IDE6MCkKLQotLyoqIFRoaXMgbWFjcm8gdGVzdHMgaWYgdGhlIHByb3ZpZGVkIE00T1NBX0VSUiBpcyBhIGZhdGFsIGVycm9yIG9yIG5vdCovCi0jZGVmaW5lIE00T1NBX0VSUl9JU19FUlJPUihlcnJvcikgICAoKCgoZXJyb3IpPj4zMCkgPT0gTTRfRVJSKSA/IDE6MCkKLQotLyoqIFRoaXMgbWFjcm8gcmV0dXJucyBhbiBlcnJvciBjb2RlIGFjY3JvZGluZyB0byB0aGUgMyBwcm92aWRlZCBmaWVsZHM6Ci0gICogQGFyZyBzZXZlcml0eTogKElOKSBbTTRPU0FfVUludDMyXSBTZXZlcml0eSB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUKLSAgKiBAYXJnIGNvcmVJRDogKElOKSBbTTRPU0FfVUludDMyXSBDb3JlSUQgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlCi0gICogQGFyZyBlcnJvcklEOiAoSU4pIFtNNE9TQV9VSW50MzJdIEVycm9ySUQgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlKi8KLSNkZWZpbmUgTTRPU0FfRVJSX0NSRUFURShzZXZlcml0eSwgY29yZUlELCBlcnJvcklEKVwKLSAgIChNNE9TQV9VSW50MzIpKCgoKE00T1NBX1VJbnQzMilzZXZlcml0eSk8PDMwKSsoKCgoTTRPU0FfVUludDMyKWNvcmVJRCkmMHgwMDNGRkYpPDwxNikrKCgoTTRPU0FfVUludDMyKWVycm9ySUQpJjB4MDBGRkZGKSkKLQotLyoqIFRoaXMgbWFjcm8gZXh0cmFjdHMgdGhlIDMgZmllbGRzIGZyb20gdGhlIGVycm9yOgotICAqIEBhcmcgZXJyb3I6IChJTikgW000T1NBX0VSUl0gRXJyb3IgY29kZQotICAqIEBhcmcgc2V2ZXJpdHk6IChPVVQpIFtNNE9TQV9VSW50MzJdIFNldmVyaXR5IHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZQotICAqIEBhcmcgY29yZUlEOiAoT1VUKSBbTTRPU0FfVUludDMyXSBDb3JlSUQgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlCi0gICogQGFyZyBlcnJvcklEOiAoT1VUKSBbTTRPU0FfVUludDMyXSBFcnJvcklEIHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZSovCi0jZGVmaW5lIE00T1NBX0VSUl9TUExJVChlcnJvciwgc2V2ZXJpdHksIGNvcmVJRCwgZXJyb3JJRClcCi0gICB7IHNldmVyaXR5PShNNE9TQV9VSW50MzIpKChlcnJvcik+PjMwKTtcCi0gICAgIGNvcmVJRD0oTTRPU0FfVUludDMyKSgoKGVycm9yKT4+MTYpJjB4MDAzRkZGKTtcCi0gICAgIChNNE9TQV9VSW50MzIpKGVycm9ySUQ9KGVycm9yKSYweDAwRkZGRik7IH0KLQotCi0vKiAiZmFrZSIgQ29yZUlELCBpcyB1c2VkIHRvIHJlcG9ydCBhbiB1bmtub3duIENvcmVJRC4gVXNlZCBieSB0aGUgdHJhY2Ugc3lzdGVtCi13aGVuIHRoZSBjb3JlIElEIG1hY3JvIGlzbid0IGRlZmluZWQuIERlZmluZWQgaGVyZSBpbnN0ZWFkIG9mIENvcmVJRC5oIHRvIGF2b2lkCi1pbnRyb2R1Y2luZyBkZXBlbmRlbmNpZXMgdG8gY29tbW9uL2luYy4gKi8KLQotI2RlZmluZSBNNFVOS05PV05fQ09SRUlEICAgIDB4M0ZGRiAvKiBtYXggcG9zc2libGUgQ29yZUlEICovCi0KLSNkZWZpbmUgTTRfQ09NTU9OICAgICAgICAgICAweDAwICAvKio8Q29tbW9uKi8KLSNkZWZpbmUgTTRNUDRfQ09NTU9OICAgICAgICAweDAxICAvKio8Q29yZSBNUDQgKGNvbW1vbikqLwotI2RlZmluZSBNNE1QNF9XUklURVIgICAgICAgIDB4MDIgIC8qKjxDb3JlIE1QNCB3cml0ZXIqLwotI2RlZmluZSBNNE1QNF9SRUFERVIgICAgICAgIDB4MDMgIC8qKjxDb3JlIE1QNCByZWFkZXIqLwotI2RlZmluZSBNNFJUU1BfQ09NTU9OICAgICAgIDB4MTEgIC8qKjxDb3JlIFJUU1AgY29tbW9uKi8KLSNkZWZpbmUgTTRSVFNQX1dSSVRFUiAgICAgICAweDEyICAvKio8Q29yZSBSVFNQIHRyYW5zbWl0dGVyKi8KLSNkZWZpbmUgTTRSVFNQX1JFQURFUiAgICAgICAweDEzICAvKio8Q29yZSBSVFNQIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTRSVFBfV1JJVEVSICAgICAgICAweDE0ICAvKio8Q29yZSBSVFAvUlRDUCByZWNlaXZlciovCi0jZGVmaW5lIE00UlRQX1JFQURFUiAgICAgICAgMHgxNSAgLyoqPENvcmUgUlRQL1JUQ1AgdHJhbnNtaXR0ZXIqLwotI2RlZmluZSBNNFNBUF9XUklURVIgICAgICAgIDB4MTYgIC8qKjxDb3JlIFNBUCB0cmFuc21pdHRlciovCi0jZGVmaW5lIE00U0FQX1JFQURFUiAgICAgICAgMHgxNyAgLyoqPENvcmUgU0FQIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTREVkJIX1JFQURFUiAgICAgICAgMHgxOCAgLyoqPENvcmUgRFZCSCByZWNlaXZlciovCi0jZGVmaW5lIE00U0RQX1dSSVRFUiAgICAgICAgMHgyMiAgLyoqPENvcmUgU0RQIHdyaXRlciovCi0jZGVmaW5lIE00U0RQX1JFQURFUiAgICAgICAgMHgzMSAgLyoqPENvcmUgU0RQIHJlYWRlciovCi0jZGVmaW5lIE00UEFLX0FNUiAgICAgICAgICAgMHgzMiAgLyoqPENvcmUgcGFja2V0aXplciBBTVIgKFJGQzMyNjcpKi8KLSNkZWZpbmUgTTRERVBBS19BTVIgICAgICAgICAweDMzICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIEFNUiAoUkZDMzI2NykqLwotI2RlZmluZSBNNFBBS19IMjYzICAgICAgICAgIDB4MzQgIC8qKjxDb3JlIHBhY2tldGl6ZXIgSDI2MyAoUkZDMjQyOSkqLwotI2RlZmluZSBNNERFUEFLX0gyNjMgICAgICAgIDB4MzUgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgSDI2MyhSRkMyNDI5KSovCi0jZGVmaW5lIE00UEFLX1NJTVBMRSAgICAgICAgMHgzNiAgLyoqPENvcmUgcGFja2V0aXplciBTaW1wbGVEcmFmdCAoUkZDIHh4eHgpKi8KLSNkZWZpbmUgTTRERVBBS19TSU1QTEUgICAgICAweDM3ICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFNpbXBsZURyYWZ0IChSRkMgeHh4eCkqLwotI2RlZmluZSBNNFBBS18zMDE2X1ZJREVPICAgIDB4MzggIC8qKjxDb3JlIHBhY2tldGl6ZXIgUkZDMzAxNiB2aWRlbyovCi0jZGVmaW5lIE00REVQQUtfMzAxNl9WSURFTyAgMHgzOSAgLyoqPENvcmUgZGUtcGFja2V0aXplciBSRkMzMDE2IHZpZGVvKi8KLSNkZWZpbmUgTTRQQUtfMzAxNl9BVURJTyAgICAweDNBICAvKio8Q29yZSBwYWNrZXRpemVyIFJGQzMwMTYgYXVkaW8gKExBVE0pKi8KLSNkZWZpbmUgTTRERVBBS18zMDE2X0FVRElPICAweDNCICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJGQzMwMTYgYXVkaW8gKExBVE0pKi8KLSNkZWZpbmUgTTRERVBBS19IMjY0ICAgICAgICAweDNDICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIEgyNjQqLwotI2RlZmluZSBNNERFUEFLX1JFQUxWICAgICAgICAweDNEICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJlYWwgVmlkZW8gKi8KLSNkZWZpbmUgTTRERVBBS19SRUFMQSAgICAgICAgMHgzRSAgLyoqPENvcmUgZGUtcGFja2V0aXplciBSZWFsIEF1ZGlvICovCi0jZGVmaW5lIE00UkRUX1JFQURFUiAgICAgICAgMHgzRiAgLyoqPENvcmUgUkRUIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTRUQ1BfRE1VWCAgICAgICAgICAweDUwICAvKio8Q29yZSBUQ1AgZGVtdXgqLwotI2RlZmluZSBNNElPRF9QQVJTRVIgICAgICAgIDB4NTEgIC8qKjxDb3JlIElPRCBwYXJzZXIqLwotI2RlZmluZSBNNE9TQV9GSUxFX0NPTU1PTiAgIDB4NjEgIC8qKjxPU0FMIGZpbGUgY29tbW9uKi8KLSNkZWZpbmUgTTRPU0FfRklMRV9XUklURVIgICAweDYyICAvKio8T1NBTCBmaWxlIHdyaXRlciovCi0jZGVmaW5lIE00T1NBX0ZJTEVfUkVBREVSICAgMHg2MyAgLyoqPE9TQUwgZmlsZSByZWFkZXIqLwotI2RlZmluZSBNNE9TQV9GSUxFX0VYVFJBICAgIDB4NjQgIC8qKjxPU0FMIGZpbGUgZXh0cmEqLwotI2RlZmluZSBNNE9TQV9ESVJFQ1RPUlkgICAgIDB4NjUgIC8qKjxPU0FMIGRpcmVjdG9yeSovCi0jZGVmaW5lIE00T1NBX1NPQ0tFVCAgICAgICAgMHg3MSAgLyoqPE9TQUwgc29ja2V0IChib3RoIHJlYWRlciBhbmQgd3JpdGVyKSovCi0jZGVmaW5lIE00T1NBX1RIUkVBRCAgICAgICAgMHg4MSAgLyoqPE9TQUwgdGhyZWFkKi8KLSNkZWZpbmUgTTRPU0FfTVVURVggICAgICAgICAweDgyICAvKio8T1NBTCBtdXRleCovCi0jZGVmaW5lIE00T1NBX1NFTUFQSE9SRSAgICAgMHg4MyAgLyoqPE9TQUwgc2VtYXBob3JlKi8KLSNkZWZpbmUgTTRPU0FfQ0xPQ0sgICAgICAgICAweDg0ICAvKio8T1NBTCBjbG9jayovCi0jZGVmaW5lIE00T1NBX01FTU9SWSAgICAgICAgMHg5MSAgLyoqPE9TQUwgbWVtb3J5Ki8KLSNkZWZpbmUgTTRDQUxMX0JBQ0sgICAgICAgICAweEExICAvKio8Q2FsbCBCYWNrIGVycm9yKi8KLSNkZWZpbmUgTTRPU0FfVVJJICAgICAgICAgICAweEIxICAvKio8T1NBTCBVUkkgaGFuZGxlciovCi0jZGVmaW5lIE00T1NBX1NUUklORyAgICAgICAgMHhCMiAgLyoqPE9TQUwgc3RyaW5nKi8KLSNkZWZpbmUgTTRTWVNfQ01BUEkgICAgICAgICAweEIzICAvKio8U1lTVEVNIENvbW1vbiBNZWRpIEFQSSovCi0jZGVmaW5lIE00T1NBX0NIQVJTVEFSICAgICAgMHhCNCAgLyoqPE9TQUwgQ2hhclN0YXIqLwotI2RlZmluZSBNNFJFQUNUT1IgICAgICAgICAgIDB4QzEgIC8qKjxDb3JlIHJlYWN0b3IqLwotI2RlZmluZSBNNFRFU1QgICAgICAgICAgICAgIDB4RDEgIC8qKjxUZXN0IGNvbXBvbmVudCovCi0jZGVmaW5lIE00U1RBQ0sgICAgICAgICAgICAgICAgMHhFMSAgLyoqPCBDb3JlIElEIG9mIHRoZSBpbnRlZ3JhdGVkIHN0YWNrKi8KLSNkZWZpbmUgTTRTVEFDS19SRUFMICAgICAgICAweEUyICAvKio8Q29yZSBJRCBvZiB0aGUgUmVhbCBpbnRlZ3JhdGVkIHN0YWNrICovCi0jZGVmaW5lIE00VE9PTF9MQlZUX1BBUkFNICAgMHhGMSAgLyoqPExCX1ZUIGNvbmZpZyBmaWxlIG1hbmFnZXIqLwotI2RlZmluZSBNNFRPT0xfTElOS19MSVNUICAgIDB4RjIgIC8qKjxUb29sIGxpbmtlZCBsaXN0Ki8KLSNkZWZpbmUgTTRUT09MX0JBU0U2NCAgICAgICAweEYzICAvKio8Q29yZSBiYXNlNjQgZW5jb2Rlci9kZWNvZGVyKi8KLQotCi0KLS8qIERlZmluaXRpb24gb2YgY29tbW9uIGVycm9yIGNvZGVzICovCi0vKiogdGhlcmUgaXMgbm8gZXJyb3IqLwotI2RlZmluZSBNNE5PX0VSUk9SICAgICAgICAgICAgMHgwMDAwMDAwMAotCi0vKiogQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMKi8KLSNkZWZpbmUgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDAxKQotLyoqIFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cqLwotI2RlZmluZSBNNEVSUl9TVEFURSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDIpCi0vKiogVGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlKi8KLSNkZWZpbmUgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDAzKQotLyoqIFByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lKi8KLSNkZWZpbmUgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA0KQotI2RlZmluZSBNNEVSUl9DT05URVhUX0ZBSUxFRCAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDUpCi0jZGVmaW5lIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwNikKLS8qKiBUaGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lKi8KLSNkZWZpbmUgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA3KQotLyoqIFRoaXMgb3B0aW9uIGlzIGEgd3JpdGUgb25seSBvbmUqLwotI2RlZmluZSBNNEVSUl9XUklURV9PTkxZICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDgpCi0vKiogVGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lKi8KLSNkZWZpbmUgTTRFUlJfUkVBRF9PTkxZICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA5KQotLyoqIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQqLwotI2RlZmluZSBNNEVSUl9OT1RfSU1QTEVNRU5URUQgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMEEpCi0KLSNkZWZpbmUgICAgTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00X0NPTU1PTiwgMHgwMDAwMEIpCi0KLSNkZWZpbmUgTTRXQVJfTk9fREFUQV9ZRVQgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDAxKQotI2RlZmluZSBNNFdBUl9OT19NT1JFX1NUUkVBTSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDIpCi0jZGVmaW5lIE00V0FSX0lOVkFMSURfVElNRSAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwMykKLSNkZWZpbmUgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDA0KQotI2RlZmluZSBNNFdBUl9USU1FX09VVCAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDUpCi0vKiogVGhlIGJ1ZmZlciBpcyBmdWxsKi8KLSNkZWZpbmUgTTRXQVJfQlVGRkVSX0ZVTEwgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDA2KQotLyogVGhlIHNlcnZlciBhc2tzIGZvciBhIHJlZGlyZWN0aW9uICovCi0jZGVmaW5lIE00V0FSX1JFRElSRUNUICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDA3KQotI2RlZmluZSBNNFdBUl9UT09fTVVDSF9TVFJFQU1TICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDgpCi0vKiBTRiBDb2RlYyBkZXRlY3RlZCBJTkZPX0ZPUk1BVF9DSEFOR0UgZHVyaW5nIGRlY29kZSAqLwotI2RlZmluZSBNNFdBUl9JTkZPX0ZPUk1BVF9DSEFOR0UgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00X0NPTU1PTiwgMHgwMDAwMDkpCi0KLSNlbmRpZiAvKk00T1NBX0VSUk9SX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FeHBvcnQuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0V4cG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiN2E2ZTgxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0V4cG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00T1NBX0V4cG9ydC5oCi0gKiBAYnJpZWYgICAgRGF0YSBhY2Nlc3MgZXhwb3J0IHR5cGVzIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0eXBlcyB3aGljaCBtdXN0IGJlCi0gKiAgICAgICAgICB1c2VkIHRvIGltcG9ydCBvciBleHBvcnQgYW55IGZ1bmN0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9FWFBPUlRfSAotI2RlZmluZSBNNE9TQV9FWFBPUlRfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qX19jcGx1c3BsdXMqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogIE9TQUwgRVhQT1JUUyAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIENIQVJfU1RBUiAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX0NMT0NLX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIENMT0NLICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX0RBVEVfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgLyoqPCBPU0FMIERBVEUgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfRklMRV9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAvKio8IE9TQUwgRklMRSAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgT1NBTCBSRUFMIFRJTUUgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9TT0NLRVRfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IFNPQ0tFVCAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIFNUUklORyAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1VSSV9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAvKio8IE9TQUwgVVJJICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgT1NBTCBNRU1PUlkgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgT1NBTCBUUkFDRSAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9UT09MX1RJTUVSX0VYUE9SVF9UWVBFICAgICAgICAvKio8IE9TQUwgVE9PTCBUSU1FUiAgICAqLwotI2RlZmluZSBNNE9TQUxfU1lTVEVNX0NNX0VYUE9SVF9UWVBFICAgICAgICAvKio8IFNZU1RFTSBDT01NT04gQVBJICAgICovCi0jZGVmaW5lIE00T1NBTF9MSU5LRURfTElTVF9FWFBPUlRfVFlQRSAgICAgICAgLyoqPCBUT09MIExJTktFRCBMSVNUICAgICovCi0jZGVmaW5lIE00T1NBTF9NRU1PUllfTUFOQUdFUl9FWFBPUlRfVFlQRSAgICAvKio8IE1FTU9SWSBNQU5BR0VSICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfVFJBQ0VfTUFOQUdFUl9FWFBPUlRfVFlQRSAgICAvKio8IFRPT0wgVFJBQ0UgTUFOQUdFUiAqLwotI2RlZmluZSBNNFZQU19FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgLyoqPCBWUFMgQVBJICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRBUF9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgLyoqPCBBVURJTyBQUkVTRU5URVJTICAgICovCi0jZGVmaW5lIE00VlBfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgIC8qKjwgVklERU8gUFJFU0VOVEVSUyAgICAqLwotI2RlZmluZSBNNENCX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IENhbGwgYmFjayAgICAgICAgICAgICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qX19jcGx1c3BsdXMqLwotCi0jZW5kaWYgLypNNE9TQV9FWFBPUlRfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDb21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjJhZmI4Yy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZUNvbW1vbi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSBjb21tb24KLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdXNlZCBieSBib3RoIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAgIHdyaXRlciBhbmQgZmlsZSByZWFkZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfRklMRUNPTU1PTl9ICi0jZGVmaW5lIE00T1NBX0ZJTEVDT01NT05fSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIgotCi0KLXR5cGVkZWYgTTRPU0FfSW50MzIgTTRPU0FfRmlsZVBvc2l0aW9uOwotCi0vKiogVGhpcyBlbnVtIGRlZmluZXMgdGhlIGFwcGxpY2F0aW9uIG1vZGUgYWNjZXNzLgotICogIGllLCB0aGUgYXBwbGljYXRpb24gdXNlcyBhIGZpbGUgZGVzY3JpcHRvciB0byByZWFkIG9yIHRvIHdyaXRlICBvcgotICogIGJvdGggdG8gcmVhZCBhbmQgd3JpdGUgYXQgdGhlIHNhbWUgdGltZS4KLSAqICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBNTSBwcm9qZWN0IG9ubHkuIEl0IGVuYWJsZXMgdG8gcmVhZCBhbmQgd3JpdGUgdG8gYSBmaWxlCi0gKiAgd2l0aCBvbmUgZGVzY3JpcHRvci4KLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICBNNE9TQV9rRGVzY05vbmVBY2Nlc3MgICAgPSAweDAwLAotICAgTTRPU0Ffa0Rlc2NSZWFkQWNjZXNzICAgID0gMHgwMSwgICAgLyoqIFRoZSBEZXNjcmlwdG9yIHJlYWRzIG9ubHkgZnJvbSB0aGUgZmlsZSAqLwotICAgTTRPU0Ffa0Rlc2NXcml0ZUFjY2VzcyAgICA9IDB4MDIsICAgIC8qKiBUaGUgRGVzY3JpcHRvciB3cml0ZXMgb25seSBmcm9tIHRoZSBmaWxlKi8KLSAgIE00T1NBX2tEZXNjUldBY2Nlc3MgICAgICAgID0gMHgwMyAgICAvKiogVGhlIERlc2NyaXB0b3IgcmVhZHMgYW5kIHdyaXRlcyBmcm9tL2luIHRoZSBmaWxlKi8KLX0gTTRPU0FfRGVzY3JNb2RlQWNjZXNzOwotCi0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgZmlsZSBtb2RlIGFjY2Vzcy4gQm90aCB0ZXh0IG1vZGUgYXMgYmluYXJ5IG1vZGUKLSAgICBjYW5ub3QgYmUgc2V0IHRvZ2V0aGVyLiovCi10eXBlZGVmIGVudW0KLXsKLSAgIC8qKiBUaGUgZmlsZSBtdXN0IGJlIGFjY2Vzc2VkIGluIHJlYWQgb25seSBtb2RlKi8KLSAgIE00T1NBX2tGaWxlUmVhZCAgICAgICAgICAgICA9IDB4MDEsCi0gICAvKiogVGhlIGZpbGUgbXVzdCBiZSBhY2Nlc3NlZCBpbiB3cml0ZSBvbmx5IG1vZGUqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZSAgICAgICAgICAgID0gMHgwMiwKLSAgIC8qKiBUaGUgZmlsZSBtdXN0IGJlIGFjY2Vzc2VkIGluIGFwcGVuZCBtb2RlIChBbiBleGlzdGluZyBmaWxlIG11c3QKLSAgICAgICBiZSBhdmFpbGFibGUgdG8gYXBwZW5kIGRhdGEpKi8KLSAgIE00T1NBX2tGaWxlQXBwZW5kICAgICAgICAgICA9IDB4MDQsCi0gICAvKiogSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCovCi0gICBNNE9TQV9rRmlsZUNyZWF0ZSAgICAgICAgICAgPSAweDA4LAotICAgLyoqIERhdGEgYXJlIHByb2Nlc3NlZCBhcyBiaW5hcnkgb25lLCB0aGVyZSBpcyBubyBkYXRhIG1hbmFnZW1lbnQqLwotICAgTTRPU0Ffa0ZpbGVJc1RleHRNb2RlICAgICAgID0gMHgxMAotfSBNNE9TQV9GaWxlTW9kZUFjY2VzczsKLQotCi0vKiogVGhpcyB0eXBlIGlzIHVzZWQgdG8gc3RvcmUgYSBkYXRlLiovCi10eXBlZGVmIHN0cnVjdAotewotICAgLyoqIFRpbWUgc2NhbGUgKHRpY2sgbnVtYmVyIHBlciBzZWNvbmQpKi8KLSAgIE00T1NBX1VJbnQzMiB0aW1lU2NhbGU7Ci0gICAvKiogRGF0ZSBleHByZXNzZWQgaW4gdGhlIHRpbWUgc2NhbGUqLwotICAgTTRPU0FfVGltZSAgIHRpbWU7Ci0gICAvKiogWWVhciBvZiB0aGUgYWJzb2x1dGUgdGltZSAoMTkwMCwgMTk3MCBvciAyMDAwKSovCi0gICBNNE9TQV9VSW50MzIgcmVmZXJlbmNlWWVhcjsKLX0gTTRPU0FfRGF0ZTsKLQotCi0vKiogVGhpcyBzdHJ1Y3VyZSBkZWZpbmVzIHRoZSBmaWxlIGF0dHJpYnV0ZXMqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIC8qKiBUaGUgZmlsZSBtb2RlIGFjY2VzcyovCi0gICBNNE9TQV9GaWxlTW9kZUFjY2VzcyAgICBtb2RlQWNjZXNzOwotICAgLyoqIFRoZSBjcmVhdGlvbiBkYXRlKi8KLSAgIE00T1NBX0RhdGUgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZTsKLSAgIC8qKiBUaGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSovCi0gICBNNE9TQV9EYXRlICAgICAgICAgICAgICBtb2RpZmllZERhdGU7Ci0gICAvKiogVGhlIGxhc3QgYWNjZXNzIGRhdGUgKHJlYWQpKi8KLSAgIE00T1NBX0RhdGUgICAgICAgICAgICAgIGxhc3RBY2Nlc3NEYXRlOwotfSBNNE9TQV9GaWxlQXR0cmlidXRlOwotCi0KLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBzZWVrIGJlaGF2aW9yKi8KLXR5cGVkZWYgZW51bSBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUKLXsKLSAgIC8qKiBSZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlKi8KLSAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyAgICAgICAgICAgID0gMHgwMSwKLSAgIC8qKiBSZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBmaWxlKi8KLSAgIE00T1NBX2tGaWxlU2Vla0VuZCAgICAgICAgICAgICAgICAgID0gMHgwMiwKLSAgIC8qKiBSZWxhdGl2ZSB0byB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uKi8KLSAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgICAgICAgICAgICAgID0gMHgwMwotfSBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGU7Ci0KLQotLyogRXJyb3IgY29kZXMgKi8KLSNkZWZpbmUgTTRFUlJfRklMRV9OT1RfRk9VTkQgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9DT01NT04sIDB4MDAwMDAxKQotI2RlZmluZSBNNEVSUl9GSUxFX0xPQ0tFRCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDIpCi0jZGVmaW5lIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfQ09NTU9OLCAweDAwMDAwMykKLSNkZWZpbmUgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9DT01NT04sIDB4MDAwMDA0KQotCi0KLSNlbmRpZiAvKk00T1NBX0ZJTEVDT01NT05fSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDb21tb25fcHJpdi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlYmE0NTYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIGNvbW1vbiBwcml2YXRlIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIHR5cGVzIHVzZWQgYnkgYm90aCB0aGUgZmlsZQotICogICAgICAgICAgICAgICB3cml0ZXIgYW5kIGZpbGUgcmVhZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9GSUxFQ09NTU9OX1BSSVZfSAotI2RlZmluZSBNNE9TQV9GSUxFQ09NTU9OX1BSSVZfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBNNE9TQV9pc0FjY2Vzc01vZGVBY3RpdmVkKGNvbXBvdW5kX21vZGVfYWNjZXNzLGVsZW1lbnRhcnlfbW9kZV9hY2Nlc3MpXAotICAgICAgICAoKChjb21wb3VuZF9tb2RlX2FjY2VzcykmKGVsZW1lbnRhcnlfbW9kZV9hY2Nlc3MpKT8gMTowKQotCi0KLXR5cGVkZWYgZW51bSBNNE9TQV9MYXN0U2VlawotewotICAgU2Vla05vbmUsCi0gICBTZWVrUmVhZCwKLSAgIFNlZWtXcml0ZQotfSBNNE9TQV9MYXN0U2VlazsKLQotLyoqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGZpbGUgY29udGV4dCovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBNNE9TQV9VSW50MzIgICAgICAgICBjb3JlSURfcmVhZDsKLSAgIE00T1NBX1VJbnQzMiAgICAgICAgIGNvcmVJRF93cml0ZTsKLSAgIEZJTEUqICAgICAgICAgICAgICAgIGZpbGVfZGVzYzsKLSAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgVVJMICovCi0gICBNNE9TQV9DaGFyKiAgICAgICAgICB1cmxfbmFtZTsKLSAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSAqLwotICAgTTRPU0FfQ2hhciogICAgICAgICAgZmlsZV9uYW1lOwotICAgLyoqIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBmaWxlICovCi0gICBNNE9TQV9GaWxlUG9zaXRpb24gICBmaWxlX3NpemU7Ci0gICAvKiogVGhlIGZpbGUgbW9kZSBhY2Nlc3MgdXNlZCB0byBvcGVuIHRoZSBmaWxlICovCi0gICBNNE9TQV9GaWxlTW9kZUFjY2VzcyBhY2Nlc3NfbW9kZTsKLSAgIE00T1NBX0xhc3RTZWVrICAgICAgIGN1cnJlbnRfc2VlazsKLSAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgIHJlYWRfcG9zaXRpb247Ci0gICBNNE9TQV9GaWxlUG9zaXRpb24gICB3cml0ZV9wb3NpdGlvbjsKLSAgIE00T1NBX0Jvb2wgICAgICAgICAgIGJfaXNfZW5kX29mX2ZpbGU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICBNNE9TQV9Db250ZXh0ICAgICAgICBzZW1hcGhvcmVfY29udGV4dDsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLQotICAgLyogVGhlc2UgdHdvIHZhcmlhYmxlcyB3ZXJlIGFkZGVkIHRvIG1hbmFnZSBjYXNlIHdoZXJlIGEgZmlsZQotICAgICogaXMgb3BlbmVkIGluIHJlYWQgYW5kIHdyaXRlIG1vZGUgd2l0aCBvbmUgZGVzY3JpcHRvciAqLwotICAgIE00T1NBX0Rlc2NyTW9kZUFjY2VzcyAgICBtX0Rlc2NyTW9kZUFjY2VzczsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3VpTG9ja01vZGU7Ci0KLQotfSBNNE9TQV9GaWxlQ29udGV4dDsKLQotCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uT3BlbihNNE9TQV9VSW50MTYgY29yZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIFVSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlTW9kZUFjY2VzcyBmaWxlTW9kZUFjY2Vzcyk7Ci0KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uQ2xvc2UoTTRPU0FfVUludDE2IGNvcmVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVBdHRyaWJ1dGUqIGF0dHJpYnV0ZSk7Ci0KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiB1cmwpOwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKE00T1NBX0NoYXIqIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIGZpbGVuYW1lKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25TZWVrKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotTTRPU0FfRVJSIE00T1NBX1RvVVRGOF9PU0FMIChNNE9TQV9Wb2lkICAgKnBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggICpwQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKmJ1ZmZlck91dFNpemUpOwotI2VuZGlmIC8qVVRGX0NPTlZFUlNJT04qLwotCi0KLSNlbmRpZiAvKk00T1NBX0ZJTEVDT01NT05fUFJJVl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlci5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjI3NTZkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlcgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB0byByZWFkIGEgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9GSUxFUkVBREVSX0gKLSNkZWZpbmUgTTRPU0FfRklMRVJFQURFUl9ICi0KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLQotCi0vKiogVGhpcyBlbnVtIGRlZmluZXMgdGhlIG9wdGlvbiBJRCB0byBiZSB1c2VkIGluIE00T1NBX0ZpbGVSZWFkR2V0T3B0aW9uKCkKLSAgICBhbmQgTTRPU0FfRmlsZVJlYWRTZXRPcHRpb24oKSovCi10eXBlZGVmIGVudW0gTTRPU0FfRmlsZVJlYWRPcHRpb25JRAotewotICAgLyoqIEdldCB0aGUgZmlsZSBzaXplIChNNE9TQV9mcG9zKikqLwotICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwMSksCi0KLSAgICAgIC8qKiBHZXQgdGhlIGZpbGUgYXR0cmlidXRlcyAoTTRPU0FfRmlsZUF0dHJpYnV0ZSopKi8KLSAgIE00T1NBX2tGaWxlUmVhZEdldEZpbGVBdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwMiksCi0KLSAgIC8qKiBHZXQgdGhlIGZpbGUgVVJMLCBwcm92aWRlZCBieSB0aGUgTTRPU0FfRmlsZVJlYWRPcGVuIChNNE9TQV9DaGFyKikqLwotICAgTTRPU0Ffa0ZpbGVSZWFkR2V0VVJMCi0gICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDMpLAotCi0gICAvKiogR2V0IHRoZSBmaWxlIHBvc2l0aW9uIChNNE9TQV9mcG9zKikqLwotICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDQpLAotCi0gICAvKiogQ2hlY2sgZW5kIG9mIGZpbGU6IFRSVUUgaWYgdGhlIEVPRiBoYXMgYmVlbiByZWFjaGVkLCBGQUxTRSBlbHNlCi0gICAgICAgKE00T1NBX0Jvb2wqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRJc0VPRgotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDA1KSwKLQotICAgLyoqIENoZWNrIGxvY2sgb2YgZmlsZSAqLwotICAgTTRPU0Ffa0ZpbGVSZWFkTG9ja01vZGUKLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEV1JJVEUsIE00T1NBX0ZJTEVfUkVBREVSLCAweDA2KQotCi19IE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQ7Ci0KLQotCi0KLQotLyoqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgc2V0IG9mIHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIGFjY2VzcyB0byBhCi0gICAgZmlsZSBpbiByZWFkIG1vZGUqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIE00T1NBX0VSUiAoKm9wZW5SZWFkKSAgIChNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgIE00T1NBX0VSUiAoKnJlYWREYXRhKSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogc2l6ZSk7Ci0KLSAgIE00T1NBX0VSUiAoKnNlZWspICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24pOwotCi0gICBNNE9TQV9FUlIgKCpjbG9zZVJlYWQpICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotICAgTTRPU0FfRVJSICgqc2V0T3B0aW9uKSAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9FUlIgKCpnZXRPcHRpb24pICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqb3B0aW9uVmFsdWUpOwotfSBNNE9TQV9GaWxlUmVhZFBvaW50ZXI7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW4gICAgICAgIChNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2Vzcyk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGEgICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogc2l6ZSk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNlZWsgICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24pOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRDbG9zZSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKm9wdGlvblZhbHVlKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgICAvKk00T1NBX0ZJTEVSRUFERVJfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVSZWFkZXJfcHJpdi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlcl9wcml2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyN2IwODYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlcl9wcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyX3ByaXYuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgcmVhZGVyIHByaXZhdGUgZm9yIEFuZHJvaWQKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0ZJTEVSRUFERVJfUFJJVl9ICi0jZGVmaW5lIE00T1NBX0ZJTEVSRUFERVJfUFJJVl9ICi0KLQotLyoqIFRob3NlIGRlZmluZSBlbmFibGUvZGlzYWJsZSBvcHRpb24gSUQqLwotCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9TSVpFICAgICAgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfQVRUUklCVVRFICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9VUkwgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9QT1NJVElPTiAgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfSVNfRU9GICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUUKLQotI2VuZGlmIC8qTTRPU0FfRklMRVJFQURFUl9QUklWX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhMTEzMzEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXIuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgd3JpdGVyCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIHR5cGVzIHRvIHdyaXRlIGluIGEgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9GSUxFV1JJVEVSX0gKLSNkZWZpbmUgTTRPU0FfRklMRVdSSVRFUl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgb3B0aW9uIElEIHRvIGJlIHVzZWQgaW4gTTRPU0FfRmlsZVdyaXRlR2V0T3B0aW9uKCkKLWFuZCBNNE9TQV9GaWxlV3JpdGVTZXRPcHRpb24oKSovCi10eXBlZGVmIGVudW0KLXsKLSAgIC8qKiBHZXQgdGhlIGZpbGUgVVJMLCBwcm92aWRlZCBieSB0aGUgTTRPU0FfRmlsZVdyaXRlT3BlbiAoTTRPU0FfQ2hhciopKi8KLSAgIE00T1NBX2tGaWxlV3JpdGVHZXRVUkwKLSAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwMSksCi0KLSAgIC8qKiBHZXQgdGhlIGZpbGUgYXR0cmlidXRlcyAoTTRPU0FfRmlsZUF0dHJpYnV0ZSopKi8KLSAgIE00T1NBX2tGaWxlV3JpdGVHZXRBdHRyaWJ1dGUKLSAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwMiksCi0KLSAgIC8qKiBHZXQgdGhlIHJlYWRlciBjb250ZXh0IGZvciByZWFkICYgd3JpdGUgZmlsZS4gKE00T1NBX0NvbnRleHQqKSovCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0UmVhZGVyQ29udGV4dAotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAzKSwKLQotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldEZpbGVQb3NpdGlvbgotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDA0KSwKLQotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldEZpbGVTaXplCi0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDUpLAotCi0KLSAgICBNNE9TQV9rRmlsZVdyaXRlTG9ja01vZGUKLSAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEV1JJVEUsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDA2KSwKLQotCi0gICAvKiogQ2hlY2sgbG9jayBvZiBmaWxlICovCi0gICBNNE9TQV9rRmlsZVdyaXRlRGVzY01vZGUKLSAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRFdSSVRFLCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwNykKLX0gTTRPU0FfRmlsZVdyaXRlT3B0aW9uSUQ7Ci0KLQotLyoqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgc2V0IG9mIHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIGFjY2VzcyB0byBhIGZpbGUKLSAgICBpbiByZWFkIG1vZGUqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIE00T1NBX0VSUiAoKm9wZW5Xcml0ZSkgICAoTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgIE00T1NBX0VSUiAoKndyaXRlRGF0YSkgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSk7Ci0KLSAgIE00T1NBX0VSUiAoKnNlZWspICAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24pOwotCi0gICBNNE9TQV9FUlIgKCpGbHVzaCkgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0gICBNNE9TQV9FUlIgKCpjbG9zZVdyaXRlKSAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0gICBNNE9TQV9FUlIgKCpzZXRPcHRpb24pICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9FUlIgKCpnZXRPcHRpb24pICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKTsKLX0gTTRPU0FfRmlsZVdyaXRlclBvaW50ZXI7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVPcGVuICAgICAgIChNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2Vzcyk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVEYXRhICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSk7Ci0KLS8qIFBpZXJyZSBMZWJlYXVwaW4gMjAwOC8wNC8yOTogV0FSTklORyEgdGhlIGZlYXR1cmUgb2YgZmlsZSpTZWVrIHdoaWNoIHJldHVybnMKLXRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSAoZnJvbSB0aGUgYmVnaW5uaW5nKSBhZnRlciB0aGUgc2VlayBpbiB0aGUgInBvc2l0aW9uIgotcG9pbnRlciBoYXMgYmVlbiBmb3VuZCB0byBiZSB1bnJlbGlhYmx5IChvciBzb21ldGltZXMgbm90IGF0IGFsbCkgaW1wbGVtZW50ZWQKLWluIHNvbWUgT1NBTHMsIHNvIHJlbHlpbmcgb24gaXQgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQsIHVubGVzcyB5b3UgcmVhbGx5IHdhbnQKLXRvIGhhdmUgYSBwaXp6YSBldmVuaW5nLiAqLwotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNlZWsgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVDbG9zZSAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlRmx1c2ggICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBvcHRpb25WYWx1ZSk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24gIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qTTRPU0FfRklMRVdSSVRFUl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlcl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ5NzJmNC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyX3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJfcHJpdi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSB3cml0ZXIgcHJpdmF0ZSBmb3IgQW5kcm9pZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0ZJTEVXUklURVJfUFJJVl9ICi0jZGVmaW5lIE00T1NBX0ZJTEVXUklURVJfUFJJVl9ICi0KLQotLyoqIFRob3NlIGRlZmluZSBlbmFibGUvZGlzYWJsZSBvcHRpb24gSUQqLwotCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfU0laRSAgICAgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX0FUVFJJQlVURSAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfUkVBREVSX0NPTlRFWFQgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfUE9TSVRJT04gICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9VUkwgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUUKLQotI2VuZGlmIC8qTTRPU0FfRklMRVdSSVRFUl9QUklWX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NZW1vcnkuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX01lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNGQxNWNjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX01lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfTWVtb3J5LmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBmdW5jdGlvbiBwcm90b3R5cGVzIHRvIGFsbG9jYXRlCi0gKiAgICAgICAgICAgICAgIGFuZCBmcmVlIG1lbW9yeS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfTUVNT1JZX0gKLSNkZWZpbmUgTTRPU0FfTUVNT1JZX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIiAvKmZvciBNNE9TQV9Db3JlSUQgZGVmaW5pdGlvbiovCi0KLXR5cGVkZWYgTTRPU0FfSW50MzIqIE00T1NBX01lbUFkZHIzMjsKLXR5cGVkZWYgTTRPU0FfSW50OCogIE00T1NBX01lbUFkZHI4OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9NZW1BZGRyMzIgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIChNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmcpOwotCi1NNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9FUlIgTTRPU0FfcmFuZEluaXQodm9pZCk7Ci0KLQotTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfRVJSIE00T1NBX3JhbmQoTTRPU0FfSW50MzIqIG91dF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBtYXhfdmFsdWUpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NdXRleC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTXV0ZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDQ5NmJkZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NdXRleC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfTXV0ZXguaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIG11dGV4IEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX01VVEVYX0gKLSNkZWZpbmUgTTRPU0FfTVVURVhfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotCi0jZW5kaWYKLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9tdXRleE9wZW4oICAgIE00T1NBX0NvbnRleHQqIGNvbnRleHQgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX211dGV4TG9jayggICAgTTRPU0FfQ29udGV4dCAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgIHRpbWVvdXQgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX211dGV4VW5sb2NrKCAgTTRPU0FfQ29udGV4dCAgY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhDbG9zZSggICBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qTTRPU0FfTVVURVhfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX09wdGlvbklELmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9PcHRpb25JRC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MWI5MDQ0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX09wdGlvbklELmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9PcHRpb25JRC5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgT3B0aW9uIElEIG1hY3JvcwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBtYWNyb3MgdG8gZ2VuZXJhdGUgYW5kIGFuYWx5emUgb3B0aW9uIElELgotICogICAgICAgICAgICAgICBPcHRpb24gSUQgaXMgdXNlZCBieSBNNFlZWV9aWnNldE9wdGlvbigpIGFuZAotICogICAgICAgICAgICAgICBNNFlZWV9aWmdldE9wdGlvbigpIGZ1bmN0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfT1BUSU9OSURfSAotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9ICi0KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLS8qKiBNNE9TQV9PcHRpb25JRCBpcyBhIDMyIGJpdHMgdW5zaWduZWQgaW50ZWdlci4KLS0gUmlnaHQgYWNjZXNzICgyIGJpdHMpOiBTb21lIG9wdGlvbnMgbWF5IGhhdmUgcmVhZCBvbmx5LCB3cml0ZSBvbmx5IG9yIHJlYWQKLSAgYW5kIHdyaXRlIGFjY2VzcwotLSBDb3JlIElEICgxNCBiaXRzKTogSXQgaXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggY29yZSBjb21wb25lbnQKLS0gU3ViT3B0aW9uIElEICgxNiBiaXRzKTogVG8gc2VsZWN0IHdoaWNoIG9wdGlvbiBpbiBhIHNwZWNpZmljIGNvcmUgY29tcG9uZW50Ci0qLwotdHlwZWRlZiBNNE9TQV9VSW50MzIgTTRPU0FfT3B0aW9uSUQ7Ci10eXBlZGVmIHZvaWQqICAgICAgICBNNE9TQV9EYXRhT3B0aW9uOwotCi0jZGVmaW5lIE00X1JFQUQgICAgICAweDAxCi0jZGVmaW5lIE00X1dSSVRFICAgICAweDAyCi0jZGVmaW5lIE00X1JFQURXUklURSAweDAzCi0KLS8qIE1hY3JvIHRvIHByb2Nlc3MgTTRPU0FfT3B0aW9uSUQgKi8KLQotLyoqIFRoaXMgbWFjcm8gY3JlYXRlcyBhbiBvcHRpb25JRCBnaXZlbiByZWFkL3dyaXRlIGFjY2VzcywKLSAgICBjb3JlSUQgYW5kIFN1Yk9wdGlvbklEKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShyaWdodCwgY29yZUlELCBlcnJvcklEKVwKLSAgIChNNE9TQV9JbnQzMikoKCgoKChNNE9TQV9VSW50MzIpcmlnaHQpJjB4MDMpPDwzMCkpKygoKChNNE9TQV9VSW50MzIpY29yZUlEKSYweDAwM0ZGRik8PDE2KSsoKChNNE9TQV9VSW50MzIpZXJyb3JJRCkmMHgwMEZGRkYpKQotCi0vKiogVGhpcyBtYWNybyBzcGxpdHMgYW4gb3B0aW9uSUQgaW50byByZWFkL3dyaXRlIGFjY2VzcywKLSAgICBjb3JlSUQgYW5kIFN1Yk9wdGlvbklEKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX1NQTElUKG9wdGlvbklELCByaWdodCwgY29yZUlELCBlcnJvcklEKVwKLSAgIHsgcmlnaHQ9KE00T1NBX1VJbnQ4KSgob3B0aW9uSUQpPj4zMCk7XAotICAgICBjb3JlSUQ9KE00T1NBX1VJbnQxNikoKChvcHRpb25JRCk+PjE2KSYweDAwMDAzRkZGKTtcCi0gICAgIGVycm9ySUQ9KE00T1NBX1VJbnQzMikoKG9wdGlvbklEKSYweDAwMDBGRkZGKTsgfQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIDEgaWYgdGhlIG9wdGlvbklEIGlzIHdyaXRhYmxlLCAwIG90aGVyd2lzZSovCi0jZGVmaW5lIE00T1NBX09QVElPTl9JRF9JU19XUklUQUJMRShvcHRpb25JRCkgKCgoKG9wdGlvbklEKT4+MzApJk00X1dSSVRFKSE9MCkKLQotLyoqIFRoaXMgbWFjcm8gcmV0dXJucyAxIGlmIHRoZSBvcHRpb25JRCBpcyByZWFkYWJsZSwgMCBvdGhlcndpc2UqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpICgoKChvcHRpb25JRCk+PjMwKSZNNF9SRUFEKSE9MCkKLQotLyoqIFRoaXMgbWFjcm8gcmV0dXJucyAxIGlmIHRoZSBvcHRpb25JRCBoYXMgaXRzIGNvcmUgSUQgZXF1YWwgdG8gJ2NvcmVJRCcsIDAgb3RoZXJ3aXNlKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgY29yZUlEKVwKLSAgICgoKCgob3B0aW9uSUQpPj4xNikmMHgwMDNGRkYpID09IChjb3JlSUQpKSA/IE00T1NBX1RSVUU6TTRPU0FfRkFMU0UpCi0KLQotI2VuZGlmICAgLypNNE9TQV9PUFRJT05JRF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU2VtYXBob3JlLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TZW1hcGhvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjYzMDQ1NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TZW1hcGhvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1NlbWFwaG9yZS5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgc2VtYXBob3JlIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9TRU1BUEhPUkVfSAotI2RlZmluZSBNNE9TQV9TRU1BUEhPUkVfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZU9wZW4oICBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgICBpbml0aWFsTnVtYmVyICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVQb3N0KCAgTTRPU0FfQ29udGV4dCAgY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlV2FpdCggIE00T1NBX0NvbnRleHQgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICAgIHRpbWVvdXQgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZUNsb3NlKCBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qTTRPU0FfU0VNQVBIT1JFX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWQuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTk2YWZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1RocmVhZC5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgdGhyZWFkIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX1RIUkVBRF9ICi0jZGVmaW5lIE00T1NBX1RIUkVBRF9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKLQotCi0vKiBEZWZpbml0aW9uIG9mIGNvbW1vbiBlcnJvciBjb2RlcyAqLwotI2RlZmluZSBNNEVSUl9USFJFQURfTk9UX1NUQVJURUQgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRPU0FfVEhSRUFELDB4MDAwMDAxKQotCi0KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0Ffa1RocmVhZE9wZW5lZCAgID0gMHgxMDAsCi0gICBNNE9TQV9rVGhyZWFkU3RhcnRpbmcgPSAweDIwMCwKLSAgIE00T1NBX2tUaHJlYWRSdW5uaW5nICA9IDB4MzAwLAotICAgTTRPU0Ffa1RocmVhZFN0b3BwaW5nID0gMHg0MDAsCi0gICBNNE9TQV9rVGhyZWFkQ2xvc2VkICA9IDB4NTAwCi19IE00T1NBX1RocmVhZFN0YXRlOwotCi0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICBNNE9TQV9rVGhyZWFkSGlnaGVzdFByaW9yaXR5ICA9ICAweDAwMCwKLSAgIE00T1NBX2tUaHJlYWRIaWdoUHJpb3JpdHkgICAgID0gIDB4MTAwLAotICAgTTRPU0Ffa1RocmVhZE5vcm1hbFByaW9yaXR5ICAgPSAgMHgyMDAsCi0gICBNNE9TQV9rVGhyZWFkTG93UHJpb3JpdHkgICAgICA9ICAweDMwMCwKLSAgIE00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eSAgID0gIDB4NDAwCi19IE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWw7Ci0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX1RocmVhZFN0YXJ0ZWQKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDEpLAotCi0gICBNNE9TQV9UaHJlYWRTdG9wcGVkCi0gICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDAyKSwKLQotICAgTTRPU0FfVGhyZWFkUHJpb3JpdHkKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDMpLAotCi0gICBNNE9TQV9UaHJlYWROYW1lCi0gICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDA0KSwKLQotICAgTTRPU0FfVGhyZWFkU3RhY2tTaXplCi0gICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDA1KSwKLQotICAgTTRPU0FfVGhyZWFkVXNlckRhdGEKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDYpCi0KLX0gTTRPU0FfVGhyZWFkT3B0aW9uSUQ7Ci0KLQotCi10eXBlZGVmIE00T1NBX0VSUiAgKCpNNE9TQV9UaHJlYWREb0l0KShNNE9TQV9Wb2lkKik7Ci10eXBlZGVmIE00T1NBX1ZvaWQgKCpNNE9TQV9UaHJlYWRDYWxsQmFjaykoTTRPU0FfQ29udGV4dCwgTTRPU0FfVm9pZCopOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNPcGVuKCAgICAgTTRPU0FfQ29udGV4dCogICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWREb0l0ICAgICAgZnVuYyApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0YXJ0KCAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqICAgICAgICAgICBwYXJhbSApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0b3AoICAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0Nsb3NlKCAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlKCBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZFN0YXRlKiAgICBzdGF0ZSApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU2xlZXAoICAgICAgICBNNE9TQV9VSW50MzIgICAgICAgICAgdGltZSApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbihNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICAgICAgdmFsdWUgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24oTTRPU0FfQ29udGV4dCAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRPcHRpb25JRCAgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogICAgIHZhbHVlICk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qTTRPU0FfVEhSRUFEX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWRfcHJpdi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjQyNGIwNS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWRfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVGhyZWFkX3ByaXYuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIFRocmVhZCBwcml2YXRlIGZvciBBbmRyb2lkCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9USFJFQURfUFJJVl9ICi0jZGVmaW5lIE00T1NBX1RIUkVBRF9QUklWX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotCi0vKiBDb250ZXh0IGZvciB0aGUgdGhyZWFkICovCi10eXBlZGVmIHN0cnVjdCBNNE9TQV9UaHJlYWRDb250ZXh0IHsKLSAgIE00T1NBX1VJbnQzMiBjb3JlSUQ7ICAgICAgICAgICAgICAgIC8qIHRocmVhZCBjb250ZXh0IGlkZW50aWZpYW50ICovCi0gICBwdGhyZWFkX3QgdGhyZWFkSUQ7ICAgICAgICAgICAgICAgICAvKiB0aHJlYWQgaWRlbnRpZmllci4gKi8KLSAgIE00T1NBX0NoYXIqIG5hbWU7ICAgICAgICAgICAgICAgICAgIC8qIHRocmVhZCBuYW1lICovCi0gICBNNE9TQV9VSW50MzIgc3RhY2tTaXplOyAgICAgICAgICAgICAvKiB0aHJlYWQgc3RhY2tTaXplIGluIGJ5dGVzICovCi0gICBNNE9TQV9UaHJlYWREb0l0IGZ1bmM7ICAgICAgICAgICAgICAvKiB0aHJlYWQgZnVuY3Rpb24gKi8KLSAgIE00T1NBX1ZvaWQqIHBhcmFtOyAgICAgICAgICAgICAgICAgIC8qIHRocmVhZCBwYXJhbWV0ZXIgKi8KLS8qCi0gICBNNE9TQV9Wb2lkKiB1c2VyRGF0YTsgICAgICAgICAgICAgICAvICogdGhyZWFkIHVzZXIgZGF0YSAqIC8KLSovCi0gICBNNE9TQV9UaHJlYWRTdGF0ZSBzdGF0ZTsgICAgICAgICAgICAvKiB0aHJlYWQgYXV0b21hdG9uIHN0YXRlICovCi0gICBNNE9TQV9Db250ZXh0IHN0YXRlTXV0ZXg7ICAgICAgICAgICAvKiBtdXRleCBmb3IgdGhyZWFkIHN0YXRlIG1hbmFnZW1lbnQgKi8KLS8qCi0gICBNNE9TQV9UaHJlYWRDYWxsQmFjayBzdGFydENhbGxCYWNrOyAvICogc3RhcnRpbmcgdGhyZWFkIGNhbGwgYmFjayAqIC8KLSAgIE00T1NBX1RocmVhZENhbGxCYWNrIHN0b3BDYWxsQmFjazsgIC8gKiBzdG9wcGluZyB0aHJlYWQgY2FsbCBiYWNrICogLwotKi8KLSAgIE00T1NBX0NvbnRleHQgc2VtU3RhcnRTdG9wOyAgICAgICAgIC8qIHNlbWFwaG9yZSBmb3Igc3RhcnQgYW5kIHN0b3AgZG9faXQgKi8KLSAgIE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWwgcHJpb3JpdHk7IC8qIHRocmVhZCBwcmlvcml0eSBsZXZlbCAqLwotfSBNNE9TQV9UaHJlYWRDb250ZXh0IDsKLQotCi0vKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFSVEVEICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9TVE9QUEVEICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9VU0VSX0RBVEEgICAgICAgICBNNE9TQV9UUlVFCi0KLSNlbmRpZiAvKk00T1NBX1RIUkVBRF9QUklWX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaW1lLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxZjI1ZWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVGltZS5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgVGltZSBtYWNyb3MKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGltZSB0eXBlIGFuZCBhc3NvY2lhdGVkIG1hY3JvcyB3aGljaCBtdXN0Ci0gKiAgICAgICAgICAgICAgIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aW1lLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogJElkOiBNNE9TQV9UaW1lLmgsdiAxLjIgMjAwNy8wMS8wNSAxMzoxMjoyMiB0aGVuYXVsdCBFeHAgJCAqLwotCi0jaWZuZGVmIE00T1NBX1RJTUVfSAotI2RlZmluZSBNNE9TQV9USU1FX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotCi10eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgIE00T1NBX1RpbWU7Ci0KLQotLyoqIFRoaXMgbWFjcm8gc2V0cyB0aGUgdW5rbm93biB0aW1lIHZhbHVlICovCi0KLSNkZWZpbmUgTTRPU0FfVElNRV9VTktOT1dOIDB4ODAwMDAwMDAKLQotLyoqIFRoaXMgbWFjcm8gY29udmVydHMgYSB0aW1lIHdpdGggYSB0aW1lIHNjYWxlIHRvIG1pbGxpc2Vjb25kLgotICAgIFRoZSByZXN1bHQgaXMgYSBNNE9TQV9Eb3VibGUqLwotI2RlZmluZSBNNE9TQV9USU1FX1RPX01TKHJlc3VsdCwgdGltZSwgdGltZXNjYWxlKVwKLSAgICAgIHsgcmVzdWx0ID0gKDEwMDAqKE00T1NBX0RvdWJsZSl0aW1lKS8oKE00T1NBX0RvdWJsZSl0aW1lc2NhbGUpOyB9Ci0KLSNlbmRpZiAvKk00T1NBX1RJTUVfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTI1OGEwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVHlwZXMuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEFic3RyYWN0aW9uIHR5cGVzIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSByZWRlZmluZXMgYmFzaWMgdHlwZXMgd2hpY2ggbXVzdCBiZQotICogICAgICAgICAgICAgICB1c2VkIHRvIGRlY2xhcmUgYW55IHZhcmlhYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfVFlQRVNfSAotI2RlZmluZSBNNE9TQV9UWVBFU19ICi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiTTRPU0FfRXhwb3J0LmgiCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotdHlwZWRlZiBpbnQ4X3QgICAgIE00T1NBX0Jvb2w7Ci10eXBlZGVmIHVpbnQ4X3QgICAgTTRPU0FfVUludDg7Ci10eXBlZGVmIGludDhfdCAgICAgTTRPU0FfSW50ODsKLXR5cGVkZWYgdWludDE2X3QgICBNNE9TQV9VSW50MTY7Ci10eXBlZGVmIGludDE2X3QgICAgTTRPU0FfSW50MTY7Ci10eXBlZGVmIHVpbnQzMl90ICAgTTRPU0FfVUludDMyOwotdHlwZWRlZiBpbnQzMl90ICAgIE00T1NBX0ludDMyOwotCi10eXBlZGVmIHNpZ25lZCBjaGFyICAgICBNNE9TQV9DaGFyOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgTTRPU0FfVUNoYXI7Ci0KLXR5cGVkZWYgZG91YmxlICAgICAgICAgIE00T1NBX0RvdWJsZTsKLXR5cGVkZWYgZmxvYXQgICAgICAgICAgIE00T1NBX0Zsb2F0OwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBNNE9TQV9XQ2hhcjsKLQotdHlwZWRlZiB2b2lkICAgICAgICAgICAgTTRPU0FfVm9pZDsKLQotLyogTWluICYgbWF4IGRlZmluaXRpb25zKi8KLSNkZWZpbmUgTTRPU0FfVUlOVDhfTUlOICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNNE9TQV9VSU5UOF9NQVggICAgICAgICAgICAgICAgMjU1Ci0KLSNkZWZpbmUgTTRPU0FfVUlOVDE2X01JTiAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNNE9TQV9VSU5UMTZfTUFYICAgICAgICAgICAgIDY1NTM1Ci0KLSNkZWZpbmUgTTRPU0FfVUlOVDMyX01JTiAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNNE9TQV9VSU5UMzJfTUFYICAgICAgICAweEZGRkZGRkZGCi0KLSNkZWZpbmUgTTRPU0FfSU5UOF9NSU4gICAgICAgICAgICAgICAgLTEyOAotI2RlZmluZSBNNE9TQV9JTlQ4X01BWCAgICAgICAgICAgICAgICAgMTI3Ci0KLSNkZWZpbmUgTTRPU0FfSU5UMTZfTUlOICAgICAgICAgICAgIC0zMjc2OAotI2RlZmluZSBNNE9TQV9JTlQxNl9NQVggICAgICAgICAgICAgIDMyNzY3Ci0KLSNkZWZpbmUgTTRPU0FfSU5UMzJfTUlOICAgICAgICgtMHg3RkZGRkZGRi0xKQotI2RlZmluZSBNNE9TQV9JTlQzMl9NQVggICAgICAgICAweDdGRkZGRkZGCi0KLSNkZWZpbmUgTTRPU0FfQ0hBUl9NSU4gICAgICAgICAgICAgICAgLTEyOAotI2RlZmluZSBNNE9TQV9DSEFSX01BWCAgICAgICAgICAgICAgICAgMTI3Ci0KLSNkZWZpbmUgTTRPU0FfVUNIQVJfTUlOICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNNE9TQV9VQ0hBUl9NQVggICAgICAgICAgICAgICAgMjU1Ci0KLSNkZWZpbmUgTTRPU0FfTlVMTCAgICAgICAgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgTTRPU0FfVFJVRSAgICAgICAgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgTTRPU0FfRkFMU0UgICAgICAgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgTTRPU0FfV0FJVF9GT1JFVkVSICAgICAgIDB4ZmZmZmZmZmYKLQotI2RlZmluZSBNNE9TQV9DT05TVCAgICAgICAgICAgICAgICAgICBjb25zdAotI2RlZmluZSBNNE9TQV9JTkxJTkUgICAgICAgICAgICAgICAgIGlubGluZQotCi0vKiBSb2xsb3ZlciBvZmZzZXQgb2YgdGhlIGNsb2NrICovCi0vKiBUaGlzIHZhbHVlIG11c3QgYmUgdGhlIG9uZSBvZiBNNE9TQV9jbG9ja0dldFRpbWUgKi8KLSNkZWZpbmUgTTRPU0FfQ0xPQ0tfUk9MTE9WRVIgICAgICAgICAgIE00T1NBX0lOVDMyX01BWAotCi10eXBlZGVmIHZvaWQqICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQ7Ci0KLS8qKiBJdCBpcyBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBjb3JlIGNvbXBvbmVudCovCi10eXBlZGVmICBNNE9TQV9VSW50MTYgTTRPU0FfQ29yZUlEOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLypNNE9TQV9UWVBFU19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmMzhiMGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYnZpZGVvZWRpdG9yX29zYWwKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX29zYWwKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgIE00T1NBX0NoYXJTdGFyLmMgXAotICAgIE00T1NBX0Nsb2NrLmMgXAotICAgIE00T1NBX0ZpbGVDb21tb24uYyBcCi0gICAgTTRPU0FfRmlsZVJlYWRlci5jIFwKLSAgICBNNE9TQV9GaWxlV3JpdGVyLmMgXAotICAgIE00T1NBX011dGV4LmMgXAotICAgIE00T1NBX1JhbmRvbS5jIFwKLSAgICBNNE9TQV9TZW1hcGhvcmUuYyBcCi0gICAgTTRPU0FfVGhyZWFkLmMgXAotICAgIE00UFNXX0RlYnVnVHJhY2UuYyBcCi0gICAgTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMgXAotICAgIE00UFNXX1RyYWNlLmMgXAotICAgIExWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJsb2cKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0KLSMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4KLUxPQ0FMX0xETElCUyA6PSBcCi0gICAgLWxwdGhyZWFkIC1sZGwKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIFwKLSAgICAtRF9fQU5EUk9JRF9fIFwKLSAgICAtRE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0NPREVDUyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9ERUMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPREVDIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9BVURJT0VOQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfVklERU9FTkMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1JFQURFUlMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUXzNHUFBfUkVBREVSCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTExZTAwOC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9vcHRpbS5jCi0gKiBAYnJpZWYKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgZmlsZXN5c3RlbSBhY2Nlc3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKiBBZGRpdGlvbiBvZiBUcmFjZSBJRCAqKi8KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0jaWZkZWYgTTRUUkFDRV9JRAotI3VuZGVmIE00VFJBQ0VfSUQKLSNlbmRpZgotI2RlZmluZSBNNFRSQUNFX0lEICAgIE00T1NBX0ZJTEVfUkVBREVSCi0KLQotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpbmNsdWRlICJMVk9TQV9GaWxlUmVhZGVyX29wdGltLmgiCi0KLSNkZWZpbmUgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0jaWZuZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgICNpbmNsdWRlICJNNE9TQV9GaWxlQWNjZXNzLmgiCi0jZW5kaWYKLQotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTCkgcmV0dXJuIChyZXR2YWwpOwotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpbGUgcmVhZGVyIGNhY2hlIGJ1ZmZlcnMgcGFyYW1ldGVycyAoc2l6ZSwgbnVtYmVyIG9mIGJ1ZmZlcnMsIGV0YykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00T1NBX1JFQURCVUZGRVJfU0laRSAgICAxMDI0KjE2Ci0jZGVmaW5lIE00T1NBX1JFQURCVUZGRVJfTkIgICAgICAgIDIKLSNkZWZpbmUgTTRPU0FfUkVBREJVRkZFUl9OT05FICAgIC0xCi0jZGVmaW5lIE00T1NBX0VPRiAgICAgICAgICAgICAgIC0xCi0KLSNkZWZpbmUgTUFYX0ZJTExTX1NJTkNFX0xBU1RfQUNDRVNTICAgIE00T1NBX1JFQURCVUZGRVJfTkIqMgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlcgotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIEZpbGUgcmVhZGVyIEJ1ZmZlcnMgY29udGV4dCAocHJpdmF0ZSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgICAgZGF0YTsgICAgICAgIC8qKjwgYnVmZmVyIGRhdGEgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIHNpemU7ICAgICAgICAvKio8IHNpemUgb2YgdGhlIGJ1ZmZlciAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgZmlsZXBvczsgICAgLyoqPCBwb3NpdGlvbiBpbiB0aGUgZmlsZSB3aGVyZSB0aGUgYnVmZmVyIHN0YXJ0cyAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgcmVtYWluOyAgICAgICAgLyoqPCBkYXRhIGFtb3VudCBub3QgYWxyZWFkeSBjb3BpZWQgZnJvbSBidWZmZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG5iRmlsbFNpbmNlTGFzdEFjZXNzOyAgICAvKio8IFRvIGtub3cgc2luY2UgaG93IG1hbnkgdGltZSB3ZSBkaWRuJ3QgdXNlIHRoaXMgYnVmZmVyICovCi19IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyX29wdGltOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBGaWxlIHJlYWRlciBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBGaWxlIFJlYWRlciBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgSXNPcGVuZWQ7ICAgICAgIC8qKjwgTWljcm8gc3RhdGUgbWFjaGluZSAqLwotICAgIE00T1NBX0ZpbGVBdHRyaWJ1dGUgICAgIEZpbGVBdHRyaWJ1dGU7ICAvKio8IE9wZW5pbmcgbW9kZSAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgICAgIHJlYWRGaWxlUG9zOyAgICAvKio8IEVmZmVjdGl2ZSBwb3NpdGlvbiBvZiB0aGUgR0ZMIHJlYWQgcG9pbnRlciAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgICAgIGFic29sdXRlUG9zOyAgICAvKio8IFZpcnR1YWwgcG9zaXRpb24gZm9yIG5leHQgcmVhZGluZyAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgICAgIGZpbGVTaXplOyAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBmaWxlICovCi0KLSAgICBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlcl9vcHRpbSBidWZmZXJbTTRPU0FfUkVBREJVRkZFUl9OQl07ICAvKio8IFJlYWQgYnVmZmVycyAqLwotCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgYUZpbGVEZXNjOyAgLyoqPCBGaWxlIGRlc2NyaXB0b3IgKi8KLQotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgIEZTOyAgICAgICAgICAgIC8qKjwgRmlsZXN5c3RlbSBpbnRlcmZhY2UgKi8KLSNlbHNlCi0gICAgTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHIgKkZTOyAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGludGVyZmFjZSAqLwotI2VuZGlmCi0KLX0gTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltOwotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgICAgR2xvYmFsIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBsb3cgbGV2ZWwgcmVhZCBhY2Nlc3MgICAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLXN0YXRpYyBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIGd2X05YUFNXX1JFQURPUFRfbG93TGV2ZWxGdW5jdGlvbnM7Ci0KLU00T1NBX0VSUiBOWFBTV19GaWxlUmVhZGVyT3B0aW1faW5pdChNNE9TQV9Wb2lkICpsb3dMZXZlbF9mdW5jdGlvblBvaW50ZXJzLCBNNE9TQV9Wb2lkICpvcHRpbWl6ZWRfZnVuY3Rpb25Qb2ludGVycykKLXsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIGxvd0xldmVsX2ZwICA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKSBsb3dMZXZlbF9mdW5jdGlvblBvaW50ZXJzOwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogb3B0aW1pemVkX2ZwID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIG9wdGltaXplZF9mdW5jdGlvblBvaW50ZXJzOwotCi0gICAgLy9TZXQgdGhlIG9wdGltaXplZCBmdW5jdGlvbnMsIHRvIGJlIGNhbGxlZCBieSB0aGUgdXNlcgotICAgIG9wdGltaXplZF9mcC0+b3BlblJlYWQgID0gTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltOwotICAgIG9wdGltaXplZF9mcC0+cmVhZERhdGEgID0gTTRPU0FfZmlsZVJlYWREYXRhX29wdGltOwotICAgIG9wdGltaXplZF9mcC0+c2VlayAgICAgID0gTTRPU0FfZmlsZVJlYWRTZWVrX29wdGltOwotICAgIG9wdGltaXplZF9mcC0+Y2xvc2VSZWFkID0gTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPnNldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uX29wdGltOwotICAgIG9wdGltaXplZF9mcC0+Z2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRHZXRPcHRpb25fb3B0aW07Ci0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTlhQU1dfRmlsZVJlYWRlck9wdGltX2NsZWFuVXAoKQotewotCi0gICAgZ3ZfTlhQU1dfUkVBRE9QVF9sb3dMZXZlbEZ1bmN0aW9ucyA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTlhQU1dfRmlsZVJlYWRlck9wdGltX2dldExvd0xldmVsRnVuY3Rpb25zKE00T1NBX1ZvaWQgKipGUykKLXsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKiBwRnVuY3Rpb25zUG9pbnRlciA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKikgRlM7Ci0gICAgKnBGdW5jdGlvbnNQb2ludGVyID0gZ3ZfTlhQU1dfUkVBRE9QVF9sb3dMZXZlbEZ1bmN0aW9uczsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgICAgICAgIEJ1ZmZlciBoYW5kbGluZyBmdW5jdGlvbnMgZm9yIFJlYWQgYWNjZXNzICAgICAgICAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckluaXQoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSAwOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zID0gMDsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gMDsKLSAgICB9Ci0KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgPSAoTTRPU0FfTWVtQWRkcjgpIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE9TQV9SRUFEQlVGRkVSX1NJWkUsIAotICAgICAgICAgICAgTTRPU0FfRklMRV9SRUFERVIsIChNNE9TQV9DaGFyICopIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVySW5pdCIpOwotICAgICAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9BTExPQywgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX1ZvaWQgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGcmVlKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ludDggaTsKLQotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICBmcmVlKGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9GaWxlUG9zaXRpb24gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGksIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLCBNNE9TQV9NZW1BZGRyOCBwRGF0YSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gY29weXNpemU7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIG9mZnNldDsKLQotICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPT0gTTRPU0FfRU9GKSByZXR1cm4gTTRPU0FfRU9GOwotCi0gICAgaWYoICAgKHBvcyA8IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpCi0gICAgICAgfHwgKHBvcyA+IChhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zICsgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSAtIDEpKSApCi0gICAgewotICAgICAgICByZXR1cm4gMDsgLyogbm90aGluZyBjb3BpZWQgKi8KLSAgICB9Ci0KLSAgICBvZmZzZXQgPSBwb3MgLSBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zOwotCi0gICAgY29weXNpemUgPSBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIC0gb2Zmc2V0OwotICAgIGNvcHlzaXplID0gKHNpemUgPCBjb3B5c2l6ZSkgPyBzaXplIDogY29weXNpemU7Ci0KLSAgICBtZW1jcHkoKHZvaWQgKilwRGF0YSwgKHZvaWQgKikoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSArIG9mZnNldCksIGNvcHlzaXplKTsKLQotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiAtPSBjb3B5c2l6ZTsKLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA9IDA7Ci0KLSAgICByZXR1cm4gY29weXNpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGksIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBncmlkUG9zOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICB0ZW1wUG9zOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgYnVmZmVyU2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIGRpZmY7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBzaXplOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiAgICAgICAgICAgICBlcnJubyA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgZmlsZVJlYWRTaXplID0gMDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIGZpbGVTZWVrUG9zaXRpb24gPSAwOwotI2Vsc2UKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgIHJldF92YWw7Ci0gICAgTTRPU0FfVUludDE2ICAgICAgICAgZXJybm87Ci0jZW5kaWYKLQotICAgIE00T1NBX1RSQUNFM180KCJCdWZmZXJGaWxsICBpID0gJWQgIHBvcyA9ICVsZCAgcmVhZCA9ICVsZCAgb2xkID0gJWxkIiwgaSwgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcywgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyk7Ci0KLSAgICAvKiBBdm9pZCBjeWNsaW5nIHN0YXRlbWVudCBiZWNhdXNlIG9mIEVPRiAqLwotICAgIGlmKHBvcyA+PSBhcENvbnRleHQtPmZpbGVTaXplKQotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLQotICAgIC8qIFJlbG9jYXRlIHRvIGFic29sdXRlIHBvc3Rpb24gaWYgbmVjZXNzYXJ5ICovCi0gICAgYnVmZmVyU2l6ZSA9IE00T1NBX1JFQURCVUZGRVJfU0laRTsKLSAgICB0ZW1wUG9zID0gKE00T1NBX0ZpbGVQb3NpdGlvbikgKHBvcyAvIGJ1ZmZlclNpemUpOwotICAgIGdyaWRQb3MgPSB0ZW1wUG9zICogTTRPU0FfUkVBREJVRkZFUl9TSVpFOwotICAgIGRpZmYgPSBncmlkUG9zIC0gYXBDb250ZXh0LT5yZWFkRmlsZVBvczsKLQotICAgIGlmKGRpZmYgIT0gMCkKLSAgICB7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgICAgIGZpbGVTZWVrUG9zaXRpb24gPSBkaWZmOwotICAgICAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPnNlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNlZWtQb3NpdGlvbik7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBncmlkUG9zOwotCi0gICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSNlbHNlCi0gICAgICAgIHJldF92YWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1NlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIGRpZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZlcnJubyk7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBncmlkUG9zOwotCi0gICAgICAgIGlmKHJldF92YWwgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCi0gICAgfQotCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA9IGFwQ29udGV4dC0+cmVhZEZpbGVQb3M7Ci0KLSAgICAvKiBSZWFkIERhdGEgKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBmaWxlUmVhZFNpemUgPSBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7Ci0gICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5yZWFkRGF0YShhcENvbnRleHQtPmFGaWxlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSwgJmZpbGVSZWFkU2l6ZSk7Ci0KLSAgICBzaXplID0gKE00T1NBX0ZpbGVQb3NpdGlvbilmaWxlUmVhZFNpemU7Ci0gICAgaWYgKChNNE5PX0VSUk9SICE9IGVycm5vKSYmKE00V0FSX05PX0RBVEFfWUVUICE9IGVycm5vKSkKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBNNE9TQV9FT0Y7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IDA7Ci0KLSAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMiA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbHNlCi0gICAgc2l6ZSA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfUmVhZChhcENvbnRleHQtPmFGaWxlRGVzYywKLSAgICAgICAgKE00T1NBX1VJbnQ4ICopYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSwgTTRPU0FfUkVBREJVRkZFUl9TSVpFLCAmZXJybm8pOwotICAgIGlmKHNpemUgPT0gLTEpCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gTTRPU0FfRU9GOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSAwOwotCi0gICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBzaXplOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IHNpemU7Ci0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPSAwOwotCi0gICAgLyogUmV0cmlldmUgY3VycmVudCBwb3NpdGlvbiAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+Z2V0T3B0aW9uKGFwQ29udGV4dC0+YUZpbGVEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbiopICZhcENvbnRleHQtPnJlYWRGaWxlUG9zKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycm5vKQotICAgIHsKLSAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMyA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSAgICBlbHNlIGlmKCAgIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID49IDApCi0gICAgICAgJiYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPCBNNE9TQV9SRUFEQlVGRkVSX1NJWkUpICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIHJldHVybnMgTk8gREFUQSBZRVQiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0jZWxzZQotICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1RlbGwoYXBDb250ZXh0LT5hRmlsZURlc2MsICZlcnJubyk7Ci0KLSAgICBpZiggICAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA+PSAwKQotICAgICAgICYmIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIDwgTTRPU0FfUkVBREJVRkZFUl9TSVpFKSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIzID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLQotICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ludDggTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJNYXRjaChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gcG9zKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ludDggaTsKLQotCi0gICAgLyogU2VsZWN0IHRoZSBidWZmZXIgd2hpY2ggbWF0Y2hlcyB3aXRoIGdpdmVuIHBvcyAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoICAgKHBvcyA+PSBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKQotICAgICAgICAgICAmJiAocG9zIDwgKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgKyBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTTRPU0FfUkVBREJVRkZFUl9OT05FOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9JbnQ4IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyU2VsZWN0KE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGN1cnJlbnRfaSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9JbnQ4IGksajsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gbWluX2Ftb3VudCxtYXhfYW1vdW50OwotICAgIE00T1NBX0ludDggbWluX2ksbWF4X2NvdW50OwotCi0gICAgLyogdXBkYXRlIG5iRmlsbFNpbmNlTGFzdEFjZXNzIGZpZWxkICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyArKzsKLSAgICB9Ci0KLSAgICAvKiBQbGFuIEEgOiBTY2FuIGZvciBlbXB0eSBidWZmZXIgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1heF9jb3VudCA9IE00T1NBX1JFQURCVUZGRVJfTkI7Ci0gICAgbWF4X2Ftb3VudCA9IE1BWF9GSUxMU19TSU5DRV9MQVNUX0FDQ0VTUzsKLQotICAgIC8qIFBsYW4gQiA6IFNjYW4gZm9yIGRlYWQgYnVmZmVyICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA+PSAoTTRPU0FfVUludDMyKSBtYXhfYW1vdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhfYW1vdW50ID0gYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3M7Ci0gICAgICAgICAgICBtYXhfY291bnQgPSBpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKG1heF9jb3VudDxNNE9TQV9SRUFEQlVGRkVSX05CKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkRFQUQgQlVGRkVSOiAlZCwgJWQiLG1heF9jb3VudCxhcENvbnRleHQtPmJ1ZmZlclttYXhfY291bnRdLm5iRmlsbFNpbmNlTGFzdEFjZXNzKTsKLSAgICAgICAgcmV0dXJuIG1heF9jb3VudDsKLSAgICB9Ci0KLSAgICBtaW5faSA9IGN1cnJlbnRfaTsKLSAgICBtaW5fYW1vdW50ID0gTTRPU0FfUkVBREJVRkZFUl9TSVpFOwotCi0gICAgLyogU2VsZWN0IHRoZSBidWZmZXIgd2hpY2ggaXMgdGhlIG1vc3QgImVtcHR5IiAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaiA9IChpK2N1cnJlbnRfaSklTTRPU0FfUkVBREJVRkZFUl9OQjsKLQotICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltqXS5yZW1haW4gPCBtaW5fYW1vdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW5fYW1vdW50ID0gYXBDb250ZXh0LT5idWZmZXJbal0ucmVtYWluOwotICAgICAgICAgICAgbWluX2kgPSBqOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbl9pOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE9TQV9GaWxlUmVhZGVyX0NhbGN1bGF0ZVNpemUoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICBlcnJubyA9IE00Tk9fRVJST1I7Ci0jZWxzZQotICAgIE00T1NBX0ludDMyICAgICAgICAgIHJldF92YWw7Ci0gICAgTTRPU0FfVUludDE2ICAgICAgICAgZXJybm87Ci0jZW5kaWYKLQotICAgIC8qIGdvIHRvIHRoZSBlbmQgb2YgZmlsZSovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5nZXRPcHRpb24oYXBDb250ZXh0LT5hRmlsZURlc2MsIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikgJmFwQ29udGV4dC0+ZmlsZVNpemUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycm5vKQotICAgIHsKLSAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0NhbGN1bGF0ZVNpemUgRVJSID0gMHgleCIsIGVycik7Ci0gICAgfQotI2Vsc2UKLSAgICByZXRfdmFsID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9TZWVrKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAwLCBNNE9TQV9rRmlsZVNlZWtFbmQsICZlcnJubyk7Ci0KLSAgICBpZiAocmV0X3ZhbCAhPSAwKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IE00T1NBX0VPRjsKLSAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0NhbGN1bGF0ZVNpemUgRVJSID0gMHgleCIsIGVycik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFJldHJpZXZlIHNpemUgb2YgdGhlIGZpbGUgKi8KLSAgICAgICAgYXBDb250ZXh0LT5maWxlU2l6ZSA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfVGVsbChhcENvbnRleHQtPmFGaWxlRGVzYywgJmVycm5vKTsKLSAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGFwQ29udGV4dC0+ZmlsZVNpemU7Ci0gICAgfQotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICAgICAgICAgICAgICAgICAgIE9TQUwgZmlsZXN5c3RlbSBBUEkgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2Qgb3BlbnMgdGhlIHByb3ZpZGVkIGZpbGVEZXNjcmlwdG9yIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChPVVQpIEZpbGUgcmVhZGVyIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBwRmlsZURlc2NyaXB0b3IgOiAgICAgICAoSU4pIEZpbGUgRGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgZmlsZS4KLSogQHBhcmFtICAgICAgIEZpbGVNb2RlQWNjZXNzIDogICAgICAgIChJTikgRmlsZSBtb2RlIGFjY2Vzcy4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9QQVJBTUVURVIgcENvbnRleHQgb3IgZmlsZURlc2NyaXB0b3IgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQUxMT0MgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MgICAgICB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdCAoaXQgbXVzdCBiZSBlaXRoZXIgaXNUZXh0TW9kZSBvciByZWFkKQotKiBAcmV0dXJuICAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQgVGhlIGZpbGUgY2FuIG5vdCBiZSBvcGVuZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcykKLSNlbHNlCi0gICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyICpGUykKLSNlbmRpZgotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIE00T1NBX0VSUiAgIGVyciAgICAgICA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVm9pZCogYUZpbGVEZXNjID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9Cb29sICBidWZmZXJzX2FsbG9jYXRlZCA9IE00T1NBX0ZBTFNFOwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiBlcnJubyA9IE00Tk9fRVJST1I7Ci0jZWxzZQotICAgIE00T1NBX1VJbnQxNiBlcnJubzsKLSNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCi0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltIHAgPSAweCVwIGZkID0gJXMgbW9kZSA9ICVsdSIsIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVEZXNjcmlwdG9yLCBGaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICAvKiAgICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBGaWxlRGVzY3JpcHRvcik7Ci0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogICAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBGaWxlIHJlYWRlciBjb250ZXh0LiAqLwotICAgIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0gKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSJNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0iKTsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBhcENvbnRleHQpOwotCi0gICAgLyogU2V0IGZpbGVzeXN0ZW0gaW50ZXJmYWNlICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0KLSAgICAvKlNldCB0aGUgb3B0aW1pemVkIGZ1bmN0aW9ucywgdG8gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyKi8KLQotICAgIGFwQ29udGV4dC0+RlMgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9GaWxlUmVhZFBvaW50ZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRklMRV9SRUFERVIsIChNNE9TQV9DaGFyICopIk00T1NBX0ZpbGVSZWFkZXJPcHRpbV9pbml0Iik7Ci0gICAgaWYgKE00T1NBX05VTEw9PWFwQ29udGV4dC0+RlMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRPU0FfRmlsZVJlYWRlck9wdGltX2luaXQgLSBFUlJPUiA6IGFsbG9jYXRpb24gZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgYXBDb250ZXh0LT5GUy0+b3BlblJlYWQgID0gTTRPU0FfZmlsZVJlYWRPcGVuOwotICAgIGFwQ29udGV4dC0+RlMtPnJlYWREYXRhICA9IE00T1NBX2ZpbGVSZWFkRGF0YTsKLSAgICBhcENvbnRleHQtPkZTLT5zZWVrICAgICAgPSBNNE9TQV9maWxlUmVhZFNlZWs7Ci0gICAgYXBDb250ZXh0LT5GUy0+Y2xvc2VSZWFkID0gTTRPU0FfZmlsZVJlYWRDbG9zZTsKLSAgICBhcENvbnRleHQtPkZTLT5zZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZFNldE9wdGlvbjsKLSAgICBhcENvbnRleHQtPkZTLT5nZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZEdldE9wdGlvbjsKLSNlbHNlCi0gICAgYXBDb250ZXh0LT5GUyA9IEZTOwotI2VuZGlmCi0KLSAgICAvKiBWZXJpZnkgYWNjZXNzIG1vZGUgKi8KLSAgICBpZiAoICAgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQXBwZW5kKSAhPSAwKQotICAgICAgICB8fCAoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgLyogT3BlbiBmaWxlIGluIHJlYWQgbW9kZSAqLwotICAgIGlmKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQ3JlYXRlKSAhPSAwKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaWxlIGlzIG9wZW5lZCBpbiByZWFkIG9ubHkqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgICAgICAgICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5vcGVuUmVhZCgmYUZpbGVEZXNjLCBwRmlsZURlc2NyaXB0b3IsIEZpbGVNb2RlQWNjZXNzKTsKLQotICAgICAgICAgICAgaWYgKChhRmlsZURlc2MgPT0gTTRPU0FfTlVMTCl8fChNNE5PX0VSUk9SICE9IGVycm5vKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgIGFGaWxlRGVzYyA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfT3BlbihwRmlsZURlc2NyaXB0b3IsIEZpbGVNb2RlQWNjZXNzLCAmZXJybm8pOwotCi0gICAgICAgICAgICBpZiAoYUZpbGVEZXNjID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0gRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgZ290byBjbGVhbnVwOwotCi0gICAgLyogQWxsb2NhdGUgYnVmZmVycyAqLwotICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVySW5pdChhcENvbnRleHQpOwotICAgIGJ1ZmZlcnNfYWxsb2NhdGVkID0gTTRPU0FfVFJVRTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgZ290byBjbGVhbnVwOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzICovCi0gICAgYXBDb250ZXh0LT5maWxlU2l6ZSA9IDA7Ci0gICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IDA7Ci0gICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IDA7Ci0KLSAgICAvKiBSZXRyaWV2ZSB0aGUgRmlsZSBEZXNjcmlwdG9yKi8KLSAgICBhcENvbnRleHQtPmFGaWxlRGVzYyA9IGFGaWxlRGVzYzsKLQotICAgIC8qIFJldHJpZXZlIHRoZSBGaWxlIG1vZGUgQWNjZXNzICovCi0gICAgYXBDb250ZXh0LT5GaWxlQXR0cmlidXRlLm1vZGVBY2Nlc3MgPSAoTTRPU0FfRmlsZU1vZGVBY2Nlc3MpIEZpbGVNb2RlQWNjZXNzOwotCi0gICAgLypSZXRyaWV2ZSB0aGUgRmlsZSByZWFkZXIgY29udGV4dCAqLwotICAgICpwQ29udGV4dD0gKE00T1NBX0NvbnRleHQpYXBDb250ZXh0OwotCi0gICAgLyogQ29tcHV0ZSBmaWxlIHNpemUgKi8KLSAgICBlcnIgPSBNNE9TQV9GaWxlUmVhZGVyX0NhbGN1bGF0ZVNpemUoYXBDb250ZXh0KTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgZ290byBjbGVhbnVwOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLWNsZWFudXA6Ci0KLSAgICAvKiBmcmVlIGNvbnRleHQgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBhcENvbnRleHQpCi0gICAgewotICAgICAgICBpZihidWZmZXJzX2FsbG9jYXRlZCA9PSBNNE9TQV9UUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZyZWUoYXBDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZyZWUoIGFwQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UyXzEgKCJNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW06IHJldHVybnMgZXJyb3IgMHglMHgiLCBlcnIpCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIHJlYWRzIHRoZSAnc2l6ZScgYnl0ZXMgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpCi0qICAgICAgICAgICAgICAgICAgICAgIGFuZCB3cml0ZXMgdGhlIGRhdGEgdG8gdGhlICdkYXRhJyBwb2ludGVyLiBJZiAnc2l6ZScgYnl0ZSBjYW4gbm90IGJlIHJlYWQgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIsCi0qICAgICAgICAgICAgICAgICAgICAgICdzaXplJyBwYXJhbWV0ZXIgaXMgdXBkYXRlZCB0byBtYXRjaCB0aGUgY29ycmVjdCBudW1iZXIgb2YgcmVhZCBieXRlcy4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEZpbGUgcmVhZGVyIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBwRGF0YSA6IChPVVQpIERhdGEgcG9pbnRlciBvZiB0aGUgcmVhZCBkYXRhLgotKiBAcGFyYW0gICAgICAgcFNpemUgOiAoSU5PVVQpIFNpemUgb2YgdGhlIGRhdGEgdG8gcmVhZCAoaW4gYnl0ZSkuCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSIHBTaXplLCBmaWxlRGVzY3JpcHRvciBvciBwRGF0YSBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGFfb3B0aW0oTTRPU0FfQ29udGV4dCBwQ29udGV4dCxNNE9TQV9NZW1BZGRyOCBwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFNpemUpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGFTaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBjb3BpZWRTaXplOwotICAgIE00T1NBX0ludDggc2VsZWN0ZWRfYnVmZmVyLCBjdXJyZW50X2J1ZmZlcjsKLQotICAgIE00T1NBX1RSQUNFM18zKCJNNE9TQV9maWxlUmVhZERhdGFfb3B0aW0gcCA9IDB4JXAgIGQgPSAweCVwICBzID0gJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcERhdGEsICpwU2l6ZSk7Ci0KLSAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwRGF0YSk7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwU2l6ZSk7Ci0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIC8qIFByZXZlbnQgcmVhZGluZyBiZXlvbmQgRU9GICovCi0gICAgaWYoKCpwU2l6ZSA+IDApICYmIChhcENvbnRleHQtPmFic29sdXRlUG9zID49IGFwQ29udGV4dC0+ZmlsZVNpemUpKQotICAgIHsKLSAgICAgICAgY29waWVkU2l6ZSA9IDA7Ci0gICAgICAgIGVyciA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiBkYXRhIGNhbiBiZSByZWFkIGZyb20gYSBidWZmZXIgKi8KLSAgICAvKiBJZiBub3QsIGZpbGwgb25lIGFjY29yZGluZyB0byBxdWFudGl6ZWQgcG9zaXRpb25zICovCi0gICAgY29waWVkU2l6ZSA9IDA7Ci0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyTWF0Y2goYXBDb250ZXh0LCBhcENvbnRleHQtPmFic29sdXRlUG9zKTsKLQotICAgIGlmKHNlbGVjdGVkX2J1ZmZlciA9PSBNNE9TQV9SRUFEQlVGRkVSX05PTkUpCi0gICAgewotICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlclNlbGVjdChhcENvbnRleHQsIDApOwotICAgICAgICBlcnIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOwotICAgIH0KLQotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgaWYoZXJyID09IE00V0FSX05PX0RBVEFfWUVUKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKnBTaXplIDw9IChNNE9TQV9VSW50MzIpYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRfYnVmZmVyXS5zaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29waWVkU2l6ZSA9IChNNE9TQV9VSW50MzIpYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRfYnVmZmVyXS5zaXplOwotICAgICAgICAgICAgICAgIC8qY29weSB0aGUgY29udGVudCBpbnRvIHBEYXRhKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckNvcHkoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcywgY29waWVkU2l6ZSwgcERhdGEpOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18zKCJyZWFkICBzaXplID0gJWx1ICBidWZmZXIgPSAlZCAgcG9zID0gJWxkIiwgKnBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyLCBhcENvbnRleHQtPmFic29sdXRlUG9zKTsKLQotICAgIC8qIENvcHkgYnVmZmVyIGludG8gcERhdGEgKi8KLSAgICB3aGlsZSgoKE00T1NBX1VJbnQzMiljb3BpZWRTaXplIDwgKnBTaXplKSAmJiAoZXJyID09IE00Tk9fRVJST1IpKQotICAgIHsKLSAgICAgICAgYVNpemUgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckNvcHkoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLWNvcGllZFNpemUsIHBEYXRhK2NvcGllZFNpemUpOwotICAgICAgICBjb3BpZWRTaXplICs9IGFTaXplOwotCi0gICAgICAgIGlmKGFTaXplID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMiljb3BpZWRTaXplIDwgKnBTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyID0gc2VsZWN0ZWRfYnVmZmVyOwotICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyTWF0Y2goYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKHNlbGVjdGVkX2J1ZmZlciA9PSBNNE9TQV9SRUFEQlVGRkVSX05PTkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlclNlbGVjdChhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9idWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypJZiB3ZSBnb3QgYWxsIHRoZSBkYXRhIHRoYXQgd2Ugd2FudGVkLCB3ZSBzaG91bGQgcmV0dXJuIG5vIGVycm9yKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU2l6ZS1jb3BpZWRTaXplKSA8PSAoTTRPU0FfVUludDMyKWFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkX2J1ZmZlcl0uc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSWYgd2UgZGlkIG5vdCBnZXQgZW5vdWdoIGRhdGEsIHdlIHdpbGwgcmV0dXJuIE5PX0RBVEFfWUVUKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29weSB0aGUgZGF0YSByZWFkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU2l6ZSA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2l6ZS1jb3BpZWRTaXplLCBwRGF0YStjb3BpZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRTaXplICs9IGFTaXplOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp3ZSByZWFjaGVkIGVuZCBvZiBmaWxlLCBzbyBzdG9wIHRyeWluZyB0byByZWFkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE00V0FSX05PX01PUkVfQVUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvcHkgdGhlIGRhdGEgcmVhZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYVNpemUgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckNvcHkoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2l6ZS1jb3BpZWRTaXplLCBwRGF0YStjb3BpZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRTaXplICs9IGFTaXplOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp3ZSByZWFjaGVkIGVuZCBvZiBmaWxlLCBzbyBzdG9wIHRyeWluZyB0byByZWFkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLWNsZWFudXAgOgotCi0gICAgLyogVXBkYXRlIHRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIgKi8KLSAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyArIGNvcGllZFNpemU7Ci0KLSAgICBpZigoZXJyICE9IE00Tk9fRVJST1IpJiYoZXJyIT1NNFdBUl9OT19EQVRBX1lFVCkpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMygiTTRPU0FfZmlsZVJlYWREYXRhX29wdGltIHNpemUgPSAlbGQgIGNvcGllZCA9ICVsZCAgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2l6ZSwgY29waWVkU2l6ZSwgZXJyKTsKLSAgICB9Ci0KLSAgICAvKiBFZmZlY3RpdmUgY29waWVkIHNpemUgbXVzdCBiZSByZXR1cm5lZCAqLwotICAgICpwU2l6ZSA9IGNvcGllZFNpemU7Ci0KLQotICAgIC8qIFJlYWQgaXMgZG9uZSAqLwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24gaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpLgotKiAgICAgICAgICAgICAgVGhlIHBvc2l0aW9uIGlzIHJlbGF0ZWQgdG8gdGhlIHNlZWtNb2RlIHBhcmFtZXRlciBpdCBjYW4gYmUgZWl0aGVyIDoKLSogICAgICAgICAgICAgIEZyb20gdGhlIGJlZ2lubmluZyAocG9zaXRpb24gTVVTVCBiZSBwb3NpdGl2ZSkgOiBlbmQgcG9zaXRpb24gPSBwb3NpdGlvbgotKiAgICAgICAgICAgICAgRnJvbSB0aGUgZW5kIChwb3NpdGlvbiBNVVNUIGJlIG5lZ2F0aXZlKSA6IGVuZCBwb3NpdGlvbiA9IGZpbGUgc2l6ZSArIHBvc2l0aW9uCi0qICAgICAgICAgICAgICBGcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIChzaWduZWQgb2Zmc2V0KSA6IGVuZCBwb3NpdGlvbiA9IGN1cnJlbnQgcG9zaXRpb24gKyBwb3NpdGlvbi4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEZpbGUgcmVhZGVyIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBTZWVrTW9kZSA6ICAgICAgKElOKSBTZWVrIGFjY2VzcyBtb2RlLgotKiBAcGFyYW0gICAgICAgcFBvc2l0aW9uIDogICAgIChJTikgUG9zaXRpb24gaW4gdGhlIGZpbGUuCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSIFNlZWttb2RlIG9yIGZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKLSogQHJldHVybiAgICAgIE00RVJSX0FMTE9DICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgotKiBAcmV0dXJuICAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OIHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW0oIE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBTZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24pCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQgPSAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKikgcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVFJBQ0UzXzMoIk00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbSBwID0gMHglcCBtb2RlID0gJWQgcG9zID0gJWQiLCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWVrTW9kZSwgKnBQb3NpdGlvbik7Ci0KLSAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwUG9zaXRpb24pOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgU2Vla01vZGUpOwotCi0gICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgICAgLyo8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLwotICAgIH0KLQotICAgIC8qIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCi0gICAgc3dpdGNoKFNlZWtNb2RlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgOgotICAgICAgICAgICAgaWYoKnBQb3NpdGlvbiA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOyAvKio8IEJhZCBTZWVrQWNlc3MgbW9kZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9ICpwUG9zaXRpb247Ci0gICAgICAgICAgICAqcFBvc2l0aW9uID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrRW5kIDoKLSAgICAgICAgICAgIGlmKCpwUG9zaXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmZpbGVTaXplICsgKnBQb3NpdGlvbjsKLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtDdXJyZW50IDoKLSAgICAgICAgICAgIGlmKCgoYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyArICpwUG9zaXRpb24pID4gYXBDb250ZXh0LT5maWxlU2l6ZSkgfHwKLSAgICAgICAgICAgICAgICAoKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyAqcFBvc2l0aW9uKSA8IDApKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOyAvKio8IEJhZCBTZWVrQWNlc3MgbW9kZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyAqcFBvc2l0aW9uOwotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gY2xvc2UgdGhlIGZpbGUKLSogICAgICAgICAgICAgIChhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0KSBhbmQgYWxzbyBmcmVlcyB0aGUgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEZpbGUgcmVhZGVyIGNvbnRleHQuCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSIGVycm5vID0gTTROT19FUlJPUjsKLSNlbHNlCi0gICAgTTRPU0FfVUludDE2IGVycm5vOwotI2VuZGlmCi0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbSBwID0gMHglcCIsIHBDb250ZXh0ICk7Ci0KLSAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7Ci0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLwotICAgIH0KLQotICAgIC8qIGJ1ZmZlciAqLwotICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRnJlZShhcENvbnRleHQpOwotCi0gICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPmNsb3NlUmVhZChhcENvbnRleHQtPmFGaWxlRGVzYyk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICB7Ci0gICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZENsb3NlX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0jZWxzZQotICAgIGFSZXRfVmFsID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9DbG9zZShhcENvbnRleHQtPmFGaWxlRGVzYywgJmVycm5vKTsKLQotICAgIGlmIChhUmV0X1ZhbCAhPSAwKQotICAgIHsKLSAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0gRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCi0KLSAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvLz4+Pj4gR0xNMjAwOTAyMTIgOiBzZXQgdGhlIGxvdyBsZXZlbCBmdW5jdGlvbiBzdGF0aWNhbGx5Ci0gICAgaWYgKGFwQ29udGV4dC0+RlMgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoIGFwQ29udGV4dC0+RlMpOwotICAgIH0KLSAgICAvLzw8PDwgR0xNMjAwOTAyMTIgOiBzZXQgdGhlIGxvdyBsZXZlbCBmdW5jdGlvbiBzdGF0aWNhbGx5Ci0KLSAgICAvKiBGcmVlIHRoZSBjb250ZXh0ICovCi0gICAgZnJlZShhcENvbnRleHQpOwotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHJlcXVpcmVkIHRvIG1haW50YWluIGZ1bmN0aW9uIHBvaW50ZXIKLSogICAgICAgICAgICAgIHN0cnVjdHVyZS4KLSogQG5vdGUgICAgICAgIFRoaXMgaXMgYSBkdW1teSBmdW5jdGlvbiByZXF1aXJlZCB0byBtYWludGFpbiBmdW5jdGlvbiBwb2ludGVyCi0qICAgICAgICAgICAgICBzdHJ1Y3R1cmUuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSogQHBhcmFtICAgICAgIE9wdGlvbklkIDogICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gc2V0LgotKiBAcGFyYW0gICAgICAgT3B0aW9uVmFsdWUgOiAgIChJTikgVmFsdWUgb2YgdGhlIG9wdGlvbi4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb25fb3B0aW0oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIE9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gT3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkCi0qICAgICAgICAgICAgICB3aXRoIHRoZSBvcHRpb25JRC5UaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcKLSogICAgICAgICAgICAgIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotKiBAbm90ZSAgICAgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY29tcG9uZW50LgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBPcHRpb25JZCA6ICAgICAgKElOKSBJZCBvZiB0aGUgb3B0aW9uIHRvIHNldC4KLSogQHBhcmFtICAgICAgIHBPcHRpb25WYWx1ZSA6ICAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHBDb250ZXh0IGlzIE5VTEwKLSogQHJldHVybiAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQgdGhlIG9wdGlvbiBpZCBpcyBub3QgdmFsaWQuCi0qIEByZXR1cm4gICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgVGhlIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBPcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwT3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQgPSAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKikgcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotCi0gICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgICAgLyoqPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLSAgICAvKiBHZXQgdGhlIGRlc2lyZWQgb3B0aW9uIGlmIGl0IGlzIGF2YWxhaWJsZSAqLwotICAgIHN3aXRjaChPcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIC8qIEdldCBGaWxlIFNpemUgKi8KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZTovKio8IEdldCBzaXplIG9mIHRoZSBmaWxlLCBsaW1pdGVkIHRvIDMyIGJpdCBzaXplICovCi0KLSAgICAgICAgICAgICgqKE00T1NBX1VJbnQzMiAqKXBPcHRpb25WYWx1ZSkgPSBhcENvbnRleHQtPmZpbGVTaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogQ2hlY2sgRW5kIG9mIGZpbGUgT2NjdXJzICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkSXNFT0YgOiAgICAgLyoqPCBTZWUgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KLQotICAgICAgICAgICAgKCooTTRPU0FfQm9vbCAqKXBPcHRpb25WYWx1ZSkgPSAoYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA+PSBhcENvbnRleHQtPmZpbGVTaXplKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIEdldCBGaWxlIFBvc2l0aW9uICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uIDogICAvKio8IEdldCBmaWxlIHBvc2l0aW9uICovCi0KLSAgICAgICAgICAgICooTTRPU0FfRmlsZVBvc2l0aW9uICopcE9wdGlvblZhbHVlID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIEdldCBBdHRyaWJ1dGUgKi8KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlQXR0cmlidXRlIDogIC8qKjwgR2V0IHRoZSBmaWxlIGF0dHJpYnV0ZSA9IGFjY2VzcyBtb2RlICovCi0KLSAgICAgICAgICAgICgqKE00T1NBX0ZpbGVBdHRyaWJ1dGUgKilwT3B0aW9uVmFsdWUpLm1vZGVBY2Nlc3MgPSBhcENvbnRleHQtPkZpbGVBdHRyaWJ1dGUubW9kZUFjY2VzczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKio8IEJhZCBvcHRpb24gSUQgKi8KLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKlJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0NoYXJTdGFyLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DaGFyU3Rhci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwODE0Y2JmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0NoYXJTdGFyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTREUEFLX0NoYXJTdGFyLmMKLSAqIEBpbmdyb3VwCi0gICogQGJyaWVmICAgICAgICBkZWZpbml0aW9uIG9mIHRoZSBDaGFyIFN0YXIgc2V0IG9mIGZ1bmN0aW9ucy4KLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIENoYXIgU3RhciBzZXQgb2YgZnVuY3Rpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotLyogV0FSTklORzogU3BlY2lmaWMgQW5kcm9pZCAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJjJ3Mgc3RybmNweSgpLgotICogQG5vdGUgICAgICAgSXQgY29waWVzIGV4YWN0bHkgbGVuMkNvcHkgY2hhcmFjdGVycyBmcm9tIHBTdHJJbiB0byBwU3RyT3V0LAotICogICAgICAgICAgICAgdHJ1bmNhdGluZyAgcFN0ckluIG9yIGFkZGluZyBudWxsIGNoYXJhY3RlcnMgdG8gcFN0ck91dCBpZgotICogICAgICAgICAgICAgbmVjZXNzYXJ5LgotICogICAgICAgICAgICAgLSBJZiBsZW4yQ29weSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiBwU3RySW4sCi0gKiAgICAgICAgICAgICAgIGEgbnVsbCBjaGFyYWN0ZXIgaXMgYXBwZW5kZWQgYXV0b21hdGljYWxseSB0byB0aGUgY29waWVkCi0gKiAgICAgICAgICAgICAgIHN0cmluZy4KLSAqICAgICAgICAgICAgIC0gSWYgbGVuMkNvcHkgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgcFN0ckluLCBwU3RyT3V0IGlzCi0gKiAgICAgICAgICAgICAgIHBhZGRlZCB3aXRoIG51bGwgY2hhcmFjdGVycyB1cCB0byBsZW5ndGggbGVuMkNvcHkuCi0gKiAgICAgICAgICAgICAtIHBTdHJPdXQgYW5kIHBTdHJJbiBNVVNUIE5PVCBPVkVSTEFQICh0aGlzIGlzIE5PVCBDSEVDS0VEKS4KLSAqIEBwYXJhbSAgICAgIHBTdHJPdXQ6IChPVVQpIERlc3RpbmF0aW9uIGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgU291cmNlIGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBsZW4yQ29weTogKElOKSBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcFN0ckluIHRvIGNvcHkuCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBTdHJPdXQgaXMgTTRPU0FfTlVMTC4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2Nock5Db3B5KE00T1NBX0NoYXIqIHBTdHJPdXQsIE00T1NBX0NoYXIgICAqcFN0ckluLCBNNE9TQV9VSW50MzIgbGVuMkNvcHkpCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2Nock5Db3B5XHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgsTTRPU0FfVUludDMyICVsZCkiLAotICAgICAgICBwU3RyT3V0LHBTdHJJbixsZW4yQ29weSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJPdXQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyTkNvcHk6XHRwU3RyT3V0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0ckluKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nock5Db3B5Olx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHN0cm5jcHkoKGNoYXIgKilwU3RyT3V0LCAoY29uc3QgY2hhciAqKXBTdHJJbiwgKHNpemVfdClsZW4yQ29weSk7Ci0gICAgaWYobGVuMkNvcHkgPD0gKE00T1NBX1VJbnQzMilzdHJsZW4oKGNvbnN0IGNoYXIgKilwU3RySW4pKQotICAgIHsKLSAgICAgICAgcFN0ck91dFtsZW4yQ29weV0gPSAnXDAnOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJvb2xlYW4gY29tcGFyaXNvbiBvZiBwU3RySW4xIGFuZCBwU3RySW4yLgotICogQG5vdGUgICAgICAgVGhlIHZhbHVlIHJldHVybmVkIGluIHJlc3VsdCBpcyBNNE9TQV9UUlVFIGlmIHRoZSBzdHJpbmcKLSAqICAgICAgICAgICAgIHBvaW50ZWQgdG8gYnkgcFN0ckluMSBpcyBzdHJpY3RseSBpZGVudGljYWwgdG8gdGhlIHN0cmluZyBwb2ludGVkCi0gKiAgICAgICAgICAgICB0byBieSBwU3RySW4yLCBhbmQgTTRPU0FfRkFMU0Ugb3RoZXJ3aXNlLgotICogQHBhcmFtICAgICAgcFN0ckluMTogKElOKSBGaXJzdCBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgcFN0ckluMjogKElOKSBTZWNvbmQgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGNtcFJlc3VsdDogKE9VVCkgQ29tcGFyaXNvbiByZXN1bHQuCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluMSBwU3RySW4yIG9yIGNtcFJlc3VsdCBpcyBNNE9TQV9OVUxMLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyQXJlSWRlbnRpY2FsKE00T1NBX0NoYXIqIHBTdHJJbjEsIE00T1NBX0NoYXIqIHBTdHJJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sKiBwUmVzdWx0KQotewotICAgIE00T1NBX1VJbnQzMiBpMzIsbGVuMzI7Ci0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2NockFyZUlkZW50aWNhbFx0KE00T1NBX0NoYXIqICV4LE00T1NBX0NoYXIqICV4LCIKLSAgICAgICAgIk00T1NBX0ludDMyKiAleCkiLHBTdHJJbjEscFN0ckluMixwUmVzdWx0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4xLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockFyZUlkZW50aWNhbDpcdHBTdHJJbjEgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyQXJlSWRlbnRpY2FsOlx0cFN0ckluMiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFJlc3VsdCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJBcmVJZGVudGljYWw6XHRwUmVzdWx0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIGxlbjMyID0gKE00T1NBX1VJbnQzMilzdHJsZW4oKGNvbnN0IGNoYXIgKilwU3RySW4xKTsKLSAgICBpZihsZW4zMiAhPSAoTTRPU0FfVUludDMyKXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJJbjIpKQotICAgIHsKLSAgICAgICAgKnBSZXN1bHQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgZm9yKGkzMj0wO2kzMjxsZW4zMjtpMzIrKykKLSAgICB7Ci0gICAgICAgIGlmKHBTdHJJbjFbaTMyXSAhPSBwU3RySW4yW2kzMl0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUmVzdWx0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpwUmVzdWx0ID0gTTRPU0FfVFJVRTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgTTRPU0FfVUludDMyIGZyb20gc3RyaW5nLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgZmlyc3Qgc2V0IG9mIG5vbi13aGl0ZXNwYWNlCi0gKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIG9mIHBTdHJJbiB0byBhIE00T1NBX1VJbnQzMiB2YWx1ZSBwVmFsLCBhc3N1bWluZyBhCi0gKiAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiBiYXNlIHByb3ZpZGVkIGJ5IHRoZSBwYXJhbWV0ZXIgYmFzZS4gcFN0ck91dCBpcwotICogICAgICAgICAgICAgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhc3QKLSAqICAgICAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzIGJlZW4gY29udmVydGVkLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIGNvbnZlcnNpb24sIHBTdHJPdXQgaXMgbm90Ci0gKiAgICAgICAgICAgICAgIHVwZGF0ZWQsIGFuZCBwVmFsIGlzIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG5lZ2F0aXZlIG51bWJlciwgcFN0ck91dCBpcyBub3QgdXBkYXRlZCwgYW5kIHBWYWwgaXMKLSAqICAgICAgICAgICAgICAgc2V0IHRvIG51bGwuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgbnVtZXJpY2FsIG92ZXJmbG93LCBwVmFsIGlzIHNldCB0byBNNE9TQV9VSU5UMzJfTUFYLgotICogICAgICAgICAgICAgLSBpZiBwU3RyT3V0IGlzIG5vdCB0byBiZSB1c2VkLCBpdCBjYW4gYmUgc2V0IHRvIE00T1NBX05VTEwuCi0gKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCi0gKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgotICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCi0gKiAgICAgICAgICAgICBncmVhdGVyIHRoYW4gTTRPU0FfVUlOVDMyX01BWC4KLSAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9ORUdBVElWRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG5lZ2F0aXZlCi0gKiAgICAgICAgICAgICBudW1iZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockdldFVJbnQzMihNNE9TQV9DaGFyKiAgICBwU3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogICAgcFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqICAgIHBTdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgdWw7Ci0gICAgY2hhciogICAgICAgIHBUZW1wOwotCi0gICAgTTRPU0FfVFJBQ0UxXzQoIk00T1NBX2NockdldFVJbnQzMlx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9VSW50MzIqICV4IgotICAgICAgICAiTTRPU0FfQ2hhcioqICV4LE00T1NBX2Nock51bUJhc2UgJWQpIixwU3RySW4scFZhbCxwU3RyT3V0LGJhc2UpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VUludDMyOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVmFsLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQzMjpcdHBWYWwgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgZXJybm8gPSAwOwotICAgIHN3aXRjaChiYXNlKQotICAgIHsKLSAgICBjYXNlIE00T1NBX2tjaHJEZWM6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCAxMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2NockhleGE6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDE2KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hyT2N0OgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCw4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLwotICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLyogd2FzIHRoZSBudW1iZXIgbmVnYXRpdmUgPyAqLwotICAgIGlmKCoocFN0ckluK3N0cnNwbigoY29uc3QgY2hhciAqKXBTdHJJbiwiIFx0IikpID09ICctJykKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9ORUdBVElWRTsKLSAgICB9Ci0KLSAgICAvKiBoYXMgYW4gb3ZlcmZsb3cgb2NjdXJlZCA/ICovCi0gICAgaWYoZXJybm8gPT0gRVJBTkdFKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSBNNE9TQV9VSU5UMzJfTUFYOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNFdBUl9DSFJfTlVNX1JBTkdFOwotICAgIH0KLQotICAgIC8qIG5vbWluYWwgY2FzZSAqLwotICAgICpwVmFsID0gKE00T1NBX1VJbnQzMil1bDsKLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgewotICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9VSW50MTYgZnJvbSBzdHJpbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKLSAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfVUludDE2IHZhbHVlIHBWYWwsIGFzc3VtaW5nIGEKLSAqICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGluIGJhc2UgcHJvdmlkZWQgYnkgdGhlIHBhcmFtZXRlciBiYXNlLiBwU3RyT3V0IGlzCi0gKiAgICAgICAgICAgICBzZXQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFzdAotICogICAgICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBudW1iZXIgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgY29udmVyc2lvbiwgcFN0ck91dCBpcyBub3QKLSAqICAgICAgICAgICAgICAgdXBkYXRlZCwgYW5kIHBWYWwgaXMgc2V0IHRvIG51bGwuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgbmVnYXRpdmUgbnVtYmVyLCBwU3RyT3V0IGlzIG5vdCB1cGRhdGVkLCBhbmQgcFZhbCBpcwotICogICAgICAgICAgICAgICBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBudW1lcmljYWwgb3ZlcmZsb3csIHBWYWwgaXMgc2V0IHRvIE00T1NBX1VJTlQxNl9NQVguCi0gKiAgICAgICAgICAgICAtIGlmIHBTdHJPdXQgaXMgbm90IHRvIGJlIHVzZWQsIGl0IGNhbiBiZSBzZXQgdG8gTTRPU0FfTlVMTC4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBDaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgcFZhbDogKE9VVCkgcmVhZCB2YWx1ZS4KLSAqIEBwYXJhbSAgICAgIHBTdHJPdXQ6IChPVVQpIE91dHB1dCBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgYmFzZTogKElOKSBCYXNlIG9mIHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwVmFsIGlzIE00T1NBX05VTEwuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ6IGNvbnZlcnNpb24gZmFpbHVyZS4KLSAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9OVU1fUkFOR0U6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBudW1iZXIKLSAqICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBNNE9TQV9VSU5UMTZfTUFYLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05FR0FUSVZFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbmVnYXRpdmUKLSAqICAgICAgICAgICAgIG51bWJlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDE2IChNNE9TQV9DaGFyKiBwU3RySW4sIE00T1NBX1VJbnQxNiAqcFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiBwU3RyT3V0LCBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0FfVUludDMyIHVsOwotICAgIGNoYXIqICAgICAgICBwVGVtcDsKLQotICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRVSW50MTZcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfVUludDE2KiAleCIKLSAgICAgICAgIk00T1NBX0NoYXIqKiAleCxNNE9TQV9jaHJOdW1CYXNlICVkKSIscFN0ckluLHBWYWwscFN0ck91dCxiYXNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VUludDE2Olx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVmFsLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQxNjpcdHBWYWwgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgc3dpdGNoKGJhc2UpCi0gICAgewotICAgIGNhc2UgTTRPU0Ffa2NockRlYzoKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsMTApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJIZXhhOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwxNik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsOCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogaGFzIGNvbnZlcnNpb24gZmFpbGVkID8gKi8KLSAgICBpZigoTTRPU0FfQ2hhciopcFRlbXAgPT0gcFN0ckluKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwOwotICAgICAgICByZXR1cm4gTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOwotICAgIH0KLQotICAgIC8qIHdhcyB0aGUgbnVtYmVyIG5lZ2F0aXZlID8gKi8KLSAgICBpZigqKHBTdHJJbitzdHJzcG4oKGNvbnN0IGNoYXIgKilwU3RySW4sIiBcdCIpKSA9PSAnLScpCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNFdBUl9DSFJfTkVHQVRJVkU7Ci0gICAgfQotCi0gICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLwotICAgIGlmKHVsPk00T1NBX1VJTlQxNl9NQVgpCi0gICAgewotICAgICAgICAqcFZhbCA9IE00T1NBX1VJTlQxNl9NQVg7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7Ci0gICAgfQotCi0gICAgLyogbm9taW5hbCBjYXNlICovCi0gICAgKnBWYWwgPSAoTTRPU0FfVUludDE2KXVsOwotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICB7Ci0gICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE00T1NBX2NoclNQcmludGYoTTRPU0FfQ2hhciAgKnBTdHJPdXQsIE00T1NBX1VJbnQzMiBzdHJPdXRNYXhMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKmZvcm1hdCwgLi4uKQotewotICAgIHZhX2xpc3QgICAgICAgbWFya2VyOwotICAgIE00T1NBX0NoYXIgICAqcFRlbXA7Ci0gICAgTTRPU0FfQ2hhciAgICpwZXJjZW50UG9pbnRlcjsKLSAgICBNNE9TQV9DaGFyICAgKm5ld0Zvcm1hdDsKLSAgICBNNE9TQV9JbnQzMiAgbmV3Rm9ybWF0TGVuZ3RoPTA7Ci0gICAgTTRPU0FfVUludDMyICBjb3VudF9sbCA9IDA7Ci0gICAgTTRPU0FfVUludDMyICBjb3VudF90bSA9IDA7Ci0gICAgTTRPU0FfVUludDMyICBjb3VudF9hYSA9IDA7Ci0gICAgTTRPU0FfVUludDMyICBjb3VudDsKLSAgICBNNE9TQV9VSW50MzIgIG5iQ2hhcjsKLSAgICBNNE9TQV9JbnQzMiAgICAgZXJyOwotICAgIE00T1NBX0NoYXIgZmxhZ0NoYXJbXSAgICAgICAgICAgICA9ICInLSsgIzAiOwotICAgIE00T1NBX0NoYXIgd2lkdGhPclByZWNpc2lvbkNoYXJbXSA9ICIqMDEyMzQ1Njc4OSI7Ci0gICAgTTRPU0FfQ2hhciBvdGhlclByZWZpeENoYXJbXSAgICAgID0gImhsTCI7Ci0gICAgTTRPU0FfQ2hhciBjb252ZXJzaW9uQ2hhcltdICAgICAgID0gImRpb3V4WG5mZUVnR2NDc1NwJSI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyU1ByaW50Zlx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9VSW50MzIgJWxkIgotICAgICAgICAiTTRPU0FfQ2hhciogJXgpIixwU3RyT3V0LHN0ck91dE1heExlbixmb3JtYXQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJPdXQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTUHJpbnRmOlx0cFN0ck91dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gZm9ybWF0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclNQcmludGY6XHRmb3JtYXQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgdmFfc3RhcnQobWFya2VyLGZvcm1hdCk7Ci0KLSAgICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mICVbZmxhZ3NdW3dpZHRoXVsucHJlY2lzaW9uXWxsW2NvbnZlcnNpb25dICovCi0gICAgcFRlbXAgPSBmb3JtYXQ7Ci0gICAgd2hpbGUoKnBUZW1wKQotICAgIHsKLSAgICAgICAgcGVyY2VudFBvaW50ZXIgPSAoTTRPU0FfQ2hhciAqKXN0cmNocigoY29uc3QgY2hhciAqKXBUZW1wLCclJyk7IC8qIGdldCB0aGUgbmV4dCBwZXJjZW50IGNoYXJhY3RlciAqLwotICAgICAgICBpZighcGVyY2VudFBvaW50ZXIpCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgcFRlbXAgPSBwZXJjZW50UG9pbnRlcisxOyAgICAgICAgICAgLyogc3BhbiBpdCAqLwotICAgICAgICBpZighKnBUZW1wKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLChjb25zdCBjaGFyICopZmxhZ0NoYXIpOyAgICAvKiBzcGFuIHRoZSBvcHRpb25hbCBmbGFncyAqLwotICAgICAgICBpZighKnBUZW1wKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLChjb25zdCBjaGFyICopd2lkdGhPclByZWNpc2lvbkNoYXIpOyAvKiBzcGFuIHRoZSBvcHRpb25hbCB3aWR0aCAqLwotICAgICAgICBpZighKnBUZW1wKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIGlmKCpwVGVtcD09Jy4nKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVGVtcCsrOwotICAgICAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopd2lkdGhPclByZWNpc2lvbkNoYXIpOyAvKiBzcGFuIHRoZSBvcHRpb25hbCBwcmVjaXNpb24gKi8KLSAgICAgICAgfQotICAgICAgICBpZighKnBUZW1wKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIGlmKHN0cmxlbigoY29uc3QgY2hhciAqKXBUZW1wKT49MikKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilwVGVtcCwibGwiLDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvdW50X2xsKys7ICAgICAgICAgICAgICAgICAvKiBJIGdvdCBPTkUgKi8KLSAgICAgICAgICAgICAgICBwVGVtcCArPTI7ICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImxsIiBwcmVmaXggKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilwVGVtcCwidG0iLDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvdW50X3RtKys7Ci0gICAgICAgICAgICAgICAgcFRlbXAgKz0yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKXBUZW1wLCJhYSIsMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnRfYWErKzsKLSAgICAgICAgICAgICAgICBwVGVtcCArPTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopb3RoZXJQcmVmaXhDaGFyKTsgLyogc3BhbiB0aGUgb3RoZXIgb3B0aW9uYWwgcHJlZml4ICovCi0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKiljb252ZXJzaW9uQ2hhcik7Ci0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgIH0KLQotICAgIGNvdW50ID0gY291bnRfbGwgKyBjb3VudF90bSArIGNvdW50X2FhOwotCi0gICAgaWYoIWNvdW50KQotICAgIHsKLSAgICAgICAgZXJyPSB2c25wcmludGYoKGNoYXIgKilwU3RyT3V0LCAoc2l6ZV90KXN0ck91dE1heExlbiArIDEsIChjb25zdCBjaGFyICopZm9ybWF0LCBtYXJrZXIpOwotICAgICAgICB2YV9lbmQobWFya2VyKTsKLSAgICAgICAgaWYgKChlcnI8MCkgfHwgKChNNE9TQV9VSW50MzIpZXJyPnN0ck91dE1heExlbikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTdHJPdXRbc3RyT3V0TWF4TGVuXSA9ICdcMCc7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBuZXdGb3JtYXRMZW5ndGggPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilmb3JtYXQpICsgMTsKLQotICAgIG5ld0Zvcm1hdExlbmd0aCAtPSAoY291bnRfbGwrY291bnRfdG0rY291bnRfYWEpOwotCi0gICAgbmV3Rm9ybWF0ID0oTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5ld0Zvcm1hdExlbmd0aCwKLSAgICAgICAgTTRPU0FfQ0hBUlNUQVIsKE00T1NBX0NoYXIqKSJNNE9TQV9jaHJQcmludGY6IG5ld0Zvcm1hdCIpOwotICAgIGlmKE00T1NBX05VTEwgPT0gbmV3Rm9ybWF0KQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgbmV3Rm9ybWF0W25ld0Zvcm1hdExlbmd0aC0xXSA9ICdcMCc7Ci0gICAgcFRlbXAgPSBuZXdGb3JtYXQ7Ci0KLSAgICAvKiBjb3B5IGZvcm1hdCB0byBuZXdGb3JtYXQsIHJlcGxhY2luZyAlW2ZsYWdzXVt3aWR0aF1bLnByZWNpc2lvbl1sbFtjb252ZXJzaW9uXQotICAgICAqIGJ5ICVbZmxhZ3NdW3dpZHRoXVsucHJlY2lzaW9uXUk2NFtjb252ZXJzaW9uXSAqLwotICAgIHdoaWxlKCpmb3JtYXQpCi0gICAgewotICAgICAgICBuYkNoYXIgPSBzdHJjc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAiJSIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7ICAgICAgLyogY29weSBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgJSBjaGFyYWN0ZXIgKi8KLSAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgIHBUZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgICAgICAqcFRlbXArKyA9ICpmb3JtYXQrKzsgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlICUgY2hhcmFjdGVyICovCi0gICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKilmbGFnQ2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSBmbGFnIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgIHBUZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopd2lkdGhPclByZWNpc2lvbkNoYXIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgd2lkdGggY2hhcmFjdGVycyAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgICAgIGlmKCpmb3JtYXQ9PScuJykKLSAgICAgICAgewotICAgICAgICAgICAgKnBUZW1wKysgPSAqZm9ybWF0Kys7ICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBkb3QgY2hhcmFjdGVyICovCi0gICAgICAgICAgICBpZighZm9ybWF0KSBicmVhazsKLSAgICAgICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7Ci0gICAgICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSB3aWR0aCBjaGFyYWN0ZXJzICovCi0gICAgICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgICAgIHBUZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZighZm9ybWF0KSBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZihzdHJsZW4oKGNvbnN0IGNoYXIgKilmb3JtYXQpPj0yKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKWZvcm1hdCwgImxsIiwgMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7IC8qICVsICovCi0gICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImxsIiBwcmVmaXggKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilmb3JtYXQsICJ0bSIsIDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOyAvKiAlbCAqLwotICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJ0bSIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopZm9ybWF0LCAiYWEiLCAyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsKLSAgICAgICAgICAgICAgICBmb3JtYXQgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAiYWEiIHByZWZpeCAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKilvdGhlclByZWZpeENoYXIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgb3RoZXIgUHJlZml4ICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKWNvbnZlcnNpb25DaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOwotICAgICAgICAgICAgZm9ybWF0ICs9IG5iQ2hhcjsKLSAgICAgICAgICAgIHBUZW1wICAgKz0gbmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBaZXJvIHRlcm1pbmF0ZSB0aGUgZm9ybWF0IHN0cmluZy4gKi8KLSAgICAoKnBUZW1wKSA9ICdcMCc7Ci0KLSAgICBlcnIgPSB2c25wcmludGYoKGNoYXIgKilwU3RyT3V0LCAoc2l6ZV90KXN0ck91dE1heExlbiArIDEsIChjb25zdCBjaGFyICopbmV3Rm9ybWF0LCBtYXJrZXIpOwotICAgIHZhX2VuZChtYXJrZXIpOwotICAgIGZyZWUobmV3Rm9ybWF0KTsKLSAgICBpZiAoKGVycjwwKSB8fCAoKE00T1NBX1VJbnQzMillcnI+c3RyT3V0TWF4TGVuKSkKLSAgICB7Ci0gICAgICAgIHBTdHJPdXRbc3RyT3V0TWF4TGVuXSA9ICdcMCc7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfU1RSX09WRVJGTE9XOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0Nsb2NrLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ODE3YjIyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0Nsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0Nsb2NrLmMKLSAqIEBicmllZiAgICAgICAgQ2xvY2sgcmVsYXRlZCBmdW5jdGlvbnMKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgY2xvY2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ2xvY2suaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhbiBhYnNvbHV0ZSB0aW1lIHRvIGFuIHVua25vd24gcmVmZXJlbmNlIHdpdGgKLSAqICAgICAgICAgICAgIGEgaGlnaCBwcmVjaXNpb24uCi0gKiBAbm90ZSAgICAgICBJdCBtZWFucyBpdCBjYW4gb25seSBiZSB1c2VkIHRvIGdldCBhIHJlbGF0aXZlIHRpbWUgYnkgY29tcHV0aW5nCi0gKiAgICAgICAgICAgICBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRvIHRpbWVzLgotICogICAgICAgICAgICAgSXQgaXMgdG8gdGhlIGNhbGxlciB0byBhbGxvY2F0ZSB0aW1lLiBUaW1lIGlzIGV4cHJlc3NlZCBpbgotICogICAgICAgICAgICAgdGltZXNjYWxlIHVuaXQuCi0gKiAgICAgICAgICAgICBNNE9TQV9ST0xMT1ZFUl9DTE9DSyBpbiBNNE9TQV9UeXBlcy5oIG11c3QgYmUgY29uZmlndXJlZCB3aXRoIHRoZSByb2xsb3ZlcgotICogICAgICAgICAgICAgb2Zmc2V0IG9mIHRoaXMgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICAgICB0aW1lOiAoSU4vT1VUKSB0aW1lCi0gKiBAcGFyYW0gICAgICB0aW1lc2NhbGU6IChJTikgVGhlIHRpbWVzY2FsZSAodGltZSB1bml0IHBlciBzZWNvbmQpCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00V0FSX1RJTUVTQ0FMRV9UT09fQklHOiB0aGUgcHJlY2lzaW9uIG9mIHRoZSBzeXN0ZW0gY2xvY2sgaXMKLSAqICAgICAgICAgICAgIG5vdAotICogICAgICAgICAgICAgY29tcGxpYW50IHdpdGggdGhlIGlucHV0IHRpbWVzY2FsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jbG9ja0dldFRpbWUoTTRPU0FfVGltZSogcFRpbWUsIE00T1NBX1VJbnQzMiB0aW1lc2NhbGUpCi17Ci0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgc3RydWN0IHRpbWV6b25lIHR6OwotICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHUzMl90aW1lX2hpOwotICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZV9sbzsKLSAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWVfbGg7Ci0gICAgTTRPU0FfVUludDMyIGZhY3RvcjsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9jbG9ja0dldFRpbWVcdFx0TTRPU0FfVGltZSogMHgleFx0TTRPU0FfVUludDMyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWUsIHRpbWVzY2FsZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVGltZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jbG9ja0dldFRpbWU6IHBUaW1lIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSB0aW1lc2NhbGUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jbG9ja0dldFRpbWU6IHRpbWVzY2FsZSBpcyAwIik7Ci0KLSAgICBmYWN0b3IgPSAxMDAwMDAwIC8gdGltZXNjYWxlOwotCi0gICAgaWYoZ2V0dGltZW9mZGF5KCZ0diwgJnR6KSA9PSAwKQotICAgIHsKLSAgICAgICAgdTMyX3RpbWVfbG8gPSAodHYudHZfc2VjICYgMHhGRkZGKSAqIHRpbWVzY2FsZTsKLSAgICAgICAgdTMyX3RpbWVfaGkgPSAoKCh0di50dl9zZWMgPj4gMTYpICYgMHhGRkZGKSAqIHRpbWVzY2FsZSkgKyAoKHUzMl90aW1lX2xvID4+IDE2KSAmIDB4RkZGRik7Ci0gICAgICAgIHUzMl90aW1lX2xvICY9IDB4RkZGRjsKLSAgICAgICAgdTMyX3RpbWVfbG8gKz0gdHYudHZfdXNlYyAvIGZhY3RvcjsKLSAgICAgICAgdTMyX3RpbWVfaGkgKz0gKCh1MzJfdGltZV9sbyA+PiAxNikgJiAweEZGRkYpOwotICAgICAgICB1MzJfdGltZV9sbyAmPSAweEZGRkY7Ci0gICAgICAgIHUzMl90aW1lID0gKCh1MzJfdGltZV9oaSAmIDB4N0ZGRikgPDwgMTYpIHwgdTMyX3RpbWVfbG87Ci0gICAgfQotCi0gICAgLyogTTRPU0FfVGltZSBpcyBzaWduZWQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG1heCB2YWx1ZSovCi0gICAgaWYgKHUzMl90aW1lID4gTTRPU0FfSU5UMzJfTUFYKQotICAgIHsKLSAgICAgICAgdTMyX3RpbWUgPSB1MzJfdGltZSAtIE00T1NBX0lOVDMyX01BWDsKLSAgICB9Ci0KLSAgICAqcFRpbWUgPSAoTTRPU0FfVGltZSl1MzJfdGltZTsKLQotICAgIGlmKCB0aW1lc2NhbGUgPiAxMDAwMCApCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfVElNRVNDQUxFX1RPT19CSUc7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlQ29tbW9uLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlQ29tbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxMmRiNWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVDb21tb24uYwotICogQGJyaWVmICAgICAgICBGaWxlIGNvbW1vbiBmb3IgQW5kcm9pZAotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdXNlZCBieSBib3RoIHRoZSBmaWxlIHdyaXRlcgotICogICAgICAgICAgICAgICBhbmQgZmlsZSByZWFkZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MKLSNlcnJvciAiVVNFX1NUQUdFRlJJR0hUX0NPREVDUyBpcyBub3QgZGVmaW5lZCIKLSNlbmRpZiAvKlVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MqLwotCi0jaWZkZWYgVVRGX0NPTlZFUlNJT04KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZiAvKlVURl9DT05WRVJTSU9OKi8KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb25fcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgcHJvdmlkZWQgVVJMIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgotICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJlZCwgdGhlIGNvbnRleHQgaXMgc2V0IHRvIE5VTEwuCi0gKiBAcGFyYW0gICAgICBjb3JlX2lkOiAoSU4pIENvcmUgSUQgb2YgdGhlIGNhbGxlciAoTTRPU0FfRklMRV9SRUFERVIgb3IgTTRPU0FfRklMRV9XUklURVIpCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICB1cmw6IChJTikgVVJMIG9mIHRoZSBpbnB1dCBmaWxlCi0gKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgIGZpbGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTE9DS0VEOiB0aGUgZmlsZSBpcyBsb2NrZWQgYnkgYW4gb3RoZXIKLSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Byb2Nlc3MKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uT3BlbihNNE9TQV9VSW50MTYgY29yZV9pZCwgTTRPU0FfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcFVybCwgTTRPU0FfRmlsZU1vZGVBY2Nlc3MgZmlsZU1vZGVBY2Nlc3MpCi17Ci0KLSAgICBNNE9TQV9JbnQzMiBpICAgICAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIGlNb2RlICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgaVNpemUgICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBpU2F2ZVBvcyAgICA9IDA7Ci0KLSAgICBNNE9TQV9DaGFyICBtb2RlWzRdICAgICAgICAgICAgPSAiIjsKLSAgICBNNE9TQV9DaGFyKiBwUmVhZFN0cmluZyAgICAgICAgPSAoTTRPU0FfQ2hhciopInIiOwotICAgIE00T1NBX0NoYXIqIHBXcml0ZVN0cmluZyAgICA9IChNNE9TQV9DaGFyKikidyI7Ci0gICAgTTRPU0FfQ2hhciogcEFwcGVuZFN0cmluZyAgICA9IChNNE9TQV9DaGFyKikiYSI7Ci0gICAgTTRPU0FfQ2hhciogcEJpbmFyeVN0cmluZyAgICA9IChNNE9TQV9DaGFyKikiYiI7Ci0gICAgTTRPU0FfQ2hhciogcFBsdXNTdHJpbmcgICAgICAgID0gKE00T1NBX0NoYXIqKSIrIjsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgRklMRSogcEZpbGVIYW5kbGVyID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCAqcEZpbGVDb250ZXh0ICAgID0gTTRPU0FfTlVMTDsKLQotCi0jaWZkZWYgVVRGX0NPTlZFUlNJT04KLSAgICAvKkZCOiB0byB0ZXN0IHRoZSBVVEYxNi0+VVRGOCBjb252ZXJzaW9uIGludG8gVmlkZW8gQXJ0aXN0Ki8KLSAgICAvKkNvbnZlcnQgdGhlIFVSTCBmcm9tIFVURjE2IHRvIFVURjgqLwotICAgIE00T1NBX1ZvaWQqIHRlbXBDb252ZXJzaW9uQnVmOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wQ29udmVyc2lvblNpemUgPSAxMDAwOwotCi0gICAgdGVtcENvbnZlcnNpb25CdWYgPSAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHRlbXBDb252ZXJzaW9uU2l6ZSArMSwgMCwgImNvbnZlcnNpb24gYnVmIik7Ci0gICAgaWYodGVtcENvbnZlcnNpb25CdWYgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciB3aGVuIGFsbG9jYXRpbmcgY29udmVyc2lvbiBidWZmZXJcbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBNNE9TQV9Ub1VURjhfT1NBTChwVXJsLCB0ZW1wQ29udmVyc2lvbkJ1ZiwgJnRlbXBDb252ZXJzaW9uU2l6ZSk7Ci0gICAgKChNNE9TQV9DaGFyKil0ZW1wQ29udmVyc2lvbkJ1ZilbdGVtcENvbnZlcnNpb25TaXplIF0gPSAnXDAnOwotCi0gICAgcHJpbnRmKCJmaWxlIG9wZW4gJXNcbiIsIHRlbXBDb252ZXJzaW9uQnVmKTsKLSNlbmRpZiAvKlVURiBDT05WRVJTSU9OKi8KLQotICAgIE00T1NBX1RSQUNFM180KCJNNE9TQV9maWxlQ29tbW9uT3Blblx0XHRNNE9TQV9VSW50MTYgJWRcdE00T1NBX0NvbnRleHQqIDB4JXhcdCIKLSAgICAgICAgIk00T1NBX0NoYXIqICVzXHRmaWxlTW9kZUFjY2VzcyAlZCIsIGNvcmVfaWQsIHBDb250ZXh0LCBwVXJsLCBmaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgICAgTTRFUlJfUEFSQU1FVEVSLCAgICAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVXJsLCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAgICAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IHBVcmwgIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBmaWxlTW9kZUFjY2VzcywgICAgTTRFUlJfUEFSQU1FVEVSLCAgICAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IGZpbGVNb2RlQWNjZXNzIGlzIDAiKTsKLQotICAgIC8qIFJlYWQgbW9kZSBub3Qgc2V0IGZvciB0aGUgcmVhZGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKSAmJiAhKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVSZWFkIik7Ci0KLSAgICAvKiBSZWFkIG1vZGUgbm90IHNldCBmb3IgdGhlIHJlYWRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgIShmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlUmVhZCIpOwotCi0gICAgLyogTTRPU0FmaWxlUmVhZE9wZW4gY2Fubm90IGJlIHVzZWQgd2l0aCBXcml0ZSBmaWxlIG1vZGUgYWNjZXNzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKSAmJiAoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVXcml0ZSIpOwotCi0gICAgLyogQXBwZW5kIGFuZCBDcmVhdGUgZmxhZ3MgY2Fubm90IGJlIHVzZWQgd2l0aCBSZWFkICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKSAmJiAoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlQXBwZW5kIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmIChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQ3JlYXRlKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVDcmVhdGUiKTsKLQotICAgIC8qIFdyaXRlIG1vZGUgbm90IHNldCBmb3IgdGhlIHdyaXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9XUklURVIgPT0gY29yZV9pZCkgJiYgIShmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVdyaXRlIik7Ci0KLSAgICAvKiBDcmVhdGUgZmxhZyBuZWNlc3NhcnkgZm9yIG9wZW5pbmcgZmlsZSAqLwotICAgIGlmICgoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpICYmCi0gICAgICAgIChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpJiYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUNyZWF0ZSkpCi0gICAgewotICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwV3JpdGVTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBQbHVzU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQXBwZW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwQXBwZW5kU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBSZWFkU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwV3JpdGVTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZigoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpJiYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsKGNvbnN0IGNoYXIgKilwUGx1c1N0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUlzVGV4dE1vZGUpKQotICAgIHsKLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcEJpbmFyeVN0cmluZywoc2l6ZV90KTEpOwotICAgIH0KLQotICAgIC8qT3BlbiB0aGUgZmlsZSovCi0KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotICAgIC8qT3BlbiB0aGUgY29udmVydGVkIHBhdGgqLwotICAgIHBGaWxlSGFuZGxlciA9IGZvcGVuKChjb25zdCBjaGFyICopdGVtcENvbnZlcnNpb25CdWYsIChjb25zdCBjaGFyICopbW9kZSk7Ci0gICAgLypGcmVlIHRoZSB0ZW1wb3JhcnkgZGVjb2RlZCBidWZmZXIqLwotICAgIGZyZWUodGVtcENvbnZlcnNpb25CdWYpOwotI2Vsc2UgLyogVVRGX0NPTlZFUlNJT04gKi8KLSAgICBwRmlsZUhhbmRsZXIgPSBmb3BlbigoY29uc3QgY2hhciAqKXBVcmwsIChjb25zdCBjaGFyICopbW9kZSk7Ci0jZW5kaWYgLyogVVRGX0NPTlZFUlNJT04gKi8KLQotICAgIGlmIChNNE9TQV9OVUxMID09IHBGaWxlSGFuZGxlcikKLSAgICB7Ci0gICAgICAgIHN3aXRjaChlcnJubykKLSAgICAgICAgewotICAgICAgICBjYXNlIEVOT0VOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9GSUxFX05PVF9GT1VORCwgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Iik7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkZpbGUgbm90IGZvdW5kOiAlcyIsIHBVcmwpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9GSUxFX05PVF9GT1VORDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBFQUNDRVM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfRklMRV9MT0NLRUQsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogUGVybWlzc2lvbiBkZW5pZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9MT0NLRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICBjYXNlIEVJTlZBTDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IEludmFsaWQgQXJndW1lbnQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKLSAgICAgICAgIH0KLSAgICAgICAgY2FzZSBFTUZJTEU6Ci0gICAgICAgICBjYXNlIEVOT1NQQzoKLSAgICAgICAgY2FzZSBFTk9NRU06Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogVG9vIG1hbnkgb3BlbiBmaWxlcyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgZmlsZSBjb250ZXh0ICovCi0gICAgcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9GaWxlQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgIGNvcmVfaWQsIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbk9wZW46IGZpbGUgY29udGV4dCIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShwRmlsZUhhbmRsZXIpOwotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25PcGVuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyAgICAgICAgPSBwRmlsZUhhbmRsZXI7Ci0gICAgcEZpbGVDb250ZXh0LT5hY2Nlc3NfbW9kZSAgICA9IGZpbGVNb2RlQWNjZXNzOwotICAgIHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrICAgID0gU2Vla05vbmU7Ci0gICAgcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlICAgID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlOiBOZXZlciB1c2UgdGhpcyBleHByZXNzaW9uICJpID0gKHZhbHVlMSA9PSB2YWx1ZTIpID8geDogeTsiCi0gICAgICogYmVjYXVzZSB0aGF0IGRvZW5zJ3QgY29tcGlsZSBvbiBvdGhlciBwbGF0Zm9ybXMgKEFEUyBmb3IgZXhhbXBsZSkKLSAgICAgKiBVc2U6IGlmKHZhbHVlMSA9PSB2YWx1ZTIpCi0gICAgICogICAgICAgIHsgaT0geDsgLi5ldGMKLSAgICAgKi8KLSAgICBwRmlsZUNvbnRleHQtPmNvcmVJRF93cml0ZSA9IDA7Ci0gICAgcEZpbGVDb250ZXh0LT5jb3JlSURfcmVhZCA9IDA7Ci0gICAgcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcyA9IE00T1NBX2tEZXNjTm9uZUFjY2VzczsKLQotICAgIGlmIChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5jb3JlSURfcmVhZCA9IGNvcmVfaWQ7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MgPSBNNE9TQV9rRGVzY1JlYWRBY2Nlc3M7Ci0gICAgfQotICAgIGVsc2UgaWYgKE00T1NBX0ZJTEVfV1JJVEVSID09IGNvcmVfaWQpCi0gICAgewotICAgICAgICBwRmlsZUNvbnRleHQtPmNvcmVJRF93cml0ZSA9IGNvcmVfaWQ7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MgPSBNNE9TQV9rRGVzY1dyaXRlQWNjZXNzOwotICAgIH0KLQotICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiA9IDA7Ci0gICAgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA9IDA7Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IHRvIHN0b3JlIHRoZSBVUkwgc3RyaW5nICovCi0gICAgcEZpbGVDb250ZXh0LT51cmxfbmFtZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbigoY29uc3QgY2hhciAqKXBVcmwpKzEsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2lkLCAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25PcGVuOiBVUkwgbmFtZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+dXJsX25hbWUpCi0gICAgewotICAgICAgICBmY2xvc2UocEZpbGVIYW5kbGVyKTsKLSAgICAgICAgZnJlZShwRmlsZUNvbnRleHQpOwotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25PcGVuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgTTRPU0FfY2hyTkNvcHkocEZpbGVDb250ZXh0LT51cmxfbmFtZSwgcFVybCwgc3RybGVuKChjb25zdCBjaGFyICopcFVybCkrMSk7Ci0KLSAgICAvKiBHZXQgdGhlIGZpbGUgbmFtZSAqLwotICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZShwVXJsLCAmcEZpbGVDb250ZXh0LT5maWxlX25hbWUpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgZmNsb3NlKHBGaWxlSGFuZGxlcik7Ci0gICAgICAgIGZyZWUocEZpbGVDb250ZXh0LT51cmxfbmFtZSk7Ci0gICAgICAgIGZyZWUocEZpbGVDb250ZXh0KTsKLSAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlT3BlbigmKHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpLCAxKTsgLyogQWxsb2NhdGUgdGhlIHNlbWFwaG9yZSAqLwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0KLSNpZmRlZiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTCi0gICAgLy8gV29ya2Fyb3VuZCBmb3IgZmlsZSBzeXN0ZW0gYnVnIG9uIFN0aW5ncmF5L0hvbmV5Y29tYiB3aGVyZSBhIGZpbGUgcmUtY3JlYXRlZCB3aWxsIGtlZXAKLSAgICAvLyB0aGUgb3JpZ2luYWwgZmlsZSdzIHNpemUgZmlsbGVkIHdpdGggMHMuIERvIG5vdCBzZWVrIHRvIHRoZSBlbmQgdG8gYXZvaWQgaWxsIGVmZmVjdHMKLSAgICBpZihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQXBwZW5kKSB7Ci0gICAgICAgIC8qIEdldCB0aGUgZmlsZSBzaXplICovCi0gICAgICAgIGlTYXZlUG9zID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICAgICAgZnNlZWsocEZpbGVIYW5kbGVyLCAwLCBTRUVLX0VORCk7ICAgICAgICAvKiAgICAyLSBHbyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlKi8KLSAgICAgICAgaVNpemUgPSBmdGVsbChwRmlsZUhhbmRsZXIpOyAgICAgICAgICAgIC8qICAgIDMtIENoZWNrIHRoZSBmaWxlIHNpemUgICAgICAgICovCi0gICAgICAgIGZzZWVrKHBGaWxlSGFuZGxlciwgaVNhdmVQb3MsIFNFRUtfU0VUKTsvKiAgICA0LSBnbyB0byB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICB9IGVsc2UgewotICAgICAgICBpU2l6ZSA9IDA7Ci0gICAgfQotI2Vsc2UgLyogVVNFX1NUQUdFRlJJR0hUX0NPREVDUyAqLwotICAgIC8qIEdldCB0aGUgZmlsZSBzaXplICovCi0gICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUhhbmRsZXIpOyAgICAgICAgICAgIC8qICAgIDEtIENoZWNrIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgIGZzZWVrKHBGaWxlSGFuZGxlciwgMCwgU0VFS19FTkQpOyAgICAgICAgLyogICAgMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSovCi0gICAgaVNpemUgPSBmdGVsbChwRmlsZUhhbmRsZXIpOyAgICAgICAgICAgIC8qICAgIDMtIENoZWNrIHRoZSBmaWxlIHNpemUgICAgICAgICovCi0gICAgZnNlZWsocEZpbGVIYW5kbGVyLCBpU2F2ZVBvcywgU0VFS19TRVQpOy8qICAgIDQtIGdvIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotI2VuZGlmIC8qIFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgKi8KLQotCi0KLSAgICAvKiBXYXJuaW5nIHBvc3NpYmxlIG92ZXJmbG93IGlmIHRoZSBmaWxlIGlzIGhpZ2hlciB0aGFuIDJHQnl0ZXMgKi8KLSAgICBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSA9IGlTaXplOwotCi0gICAgKnBDb250ZXh0ID0gcEZpbGVDb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnQgZnJvbSBVVEYxNiB0byBVVEY4Ci0gKiBAcGFyYW0gICAgICBwQnVmZmVySW46IChJTikgVVRGMTYgaW5wdXQgcGF0aAotICogQHBhcmFtICAgICAgcEJ1ZmZlck91dDogKE9VVCkgVVRGOCBvdXRwdXQgcGF0aAotICogQHBhcmFtICAgICAgYnVmZmVyT3V0U2l6ZTogKElOL09VVCkgc2l6ZSBvZiB0aGUgb3V0cHV0IHBhdGgKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHRoZSBvdXRwdXQgcGF0aCBzaXplIGlzIG5vdCBlbm91Z2ggdG8gY29udGFpbgotICogICAgICAgICAgICAgICB0aGUgZGVjb2RlZCBwYXRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmZGVmIFVURl9DT05WRVJTSU9OCi1NNE9TQV9FUlIgTTRPU0FfVG9VVEY4X09TQUwgKE00T1NBX1ZvaWQgICAqcEJ1ZmZlckluLCBNNE9TQV9VSW50OCAgKnBCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpidWZmZXJPdXRTaXplKQotewotICAgIE00T1NBX1VJbnQxNiBpOwotICAgIHdjaGFyX3QgICAgICAqd19zdHIgPSAod2NoYXJfdCAqKSBwQnVmZmVySW47Ci0gICAgTTRPU0FfVUludDMyIGxlbiwgc2l6ZV9uZWVkZWQsIHNpemVfZ2l2ZW47Ci0gICAgaWYgKHBCdWZmZXJJbiA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgKnBCdWZmZXJPdXQ9TlVMTDsKLSAgICAgICAgKmJ1ZmZlck91dFNpemU9MTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbGVuICAgICAgICAgPSB3Y3NsZW4od19zdHIpOwotICAgICAgICBzaXplX25lZWRlZCA9IGxlbisxOwotICAgICAgICBzaXplX2dpdmVuICA9ICpidWZmZXJPdXRTaXplOwotCi0gICAgICAgKmJ1ZmZlck91dFNpemU9c2l6ZV9uZWVkZWQ7Ci0gICAgICAgIGlmIChzaXplX2dpdmVuIDwgc2l6ZV9uZWVkZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEJ1ZmZlck91dFtpXT0oTTRPU0FfVUludDgpd19zdHJbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQnVmZmVyT3V0W2xlbl09MDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLSNlbmRpZiAvKlVURiBDT05WRVJTSU9OKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbi4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIHNlZWtNb2RlOiAoSU4pIFNlZWsgYWNjZXNzIG1vZGUKLSAqIEBwYXJhbSAgICAgIHBvc2l0aW9uOiAoSU4vT1VUKSBQb3NpdGlvbiBpbiB0aGUgZmlsZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjogdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZWFjaGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25TZWVrKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcEZpbGVQb3MpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX2N1cnJlbnQ7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3Nfc2VlazsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19udWxsID0gMDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19uZWdfdW4gPSAtMTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19maWxlX3NpemU7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3Nfc2Vla19mcm9tX2JlZ2lubmluZzsKLQotICAgIE00T1NBX1RSQUNFM18zKCJNNE9TQV9maWxlQ29tbW9uU2Vla1x0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgJWRcdE00T1NBX0ZpbGVQb3NpdGlvbiogMHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBzZWVrTW9kZSwgcEZpbGVQb3MpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gc2Vla01vZGUsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVQb3MsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0KLSAgICBmcG9zX2ZpbGVfc2l6ZSA9IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplOwotCi0gICAgaWYoU2Vla1JlYWQgPT0gcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWspCi0gICAgewotICAgICAgICBmcG9zX2N1cnJlbnQgPSBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb247Ci0gICAgfQotICAgIGVsc2UgaWYoU2Vla1dyaXRlID09IHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrKQotICAgIHsKLSAgICAgICAgZnBvc19jdXJyZW50ID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZnBvc19jdXJyZW50ID0gMDsKLSAgICB9Ci0KLSAgICBzd2l0Y2goc2Vla01vZGUpCi0gICAgewotICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudDoKLSAgICAgICAgewotICAgICAgICAgICAgZnBvc19zZWVrID0gKnBGaWxlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZzoKLSAgICAgICAgewotICAgICAgICAgICAgZnBvc19zZWVrID0gKnBGaWxlUG9zIC0gZnBvc19jdXJyZW50OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0VuZDoKLSAgICAgICAgewotICAgICAgICAgICAgZnBvc19zZWVrID0gKnBGaWxlUG9zICsgZnBvc19maWxlX3NpemUgLSBmcG9zX2N1cnJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmcG9zX3NlZWtfZnJvbV9iZWdpbm5pbmcgPSBmcG9zX2N1cnJlbnQgKyBmcG9zX3NlZWs7Ci0KLSAgICBpZihmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgZnBvc19zZWVrLCBTRUVLX0NVUikgIT0gMCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaChlcnJubykKLSAgICAgICAgewotICAgICAgICBjYXNlIEVJTlZBTDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIG1lYW5pbmcgdGhlIHZhbHVlIGZvciBvcmlnaW4gaXMgaW52YWxpZCBvciB0aGUgcG9zaXRpb24KLSAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgb2Zmc2V0IGlzIGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIEVCQURGOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsvKiBmaWxlIGhhbmRsZSBpcyBpbnZhbGlkICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHJldHVybmVkIHBvc2l0aW9uIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSAqLwotICAgICpwRmlsZVBvcyA9IGZwb3Nfc2Vla19mcm9tX2JlZ2lubmluZzsKLQotICAgIC8qIFNFRUsgZG9uZSwgcmVzZXQgZW5kIG9mIGZpbGUgdmFsdWUgKi8KLSAgICBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGUgPSBNNE9TQV9GQUxTRTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRvIGNsb3NlIHRoZSBmaWxlIChhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0KQotICogQG5vdGUgICAgICAgVGhlIGNvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIvd3JpdGVyIGlzIGZyZWVkLgotICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uQ2xvc2UoTTRPU0FfVUludDE2IGNvcmVfaWQsIE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotICAgIE00T1NBX0ludDMyIGkzMl9lcnJfY29kZT0wOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25DbG9zZVx0TTRPU0FfVUludDE2ICVkXHRNNE9TQV9Db250ZXh0IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaWQsIHBDb250ZXh0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwKLSAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vbkNsb3NlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25DbG9zZTogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGZyZWUocEZpbGVDb250ZXh0LT51cmxfbmFtZSk7Ci0gICAgcEZpbGVDb250ZXh0LT51cmxfbmFtZSA9IE00T1NBX05VTEw7Ci0KLSAgICBmcmVlKHBGaWxlQ29udGV4dC0+ZmlsZV9uYW1lKTsKLSAgICBwRmlsZUNvbnRleHQtPmZpbGVfbmFtZSA9IE00T1NBX05VTEw7Ci0KLSAgICBpMzJfZXJyX2NvZGUgPSBmY2xvc2UocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotCi0gICAgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MgPSBNNE9TQV9OVUxMOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZUNsb3NlKHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOy8qIGZyZWUgdGhlIHNlbWFwaG9yZSAqLwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGZyZWUocEZpbGVDb250ZXh0KTsKLQotICAgIGlmIChpMzJfZXJyX2NvZGUgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZUNvbW1vbkNsb3NlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgZmlsZSBhdHRyaWJ1dGVzIChhc3NvY2lhdGVkIHRvIHRoZQotICogICAgICAgICAgICAgY29udGV4dCkKLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTikgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgYXR0cmlidXRlOiAoT1VUKSBUaGUgZmlsZSBhdHRyaWJ1dGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlQXR0cmlidXRlKiBwQXR0cmlidXRlKQotewotCi0gICAgTTRPU0FfRmlsZUNvbnRleHQqIGZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0KLSAgICBzdHJ1Y3Qgc3RhdCBUaGVTdGF0OwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGVcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAiTTRPU0FfRmlsZUF0dHJpYnV0ZSogMHgleCIsIHBDb250ZXh0LCBwQXR0cmlidXRlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBBdHRyaWJ1dGUsICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUiKTsKLQotICAgIGlmKHN0YXQoKGNoYXIqKWZpbGVDb250ZXh0LT51cmxfbmFtZSwgJlRoZVN0YXQpICE9IDApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIHBBdHRyaWJ1dGUtPmNyZWF0aW9uRGF0ZS50aW1lID0gKE00T1NBX1RpbWUpVGhlU3RhdC5zdF9jdGltZTsKLSAgICBwQXR0cmlidXRlLT5sYXN0QWNjZXNzRGF0ZS50aW1lID0gKE00T1NBX1RpbWUpVGhlU3RhdC5zdF9hdGltZTsKLSAgICBwQXR0cmlidXRlLT5tb2RpZmllZERhdGUudGltZSA9IChNNE9TQV9UaW1lKVRoZVN0YXQuc3RfbXRpbWU7Ci0KLSAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUudGltZVNjYWxlID0gMTsKLSAgICBwQXR0cmlidXRlLT5sYXN0QWNjZXNzRGF0ZS50aW1lU2NhbGUgPSAxOwotICAgIHBBdHRyaWJ1dGUtPm1vZGlmaWVkRGF0ZS50aW1lU2NhbGUgPSAxOwotCi0gICAgcEF0dHJpYnV0ZS0+Y3JlYXRpb25EYXRlLnJlZmVyZW5jZVllYXIgPSAxOTcwOwotICAgIHBBdHRyaWJ1dGUtPmxhc3RBY2Nlc3NEYXRlLnJlZmVyZW5jZVllYXIgPSAxOTcwOwotICAgIHBBdHRyaWJ1dGUtPm1vZGlmaWVkRGF0ZS5yZWZlcmVuY2VZZWFyID0gMTk3MDsKLQotICAgIHBBdHRyaWJ1dGUtPm1vZGVBY2Nlc3MgPSBmaWxlQ29udGV4dC0+YWNjZXNzX21vZGU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGZpbGUgVVJMIChhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4pIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIHVybDogKE9VVCkgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBVUkwgKGFsbG9jYXRlZCBieQotICogICAgICAgICAgICAgTTRPU0FfZmlsZUNvbW1vbkdldFVSTCkKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRVUkwoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ2hhcioqIHBVcmwpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiAgICB1aUxlbmd0aDsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNE9TQV9maWxlQ29tbW9uR2V0VVJMXHRNNE9TQV9Db250ZXh0IDB4JXhcdE00T1NBX0NoYXIqKiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHBVcmwpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uR2V0VVJMOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uR2V0VVJMOiBwVXJsIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHVpTGVuZ3RoID0gc3RybGVuKChjb25zdCBjaGFyICopcEZpbGVDb250ZXh0LT51cmxfbmFtZSkrMTsKLQotICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgdG8gc3RvcmUgdGhlIHVybF9uYW1lICovCi0gICAgKnBVcmwgPSAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHVpTGVuZ3RoLCBNNE9TQV9GSUxFX0NPTU1PTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbkdldFVSTDogdXJsIik7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSAqcFVybCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbkdldFVSTCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfY2hyTkNvcHkoKnBVcmwsIHBGaWxlQ29udGV4dC0+dXJsX25hbWUsIHVpTGVuZ3RoKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpbGUgbmFtZSBhc3NvY2lhdGVkCi0gKiAgICAgICAgICAgICB0byB0aGUgaW5wdXQgVVJMLgotICogQG5vdGUgICAgICAgVGhlIHVzZXIgc2hvdWxkIG5vdCBmb3JnZXQgdG8gZGVsZXRlIHRoZSBvdXRwdXQgc3RyaW5nIHVzaW5nCi0gKiAgICAgICAgICAgICBNNE9TQV9zdHJEZXN0cm95Ci0gKiBAcGFyYW0gICAgICBwVXJsOiAgICAgICAgICAgIChJTikgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBVUkwKLSAqIEBwYXJhbSAgICAgIHBGaWxlTmFtZTogICAgKE9VVCkgVGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBVUkwuIEl0IGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgaW5zaWRlIHRoaXMgZnVuY3Rpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICBmaWxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZShNNE9TQV9DaGFyKiBwVXJsLCBNNE9TQV9DaGFyKiogcEZpbGVOYW1lKQotewotICAgIE00T1NBX0ludDMyIGkgICAgICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgaVVybExlbiAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIEZpbGVOYW1lTGVuID0gMDsKLQotICAgIE00T1NBX0NoYXIqIHB0clVybCAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0NoYXIqIHB0ckZpbGVuYW1lICAgID0gTTRPU0FfTlVMTDsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNE9TQV9maWxlQ29tbW9uR2V0VVJMXHRNNE9TQV9DaGFyKiAlc1x0TTRPU0FfQ2hhcioqIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVybCwgcEZpbGVOYW1lKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBVcmwsICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZTogcFVybCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVOYW1lLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lOiBwRmlsZU5hbWUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgKnBGaWxlTmFtZSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKlBhcnNlIFVSTCovCi0gICAgaVVybExlbiA9IHN0cmxlbigoY29uc3QgY2hhciAqKXBVcmwpOwotICAgIGZvcihpPWlVcmxMZW4tMTsgaT49MDsgaS0tKQotICAgIHsKLSAgICAgICAgaWYgKHBVcmxbaV0gIT0gJ1xcJyAmJiBwVXJsW2ldICE9ICcvJykKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZU5hbWVMZW4rKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOyAvKiBmaW5kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgbmFtZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHRyRmlsZW5hbWUgPSAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhGaWxlTmFtZUxlbisxLCBNNE9TQV9GSUxFX0NPTU1PTiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWU6IEZpbGVuYW1lIHN0cmluZyIpOwotICAgIGlmIChwdHJGaWxlbmFtZSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHB0clVybCA9IHBVcmwgKyAoaVVybExlbiAtIEZpbGVOYW1lTGVuKTsKLSAgICBNNE9TQV9jaHJOQ29weShwdHJGaWxlbmFtZSwgcHRyVXJsLCBGaWxlTmFtZUxlbisxKTsKLQotICAgICpwRmlsZU5hbWUgPSBwdHJGaWxlbmFtZTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlUmVhZGVyLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlUmVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwYTcyZjUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlci5jCi0gKiBAYXV0aG9yICAgICAgIENlZHJpYyBMZWNvdXRyZSAoY2VkcmljLmxlY291dHJlQHBoaWxpcHMuY29tKQotICogICAgICAgICAgICAgICBMYXVyZW50IEZheSAobGF1cmVudC5mYXlAcGhpbGlwcy5jb20pCi0gKiBAcGFyIE9yZzogICAgIFBoaWxpcHMgRGlnaXRhbCBTeXN0ZW1zIExhYm9yYXRvcmllcyAtIFBhcmlzIChQRFNMLVApCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgcmVhZGVyIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byByZWFkIGEgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXJfcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBwcm92aWRlZCBVUkwgYW5kIHJldHVybnMgaXRzIGNvbnRleHQuCi0qICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VyZWQsIHRoZSBjb250ZXh0IGlzIHNldCB0byBOVUxMLgotKiBAcGFyYW0gICAgICBjb250ZXh0OiAoT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0qIEBwYXJhbSAgICAgIHVybDogKElOKSBVUkwgb2YgdGhlIGlucHV0IGZpbGUKLSogQHBhcmFtICAgICAgZmlsZU1vZGVBY2Nlc3M6IChJTikgRmlsZSBtb2RlIGFjY2VzcwotKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSogICAgICAgICAgICAgZmlsZQotKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX05PVF9GT1VORDogdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kCi0qIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTE9DS0VEOiB0aGUgZmlsZSBpcyBsb2NrZWQgYnkgYW4gb3RoZXIKLSogICAgICAgICAgICAgYXBwbGljYXRpb24vcHJvY2VzcwotKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzogdGhlIGZpbGUgbW9kZSBhY2Nlc3MgaXMgbm90IGNvcnJlY3QKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW4oTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9maWxlUmVhZE9wZW4gOiBwQyA9IDB4JXAgIGZkID0gMHglcCAgbW9kZSA9ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHBGaWxlRGVzY3JpcHRvciwgZmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX0ZJTEVfUkVBREVSLCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVEZXNjcmlwdG9yLCBmaWxlTW9kZUFjY2Vzcyk7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlICdzaXplJyBieXRlcyBpbiB0aGUgY29yZSBmaWxlIHJlYWRlcgotKiAgICAgICAgICAgICAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykgYW5kIHdyaXRlcyB0aGUgZGF0YSB0byB0aGUgJ2RhdGEnCi0qICAgICAgICAgICAgIHBvaW50ZXIuCi0qIEBub3RlICAgICAgIElmICdzaXplJyBieXRlIGNhbm5vdCBiZSByZWFkIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyLCAnc2l6ZScKLSogICAgICAgICAgICAgcGFyYW1ldGVyIGlzIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGNvcnJlY3QKLSogQG5vdGUgICAgICAgbnVtYmVyIG9mIHJlYWQgYnl0ZXMuCi0qIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSogQHBhcmFtICAgICAgYnVmZmVyOiAoT1VUKSBEYXRhIHBvaW50ZXIgb2YgdGhlIHJlYWQgZGF0YQotKiBAcGFyYW0gICAgICBzaXplOiAoSU4vT1VUKSBTaXplIG9mIHRoZSBkYXRhIHRvIHJlYWQgKGluIGJ5dGVzKQotKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICBNNFdBUl9OT19EQVRBX1lFVDogdGhlcmUgaXMgbm8gZW5vdWdoIGRhdGEgdG8gZmlsbCB0aGUgJ2RhdGEnCi0qICAgICAgICAgICAgIGJ1ZmZlciwgc28gdGhlIHNpemUgcGFyYW1ldGVyIGhhcyBiZWVuIHVwZGF0ZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWREYXRhKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX01lbUFkZHI4IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBTaXplKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9JbnQzMiAgICB1aVNpemVSZWFkOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVSZWFkRGF0YSA6IGRhdGEgPSAweCVwICBzaXplID0gJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIChNNE9TQV9OVUxMICE9IHBTaXplKSA/ICgqcFNpemUpIDogMCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZERhdGE6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBkYXRhLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZERhdGE6IGRhdGEgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTaXplLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkRGF0YTogcFNpemUgaXMgTTRPU0FfTlVMTCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlUmVhZERhdGE6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZihNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpIC8qIHJlYWQgd3JpdGUgKi8KLSAgICB7Ci0gICAgICAgIHVpU2l6ZVJlYWQgPSBmcmVhZChkYXRhLCBzaXplb2YoTTRPU0FfQ2hhciksICpwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0gICAgICAgIGlmKC0xID09IHVpU2l6ZVJlYWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGhhbmRsZSBpcyBpbnZhbGlkLCBvciB0aGUgZmlsZSBpcyBub3Qgb3BlbiBmb3IgcmVhZGluZywgb3IgdGhlIGZpbGUgaXMgbG9ja2VkICovCi0gICAgICAgICAgICAqcFNpemUgPSAwOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gKyB1aVNpemVSZWFkOwotICAgICAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpdWlTaXplUmVhZCA8ICpwU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOwotICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIGVuZCBvZiBmaWxlICovCi0gICAgICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmKHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrICE9IFNlZWtSZWFkKQotICAgIHsKLSAgICAgICAgLyogZnNlZWsgdG8gdGhlIGxhc3QgcmVhZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24pKTsKLSAgICAgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVSZWFkRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrUmVhZDsKLSAgICB9Ci0KLSAgICAvKiBSZWFkIGRhdGEgKi8KLSAgICB1aVNpemVSZWFkID0gZnJlYWQoZGF0YSwgc2l6ZW9mKE00T1NBX0NoYXIpLCAqcFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotICAgIGlmKC0xID09IHVpU2l6ZVJlYWQpCi0gICAgewotICAgICAgICAvKiBoYW5kbGUgaXMgaW52YWxpZCwgb3IgdGhlIGZpbGUgaXMgbm90IG9wZW4gZm9yIHJlYWRpbmcsCi0gICAgICAgICBvciB0aGUgZmlsZSBpcyBsb2NrZWQgKi8KLSAgICAgICAgKnBTaXplID0gMDsKLSAgICAgICAgZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiArIHVpU2l6ZVJlYWQ7Ci0gICAgICAgIGlmICgoTTRPU0FfVUludDMyKXVpU2l6ZVJlYWQgPCAqcFNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7Ci0KLSAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIGVuZCBvZiBmaWxlICovCi0gICAgICAgICAgICBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGUgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUKLSAqICAgICAgICAgICAgIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvCi0gKiAgICAgICAgICAgICB0aGUgc2Vla01vZGUgcGFyYW1ldGVyIGl0IGNhbiBiZSBlaXRoZXIgZnJvbSB0aGUgYmVnaW5uaW5nLCBmcm9tCi0gKiAgICAgICAgICAgICB0aGUgZW5kIG9yIGZyb20gdGhlIGN1cnJlbnQgcG9zdGlvbi4gVG8gc3VwcG9ydCBsYXJnZSBmaWxlCi0gKiAgICAgICAgICAgICBhY2Nlc3MgKG1vcmUgdGhhbiAyR0J5dGVzKSwgdGhlIHBvc2l0aW9uIGlzIHByb3ZpZGVkIG9uIGEgNjQKLSAqICAgICAgICAgICAgIGJpdHMuCi0gKiBAbm90ZSAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24gcG9pbnRlcgotICogICAgICAgICAgICAgaW4gdGhlIGZpbGUgbXVzdCBub3QgY2hhbmdlLiBFbHNlIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICBwb3NpdGlvbiBwb2ludGVyIG11c3QgYmUgdXBkYXRlZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIHNlZWtNb2RlOiAoSU4pIFNlZWsgYWNjZXNzIG1vZGUKLSAqIEBwYXJhbSAgICAgIHBvc2l0aW9uOiAoSU4vT1VUKSBQb3NpdGlvbiBpbiB0aGUgZmlsZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjogdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZWFjaGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZWVrKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24pCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9maWxlUmVhZFNlZWsgOiBtb2RlID0gJWQgIHBvcyA9ICVsdSIsIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUG9zaXRpb24gIT0gTTRPU0FfTlVMTCkgPyAoKnBQb3NpdGlvbikgOiAwKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2VlazogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHNlZWtNb2RlLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2Vlazogc2Vla01vZGUgaXMgMCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBQb3NpdGlvbiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2VlazogcFBvc2l0aW9uIGlzIE00T1NBX05VTEwiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZVJlYWRTZWVrOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYgKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykKLSAgICB7Ci0gICAgICAgICBNNE9TQV9VSW50MzIgICAgU2Vla01vZGVPcHRpb247Ci0gICAgICAgICAvKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLwotICAgICAgICBpZiAoTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfU0VUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00T1NBX2tGaWxlU2Vla0VuZCA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0VORDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtDdXJyZW50ID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfQ1VSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00T1NBX2ZpbGVSZWFkU2VlazogRU5EIFdJVEggRVJST1IgISEhIChDT05WRVJJT04gRVJST1IgRk9SIFRIRSBTRUVLIE1PREUpIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCAqcFBvc2l0aW9uLCBTZWVrTW9kZU9wdGlvbik7Ci0gICAgICAgIGlmKGVyciAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICBlcnI9KChNNE9TQV9VSW50MzIpKE00X0VSUik8PDMwKSsoKChNNE9TQV9GSUxFX1dSSVRFUikmMHgwMDNGRkYpPDwxNikrKE00T1NBX0ludDE2KShlcnIpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkU2VlayBlcnJvcjoleCIsZXJyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYocEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgIT0gU2Vla1JlYWQpCi0gICAgewotCi0gICAgICAgIC8qIGZzZWVrIHRvIHRoZSBsYXN0IHJlYWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uKSk7Ci0gICAgICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlUmVhZERhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrID0gU2Vla1JlYWQ7Ci0gICAgfQotCi0gICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIHNlZWtNb2RlLCBwUG9zaXRpb24pOwotICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVJlYWREYXRhOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gPSAqcFBvc2l0aW9uOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gY2xvc2UgdGhlIGZpbGUKLSAqICAgICAgICAgICAgIChhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0KS4KLSAqIEBub3RlICAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyIGlzIGZyZWVkLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2UoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9maWxlUmVhZENsb3NlIDogcEMgPSAweCVwIiwgcENvbnRleHQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZENsb3NlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZihNNE9TQV9GSUxFX1dSSVRFUiA9PSBwRmlsZUNvbnRleHQtPmNvcmVJRF93cml0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uQ2xvc2UoTTRPU0FfRklMRV9SRUFERVIsIHBDb250ZXh0KTsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZQotICogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLSAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgICd2YWx1ZScgbXVzdCBiZSBjYXN0IGFjY29yZGluZyB0byB0aGUgdHlwZSByZWxhdGVkIHRvIHRoZQotICogICAgICAgICAgICAgb3B0aW9uSUQgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLSAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkKLSAqICAgICAgICAgICAgIHRoaXMgZmllbGQgdG8gaXRzIGludGVybmFsIHZhcmlhYmxlLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIHBPcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICBwT3B0aW9uVmFsdWU6IChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9XUklURV9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHdyaXRlIG9ubHkgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZEdldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBPcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24gOiBvcHRpb24gPSAweCV4Iiwgb3B0aW9uSUQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IDAsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOiBvcHRpb25JRCBpcyAwIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE9wdGlvblZhbHVlLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOiBwT3B0aW9uVmFsdWUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9GSUxFX1JFQURFUiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1JFQURBQkxFKG9wdGlvbklEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfV1JJVEVfT05MWSwgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfUE9TSVRJT04gPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24gPSAoTTRPU0FfRmlsZVBvc2l0aW9uKilwT3B0aW9uVmFsdWU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICAqcFBvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfUE9TSVRJT04qLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0lTX0VPRiA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkSXNFT0Y6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0Jvb2wqIGJJc0VuZE9mRmlsZSA9IChNNE9TQV9Cb29sKilwT3B0aW9uVmFsdWU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICAqYklzRW5kT2ZGaWxlID0gcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfSVNfRU9GKi8KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1NJWkUgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIE00T1NBX0ludDMyIGlTYXZlUG9zICAgID0gMDsKLSAgICAgICAgICAgIE00T1NBX0ludDMyIGlTaXplICAgICAgICA9IDA7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEJ1Z2ZpeDogdXBkYXRlIHRoZSBmaWxlIHNpemUuCi0gICAgICAgICAgICAqIFdoZW4gYSBmaWxlIGlzIGluIHJlYWQgbW9kZSwgbWF5IGJlIGFub3RoZXIgYXBwbGljYXRpb24gaXMgd3JpdGluZyBpbi4KLSAgICAgICAgICAgICogU28sIHdlIGhhdmUgdG8gdXBkYXRlIHRoZSBmaWxlIHNpemUgKi8KLSAgICAgICAgICAgIGlTYXZlUG9zID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgIC8qMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgICAgICAgICBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgMCwgU0VFS19FTkQpOyAgICAgICAgLyoyLSBHbyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlICovCi0gICAgICAgICAgICBpU2l6ZSA9IGZ0ZWxsKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsgICAgICAgICAgICAgICAgLyozLSBDaGVjayB0aGUgZmlsZSBzaXplKi8KLSAgICAgICAgICAgIGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCBpU2F2ZVBvcywgU0VFS19TRVQpOyAgICAvKjQtIGdvIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiovCi0gICAgICAgICAgICBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSA9IGlTaXplOwotCi0gICAgICAgICAgICAqcFBvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5maWxlX3NpemU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9TSVpFKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9BVFRSSUJVVEUgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVBdHRyaWJ1dGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZUF0dHJpYnV0ZSopcE9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX0FUVFJJQlVURSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX1VSTCA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0VVJMOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldFVSTChwQ29udGV4dCwgKE00T1NBX0NoYXIqKilwT3B0aW9uVmFsdWUpOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX1VSTCovCi0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRMb2NrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgKihNNE9TQV9VSW50MzIqKXBPcHRpb25WYWx1ZSA9IHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbiIpOwotCi0gICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZm4gICAgICAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24gKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkpCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gc2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotICogICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSAndmFsdWUnIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkCi0gKiAgICAgICAgICAgICB0byBpdHMgaW50ZXJuYWwgdmFyaWFibGUuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgotICogQHBhcmFtICAgICAgdmFsdWU6IChJTikgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1JFQURfT05MWTogdGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24gOiBvcHRpb24gPSAweCV4Iiwgb3B0aW9uSUQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gb3B0aW9uSUQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9GSUxFX1JFQURFUiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfV1JJVEFCTEUob3B0aW9uSUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUkVBRF9PTkxZLCAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb246IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZExvY2tNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICBwRmlsZUNvbnRleHQtPm1fdWlMb2NrTW9kZT0gKE00T1NBX1VJbnQzMikqKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlV3JpdGVyLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlV3JpdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3ZmMxNzMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXIuYwotICogQGJyaWVmICAgICAgICBGaWxlIHdyaXRlciBmb3IgQW5kcm9pZAotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gd3JpdGUgaW4gYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXJfcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBwcm92aWRlZCBVUkwgYW5kIHJldHVybnMgaXRzIGNvbnRleHQuCi0gKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cmVkLCB0aGUgY29udGV4dCBpcyBzZXQgdG8gTlVMTC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0gKiBAcGFyYW0gICAgICBwVXJsOiAoSU4pIFVSTCBvZiB0aGUgaW5wdXQgZmlsZQotICogQHBhcmFtICAgICAgZmlsZU1vZGVBY2Nlc3M6IChJTikgRmlsZSBtb2RlIGFjY2VzcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICBmaWxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX05PVF9GT1VORDogdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0xPQ0tFRDogdGhlIGZpbGUgaXMgbG9ja2VkIGJ5IGFuIG90aGVyCi0gKiAgICAgICAgICAgICBhcHBsaWNhdGlvbi9wcm9jZXNzCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzogdGhlIGZpbGUgbW9kZSBhY2Nlc3MgaXMgbm90IGNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlT3BlbihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcykKLXsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfZmlsZVdyaXRlT3BlbiA6IHBDID0gMHglcCAgZmQgPSAweCVwICBtb2RlID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHBVcmwsIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uT3BlbihNNE9TQV9GSUxFX1dSSVRFUiwgcENvbnRleHQsIHBVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNb2RlQWNjZXNzKTsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSAnc2l6ZScgYnl0ZXMgc3RvcmVkIGF0ICdkYXRhJyBtZW1vcnkKLSAqICAgICAgICAgICAgIGluIHRoZSBmaWxlIHNlbGVjdGVkIGJ5IGl0cyBjb250ZXh0LgotICogQG5vdGUgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotICogICAgICAgICAgICAgbWVtb3J5IGZvciAnZGF0YScgcGFyYW1ldGVyLgotICogQG5vdGUgICAgICAgTW9yZW92ZXIgdGhlIGRhdGEgcG9pbnRlciBtdXN0IGJlIGFsbG9jYXRlZCB0byBzdG9yZSBhdCBsZWFzdAotICogICAgICAgICAgICAgJ3NpemUnIGJ5dGVzLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIGJ1ZmZlcjogKElOKSBEYXRhIHBvaW50ZXIgb2YgdGhlIHdyaXRlIGRhdGEKLSAqIEBwYXJhbSAgICAgIHNpemU6IChJTikgU2l6ZSBvZiB0aGUgZGF0YSB0byB3cml0ZSAoaW4gYnl0ZXMpCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVEYXRhKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX01lbUFkZHI4IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlTaXplKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB1aVNpemVXcml0ZTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9maWxlV3JpdGVEYXRhIDogZGF0YSA9IDB4JXAgIHNpemUgPSAlbHUiLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlTaXplKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRGF0YTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGRhdGEsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRGF0YTogZGF0YSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gdWlTaXplLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVEYXRhOiB1aVNpemUgaXMgMCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVEYXRhOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYgKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICBXcml0ZVNpemU7Ci0gICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgIFdyaXRlU2l6ZSA9IGZ3cml0ZSgodm9pZCAqKWRhdGEsMSwgdWlTaXplLCBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0gICAgICAgIGlmKFdyaXRlU2l6ZSAhPSB1aVNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgIGVyciA9ICgoTTRPU0FfVUludDMyKShNNF9FUlIpPDwzMCkrKCgoTTRPU0FfRklMRV9XUklURVIpJjB4MDAzRkZGKTw8MTYpKyhNNE9TQV9JbnQxNikoV3JpdGVTaXplKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlV3JpdGVEYXRhIGVycm9yOiV4IixlcnIpOwotICAgICAgICB9Ci0gICAgICAgIGZmbHVzaChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0KLSAgICAgICAgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gKyBXcml0ZVNpemU7Ci0KLSAgICAgICAgLyogVXBkYXRlIHRoZSBmaWxlIHNpemUgKi8KLSAgICAgICAgaWYocEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA+IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmKHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrICE9IFNlZWtXcml0ZSkKLSAgICB7Ci0gICAgICAgIC8qIGZzZWVrIHRvIHRoZSBsYXN0IHJlYWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICYocEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbikpOwotCi0gICAgICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICB7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0gICAgICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlV3JpdGVEYXRhOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrID0gU2Vla1dyaXRlOwotICAgIH0KLQotICAgIC8qIFdyaXRlIGRhdGEgKi8KLSAgICB1aVNpemVXcml0ZSA9IGZ3cml0ZShkYXRhLCBzaXplb2YoTTRPU0FfQ2hhciksIHVpU2l6ZSwgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotCi0gICAgaWYodWlTaXplV3JpdGUgPT0gKE00T1NBX1VJbnQzMiktMSkKLSAgICB7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAvKiBBbiBlcnJvciBvY2N1cmVkICovCi0KLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlV3JpdGVEYXRhOiBmd3JpdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiArIHVpU2l6ZVdyaXRlOwotCi0gICAgLyogVXBkYXRlIHRoZSBmaWxlIHNpemUgKi8KLSAgICBpZihwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID4gcEZpbGVDb250ZXh0LT5maWxlX3NpemUpCi0gICAgewotICAgICAgICBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb247Ci0gICAgfQotCi0gICAgaWYoKE00T1NBX1VJbnQzMil1aVNpemVXcml0ZSA8IHVpU2l6ZSkKLSAgICB7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVXcml0ZURhdGEiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24gaW4gdGhlIGNvcmUgZmlsZQotICogICAgICAgICAgICAgd3JpdGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4gVGhlIHBvc2l0aW9uIGlzIHJlbGF0ZWQgdG8KLSAqICAgICAgICAgICAgIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciBmcm9tIHRoZSBiZWdpbm5pbmcsCi0gKiAgICAgICAgICAgICBmcm9tIHRoZSBlbmQgb3IgZnJvbSB0aGUgY3VycmVudCBwb3N0aW9uLiBUbyBzdXBwb3J0IGxhcmdlIGZpbGUKLSAqICAgICAgICAgICAgIGFjY2VzcyAobW9yZSB0aGFuIDJHQnl0ZXMpLCB0aGUgcG9zaXRpb24gaXMgcHJvdmlkZWQgb24gYSA2NAotICogICAgICAgICAgICAgYml0cy4KLSAqIEBub3RlICAgICAgIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciB0aGUgY3VycmVudCBwb3NpdGlvbiBwb2ludGVyCi0gKiAgICAgICAgICAgICBpbiB0aGUgZmlsZSBtdXN0IG5vdCBjaGFuZ2UuIEVsc2UgdGhlIGN1cnJlbnQgcG9zaXRpb24gcG9pbnRlcgotICogICAgICAgICAgICAgbXVzdCBiZSB1cGRhdGVkLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIHNlZWtNb2RlOiAoSU4pIFNlZWsgYWNjZXNzIG1vZGUKLSAqIEBwYXJhbSAgICAgIHBvc2l0aW9uOiAoSU4vT1VUKSBQb3NpdGlvbiBpbiB0aGUgZmlsZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjogdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZWFjaGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNlZWsoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24pCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9maWxlV3JpdGVTZWVrIDogbW9kZSA9ICVkICBwb3MgPSAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vla01vZGUsIChNNE9TQV9OVUxMICE9IHBQb3NpdGlvbikgPyAoKnBQb3NpdGlvbikgOiAwKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2VlazogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHNlZWtNb2RlLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2Vlazogc2VlbU1vZGUgaXMgMCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBQb3NpdGlvbiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2VlazogcFBvc2l0aW9uIGlzIE00T1NBX05VTEwiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2Vlazogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmIChNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpIC8qIHJlYWQgd3JpdGUgKi8KLSAgICB7Ci0gICAgICAgICBNNE9TQV9VSW50MzIgICAgU2Vla01vZGVPcHRpb247Ci0gICAgICAgIC8qVGhlIHBvc2l0aW9uIGZvciB0aGUgc2VlayBtb2RlIGJldHdlZW4gdGhlIFNIUCBhbmQgdGhlIE9TQWwgcGFydCBhcmUgZGlmZmVyZW50ICovCi0gICAgICAgIGlmIChNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19TRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrRW5kID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfRU5EOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19DVVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRPU0FfZmlsZVdyaXRlU2VlazogRU5EIFdJVEggRVJST1IgISEhIChDT05WRVJJT04gRVJST1IgRk9SIFRIRSBTRUVLIE1PREUpICIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywqcFBvc2l0aW9uLFNlZWtNb2RlT3B0aW9uKTsKLSAgICAgICAgaWYoZXJyICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgIGVycj0oKE00T1NBX1VJbnQzMikoTTRfRVJSKTw8MzApKygoKE00T1NBX0ZJTEVfV1JJVEVSKSYweDAwM0ZGRik8PDE2KSsoTTRPU0FfSW50MTYpKGVycik7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVdyaXRlU2VlayBlcnJvcjoleCIsZXJyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBzZWVrTW9kZSwgcFBvc2l0aW9uKTsKLQotICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVdyaXRlU2VlazogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID0gKnBQb3NpdGlvbjsKLQotICAgIHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrID0gU2Vla1dyaXRlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSB3cml0ZXIgdG8gY2xvc2UgdGhlIGZpbGUKLSAqICAgICAgICAgICAgIChhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0KS4KLSAqIEBub3RlICAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyIGlzIGZyZWVkLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVDbG9zZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2ZpbGVXcml0ZUNsb3NlIDogcEMgPSAweCVwIiwgcENvbnRleHQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUNsb3NlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkNsb3NlKE00T1NBX0ZJTEVfV1JJVEVSLCBwQ29udGV4dCk7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGZsdXNoZXMgdGhlIHN0cmVhbSBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0LgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUZsdXNoKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotICAgIE00T1NBX0VSUiAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVXcml0ZUZsdXNoIDogcEMgPSAweCVwIiwgcENvbnRleHQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUZsdXNoOiBwY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVGbHVzaDogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYgKGZmbHVzaChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYykgIT0gMCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSB3cml0ZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZQotICogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSAqICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSAqICAgICAgICAgICAgIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICAndmFsdWUnIG11c3QgYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgcmVsYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIG9wdGlvbklECi0gKiAgICAgICAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICAndmFsdWUnIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkCi0gKiAgICAgICAgICAgICB0byBpdHMgaW50ZXJuYWwgdmFyaWFibGUuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgotICogQHBhcmFtICAgICAgdmFsdWU6IChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9XUklURV9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHdyaXRlIG9ubHkgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwT3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiA6IG9wdGlvbiA9IDB4JXgiLCBvcHRpb25JRCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIob3B0aW9uSUQgPT0gMCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE9wdGlvblZhbHVlLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogcE90aW9uVmFsdWUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9GSUxFX1dSSVRFUiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1JFQURBQkxFKG9wdGlvbklEKSwgTTRFUlJfV1JJVEVfT05MWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfUE9TSVRJT04gPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlUG9zaXRpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gPSAoTTRPU0FfRmlsZVBvc2l0aW9uKilwT3B0aW9uVmFsdWU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICAqcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1BPU0lUSU9OKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfU0laRSA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEZpbGVTaXplOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOwotCi0gICAgICAgICAgICBpZihNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNhdmVQb3MgICAgPSAwOwotICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlTaXplICAgICAgICA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsgICAgICAgICAgICAvKjEtIENoZWNrIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgIGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCAwLCBTRUVLX0VORCk7ICAgICAgICAvKjItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KLSAgICAgICAgICAgICAgICAqcG9zaXRpb24gPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgLyozLSBDaGVjayB0aGUgZmlsZSBzaXplKi8KLSAgICAgICAgICAgICAgICBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgaVNhdmVQb3MsIFNFRUtfU0VUKTsgICAgLyo0LSBnbyB0byB0aGUgZmlyc3QgcG9zaXRpb24qLwotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgKnBvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5maWxlX3NpemU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfU0laRSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9VUkwgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRVUkw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMIChwQ29udGV4dCwgKE00T1NBX0NoYXIqKilwT3B0aW9uVmFsdWUpOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9VUkwqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9BVFRSSUJVVEUgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRBdHRyaWJ1dGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlKHBDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNE9TQV9GaWxlQXR0cmlidXRlKilwT3B0aW9uVmFsdWUpOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX0FUVFJJQlVURSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9SRUFERVJfQ09OVEVYVCA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldFJlYWRlckNvbnRleHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGFjY2VzcyA9IHBGaWxlQ29udGV4dC0+YWNjZXNzX21vZGU7Ci0KLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMSghKGFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCksIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IE00T1NBX2tGaWxlUmVhZCIpOwotCi0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoIShhY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogTTRPU0Ffa0ZpbGVXcml0ZSIpOwotCi0gICAgICAgICAgICBwRmlsZUNvbnRleHQtPmNvcmVJRF9yZWFkID0gTTRPU0FfRklMRV9SRUFERVI7Ci0KLSAgICAgICAgICAgICpwT3B0aW9uVmFsdWUgPSBwQ29udGV4dDsKLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1JFQURFUl9DT05URVhUKi8KLQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUxvY2tNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICAqKE00T1NBX1VJbnQzMiopcE9wdGlvblZhbHVlID0gcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIik7Ci0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotfQotCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHdyaXRlciB0byBzZXQgdGhlIHZhbHVlCi0qICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCi0qICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSogICAgICAgICAgICAgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotKiAgICAgICAgICAgICAndmFsdWUnIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbAotKiAgICAgICAgICAgICB2YXJpYWJsZS4KLSogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKLSogQHBhcmFtICAgICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgotKiBAcGFyYW0gICAgICB2YWx1ZTogKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0qIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0qIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICAgIE00RVJSX1JFQURfT05MWTogdGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lCi0qIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiA6IG9wdGlvbiA9IDB4JXgiLCBvcHRpb25JRCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMigwID09IG9wdGlvbklELCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9XUklURVIpLAotICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19XUklUQUJMRShvcHRpb25JRCksIE00RVJSX1JFQURfT05MWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUxvY2tNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICBwRmlsZUNvbnRleHQtPm1fdWlMb2NrTW9kZSA9IChNNE9TQV9VSW50MzIpKihNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVEZXNjTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcyA9IChNNE9TQV9JbnQzMikqKE00T1NBX0ludDMyKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfTXV0ZXguYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX011dGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiZTZiYmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfTXV0ZXguYworKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgICBNdXRleCBmb3IgQW5kcm9pZAotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBtdXRleAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotCi0vKiBDb250ZXh0IGZvciB0aGUgbXV0ZXggKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICBNNE9TQV9VSW50MzIgICAgIGNvcmVJRDsgICAgICAgICAgICAgICAvKiBtdXRleCBjb250ZXh0IGlkZW50aWZpYW50ICovCi0gICBwdGhyZWFkX211dGV4X3QgIG11dGV4OyAgICAgICAgICAgICAgICAvKiBtdXRleCAqLwotICAgcHRocmVhZF90ICAgICAgICB0aHJlYWRPd25lcklEOyAgICAgICAgLyogdGhyZWFkIG93bmVyIGlkZW50aWZpYW50ICovCi19IE00T1NBX011dGV4Q29udGV4dDsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBtdXRleC4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbmQgYWxsb2NhdGVzIGEgdW5pcXVlIGNvbnRleHQuIEl0J3MgdGhlCi0gKiAgICAgICAgICAgICBPU0FMIHJlYWwgdGltZSByZXNwb25zaWJpbGl0eSBmb3IgbWFuYWdpbmcgaXRzIGNvbnRleHQuIEl0IG11c3QKLSAqICAgICAgICAgICAgIGJlIGZyZWVkIGJ5IHRoZSBNNE9TQV9tdXRleENsb3NlIGZ1bmN0aW9uLiBUaGUgY29udGV4dCBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgIHdpbGwgYmUgc2VudCBiYWNrIHRvIGFueSBPU0FMIGNvcmUgbXV0ZXggZnVuY3Rpb25zIHRvIGFsbG93Ci0gKiAgICAgICAgICAgICByZXRyaWV2aW5nIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgb3BlbmVkIG11dGV4LgotICogQHBhcmFtICAgICAgcENvbnRleHQ6KE9VVCkgQ29udGV4dCBvZiB0aGUgY3JlYXRlZCBtdXRleAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgIE00RVJSX0NPTlRFWFRfRkFJTEVEOiB0aGUgY29udGV4dCBjcmVhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfbXV0ZXhPcGVuKE00T1NBX0NvbnRleHQqIHBDb250ZXh0KQotewotICAgIE00T1NBX011dGV4Q29udGV4dCogcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKU00T1NBX05VTEw7Ci0gICAgcHRocmVhZF9tdXRleGF0dHJfdCBhdHRyaWJ1dGUgPSB7IDAgfTsKLSAgICBNNE9TQV9Cb29sIG9wZW5lZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX211dGV4T3Blblx0XHRNNE9TQV9Db250ZXh0KiAweCV4IiwgcENvbnRleHQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX211dGV4T3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX011dGV4Q29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX01VVEVYLCAoTTRPU0FfQ2hhciopIk00T1NBX211dGV4T3BlbjogbXV0ZXggY29udGV4dCIpOwotCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBwTXV0ZXhDb250ZXh0KQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9tdXRleE9wZW4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgdGhlIG11dGV4IGF0dHJpYnV0ZS4gKi8KLSAgICBpZiAoIDAgPT0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCggJmF0dHJpYnV0ZSApICkKLSAgICB7Ci0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIG11dGV4IHR5cGUuICovCi0gICAgICAgIGlmICggMCA9PSBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCAmYXR0cmlidXRlLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSApICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbXV0ZXguICovCi0gICAgICAgICAgICBpZiAoMCA9PSBwdGhyZWFkX211dGV4X2luaXQoICZwTXV0ZXhDb250ZXh0LT5tdXRleCwgJmF0dHJpYnV0ZSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcGVuZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRGVzdHJveSB0aGUgbXV0ZXggYXR0cmlidXRlLiAqLwotICAgICAgICBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCAmYXR0cmlidXRlICk7Ci0gICAgfQotCi0gICAgaWYoIW9wZW5lZCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0NPTlRFWFRfRkFJTEVELCAiTTRPU0FfbXV0ZXhPcGVuOiBPUyBtdXRleCBjcmVhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgZnJlZShwTXV0ZXhDb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NPTlRFWFRfRkFJTEVEIDsKLSAgICB9Ci0KLSAgICBwTXV0ZXhDb250ZXh0LT5jb3JlSUQgPSBNNE9TQV9NVVRFWDsKLQotICAgIHBNdXRleENvbnRleHQtPnRocmVhZE93bmVySUQgPSAwOwotCi0gICAgKnBDb250ZXh0ID0gKE00T1NBX0NvbnRleHQpIHBNdXRleENvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBsb2NrcyB0aGUgbXV0ZXguICJDb250ZXh0IiBpZGVudGlmaWVzIHRoZSBtdXRleC4KLSAqIEBub3RlICAgICAgIElmIHRoZSBtdXRleCBpcyBhbHJlYWR5IGxvY2tlZCwgdGhlIGNhbGxpbmcgdGhyZWFkIGJsb2NrcyB1bnRpbAotICogICAgICAgICAgICAgdGhlIG11dGV4IGJlY29tZXMgYXZhaWxhYmxlIChieSBjYWxsaW5nIE00T1NBX211dGV4VW5sb2NrKSBvcgotICogICAgICAgICAgICAgInRpbWVvdXQiIGlzIHJlYWNoZWQuIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBtdXRleAotICogQHBhcmFtICAgICAgdGltZW91dDooSU4pIFRpbWUgb3V0IGluIG1pbGxpc2Vjb25kcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNFdBUl9USU1FX09VVDogdGltZSBvdXQgaXMgZWxhcHNlZCBiZWZvcmUgbXV0ZXggaGFzIGJlZW4KLSAqICAgICAgICAgICAgIGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX211dGV4TG9jayhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1VJbnQzMiB0aW1lb3V0KQotewotICAgIE00T1NBX011dGV4Q29udGV4dCogcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKWNvbnRleHQ7Ci0gICAgcHRocmVhZF90ICAgICAgICAgICBjdXJyZW50VGhyZWFkOwotICAgIGludCAgICAgICAgICAgICAgICAgcmVzdWx0OwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgdHM7Ci0gICAgc3RydWN0IHRpbWVzcGVjICAgICBsZWZ0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX211dGV4TG9ja1x0XHRNNE9TQV9Db250ZXh0IDB4JXhcdE00T1NBX1VJbnQzMiAlZCIsCi0gICAgICAgIGNvbnRleHQsIHRpbWVvdXQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gY29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhMb2NrOiBjb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIocE11dGV4Q29udGV4dC0+Y29yZUlEICE9IE00T1NBX01VVEVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleExvY2siKTsKLQotICAgIGN1cnJlbnRUaHJlYWQgPSBwdGhyZWFkX3NlbGYoKTsKLQotICAgIGlmKHBNdXRleENvbnRleHQgLT50aHJlYWRPd25lcklEID09IGN1cnJlbnRUaHJlYWQpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jazogVGhyZWFkIHRyaWVkIHRvIGxvY2sgYSBtdXRleCBpdCBhbHJlYWR5IG93bnMiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUIDsKLSAgICB9Ci0KLSAgICAvKiBMb2NrIHRoZSBtdXRleC4gKi8KLSAgICBpZiAoIE00T1NBX1dBSVRfRk9SRVZFUiA9PSB0aW1lb3V0KQotICAgIHsKLSAgICAgICAgaWYgKCAwICE9IHB0aHJlYWRfbXV0ZXhfbG9jaygmcE11dGV4Q29udGV4dC0+bXV0ZXgpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleExvY2s6IE9TIG11dGV4IHdhaXQgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcHRocmVhZF9tdXRleF90cnlsb2NrKCZwTXV0ZXhDb250ZXh0LT5tdXRleCk7Ci0gICAgICAgIHdoaWxlICggKCBFQlVTWSA9PSByZXN1bHQgKSAmJiAoIDAgPCB0aW1lb3V0ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cy50dl9zZWMgID0gMDsKLSAgICAgICAgICAgIGlmICgxIDw9IHRpbWVvdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgdGltZW91dCAtPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRzLnR2X25zZWMgPSB0aW1lb3V0ICogMTAwMDAwMDsKLSAgICAgICAgICAgICAgICB0aW1lb3V0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbm9zbGVlcCgmdHMsICZsZWZ0KTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcE11dGV4Q29udGV4dC0+bXV0ZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgwICE9IHJlc3VsdCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEVCVVNZID09IHJlc3VsdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfVElNRV9PVVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleExvY2s6IE9TIG11dGV4IHdhaXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCA9IGN1cnJlbnRUaHJlYWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgdW5sb2NrcyB0aGUgbXV0ZXguIFRoZSBtdXRleCBpcyBpZGVudGlmaWVkIGJ5Ci0gKiAgICAgICAgICAgICBpdHMgY29udGV4dAotICogQG5vdGUgICAgICAgVGhlIE00T1NBX211dGV4TG9jayB1bmJsb2NrcyB0aGUgdGhyZWFkIHdpdGggdGhlIGhpZ2hlc3QKLSAqICAgICAgICAgICAgIHByaW9yaXR5IGFuZCBtYWRlIGl0IHJlYWR5IHRvIHJ1bi4KLSAqIEBub3RlICAgICAgIE5vIGh5cG90aGVzZXMgY2FuIGJlIG1hZGUgb24gd2hpY2ggdGhyZWFkIHdpbGwgYmUgdW4tYmxvY2tlZAotICogICAgICAgICAgICAgYmV0d2VlbiB0aHJlYWRzIHdpdGggdGhlIHNhbWUgcHJpb3JpdHkuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIG11dGV4Ci0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX211dGV4VW5sb2NrKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0Kiljb250ZXh0OwotICAgIHB0aHJlYWRfdCBjdXJyZW50VGhyZWFkOwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX211dGV4VW5sb2NrXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleFVubG9jazogY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX01VVEVYICE9IHBNdXRleENvbnRleHQtPmNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4VW5sb2NrIik7Ci0KLSAgICBjdXJyZW50VGhyZWFkID0gcHRocmVhZF9zZWxmKCk7Ci0KLSAgICBpZihwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEICE9IGN1cnJlbnRUaHJlYWQpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4VW5sb2NrOiBUaHJlYWQgdHJpZWQgdG8gdW5sb2NrIGEgbXV0ZXggaXQgZG9lc24ndCBvd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIHBNdXRleENvbnRleHQtPnRocmVhZE93bmVySUQgPSAwIDsKLQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwTXV0ZXhDb250ZXh0LT5tdXRleCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWxldGVzIGEgbXV0ZXggKGlkZW50aWZ5IGJ5IGl0cyBjb250ZXh0KS4gQWZ0ZXIKLSAqICAgICAgICAgICAgIHRoaXMgY2FsbCwgdGhlIG11dGV4IGFuZCBpdHMgY29udGV4dCBpcyBubyBtb3JlIHVzZWFibGUuIFRoaXMKLSAqICAgICAgICAgICAgIGZ1bmN0aW9uIGZyZWVzIGFsbCB0aGUgbWVtb3J5IHJlbGF0ZWQgdG8gdGhpcyBtdXRleC4KLSAqIEBub3RlICAgICAgIEl0IGlzIGFuIGFwcGxpY2F0aW9uIGlzc3VlIHRvIHdhcnJhbnQgbm8gbW9yZSB0aHJlYWRzIGFyZSBsb2NrZWQKLSAqICAgICAgICAgICAgIG9uIHRoZSBkZWxldGVkIG11dGV4LgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBtdXRleAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfbXV0ZXhDbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopY29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9tdXRleENsb3NlXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gY29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleENsb3NlOiBjb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIocE11dGV4Q29udGV4dC0+Y29yZUlEICE9IE00T1NBX01VVEVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhVbmxvY2siKTsKLQotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcE11dGV4Q29udGV4dC0+bXV0ZXgpOwotCi0gICAgZnJlZSggcE11dGV4Q29udGV4dCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfUmFuZG9tLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9SYW5kb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzI0ZDAzOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9SYW5kb20uYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRQU1dfVHJhY2UuYwotICogQGJyaWVmICAgICAgICBUcmFjZSBmdW5jdGlvbiBmb3IgdHJhY2UgbWFjcm9zCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGdpdmVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhY2UgZnVuY3Rpb24gdXNlZAotICogICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlIGluc3RydW1lbnRhdGlvbiBtYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPiAgLypmb3IgcHJpbnRmICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+IC8qIEFOU0kgQyBtYWNyb3MgYW5kIGRlZnMgZm9yIHZhcmlhYmxlIGFyZ3MgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZuICAgICAgICAgTTRPU0FfRVJSIE00T1NBX3JhbmRJbml0KCkKLSAqIEBicmllZiAgICAgIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSB0aGUgbnVtYmVyIGdlbmVyYXRvcgotICogICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgYmVmb3JlIGFueSBjYWxsIHRvIE00T1NBX3JhbmQoKQotICogICAgICAgICAgICAgICBuZWVkIHRoZSBzdGRsaWIgYW5kIHRpbWUgbGlicmFyaWVzCi0gKiBAbm90ZQotICogQHBhcmFtCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfcmFuZEluaXQoKQotewotICAgIGludCBpOwotCi0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0KLSAgICAvKiBXaW5kb3dzJyByYW5kIGlzIHJvdHRlbiwgdGhlIGZpcnN0IGdlbmVyYXRlZCB2YWx1ZSBhZnRlciB0aGUgaW5pdAotICAgIGFib3ZlIGlzIG5vdCByYW5kb20gZW5vdWdoLCBzbyBsZXQncyBzaGFrZSB0aGluZ3MgYSBsaXR0bGUuLi4gKi8KLQotICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKSByYW5kKCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZuICAgICAgICAgICBNNE9TQV9FUlIgTTRPU0FfcmFuZChNNE9TQV9JbnQzMiogb3V0X3ZhbHVlLCBNNE9TQV9VSW50MzIgbWF4X3ZhbHVlKQotICogQGJyaWVmICAgICAgIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gMSBhbmQgbWF4X3ZhbHVlCi0gKiAgICAgICAgICAgICAgIChpbmNsdXNpdmUpIHdpdGggYXBwcm94aW1hdGVseSBlcXVhbCBwcm9iYWJpbGl0eSwgYW5kCi0gKiAgICAgICAgICAgICAgIHJldHVybnMgdGhpcyBudW1iZXIgaW4gb3V0X3ZhbHVlLiBGb3IgaW5zdGFuY2UsIGEgbWF4X3ZhbHVlCi0gKiAgICAgICAgICAgICBvZiA2IHdpbGwgc2ltdWxhdGUgYSBmYWlyIDYtc2lkZWQgZGljZSByb2xsLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIG91dF92YWx1ZSAoT1VUKTogb24gcmV0dXJuLCBwb2ludHMgdG8gcmFuZG9tIHJlc3VsdAotICogQHBhcmFtICAgICAgIG1heF92YWx1ZSAoSU4pOiBtYXggZXhwZWN0ZWQgdmFsdWUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9yYW5kKE00T1NBX0ludDMyKiBvdXRfdmFsdWUsIE00T1NBX1VJbnQzMiBtYXhfdmFsdWUpCi17Ci0gICAgaWYoIChvdXRfdmFsdWUgPT0gTTRPU0FfTlVMTCkgfHwgKG1heF92YWx1ZSA8IDEpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgKCpvdXRfdmFsdWUpID0gcmFuZCgpOwotICAgIC8qIG5vdGljZSB0aGlzIGFsZ29yaXRobSB3aWxsIG9ubHkgd29yayBmb3IgbWF4X3ZhbHVlcyBzdWNoIHRoYXQgdGhlIG11bHRpcGxpY2F0aW9uCi0gICAgd29uJ3Qgb3ZlcmZsb3csIHdoaWNoIG1lYW5zIHRoYXQgbWF4X3ZhbHVlIHR5cGljYWxseSBzaG91bGRuJ3QgZ28gb3ZlciB0aGUgcmFuZ2Ugb2YKLSAgICBhbiBJbnQxNi4gKi8KLSAgICAoKm91dF92YWx1ZSkgPSAoKCgqb3V0X3ZhbHVlKSAqIG1heF92YWx1ZSkgLyAoKE00T1NBX1VJbnQzMilSQU5EX01BWCArIDEpKSArIDE7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1NlbWFwaG9yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2I1ODUyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1NlbWFwaG9yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1NlbWFwaG9yZS5jCi0gKiBAYnJpZWYgICAgICAgIFNlbWFwaG9yZSBmb3IgV2luZG93cwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBzZW1hcGhvcmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0KLSNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0KLS8qIENvbnRleHQgZm9yIHRoZSBzZW1hcGhvcmUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgIE00T1NBX1VJbnQzMiAgIGNvcmVJRDsgICAgIC8qIHNlbWFwaG9yZSBjb250ZXh0IGlkZW50aWZpYW50ICovCi0gICBzZW1fdCAgICAgICAgICBzZW1hcGhvcmU7ICAvKiBzZW1hcGhvcmUgKi8KLX0gTTRPU0FfU2VtYXBob3JlQ29udGV4dDsKLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IHNlbWFwaG9yZSB3aXRoIHRoZSAiaW5pdGlhbENvdW50ZXIiCi0gKiAgICAgICAgICAgICB2YWx1ZS4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbmQgYWxsb2NhdGVzIGEgdW5pcXVlIGNvbnRleHQuIEl0J3MgdGhlCi0gKiAgICAgICAgICAgICBPU0FMIHJlYWwgdGltZSByZXNwb25zaWJpbGl0eSBmb3IgbWFuYWdpbmcgaXRzIGNvbnRleHQuIEl0IG11c3QKLSAqICAgICAgICAgICAgIGJlIGZyZWVkIGJ5IHRoZSBNNE9TQV9zZW1hcGhvcmVDbG9zZSBmdW5jdGlvbi4gVGhlIGNvbnRleHQKLSAqICAgICAgICAgICAgIHBhcmFtZXRlciB3aWxsIGJlIHNlbnQgYmFjayB0byBhbnkgT1NBTCBjb3JlIHNlbWFwaG9yZSBmdW5jdGlvbnMKLSAqICAgICAgICAgICAgIHRvIGFsbG93IHJldHJpZXZpbmcgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBvcGVuZWQgc2VtYXBob3JlLgotICogQHBhcmFtICAgICAgY29udGV4dDooT1VUKSBDb250ZXh0IG9mIHRoZSBjcmVhdGVkIHNlbWFwaG9yZQotICogQHBhcmFtICAgICAgaW5pdGlhbF9jb3VudDooSU4pIEluaXRpYWwgY291bnRlciBvZiB0aGUgc2VtYXBob3JlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwcm92aWRlZCBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgIE00RVJSX0NPTlRFWFRfRkFJTEVEOiB0aGUgY29udGV4dCBjcmVhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlT3BlbihNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGluaXRpYWxfY291bnQpCi17Ci0gICBNNE9TQV9TZW1hcGhvcmVDb250ZXh0KiBzZW1hcGhvcmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3NlbWFwaG9yZU9wZW5cdFx0TTRPU0FfQ29udGV4dCogMHgleFx0TTRPU0FfVUludDMyICIKLSAgICAgICAgICAgICAgICAgICIlZCIsIGNvbnRleHQsIGluaXRpYWxfY291bnQpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3NlbWFwaG9yZU9wZW4iKTsKLQotICAgKmNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICBzZW1hcGhvcmVDb250ZXh0ID0gKE00T1NBX1NlbWFwaG9yZUNvbnRleHQqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX1NlbWFwaG9yZUNvbnRleHQpLCBNNE9TQV9TRU1BUEhPUkUsCi0gICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9zZW1hcGhvcmVPcGVuOiBzZW1hcGhvcmUgY29udGV4dCIpOwotCi0gICBpZihzZW1hcGhvcmVDb250ZXh0ID09IE00T1NBX05VTEwpCi0gICB7Ci0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX3NlbWFwaG9yZU9wZW4iKTsKLQotICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgfQotCi0gICBpZiAoMCAhPSBzZW1faW5pdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlLCAwLCBpbml0aWFsX2NvdW50KSkKLSAgIHsKLSAgICAgIGZyZWUoc2VtYXBob3JlQ29udGV4dCk7Ci0KLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgIk00T1NBX3NlbWFwaG9yZU9wZW46IE9TIHNlbWFwaG9yZSBjcmVhdGlvbiBmYWlsZWQiKTsKLQotICAgICAgcmV0dXJuIE00RVJSX0NPTlRFWFRfRkFJTEVEOwotICAgfQotCi0gICBzZW1hcGhvcmVDb250ZXh0LT5jb3JlSUQgPSBNNE9TQV9TRU1BUEhPUkUgOwotICAgKmNvbnRleHQgPSAoTTRPU0FfQ29udGV4dClzZW1hcGhvcmVDb250ZXh0OwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWNyZW1lbnRzIChvbmUgYnkgb25lKSB0aGUgc2VtYXBob3JlIGNvdW50ZXIuIFRoZQotICogICAgICAgICAgICAgc2VtYXBob3JlIGlzIGlkZW50aWZpZWQgYnkgaXRzIGNvbnRleHQgVGhpcyBjYWxsIGlzIG5vdCBibG9ja2luZwotICogICAgICAgICAgICAgaWYgdGhlIHNlbWFwaG9yZSBjb3VudGVyIGlzIHBvc2l0aXZlIG9yIHplcm8gKGFmdGVyCi0gKiAgICAgICAgICAgICBkZWNyZW1lbnRhdGlvbikuIFRoaXMgY2FsbCBpcyBibG9ja2luZyBpZiB0aGUgc2VtYXBob3JlIGNvdW50ZXIKLSAqICAgICAgICAgICAgIGlzIGxlc3MgdGhhbiB6ZXJvIChhZnRlciBkZWNyZW1lbnRhdGlvbiksIHVudGlsIHRoZSBzZW1hcGhvcmUgaXMKLSAqICAgICAgICAgICAgIHVwcGVyIHRoYW4gemVybyAoc2VlIE00T1NBX3NlbWFwaG9yZVBvc3QpIG9yIHRpbWVfb3V0IGlzCi0gKiAgICAgICAgICAgICByZWFjaGVkLgotICogQG5vdGUgICAgICAgSWYgInRpbWVvdXQiIHZhbHVlIGlzIE00T1NBX1dBSVRfRk9SRVZFUiwgdGhlIGNhbGxpbmcgdGhyZWFkCi0gKiAgICAgICAgICAgICB3aWxsIGJsb2NrIGluZGVmaW5pdGVseSB1bnRpbCB0aGUgc2VtYXBob3JlICBpcyB1bmxvY2tlZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgc2VtYXBob3JlCi0gKiBAcGFyYW0gICAgICB0aW1lb3V0OihJTikgVGltZSBvdXQgaW4gbWlsbGlzZWNvbmRzCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00V0FSX1RJTUVfT1VUOiB0aW1lIG91dCBpcyBlbGFwc2VkIGJlZm9yZSBzZW1hcGhvcmUgaGFzIGJlZW4KLSAqICAgICAgICAgICAgIGF2YWlsYWJsZS4KLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVXYWl0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfSW50MzIgdGltZW91dCkKLXsKLSAgIE00T1NBX1NlbWFwaG9yZUNvbnRleHQqIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopY29udGV4dDsKLSAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgIHRzOwotICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgbGVmdDsKLSAgIGludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3NlbWFwaG9yZVdhaXRcdFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9VSW50MzIgJWQiLAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgdGltZW91dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlV2FpdCIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1NFTUFQSE9SRSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZVdhaXQiKTsKLQotICAgaWYgKCAoTTRPU0FfSW50MzIpTTRPU0FfV0FJVF9GT1JFVkVSID09IHRpbWVvdXQpCi0gICB7Ci0gICAgICAgaWYgKCAwICE9IHNlbV93YWl0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpICkKLSAgICAgICB7Ci0gICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgIk00T1NBX3NlbWFwaG9yZVdhaXQ6IE9TIHNlbWFwaG9yZSB3YWl0IGZhaWxlZCIpOwotCi0gICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVCA7Ci0gICAgICAgfQotICAgfQotICAgZWxzZQotICAgewotICAgICAgIHJlc3VsdCA9IHNlbV90cnl3YWl0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpOwotICAgICAgIHdoaWxlICggKChFQlVTWSA9PSByZXN1bHQpIHx8IChFQUdBSU4gPT0gcmVzdWx0KSkgJiYgKCAwIDwgdGltZW91dCApICkKLSAgICAgICB7Ci0gICAgICAgICAgIHRzLnR2X3NlYyAgPSAwOwotICAgICAgICAgICBpZiAoMSA8PSB0aW1lb3V0KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB0cy50dl9uc2VjID0gMTAwMDAwMDsKLSAgICAgICAgICAgICAgIHRpbWVvdXQgLT0gMTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHRzLnR2X25zZWMgPSB0aW1lb3V0ICogMTAwMDAwMDsKLSAgICAgICAgICAgICAgIHRpbWVvdXQgPSAwOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIG5hbm9zbGVlcCgmdHMsICZsZWZ0KTsKLSAgICAgICAgICAgcmVzdWx0ID0gc2VtX3RyeXdhaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7Ci0gICAgICAgfQotICAgICAgIGlmICgwICE9IHJlc3VsdCkKLSAgICAgICB7Ci0gICAgICAgICAgIGlmICgoRUJVU1kgPT0gcmVzdWx0KSB8fCAoRUFHQUlOID09IHJlc3VsdCkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9USU1FX09VVDsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0Ffc2VtYXBob3JlV2FpdDogT1Mgc2VtYXBob3JlIHdhaXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgaW5jcmVtZW50cyB0aGUgc2VtYXBob3JlIGNvdW50ZXIuIFRoZSBzZW1hcGhvcmUgaXMKLSAqICAgICAgICAgICAgIGlkZW50aWZpZWQgYnkgaXRzIGNvbnRleHQKLSAqIEBub3RlICAgICAgIElmIHRoZSBzZW1hcGhvcmUgY291bnRlciBpcyB1cHBlciB0aGFuIHplcm8gKGFmdGVyIGFkZGl0aW9uKSwKLSAqICAgICAgICAgICAgIHRoZSBNNE9TQV9zZW1hcGhvcmVXYWl0IGNhbGwgb2YgdGhlIHRocmVhZCB3aXRoIHRoZSBoaWdoZXN0Ci0gKiAgICAgICAgICAgICBwcmlvcml0eSBpcyB1bmJsb2NrZWQgYW5kIG1hZGUgcmVhZHkgdG8gcnVuLgotICogQG5vdGUgICAgICAgTm8gaHlwb3RoZXNlcyBjYW4gYmUgbWFkZSBvbiB3aGljaCB0aHJlYWQgd2lsbCBiZSB1bmJsb2NrZWQKLSAqICAgICAgICAgICAgIGJldHdlZW4gdGhyZWFkcyB3aXRoIHRoZSBzYW1lIHByaW9yaXR5LgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBzZW1hcGhvcmUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlUG9zdChNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICBNNE9TQV9TZW1hcGhvcmVDb250ZXh0KiBzZW1hcGhvcmVDb250ZXh0ID0gKE00T1NBX1NlbWFwaG9yZUNvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9zZW1hcGhvcmVQb3N0XHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3NlbWFwaG9yZVBvc3QiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9TRU1BUEhPUkUsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVQb3N0Iik7Ci0KLSAgIHNlbV9wb3N0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYSBzZW1hcGhvcmUgKGlkZW50aWZ5IGJ5IGl0cyBjb250ZXh0KS4KLSAqICAgICAgICAgICAgIEFmdGVyIHRoaXMgY2FsbCB0aGUgc2VtYXBob3JlIGFuZCBpdHMgY29udGV4dCBpcyBubyBtb3JlCi0gKiAgICAgICAgICAgICB1c2VhYmxlLiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGFsbCB0aGUgbWVtb3J5IHJlbGF0ZWQgdG8gdGhpcwotICogICAgICAgICAgICAgc2VtYXBob3JlLgotICogQG5vdGUgICAgICAgSXQgaXMgYW4gYXBwbGljYXRpb24gaXNzdWUgdG8gd2FycmFudCBubyBtb3JlIHRocmVhZHMgYXJlIGxvY2tlZAotICogICAgICAgICAgICAgb24gdGhlIGRlbGV0ZWQgc2VtYXBob3JlLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBzZW1hcGhvcmUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZUNsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgIE00T1NBX1NlbWFwaG9yZUNvbnRleHQqIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3NlbWFwaG9yZUNsb3NlXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3NlbWFwaG9yZUNsb3NlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihzZW1hcGhvcmVDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0Ffc2VtYXBob3JlQ2xvc2UiKTsKLQotICAgc2VtX2Rlc3Ryb3koJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7Ci0KLSAgIGZyZWUoc2VtYXBob3JlQ29udGV4dCk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9UaHJlYWQuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1RocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZTgyZmIzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1RocmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVGhyZWFkLmMKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBJbXBsZW1lbnRzIGFuZCBtYW5pcHVsYXRlIHRocmVhZHMKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdGhyZWFkcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVGhyZWFkLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGhyZWFkX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0KLQotdm9pZCogTTRPU0FfdGhyZWFkU3luY0ZvckV2ZXJEbyh2b2lkICpjb250ZXh0KQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfQm9vbCBhdXRvX2tpbGwgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qCi0gICAgICAgTTRPU0FfVm9pZCogdXNlckRhdGE7Ci0gICAgKi8KLQotICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX3RocmVhZFN5bmNGb3JFdmVyRG9cdFx0TFBWT0lEIDB4JXgiLCBjb250ZXh0KTsKLQotICAgIC8qCi0gICAgICAgdXNlckRhdGEgPSB0aHJlYWRDb250ZXh0LT51c2VyRGF0YTsKLSAgICAqLwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotCi0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRSdW5uaW5nOwotCi0gICBNNE9TQV9zZW1hcGhvcmVQb3N0KHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCk7Ci0KLSAgIHdoaWxlKHRocmVhZENvbnRleHQtPnN0YXRlID09IE00T1NBX2tUaHJlYWRSdW5uaW5nKQotICAgewotICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgICAgIGlmKCh0aHJlYWRDb250ZXh0LT5mdW5jKHRocmVhZENvbnRleHQtPnBhcmFtKSkgIT0gTTROT19FUlJPUikKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICAgICAgICBpZih0aHJlYWRDb250ZXh0LT5zdGF0ZSA9PSBNNE9TQV9rVGhyZWFkUnVubmluZykKLSAgICAgICAgIHsKLQotICAgICAgICAgICAgLy9QUiAyMzU0IC0gQUNPIDogU3VwcHJlc3Mgc3RvcHBpbmcgc3RhdGUgYW5kIGRvbid0Ci0gICAgICAgICAgICAvLyAgICAgICAgIHVubG9jayBtdXRleCBiZWZvcmUgY2xvc2luZyB0aGUgdGhyZWFkCi0gICAgICAgICAgICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7Ci0gICAgICAgICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgfQotCi0gICAgICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLSAgICAgIH0KLQotICAgICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0gICB9Ci0KLQotICAgTTRPU0Ffc2VtYXBob3JlUG9zdCh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3ApOwotCi0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0KLSAgIHJldHVybiAwOwotfQotCi0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgdGhyZWFkLiBBZnRlciB0aGlzIGNhbGwgdGhlIHRocmVhZCBpcwotICogICAgICAgICAgICAgaWRlbnRpZmllZCBieSBpdHMgImNvbnRleHQiLiBUaGUgdGhyZWFkIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGJ5Ci0gKiAgICAgICAgICAgICB0aGUgImZ1bmMiIHBhcmFtZXRlci4gVGhpcyBmdW5jdGlvbiBjcmVhdGVzICYgYWxsb2NhdGVzIGEgdW5pcXVlCi0gKiAgICAgICAgICAgICBjb250ZXh0LiBJdCdzIHRoZSBPU0FMIHJlYWwgdGltZSByZXNwb25zaWJpbGl0eSBmb3IgbWFuYWdpbmcgaXRzCi0gKiAgICAgICAgICAgICBjb250ZXh0LiBJdCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBNNE9TQV90aHJlYWRTeW5jQ2xvc2UgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICBUaGUgY29udGV4dCBwYXJhbWV0ZXIgd2lsbCBiZSBzZW50IGJhY2sgdG8gYW55IE9TQUwgY29yZSB0aHJlYWQKLSAqICAgICAgICAgICAgIGZ1bmN0aW9ucyB0byBhbGxvdyByZXRyaWV2aW5nIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgb3BlbmVkCi0gKiAgICAgICAgICAgICB0aHJlYWQuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIHRocmVhZCwgYnV0IHRoZSB0aHJlYWQgaXMgbm90IHJ1bm5pbmcuCi0gKiBAbm90ZSAgICAgICBPbmNlIHRoZSB0aHJlYWQgaXMgY3JlYXRlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRPcGVuZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihPVVQpIENvbnRleHQgb2YgdGhlIGNyZWF0ZWQgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBmdW5jOihJTikgImRvSXQiIGZ1bmN0aW9uIHBvaW50ZXIgdG8gcnVuCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgIE00RVJSX0NPTlRFWFRfRkFJTEVEOiB0aGUgY29udGV4dCBjcmVhdGlvbiBmYWlsZWQKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNPcGVuKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkRG9JdCBmdW5jKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV90aHJlYWRTeW5jT3Blblx0XHRNNE9TQV9Db250ZXh0KiAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfVGhyZWFkRG9JdCAweCV4IiwgY29udGV4dCwgZnVuYyk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY09wZW4iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGZ1bmMgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY09wZW4iKTsKLQotICAgKmNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICB0aHJlYWRDb250ZXh0ID0KLSAgICAgIChNNE9TQV9UaHJlYWRDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1RocmVhZENvbnRleHQpLAotICAgICAgTTRPU0FfVEhSRUFELCAoTTRPU0FfQ2hhciopIk00T1NBX3RocmVhZFN5bmNPcGVuOiB0aHJlYWQgY29udGV4dCIpOwotCi0gICBpZih0aHJlYWRDb250ZXh0ID09IE00T1NBX05VTEwpCi0gICB7Ci0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX3RocmVhZFN5bmNPcGVuIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgIH0KLQotICAgdGhyZWFkQ29udGV4dC0+ZnVuYyA9IGZ1bmM7Ci0gICB0aHJlYWRDb250ZXh0LT5zdGFja1NpemUgPSA2NCAqIDEwMjQ7Ci0gICB0aHJlYWRDb250ZXh0LT5uYW1lID0gTTRPU0FfTlVMTDsKLSAgIHRocmVhZENvbnRleHQtPnRocmVhZElEID0gMDsKLSAgIHRocmVhZENvbnRleHQtPmNvcmVJRCA9IE00T1NBX1RIUkVBRDsKLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKLSAgIHRocmVhZENvbnRleHQtPnByaW9yaXR5ID0gTTRPU0Ffa1RocmVhZE5vcm1hbFByaW9yaXR5IDsKLQotICAgZXJyX2NvZGUgPSBNNE9TQV9tdXRleE9wZW4oJih0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KSk7Ci0KLSAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCi0gICB7Ci0gICAgICBNNE9TQV9ERUJVRyhlcnJfY29kZSwgIk00T1NBX3RocmVhZFN5bmNPcGVuOiBNNE9TQV9tdXRleE9wZW4iKTsKLQotICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgfQotCi0gICBlcnJfY29kZSA9IE00T1NBX3NlbWFwaG9yZU9wZW4oJih0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3ApLCAwKTsKLQotICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKGVycl9jb2RlLCAiTTRPU0FfdGhyZWFkU3luY09wZW46IE00T1NBX3NlbWFwaG9yZU9wZW4iKTsKLQotICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgfQotCi0gICAqY29udGV4dCA9IHRocmVhZENvbnRleHQ7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgcnVucyBhIHNwZWNpZmllZCB0aHJlYWQuIFRoZSAicGFyYW0iIHBhcmFtZXRlcgotICogICAgICAgICAgICAgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBzZXQgYSBzcGVjaWZpYyBwYXJhbWV0ZXIgdG8gdGhlCi0gKiAgICAgICAgICAgICBjcmVhdGVkIHRocmVhZC4gVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZSBzZWNvbmQgb25lIG9mCi0gKiAgICAgICAgICAgICB0aGUgIk00T1NBX1RocmVhZERvSXQiIGZ1bmN0aW9uLgotICogQG5vdGUgICAgICAgVGhpcyBtZXRob2QgaXMgYSBibG9ja2luZyB1cCB0byB0aGUgdGhyZWFkIGlzIHJ1bm5pbmcuCi0gKiAgICAgICAgICAgICBCZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRPcGVuZWQuCi0gKiAgICAgICAgICAgICBPbmNlIHRoZSBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZFN0YXJ0aW5nLgotICogICAgICAgICAgICAgT25jZSB0aGUgdGhyZWFkIGlzIHJ1bm5pbmcsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkUnVubmluZy4KLSAqIEBub3RlICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkuIElmIHRoZSAidGhyZWFkU3RhcnRlZCIgb3B0aW9uSUQKLSAqICAgICAgICAgICAgIGlzIG5vdCBOVUxMLCB0aGUgdGhyZWFkIHdpbGwgY2FsbCBpdCBiZWZvcmUgcnVubmluZyB0aGUgZG9JdAotICogICAgICAgICAgICAgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgcGFyYW06KElOKSBBcHBsaWNhdGlvbiBkYXRhIHRocmVhZCBwYXJhbWV0ZXIKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9TVEFURTogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgICAgTTRFUlJfVEhSRUFEX05PVF9TVEFSVEVEOiB0aGUgdGhyZWFkIGRpZCBub3Qgc3RhcnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0YXJ0KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcGFyYW0pCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gIChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgcHRocmVhZF9hdHRyX3QgICAgIGF0dHJpYnV0ZSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwotICAgaW50ICAgICAgICAgICAgICAgIG1pbiAgICAgICA9IDA7Ci0gICBpbnQgICAgICAgICAgICAgICAgbWF4ICAgICAgID0gMDsKLSAgIGludCAgICAgICAgICAgICAgICBwcmlvcml0eSAgPSAwOwotICAgc3RydWN0IHNjaGVkX3BhcmFtIHNjaGVkICAgICA9IHsgMCB9OwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfdGhyZWFkU3luY1N0YXJ0XHRcdE00T1NBX0NvbnRleHQgMHgleFx0TTRPU0FfVm9pZCogIgotICAgICAgICAgICAgICAgICAgIjB4JXgiLCBjb250ZXh0LCBwYXJhbSk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1N0YXJ0Iik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY1N0YXJ0Iik7Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICBpZih0aHJlYWRDb250ZXh0LT5zdGF0ZSAhPSBNNE9TQV9rVGhyZWFkT3BlbmVkKQotICAgewotICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUQVRFLCAiTTRPU0FfdGhyZWFkU3luY1N0YXJ0Iik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkU3RhcnRpbmc7Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotICAgdGhyZWFkQ29udGV4dC0+cGFyYW0gPSBwYXJhbTsKLQotICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9pbml0KCAmYXR0cmlidXRlICkgKQotICAgewotICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSggJmF0dHJpYnV0ZSwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQgKSApCi0gICAgICB7Ci0gICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSggJmF0dHJpYnV0ZSwgKHNpemVfdCl0aHJlYWRDb250ZXh0LT5zdGFja1NpemUgKSApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KCAmYXR0cmlidXRlLCBTQ0hFRF9PVEhFUiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUZW50YXRpdmUgcGF0Y2hlcyB0byBoYW5kbGUgcHJpb3JpdGllcyBpbiBhIGJldHRlciB3YXkgOiAqLwotICAgICAgICAgICAgICAgIC8qIFVzZSBBbmRyb2lkJ3MgcHJlZGVmaW5lZCBwcmlvcml0aWVzIChyYW5nZSArMTkuLi0yMCkKLSAgICAgICAgICAgICAgICAgKnJhdGhlciB0aGFuIExpbnV4IG9uZXMgKDAuLjk5KSovCi0KLSAgICAgICAgICAgICAgICAvKiBHZXQgbWluIGFuZCBtYXggcHJpb3JpdGllcyAqLwotICAgICAgICAgICAgICAgIG1pbiA9IHNjaGVkX2dldF9wcmlvcml0eV9taW4oIFNDSEVEX0ZJRk8gKTsKLSAgICAgICAgICAgICAgICBtYXggPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KCBTQ0hFRF9GSUZPICk7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfdGhyZWFkU3luY1N0YXJ0IE1BWD0lZCBNSU49JWQiLCBtYXgsIG1pbik7Ci0KLSAgICAgICAgICAgICAgICAvKiB0ZW50YXRpdmUgbW9kaWZpY2F0aW9uIG9mIHRoZSBwcmlvcml0aWVzICovCi0gICAgICAgICAgICAgICAgLyogU2V0IHRoZSBwcmlvcml0eSBiYXNlZCBvbiBkZWZhdWx0IGFuZHJvaWQgcHJpb3JpdGllcyAqLwotICAgICAgICAgICAgICAgIC8qIFRoaXMgcHJvYmFibHkgcmVxdWlyZXMgc29tZSBtb3JlIHR1bmluZywKLSAgICAgICAgICAgICAgICAgKiBvdXRjb21lIG9mIHRoaXMgcHJpb3JpdHkgc2V0dGluZ3MgYXJlIG5vdCB5ZXQgc2F0aXNmYWN0b3J5ICovCi0gICAgICAgICAgICAgICAgLyogSW1wbGVtZW50aW5nIHRocmVhZCBoYW5kbGluZyBiYXNlZCBvbiBBbmRyb2lkJ3MgdGhyZWFkIGNyZWF0aW9uCi0gICAgICAgICAgICAgICAgICogaGVscGVycyBtaWdodCBicmluZyBzb21lIGltcHJvdmVtZW50IChzZWUgdGhyZWFkcy5oKSAqLwotICAgICAgICAgICAgICAgIHN3aXRjaCh0aHJlYWRDb250ZXh0LT5wcmlvcml0eSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkTG93ZXN0UHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9OT1JNQUw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZExvd1ByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfRElTUExBWTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkTm9ybWFsUHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfRElTUExBWTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkSGlnaFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfQVVESU87Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZEhpZ2hlc3RQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNjaGVkLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0oICZhdHRyaWJ1dGUsICZzY2hlZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2NyZWF0ZSggJnRocmVhZENvbnRleHQtPnRocmVhZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk00T1NBX3RocmVhZFN5bmNGb3JFdmVyRG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKil0aHJlYWRDb250ZXh0ICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIE00T1NBX0ZBTFNFID09IE00T1NBX0VSUl9JU19FUlJPUiggTTRPU0Ffc2VtYXBob3JlV2FpdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9XQUlUX0ZPUkVWRVIgKSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCAmYXR0cmlidXRlICk7Ci0gICB9Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICBNNE9TQV9ERUJVRyhNNEVSUl9USFJFQURfTk9UX1NUQVJURUQsICJNNE9TQV90aHJlYWRTeW5jU3RhcnQiKTsKLQotICAgcmV0dXJuIE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRDsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBzdG9wcyBhIHNwZWNpZmllZCB0aHJlYWQuCi0gKiBAbm90ZSAgICAgICBUaGlzIGNhbGwgaXMgYSBibG9ja2luZyBvbmUgdXAgdG8gdGhlICJNNE9TQV9UaHJlYWREb0l0IgotICogICAgICAgICAgICAgZnVuY3Rpb24gaGFzIHJldHVybmVkLgotICogICAgICAgICAgICAgQmVmb3JlIHRoZSBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZFJ1bm5pbmcuCi0gKiAgICAgICAgICAgICBPbmNlIHRoZSBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZFN0b3BwaW5nLgotICogICAgICAgICAgICAgT25jZSB0aGUgdGhyZWFkIGlzIHN0b3BwZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgotICogQG5vdGUgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBvbmNlIHRoZSB0aHJlYWQgaGFzIGJlZW4gc3RvcHBlZC4gSWYgdGhlCi0gKiAgICAgICAgICAgICAidGhyZWFkU3RvcHBlZCIgb3B0aW9uSUQgaXMgbm90IE5VTEwsIHRoZSB0aHJlYWQgd2lsbCBjYWxsIGl0Ci0gKiAgICAgICAgICAgICBiZWZvcmUgZHlpbmcuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9TVEFURTogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNTdG9wKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3RocmVhZFN5bmNTdG9wXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTdG9wIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY1N0b3AiKTsKLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlICE9IE00T1NBX2tUaHJlYWRSdW5uaW5nKQotICAgewotICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUQVRFLCAiTTRPU0FfdGhyZWFkU3luY1N0b3AiKTsKLQotICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgfQotCi0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRTdG9wcGluZzsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIE00T1NBX3NlbWFwaG9yZVdhaXQodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wLCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkT3BlbmVkOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgZGVsZXRlcyBhIHRocmVhZCAoaWRlbnRpZmllZCBieSBpdHMgY29udGV4dCkuIEFmdGVyCi0gKiAgICAgICAgICAgICB0aGlzIGNhbGwgdGhlIHRocmVhZCBhbmQgaXRzIGNvbnRleHQgYXJlIG5vIG1vcmUgdXNlYWJsZS4gVGhpcwotICogICAgICAgICAgICAgZnVuY3Rpb24gZnJlZXMgYWxsIHRoZSBtZW1vcnkgcmVsYXRlZCB0byB0aGlzIHRocmVhZC4KLSAqIEBub3RlICAgICAgIEJlZm9yZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRPcGVuZWQuCi0gKiAgICAgICAgICAgICBPbmNlIHRoZSBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZENsb3NlZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX1NUQVRFOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0Nsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3RocmVhZFN5bmNDbG9zZVx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2UiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2UiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPnN0YXRlID09IE00T1NBX2tUaHJlYWRDbG9zZWQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2UiKTsKLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlICE9IE00T1NBX2tUaHJlYWRPcGVuZWQpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2UiKTsKLQotICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgfQotCi0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRDbG9zZWQ7Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICBlcnJfY29kZSA9IE00T1NBX211dGV4Q2xvc2UodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCi0gICB7Ci0gICAgICBNNE9TQV9ERUJVRyhlcnJfY29kZSwgIk00T1NBX3RocmVhZFN5bmNDbG9zZTogTTRPU0FfbXV0ZXhDbG9zZSIpOwotCi0gICAgICByZXR1cm4gZXJyX2NvZGU7Ci0gICB9Ci0KLSAgIGVycl9jb2RlID0gTTRPU0Ffc2VtYXBob3JlQ2xvc2UodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKTsKLQotICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKGVycl9jb2RlLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlOiBNNE9TQV9zZW1hcGhvcmVDbG9zZSIpOwotCi0gICAgICByZXR1cm4gZXJyX2NvZGU7Ci0gICB9Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPm5hbWUgIT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIGZyZWUodGhyZWFkQ29udGV4dC0+bmFtZSk7Ci0gICB9Ci0KLSAgIGZyZWUodGhyZWFkQ29udGV4dCk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIHRocmVhZCB0byByZXR1cm4gaXRzIHN0YXRlLgotICogQG5vdGUgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcgdGhlIHN0YXRlCi0gKiAgICAgICAgICAgICBmaWVsZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEBwYXJhbSAgICAgIHN0YXRlOihPVVQpIFRocmVhZCBzdGF0ZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkU3RhdGUqIHN0YXRlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX1RocmVhZFN0YXRlKiAweCV4IiwgY29udGV4dCwgc3RhdGUpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoc3RhdGUgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUiKTsKLQotICAgKnN0YXRlID0gdGhyZWFkQ29udGV4dC0+c3RhdGU7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHNsZWVwIGR1cmluZyAidGltZVNsZWVwIgotICogICAgICAgICAgICAgbWlsbGlzZWNvbmRzLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBjb250ZXh0LgotICogQHBhcmFtICAgICAgdGltZTooSU4pIFRpbWUgdG8gc2xlZXAgaW4gbWlsbGlzZWNvbmRzCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTbGVlcChNNE9TQV9VSW50MzIgdGltZSkKLXsKLSAgIHN0cnVjdCB0aW1lc3BlYyBycXRwID0geyAwLCAwIH07Ci0gICBzdHJ1Y3QgdGltZXNwZWMgcm10cCA9IHsgMCwgMCB9OwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfdGhyZWFkU2xlZXBcdFx0TTRPU0FfVUludDMyICVkIiwgdGltZSk7Ci0KLSAgIHJxdHAudHZfc2VjID0gKHRpbWVfdCl0aW1lLzEwMDA7Ci0gICBycXRwLnR2X25zZWMgPSAodGltZSUxMDAwKSAqIDEwMDAwMDA7Ci0gICBuYW5vc2xlZXAoJnJxdHAsICZybXRwKTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNQcmlvcml0eShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWwgcHJpb3JpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWwpKG9wdGlvblZhbHVlKTsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNQcmlvcml0eVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9EYXRhT3B0aW9uIDB4JXgiLCBjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgIGlmKChNNE9TQV9VSW50MzIpKHVpbnRwdHJfdClvcHRpb25WYWx1ZT5NNE9TQV9rVGhyZWFkTG93ZXN0UHJpb3JpdHkpCi0gICB7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgfQotCi0gICB0aHJlYWRDb250ZXh0LT5wcmlvcml0eSA9IHByaW9yaXR5OwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZKi8KLQotCi0KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FID09IE00T1NBX1RSVUUpCi0KLU00T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jTmFtZShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfQ2hhciogbmFtZSA9IChNNE9TQV9DaGFyKilvcHRpb25WYWx1ZTsKLSAgIE00T1NBX1VJbnQzMiBuYW1lU2l6ZSA7Ci0KLSAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9TZXRUaHJlYWRTeW5jTmFtZVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9EYXRhT3B0aW9uIDB4JXgiLCBjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPm5hbWUgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGZyZWUodGhyZWFkQ29udGV4dC0+bmFtZSk7Ci0gICAgICB0aHJlYWRDb250ZXh0LT5uYW1lID0gTTRPU0FfTlVMTDsKLSAgIH0KLQotICAgaWYob3B0aW9uVmFsdWUgIT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIG5hbWVTaXplID0gc3RybGVuKChjb25zdCBjaGFyICopbmFtZSkrMTsKLQotICAgICAgdGhyZWFkQ29udGV4dC0+bmFtZSA9Ci0gICAgICAgICAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5hbWVTaXplLCBNNE9TQV9USFJFQUQsCi0gICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX1NldFRocmVhZFN5bmNOYW1lOiB0aHJlYWQgbmFtZSIpOwotCi0gICAgICBpZih0aHJlYWRDb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICB9Ci0KLSAgICAgIG1lbWNweSgodm9pZCAqKXRocmVhZENvbnRleHQtPm5hbWUsICh2b2lkICopbmFtZSwKLSAgICAgICAgICAgICAgICAgICBuYW1lU2l6ZSk7Ci0gICB9Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSovCi0KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFID09IE00T1NBX1RSVUUpCi0KLU00T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jU3RhY2tTaXplKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNTdGFja1NpemVcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfRGF0YU9wdGlvbiAweCV4IiwgY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICB0aHJlYWRDb250ZXh0LT5zdGFja1NpemUgPSAoTTRPU0FfVUludDMyKSh1aW50cHRyX3Qpb3B0aW9uVmFsdWU7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBPU0FMLVRocmVhZCBjb21wb25lbnQgdG8gc2V0IHRoZSB2YWx1ZQotICogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLSAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBvZiBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICAidmFsdWUiIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbAotICogICAgICAgICAgICAgdmFyaWFibGUuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6KElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICBvcHRpb25WYWx1ZTooSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9TVEFURTogdGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX1JFQURfT05MWTogdGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb25cdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfT3B0aW9uSUQgJWRcdE00T1NBX0RhdGFPcHRpb24gMHgleCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9USFJFQUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9SRUFEX09OTFksICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlICE9IE00T1NBX2tUaHJlYWRPcGVuZWQpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgc3dpdGNoKG9wdGlvbklEKQotICAgewotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZFByaW9yaXR5OgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHkoY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWROYW1lOgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jTmFtZShjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkU3RhY2tTaXplOgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jU3RhY2tTaXplKGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSovCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgICAgICAgIGVycl9jb2RlID0gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgfQotICAgfQotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgcmV0dXJuIGVycl9jb2RlOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBPU0FMLVRocmVhZCB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQKLSAqICAgICAgICAgICAgIHdpdGggdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICAib3B0aW9uVmFsdWUiIG11c3QgYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgcmVsYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIG9wdGlvbklELgotICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGUtYWxsb2NhdGluZyB0aGUgInZhbHVlIgotICogICAgICAgICAgICAgZmllbGQsIHRoZSBjb3JlIE9TQUwtVGhyZWFkIGNvbXBvbmVudCBtdXN0IHBlcmZvcm0gYSBjb3B5IG9mIGl0cwotICogICAgICAgICAgICAgaW50ZXJuYWwgdmFsdWUgdG8gdGhlIHZhbHVlIGZpZWxkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4pIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6KElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICBvcHRpb25WYWx1ZTooT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfV1JJVEVfT05MWTogdGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvblx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9PcHRpb25JRCAlZFx0TTRPU0FfRGF0YU9wdGlvbiogMHgleCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIob3B0aW9uVmFsdWUgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX1RIUkVBRCksCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1dSSVRFX09OTFksICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIHN3aXRjaChvcHRpb25JRCkKLSAgIHsKLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRQcmlvcml0eToKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWwqIHByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsKilvcHRpb25WYWx1ZTsKLQotICAgICAgICAgKnByaW9yaXR5ID0gdGhyZWFkQ29udGV4dC0+cHJpb3JpdHk7Ci0KLSAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZE5hbWU6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9DaGFyKiogbmFtZSA9IChNNE9TQV9DaGFyKiopb3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICpuYW1lID0gdGhyZWFkQ29udGV4dC0+bmFtZTsKLQotICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRTdGFja1NpemU6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9VSW50MzIqIHN0YWNrU2l6ZSA9IChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlOwotCi0gICAgICAgICAqc3RhY2tTaXplID0gdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplOwotCi0gICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFKi8KLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTBlZDkxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX0RlYnVnVHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICBNNFBTV19EZWJ1Z1RyYWNlLmMKLSAqIEBicmllZiAgICAgIERlZmF1bHQgdHJhY2UgZnVuY3Rpb24gZm9yIGRlYnVnZ2luZyBtYWNyb3MKLSAqIEBub3RlICAgICAgIFRoaXMgZmlsZSBnaXZlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhY2UgZnVuY3Rpb24KLSAqICAgICAgICAgICAgIHVzZWQgaW4gdGhlIGRlYnVnIGluc3RydW1lbnRhdGlvbiBtYWNyb3MsIGJhc2VkIG9uIHByaW50Zi4KLSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIHdyaXRlcnMgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gaW1wbGVtZW50IHRoZWlyCi0gKiAgICAgICAgICAgICBvd24gIk00T1NBX0RlYnVnVHJhY2UiLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPiAvKmZvciBwcmludGYgKi8KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyojZGVmaW5lIE5PX0ZJTEUgKi8gLyogc3VwcHJlc3NlcyB0aGUgZmlsZSBuYW1lIHByaW50IG91dCAqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogdm9pZCBNNE9TQV9EZWJ1Z1RyYWNlKE00T1NBX0ludDMyIGxpbmUsIGNoYXIqIGZpbGUsIE00T1NBX0ludDMyIGxldmVsLAotICogICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGNvbmQsIGNoYXIqIG1zZywgTTRPU0FfRVJSIGVycikKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHRyYWNlIGZvciBkZWJ1ZyB0ZXN0cwotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB0byBiZSBjYWxsZWQgaW4gdGhlIGRlYnVnIG1hY3JvcyBvbmx5LgotICogICAgICAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgcHJpbnRmLgotICogQHBhcmFtICAgIGxpbmUgKElOKTogdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBzb3VyY2UgZmlsZQotICogQHBhcmFtICAgIGZpbGUgKElOKTogdGhlIHNvdXJjZSBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgICBsZXZlbCAoSU4pOiB0aGUgZGVidWcgbGV2ZWwKLSAqIEBwYXJhbSAgICBtc2cgKElOKTogdGhlIGVycm9yIG1lc3NhZ2UKLSAqIEBwYXJhbSAgICBlcnIgKElOKTogdGhlIHJldHVybiB2YWx1ZSAoZXJyb3IgY29kZSkKLSAqIEByZXR1cm4gICAgbm9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIHZvaWQgTTRPU0FfRGVidWdUcmFjZShNNE9TQV9JbnQzMiBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgZXJyKQotewotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICAvKiB0cnkgdG8gImluZGVudCIgdGhlIHJlc3VsdGluZyB0cmFjZXMgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCAqLwotICAgIGZvciAoaSA9MCA7IGkgPCBsZXZlbDsgaSArKykKLSAgICB7Ci0gICAgICAgIHByaW50ZigiICIpOwotICAgIH0KLQotI2lmZGVmIE5PX0ZJTEUKLSAgICBwcmludGYoIkVycm9yOiAlIiBQUkl1MzIgIiwgb24gJXM6ICVzXG4iLGVycixjb25kLG1zZyk7Ci0jZWxzZSAvKiBOT19GSUxFICAgICAqLwotICAgIHByaW50ZigiRXJyb3I6ICUiIFBSSXUzMiAiLCBvbiAlczogJXMgTGluZSAlIiBQUkl1MzIgIiBpbjogJXNcbiIsZXJyLGNvbmQsbXNnLGxpbmUsZmlsZSk7Ci0jZW5kaWYgLyogTk9fRklMRSAgICAgKi8KLQotfQotCi1NNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgTTRPU0FfVm9pZCBNNE9TQV9ERUJVR190cmFjZUZ1bmN0aW9uKE00T1NBX1VJbnQzMiBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmdDb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiByZXR1cm5lZEVycm9yKQotewotICAgIE00T1NBX0RlYnVnVHJhY2UobGluZSwgZmlsZU5hbWUsIGxldmVsLCBzdHJpbmdDb25kaXRpb24sIG1lc3NhZ2UsIHJldHVybmVkRXJyb3IpOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19NZW1vcnlJbnRlcmZhY2UuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX01lbW9yeUludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTRjY2VhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX01lbW9yeUludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMKLSAqIEBicmllZiAgTWVtb3J5IEludGVyZmFjZQotICogQG5vdGUgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgb3NhbCBtZW1vcnkgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPG1lbW9yeS5oPgotCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2lmbmRlZiBNNFZQU19BRFZBTkNFRF9NRU1PUllfTUFOQUdFUgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZm4gICAgICAgICBNNE9TQV9NZW1BZGRyMzIgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00T1NBX1VJbnQzMiBzaXplLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db3JlSUQgY29yZUlELAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmcpCi0gKiBAYnJpZWYgICAgICB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG1lbW9yeSBibG9jayAoYXQgbGVhc3QgMzIgYml0cyBhbGlnbmVkKQotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIHNpemUgKElOKTogc2l6ZSBvZiBhbGxvY2F0ZWQgYmxvY2sgaW4gYnl0ZXMKLSAqIEBwYXJhbSAgICAgIGNvcmVJRCAoSU4pOiBpZGVudGlmaWNhdGlvbiBvZiB0aGUgY2FsbGVyIGNvbXBvbmVudAotICogQHBhcmFtICAgICAgc3RyaW5nIChJTik6IGRlc2NyaXB0aW9uIG9mIHRoZSBhbGxvY2F0ZWQgYmxvY2sgKG51bGwgdGVybWluYXRlZCkKLSAqIEByZXR1cm4gICAgIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBibG9jaywgTTRPU0FfTlVMTCBpZiBubyBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9NZW1BZGRyMzIgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00T1NBX1VJbnQzMiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db3JlSUQgY29yZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmcpCi17Ci0gICAgTTRPU0FfTWVtQWRkcjMyIEFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogSWYgc2l6ZSBpcyAwLCBtYWxsb2Mgb24gV0lOIE9TIGFsbG9jYXRlcyBhIHplcm8tbGVuZ3RoIGl0ZW0gaW4KLSAgICAgKiB0aGUgaGVhcCBhbmQgcmV0dXJucyBhIHZhbGlkIHBvaW50ZXIgdG8gdGhhdCBpdGVtLgotICAgICAqIE9uIG90aGVyIHBsYXRmb3JtcywgbWFsbG9jIGNvdWxkIHJldHVybnMgYW4gaW52YWxpZCBwb2ludGVyCi0gICAgICogU28sIERPTidUIGFsbG9jYXRlIG1lbW9yeSBvZiAwIGJ5dGUgKi8KLSAgICBpZiAoc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFkZHJlc3M7Ci0gICAgfQotCi0gICAgaWYgKHNpemUlNCAhPSAwKQotICAgIHsKLSAgICAgICAgc2l6ZSA9IHNpemUgKyA0IC0gKHNpemUlNCk7Ci0gICAgfQotCi0gICAgQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyMzIpIG1hbGxvYyhzaXplKTsKLQotICAgIHJldHVybiBBZGRyZXNzOwotfQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfVHJhY2UuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX1RyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzZDlhMWYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfVHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRQU1dfVHJhY2UuYwotICogQGJyaWVmICAgICAgICBUcmFjZSBmdW5jdGlvbiBmb3IgdHJhY2UgbWFjcm9zCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGdpdmVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhY2UgZnVuY3Rpb24gdXNlZAotICogICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlIGluc3RydW1lbnRhdGlvbiBtYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+IC8qZm9yIHByaW50ZiAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPiAvKiBBTlNJIEMgbWFjcm9zIGFuZCBkZWZzIGZvciB2YXJpYWJsZSBhcmdzICovCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNkZWZpbmUgTk9fRklMRSAvKiBzdXBwcmVzc2VzIHRoZSBmaWxlIG5hbWUgcHJpbnQgb3V0ICovCi0KLSNkZWZpbmUgTUFYX1NUUklOR19TSVpFIDEwMjQKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiB2b2lkIE00T1NBX1RyYWNlKE00T1NBX0ludDMyIGxpbmUsIE00T1NBX0NoYXIqIGZpbGUgLE00T1NBX0ludDMyIGxldmVsLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmb3JtYXQsIC4uLikKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHRyYWNlIGZvciBkZWJ1ZyB0ZXN0cwotICogQG5vdGUgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHByaW50Zi4gRmlyc3QgdGhlIHZhcmlhYmxlcyBhcmUgcmV0cmlldmVkIHVzaW5nCi0gKiAgICAgICAgICAgIEFOU0kgQyBkZWZzIGFuZCBtYWNyb3Mgd2hpY2ggZW5hYmxlIHRvIGFjY2VzcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCi0gKiAgICAgICAgICAgIFRoZW4gdGhlIHByaW50ZiBpcyBkb25lICh3aXRoIHNvbWUgb3JuZW1lbnRhbCBhZGRzKS4KLSAqIEBwYXJhbSAgICBsZXZlbCAoSU4pOiB0aGUgZGVidWcgbGV2ZWwKLSAqIEBwYXJhbSAgICBmb3JtYXQgKElOKTogdGhlICJwcmludGYiIGZvcm1hdGVkIHN0cmluZwotICogQHBhcmFtICAgIC4uLiAoSU4pOiBhcyBtYW55IHBhcmFtZXRlcnMgYXMgcmVxdWlyZWQgLi4uCi0gKiBAcmV0dXJuICAgIG5vbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSB2b2lkIE00T1NBX1RyYWNlKE00T1NBX0ludDMyIGxpbmUsIE00T1NBX0NoYXIqIGZpbGUgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9DaGFyKiBmb3JtYXQsIC4uLikKLXsKLSAgICBNNE9TQV9DaGFyIG1lc3NhZ2VbTUFYX1NUUklOR19TSVpFXTsKLSAgICBNNE9TQV9JbnQzMiBpOwotICAgIHZhX2xpc3QgbWFya2VyOyAvKiBwb2ludGVyIHRvIGxpc3Qgb2YgYXJndW1lbnRzICovCi0KLSAgICAvKiBnZXQgdGhlIHZhciBhcmd1bWVudHMgaW50byB0aGUgc3RyaW5nIG1lc3NhZ2UgdG8gYmUgYWJsZSB0byBwcmludCAqLwotICAgIHZhX3N0YXJ0KG1hcmtlcixmb3JtYXQpOyAvKiBzZXQgcHRyIHRvIGZpcnN0IGFyZ3VtZW50IGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uICovCi0gICAgdnNwcmludGYoKGNoYXIgKiltZXNzYWdlLCAoY29uc3QgY2hhciAqKWZvcm1hdCxtYXJrZXIgKTsgIC8qIGZvcm1hdHMgYW5kIHdyaXRlcyB0aGUgZGF0YSBpbnRvIG1lc3NhZ2UgKi8KLSAgICB2YV9lbmQobWFya2VyKTsgLyogcmVzZXQgcG9pbnRlciB0byBOVUxMICovCi0KLSAgICAvKiBkbyB0aGUgYWN0dWFsIHByaW50ICovCi0jaWZkZWYgTk9fRklMRQotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RyYWNlIiwgIiVzIiwgKGNoYXIqKW1lc3NhZ2UpOwotI2Vsc2UgLyogTk9fRklMRSAgICAgKi8KLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UcmFjZSIsICIlcyIsICIlcyBhdCAlbHUgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltZXNzYWdlLCBsaW5lLCBmaWxlKTsKLSNlbmRpZiAvKiBOT19GSUxFICAgICAqLwotCi19Ci0KLU00T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSBNNE9TQV9Wb2lkIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oTTRPU0FfVUludDMyIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db3JlSUQgY29yZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZ01zZywgLi4uKQotewotICAgIE00T1NBX0NoYXIgbWVzc2FnZVtNQVhfU1RSSU5HX1NJWkVdOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgdmFfbGlzdCBtYXJrZXI7IC8qIHBvaW50ZXIgdG8gbGlzdCBvZiBhcmd1bWVudHMgKi8KLQotICAgIC8qIGdldCB0aGUgdmFyIGFyZ3VtZW50cyBpbnRvIHRoZSBzdHJpbmcgbWVzc2FnZSB0byBiZSBhYmxlIHRvIHByaW50ICovCi0gICAgdmFfc3RhcnQobWFya2VyLHN0cmluZ01zZyk7IC8qIHNldCBwdHIgdG8gZmlyc3QgYXJndW1lbnQgaW4gdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gKi8KLSAgICB2c3ByaW50ZigoY2hhciAqKW1lc3NhZ2UsIChjb25zdCBjaGFyICopc3RyaW5nTXNnLG1hcmtlciApOyAgLyogZm9ybWF0cyBhbmQgd3JpdGVzIHRoZSBkYXRhIGludG8gbWVzc2FnZSAqLwotICAgIHZhX2VuZChtYXJrZXIpOyAvKiByZXNldCBwb2ludGVyIHRvIE5VTEwgKi8KLQotICAgIC8qIGRvIHRoZSBhY3R1YWwgcHJpbnQgKi8KLSNpZmRlZiBOT19GSUxFCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbiIsICIlcyIsIChjaGFyKiltZXNzYWdlKTsKLSNlbHNlIC8qIE5PX0ZJTEUgICAgICovCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbiIsICIlcyIsICIlcyBhdCAlbHUgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1lc3NhZ2UsIGxpbmUsIChjaGFyKilmaWxlKTsKLSNlbmRpZiAvKiBOT19GSUxFICAgICAqLwotCi19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTk9USUNFIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWY5ZDE2Yi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfVHlwZXMuaAotICogQGJyaWVmICAgRGVmaW5pdGlvbiBvZiB0eXBlcyBmb3IgdGhlIGNvcmUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgTTRNUDRXX1RZUEVTX0gKLSNkZWZpbmUgTTRNUDRXX1RZUEVTX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLS8qIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00U1lTX1N0cmVhbS5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNENfRnR5cEJveAotICogQGJyaWVmICAgICAgIEluZm9ybWF0aW9uIHRvIGJ1aWxkIHRoZSAnZnR5cCcgYXRvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIE00TVBBQ19GVFlQX1RBRyAweDY2NzQ3OTcwIC8qICdmdHlwJyAqLwotI2RlZmluZSBNNE1QQUNfTUFYX0NPTVBBVElCTEVfQlJBTkRTIDEwCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIEFsbCBicmFuZCBmaWVsZHMgYXJlIGFjdHVhbGx5IGNoYXJbNF0gc3RvcmVkIGluIGJpZy1lbmRpYW4gaW50ZWdlciBmb3JtYXQgKi8KLQotICAgIE00T1NBX1VJbnQzMiAgICBtYWpvcl9icmFuZDsgICAgICAgICAvKiBnZW5lcmFsbHkgJzNncDQnICAgICAgICAgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbWlub3JfdmVyc2lvbjsgICAgICAgLyogZ2VuZXJhbGx5ICcwMDAwJyBvciAneC54ICcgICovCi0gICAgTTRPU0FfVUludDMyICAgIG5iQ29tcGF0aWJsZUJyYW5kczsgIC8qIG51bWJlciBvZiBjb21wYXRpYmxlIGJyYW5kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBjb21wYXRpYmxlX2JyYW5kc1tNNE1QQUNfTUFYX0NPTVBBVElCTEVfQlJBTkRTXTsgICAvKiBhcnJheSBvZiBtYXggY29tcGF0aWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZHMgKi8KLX0gTTRNUDRDX0Z0eXBCb3g7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX21lbUFkZHIKLSAqIEBicmllZiAgICAgICAgQnVmZmVyIHN0cnVjdHVyZSBmb3IgdGhlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHNpemU7Ci0gICAgTTRPU0FfTWVtQWRkcjMyICAgIGFkZHI7Ci19IE00TVA0V19tZW1BZGRyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRpbWUgdHlwZSBmb3IgdGhlIGNvcmUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX1VJbnQzMiBNNE1QNFdfVGltZTMyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgTTRNUDRXX1N0YXRlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBjb3JlIE1QNCB3cml0ZXIgc3RhdGVzCi0gKiBAbm90ZSAgICAgICAgIFRoZXNlIHN0YXRlcyBhcmUgdXNlZCBpbnRlcm5hbHksIGJ1dCBjYW4gYmUgcmV0cmlldmVkIGZyb20gb3V0c2lkZQotICogICAgICAgICAgICAgICB0aGUgd3JpdGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1QNFdfb3BlbmVkICAgICAgICAgICAgPSAweDEwMCwKLSAgICBNNE1QNFdfcmVhZHkgICAgICAgICAgICAgPSAweDIwMCwKLSAgICBNNE1QNFdfd3JpdGluZyAgICAgICAgICAgPSAweDMwMCwKLSAgICBNNE1QNFdfd3JpdGluZ19zdGFydEFVICAgPSAweDMwMSwKLSAgICBNNE1QNFdfY2xvc2VkICAgICAgICAgICAgPSAweDQwMAotfSBNNE1QNFdfU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRNUDRXX09wdGlvbklECi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBjb3JlIE1QNCB3cml0ZXIgb3B0aW9ucwotICogQG5vdGUgICAgICAgIFRoZXNlIG9wdGlvbnMgZ2l2ZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29yZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TVA0V19tYXhBVXBlckNodW5rICAgICAgICA9IDB4QzEwMSwKLSAgICBNNE1QNFdfbWF4Q2h1bmtTaXplICAgICAgICAgPSAweEMxMDIsCi0gICAgTTRNUDRXX21heENodW5rSW50ZXIgICAgICAgID0gMHhDMTAzLAotICAgIE00TVA0V19wcmVXcml0ZUNhbGxCYWNrICAgICA9IDB4QzEwNCwKLSAgICBNNE1QNFdfcG9zdFdyaXRlQ2FsbEJhY2sgICAgPSAweEMxMDUsCi0gICAgTTRNUDRXX21heEFVc2l6ZSAgICAgICAgICAgID0gMHhDMTA2LAotICAgIE00TVA0V19JT0QgICAgICAgICAgICAgICAgICA9IDB4QzExMSwKLSAgICBNNE1QNFdfRVNEICAgICAgICAgICAgICAgICAgPSAweEMxMTIsCi0gICAgTTRNUDRXX1NEUCAgICAgICAgICAgICAgICAgID0gMHhDMTEzLAotICAgIE00TVA0V190cmFja1NpemUgICAgICAgICAgICA9IDB4QzExNCwKLSAgICBNNE1QNFdfTU9PVmZpcnN0ICAgICAgICAgICAgPSAweEMxMjEsCi0gICAgTTRNUDRXX1YyX01PT0YgICAgICAgICAgICAgID0gMHhDMTMxLAotICAgIE00TVA0V19WMl90YmxDb21wcmVzICAgICAgICA9IDB4QzEzMiwKLSAgICAvKndhcm5pbmc6IHVuc3BlY2lmaWVkIG9wdGlvbnM6Ki8KLSAgICBNNE1QNFdfbWF4RmlsZVNpemUgICAgICAgICAgPSAweEMxNTIsCi0gICAgTTRNUDRXX0NhbWNvZGVyVmVyc2lvbiAgICAgID0gMHhDMTUzLCAvKjAwMCB0byA5OTkgISovCi0gICAgTTRNUDRXX2VzdGltYXRlQXVkaW9TaXplICAgID0gMHhDMTU0LCAvKmF1ZGlvIEFVcyBhcmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSB2aWRlbywgKi8KLSAgICAvKnRoaXMgb3B0aW9uIE1VU1QgTk9UIGJlIHNldCBpZiBub24gY29uc3RhbnQgYXVkaW8KLSAgICBmcmFtZSBzaXplIChlLmcuIGlmIFNJRCkqLwotICAgIE00TVA0V19lbWJlZGRlZFN0cmluZyAgICAgICA9IDB4QzE1NSwKLSAgICBNNE1QNFdfaW50ZWdyYXRpb25UYWcgICAgICAgPSAweEMxNTYsCi0gICAgTTRNUDRXX21heEZpbGVEdXJhdGlvbiAgICAgID0gMHhDMTU3LAotICAgIE00TVA0V19zZXRGdHlwQm94ICAgICAgICAgICA9IDB4QzE1OCwKLSAgICBNNE1QNFdfRFNJICAgICAgICAgICAgICAgICAgPSAweEMxNTksCi0gICAgLyogSC4yNjQgdHJpbW1pbmcgKi8KLSAgICBNNE1QNFdfTVVMX1BQU19TUFMgICAgICAgICAgPSAweEMxNjAsCi0gICAgLyogSC4yNjQgdHJpbW1pbmcgKi8KLX0gTTRNUDRXX09wdGlvbklEOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEF1ZGlvICYgdmlkZW8gc3RyZWFtIElEcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIEF1ZGlvU3RyZWFtSUQgMQotI2RlZmluZSBWaWRlb1N0cmVhbUlEIDIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZWZhdWx0IHBhcmFtZXRlcnMgdmFsdWVzLCB0aGF0IGNhbiBiZSBtb2RpZmllZCBieSBNNE1QNFdfc2V0T3B0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRXaWR0aCAzMjAKLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRIZWlnaHQgMjQwCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0TWF4QXVTaXplICA0MDk2IC8qYnl0ZXMqLwotI2RlZmluZSBNNE1QNFdfRGVmYXVsdE1heENodW5rU2l6ZSAxMDAwMDAgLypieXRlcyovCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0SW50ZXJsZWF2ZUR1ciAwIC8qYnl0ZXMqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19TdHJlYW1JRHNpemUKLSAqIEBicmllZiAgICAgICAgVmlkZW8gcGxhbmUgc2l6ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlEOwotICAgIE00T1NBX1VJbnQxNiAgICBoZWlnaHQ7Ci0gICAgTTRPU0FfVUludDE2ICAgIHdpZHRoOwotfSBNNE1QNFdfU3RyZWFtSURzaXplOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfVHJhY2tEYXRhCi0gKiBAYnJpZWYgICAgICAgSW50ZXJuYWwgY29yZSBNUDQgd3JpdGVyIHRyYWNrIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00U1lTX1N0cmVhbVR5cGUgICAgdHJhY2tUeXBlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgdGltZXNjYWxlOyAgICAgICAgICAvKiBUICh2aWRlbz0xMDAwKSwgKEFNUjg9ODAwMCksIChBTVIxNj0xNjAwMCkqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc2FtcGxlU2l6ZTsgICAgICAgICAvKiBTICh2aWRlbz0wKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBzdHRzVGFibGVFbnRyeU5iOyAgIC8qIEogKGF1ZGlvPTEpKi8KLSAgICBNNE1QNFdfVGltZTMyICAgICAgICBsYXN0Q1RTOyAgICAgICAgICAgLyogQ1RTIG9mIHRoZSBwcmV2aW91cyBBVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCB0byAwLkdpdmVzIGR1cmF0aW9uIGF0IHRoZSBlbmQuKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHNhbXBsZU5iOyAgICAgICAgICAgLyogSyAoYXVkaW89RikqLwotfSBNNE1QNFdfVHJhY2tEYXRhOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfQXVkaW9UcmFja0RhdGEKLSAqIEBicmllZiAgICAgICBJbnRlcm5hbCBjb3JlIE1QNCB3cml0ZXIgYXVkaW8gc3BlY2lmaWMgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRNUDRXX1N0YXRlICAgICAgICAgICAgbWljcm9TdGF0ZTsKLSAgICBNNE1QNFdfVHJhY2tEYXRhICAgICAgICBDb21tb25EYXRhOwotICAgIE00T1NBX1VDaGFyKiogICAgICAgICAgIENodW5rOwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rU2l6ZVRhYmxlOwotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua09mZnNldFRhYmxlOwotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGU7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50Q2h1bms7ICAgICAgIC8qIEluaXQgdG8gMCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudFBvczsgICAgICAgICAvKiBJbml0IHRvIDAgKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRTdHNjOyAgICAgICAgLyogSW5pdCB0byAwICovCi0jZW5kaWYKLSAgICBNNE1QNFdfVGltZTMyICAgICAgICAgICBzYW1wbGVEdXJhdGlvbjsgICAgIC8qIENoZWNrIChBTVI4PTE2MCksIChBTVIxNj0zMjApKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhDaHVua1NpemU7ICAgICAgIC8qIEluaXQgdG8gTTRNUDRXX01wNEZpbGVEYXRhLk1heENodW5rU2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTWF4QVVTaXplOyAgICAgICAgICAvKiBJbml0IHRvIE00TVA0V19NcDRGaWxlRGF0YS5NYXhBVVNpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIExhc3RBbGxvY2F0ZWRDaHVuazsKLSAgICAvKiBwcmV2aW91c2x5LCBhdWRpbyBhdSBzaXplIHdhcyBzdXBwb3NlZCBjb25zdGFudCwKLSAgICAgKiB3aGljaCBpcyBhY3R1YWxseSBub3QgdGhlIGNhc2UgaWYgc2lsZW5jZXMgKHNpZCkuKi8KLSAgICAvKiBhdCBmaXJzdCBhdWRpbyBhdSwgc2FtcGxlU2l6ZSBpcyBzZXQuIEl0IGlzIGxhdGVyIHJlc2V0IHRvIDAgaWYgbm9uIGNvbnN0YW50IHNpemUuKi8KLSAgICAvKiBTbyBzYW1wbGVTaXplIHNob3VsZCBiZSB0ZXN0ZWQgdG8ga25vdyB3ZWl0aGVyIG9yIG5vdCB0aGVyZSBpcyBhIFRBQkxFX1NUU1ouICovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgVEFCTEVfU1RTWjsgLyogdGFibGUgc2l6ZSBpcyA0SyovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3M7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgVEFCTEVfU1RUUzsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrczsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtYXhCaXRyYXRlOyAgICAgLypub3QgdXNlZCBpbiBhbXIgY2FzZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgYXZnQml0cmF0ZTsgICAgIC8qbm90IHVzZWQgaW4gYW1yIGNhc2UqLwotICAgIE00T1NBX1VDaGFyKiAgICAgICAgICAgIERTSTsgICAgICAgICAgICAvKiBEZWNvZGVyIFNwZWNpZmljIEluZm86IE1heSBiZSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ZWQpIGZvciBBTVIgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICBkc2lTaXplOyAgICAgICAgLyogRFNJIHNpemUsIGFsd2F5cyA5IGJ5dGVzIGZvciBBTVIgKi8KLX0gTTRNUDRXX0F1ZGlvVHJhY2tEYXRhOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19WaWRlb1RyYWNrRGF0YQotICogQGJyaWVmICAgICAgICBJbnRlcm5hbCBjb3JlIE1QNCB3cml0ZXIgdmlkZW8gc3BlY2lmaWMgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRNUDRXX1N0YXRlICAgICAgICAgICAgbWljcm9TdGF0ZTsKLSAgICBNNE1QNFdfVHJhY2tEYXRhICAgICAgICBDb21tb25EYXRhOwotICAgIE00T1NBX1VDaGFyKiogICAgICAgICAgIENodW5rOwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rU2l6ZVRhYmxlOwotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua09mZnNldFRhYmxlOwotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGU7Ci0gICAgTTRNUDRXX1RpbWUzMiogICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50Q2h1bms7ICAgICAgICAgICAgLyogSW5pdCB0byAwKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50UG9zIDsgICAgICAgICAgICAgLyogSW5pdCB0byAwKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRTdHNjOyAgICAgICAgICAgICAvKiBJbml0IHRvIDAqLwotI2VuZGlmCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgc3Rzc1RhYmxlRW50cnlOYiA7ICAgICAgIC8qIE4qLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgIHdpZHRoOyAgICAgICAgICAgICAgICAgICAvKiBYKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICBoZWlnaHQ7ICAgICAgICAgICAgICAgICAgLyogWSovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgVEFCTEVfU1RUUzsgICAgICAgICAgICAgIC8qIHRhYmxlIHNpemUgaXMgSiovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3M7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICBNNE9TQV9VSW50MTYqICAgICAgICAgICBUQUJMRV9TVFNaOyAgICAgICAgICAgICAgLyogdGFibGUgc2l6ZSBpcyAySyovCi0jZWxzZQotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUU1o7ICAgICAgICAgICAgICAvKiB0YWJsZSBzaXplIGlzIDRLKi8KLSNlbmRpZgotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzOwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUU1M7ICAgICAgICAgICAgICAvKiB0YWJsZSBzaXplIGlzIE4qLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTWF4QVVwZXJDaHVuazsgICAgICAgICAgIC8qSW5pdCB0byAwLCBpLmUuIG5vdCB1c2VkKi8KLSNlbmRpZgotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heENodW5rU2l6ZTsgICAgICAgICAgICAvKkluaXQgdG8gTTRNUDRXX01wNEZpbGVEYXRhLk1heENodW5rU2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTWF4QVVTaXplOyAgICAgICAgICAgICAgIC8qSW5pdCB0byBNNE1QNFdfTXA0RmlsZURhdGEuTWF4QVVTaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBMYXN0QWxsb2NhdGVkQ2h1bms7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbWF4Qml0cmF0ZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBhdmdCaXRyYXRlOwotICAgIE00T1NBX1VDaGFyKiAgICAgICAgICAgIERTSTsgICAgICAgICAgICAvKiBEZWNvZGVyIFNwZWNpZmljIEluZm86IE1heSBiZSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ZWQpIGZvciBIMjYzKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICBkc2lTaXplOyAgICAgICAgLyogRFNJIHNpemUsIGFsd2F5cyA3IGJ5dGVzIGZvciBIMjYzICovCi19IE00TVA0V19WaWRlb1RyYWNrRGF0YTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX01wNEZpbGVEYXRhCi0gKiBAYnJpZWYgICAgICAgSW50ZXJuYWwgY29yZSBNUDQgd3JpdGVyIHByaXZhdGUgY29udGV4dCBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE1QNFdfU3RhdGUgICAgICAgICAgICAgICAgICBzdGF0ZTsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICB1cmw7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgZHVyYXRpb247ICAgIC8qIEQgaW4gbXMsIG1heCBkdXJhdGlvbiBvZiBhdWRpbyZ2aWRlbyovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgZmlsZXNpemU7ICAgIC8qIGFjdHVhbCBmaWxlc2l6ZSBpbiBieXRlcyovCi0gICAgTTRNUDRXX0F1ZGlvVHJhY2tEYXRhKiAgICAgICAgYXVkaW9UcmFja1B0cjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBoYXNBdWRpbzsKLSAgICBNNE1QNFdfVmlkZW9UcmFja0RhdGEqICAgICAgICB2aWRlb1RyYWNrUHRyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGhhc1ZpZGVvOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIE1heENodW5rU2l6ZTsgICAgICAgLyogSW5pdCB0byAxMDAwMDAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIE1heEFVU2l6ZTsgICAgICAgICAgLyogSW5pdCB0byA0MDk2Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBNYXhGaWxlU2l6ZTsgICAgICAgIC8qIEluaXQgdG8gMCwgaS5lLiBub3QgdXNlZCovCi0gICAgTTRNUDRXX1RpbWUzMiAgICAgICAgICAgICAgICAgSW50ZXJsZWF2ZUR1cjsgICAgICAvKiBJbml0IHRvIDAsIGkuZS4gbm90IHVzZWQsIG1zKi8KLSAgICAvKiBNNE1QNFdfV3JpdGVDYWxsQmFjayAgICAgICAgICAgIFByZVdyaXRlQ2FsbEJhY2s7Ki8gICAgLypJbml0IHRvIE00T1NBX05VTEwqLwotICAgIC8qIE00TVA0V19Xcml0ZUNhbGxCYWNrICAgICAgICAgICAgUG9zdFdyaXRlQ2FsbEJhY2s7Ki8gLypJbml0IHRvIE00T1NBX05VTEwqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICAgIGZpbGVXcml0ZXJGdW5jdGlvbnM7Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgZmlsZVJlYWRlckZ1bmN0aW9uczsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBjYW1jb2RlclZlcnNpb247Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVBdWRpb1NpemU7ICAvKiBkZWZhdWx0IGlzIGZhbHNlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBhdWRpb01zQ2h1bmtEdXI7ICAgIC8qIGluIG1zLCBzZXQgb25seSBpZiBlc3RpbWF0ZUF1ZGlvU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdHJ1ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgYXVkaW9Nc1N0b3BUaW1lOyAgICAvKiB0aW1lIHRvIHN0b3AgYXVkaW8sIHNldCBvbmx5IGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZUF1ZGlvU2l6ZSBpcyB0cnVlKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dDsKLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgYWJzb2x1dGVDdXJyZW50UG9zOyAvKiBuZXcgZmllbGQgZm9yIG9mZnNldCB1cGRhdGUqLwotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLSAgICBNNE9TQV9VQ2hhciogICAgICAgICAgICAgICAgICBlbWJlZGRlZFN0cmluZzsgICAgIC8qIDE2IGJ5dGVzIHN0cmluZywgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVuIGlmIE5VTEwqLwotICAgIE00T1NBX1VDaGFyKiAgICAgICAgICAgICAgICAgIGludGVncmF0aW9uVGFnOyAgICAgLyogNjAgYnl0ZXMgc3RyaW5nLCBtZW1zZXQgdG8gMCBpZiBOVUxMICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgTWF4RmlsZUR1cmF0aW9uOyAgICAvKiBJbml0IHRvIDAsIGkuZS4gbm90IHVzZWQqLwotICAgIE00TVA0Q19GdHlwQm94ICAgICAgICAgICAgICAgIGZ0eXA7ICAgICAgICAgICAgICAgLyogZnR5cCBhdG9tLCBpZiBub3QgZGVmaW5lZCBzZXQgbWFqb3JfYnJhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgd2lsbCB1c2UgZGVmYXVsdCBib3ggKi8KLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICBzYWZldHlGaWxlVXJsOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblNhZmV0eUZpbGU7Ci0jZW5kaWYgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNVUxQUFNTUFM7Ci19IE00TVA0V19NcDRGaWxlRGF0YTsKLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKk00TVA0V19UWVBFU19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1V0aWxzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmJlN2FiYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfVXRpbHMuaAotICogQGJyaWVmICAgVXRpbGl0aWVzIGFuZCBwcml2YXRlIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbiBmb3IgdGhlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIE00TVA0V19VVElMU19ICi0jZGVmaW5lIE00TVA0V19VVElMU19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotCi0vKiBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVXRpbGl0eSBmdW5jdGlvbnMgdG8gd3JpdGUgZGF0YSBpbiBiaWcgZW5kaWFuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0Qnl0ZShNNE9TQV9VQ2hhciBjLCAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMTYoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTI0KE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUzMihNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogV3JpdGUgYSBidWxrIG9mIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIGZpbGUsIHNpemUgaXMgZ2l2ZW4gaW4gYnl0ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCbG9jayhjb25zdCBNNE9TQV9VQ2hhciogQmxvY2ssIE00T1NBX1VJbnQzMiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLCBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbnZlcnQgdGhlICduYicgdW5zaWduZWQgaW50ZWdlcnMgaW4gJ3RhYicgdGFibGUgZnJvbSBMRSBpbnRvIEJFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXZvaWQgTTRNUDRXX3RhYmxlMzJUb0JFKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MzIgbmIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbnZlcnQgYW4gdW5zaWduZWQgMzIgYml0cyBpbnRlZ2VyIGZyb20gTEUgaW50byBCRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi12b2lkIE00TVA0V19jb252ZXJ0SW50MzJCRShNNE9TQV9VSW50MzIqIHZhbFB0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmUtYWxsb2NhdGlvbiBmdW5jdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi12b2lkKiBNNE1QNFdfcmVhbGxvYyhNNE9TQV9NZW1BZGRyMzIgcHRyLCBNNE9TQV9VSW50MzIgb2xkU2l6ZSwgTTRPU0FfVUludDMyIG5ld1NpemUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERlLWFsbG9jYXRlIHRoZSBjb250ZXh0Ci0gKiBUaGlzIG1ldGhvZCBpcyBubyBsb25nZXIgaW4gdGhlIHdyaXRlciBleHRlcm5hbCBpbnRlcmZhY2UsIGJ1dCBpcyBjYWxsZWQgZnJvbQotICogdGhlIGZ1bmN0aW9uIE00TVA0V19jbG9zZVdyaXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfZnJlZUNvbnRleHQoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUHV0IEhpIGFuZCBMbyB1MTYgcGFydCBpbiBhIHUzMiB2YXJpYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9Wb2lkIE00TVA0V19wdXQzMl9IaShNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDE2IEhpKTsKLU00T1NBX1ZvaWQgTTRNUDRXX3B1dDMyX0xvKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MTYgTG8pOwotTTRPU0FfVUludDE2IE00TVA0V19nZXQzMl9IaShNNE9TQV9VSW50MzIqIHRhYik7Ci1NNE9TQV9VSW50MTYgTTRNUDRXX2dldDMyX0xvKE00T1NBX1VJbnQzMiogdGFiKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qTTRNUDRXX1VUSUxTX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfV3JpdGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfV3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3M2EyMjMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1dyaXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19Xcml0ZXIuaAotICogQGJyaWVmICAgQ29yZSBNUDQgd3JpdGVyIGludGVyZmFjZQotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNUDQgd3JpdGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiAgICAgICAgICBUaGUgTVA0IHdyaXRlciBzcGVjaWZpYyB0eXBlcyBhcmUgZGVmaW5lZCBpbiBmaWxlIE00TVA0V19UeXBlcy5oCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpZm5kZWYgTTRNUDRXX1dSSVRFUl9ICi0jZGVmaW5lIE00TVA0V19XUklURVJfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotLyogaW5jbHVkZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiCi0jaW5jbHVkZSAiTTRNUDRXX1R5cGVzLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTVA0VyBFcnJvcnMgJiBXYXJuaW5ncyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgTTRXQVJfTVA0V19PVkVSU0laRSAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNE1QNF9XUklURVIgLDB4MDAwMDAxKQotI2RlZmluZSBNNFdBUl9NUDRXX05PVF9FVkFMVUFCTEUgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00TVA0X1dSSVRFUiAsMHgwMDAwMDIpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCBNUDRXIHZlcnNpb24KLSAqIEBwYXJhbSAgICBtYWpvciAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlICdtYWpvcicgdmVyc2lvbiBudW1iZXIuCi0gKiBAcGFyYW0gICAgbWlub3IgICAgICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHRoZSAnbWlub3InIHZlcnNpb24gbnVtYmVyLgotICogQHBhcmFtICAgIHJldmlzaW9uICAgICAgICAgKE9VVCkgUG9pbnRlciB0byB0aGUgJ3JldmlzaW9uJyBudW1iZXIuCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0VmVyc2lvbihNNE9TQV9VSW50OCogbWFqb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIG1pbm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiByZXZpc2lvbik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEluaXRpYXRpb24gb2YgdGhlIE1QNCBmaWxlIGNyZWF0aW9uCi0gKiBAcGFyYW0gICAgY29udGV4dFB0ciAgICAgICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHRoZSBNUDQgd3JpdGVyIGNvbnRleHQgdG8gY3JlYXRlLgotICogQHBhcmFtICAgIG91dHB1dEZpbGVEZXNjcmlwdG9yICAgKElOKSAgRGVzY3JpcHRvciBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gb3Blbi4KLSAqIEBwYXJhbSAgICBmaWxlV3JpdGVyRnVuY3Rpb24gICAgIChJTikgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHNldCBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLgotICogQHBhcmFtICAgIHRlbXBGaWxlRGVzY3JpcHRvciAgICAgKElOKSAgRGVzY3JpcHRvciBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgdG8gb3Blbi4KLSAqIEBwYXJhbSAgICBmaWxlUmVhZGVyRnVuY3Rpb24gICAgIChJTikgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHNldCBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfb3BlbldyaXRlKCBNNE9TQV9Db250ZXh0KiAgICAgICAgICAgICAgICAgIGNvbnRleHRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICAgIGZpbGVXcml0ZXJGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICAgIGZpbGVSZWFkZXJGdW5jdGlvbiApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBBZGQgYSBuZXcgdHJhY2sKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAoSU4vT1VUKSAgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHN0cmVhbURlc2NQdHIgICAgICAgIChJTikgICAgICBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBmb3IgdGhlIG5ldyB0cmFjay4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBJbnZhbGlkIHN0YXRlCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUOiAgQW4gYXVkaW8gKHJlc3AudmlkZW8pIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhpcyBjb250ZXh0IHdoaWxlIGF0dGVtcHRpbmcgdG8gYWRkIGFub3RoZXIgb25lLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIGZvcmJpZGRlbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19hZGRTdHJlYW0oIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogICAgIHN0cmVhbURlc2NQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFNpZ25hbCB0byB0aGUgY29yZSBNUDQgd3JpdGVyIHRoYXQgdGhlcmUgaXMgbm8gbW9yZSB0cmFja3MgdG8gYWRkCi0gKiBAcGFyYW0gICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgSW52YWxpZCBzdGF0ZQotICogQHJldHVybiAgTTRFUlJfQkFEX0NPTlRFWFQ6ICBBdWRpbyBzaXplIGVzdGltYXRpb24gaXMgcmVxdWlyZWQgYnV0IG5vdCB0d28gc3RyZWFtcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGJlZW4gYWRkZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfc3RhcnRXcml0aW5nKCBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFza3MgdGhlIGNvcmUgTVA0IHdyaXRlciB0byBpbml0aWF0ZSB0aGUgYWNjZXNzIHVuaXQgY3JlYXRpb24gaW4KLSAqICAgICAgICAgIHRoZSBzdHJlYW1JRCB0cmFjawotICogQHBhcmFtICAgY29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBzdHJlYW1JRCAgICAgICAgICAgIChJTikgU3RyZWFtIElEIG9mIHRoZSB0cmFjay4KLSAqIEBwYXJhbSAgIGF1UHRyICAgICAgICAgICAgICAgKElOL09VVCkgQWNjZXNzIHVuaXQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6VW5rbm93biBzdHJlYW0gSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBJbnZhbGlkIHN0YXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfc3RhcnRBVSggTTRPU0FfQ29udGV4dCAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgICAgICAgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgIGF1UHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBBc2sgdGhlIGNvcmUgTVA0IHdyaXRlciB0byB3cml0ZSB0aGUgYWNjZXNzIHVuaXQgaW4gdGhlIHN0cmVhbUlEIHRyYWNrCi0gKiBAbm90ZSAgICBJZiBNNE1QNFdfV0FSX09WRVJTSVpFIGlzIHJldHVybmVkLCBNNE1QNFdfc3RhcnRBVSBtdXN0IG5vdCBiZSBjYWxsZWQgYW55bW9yZSwKLSAqICAgICAgICAgIGJ1dCBkaXJlY3RseSBNNE1QNFdfY2xvc2VXcml0ZSgpLgotICogQHBhcmFtICAgY29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSAgIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIHN0cmVhbUlEICAgICAgICAgICAgKElOKSAgICAgICBTdHJlYW0gSUQgb2YgdGhlIHRyYWNrLgotICogQHBhcmFtICAgYXVQdHIgICAgICAgICAgICAgICAoSU4vT1VUKSAgIEFjY2VzcyB1bml0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogICAgICAgIFVua25vd24gc3RyZWFtIElECi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgICAgIEludmFsaWQgc3RhdGUKLSAqIEByZXR1cm4gICAgTTRXQVJfTVA0V19OT1RfRVZBTFVBQkxFOiAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBldmFsdWF0ZSBhdWRpbyBzaXplIGlmIGF1ZGlvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIGRvbid0IGhhdmUgYSBjb25zdGFudCBzaXplLgotICogQHJldHVybiAgICBNNFdBUl9NUDRXX09WRVJTSVpFOiAgICAgICAgTWF4IGZpbGUgc2l6ZSB3YXMgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3Byb2Nlc3NBVSggTTRPU0FfQ29udGV4dCAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCAgICAgICBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiAgICBhdVB0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICBDbG9zZSB0aGUgTVA0IGZpbGUKLSAqIEBub3RlICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIE1QNCB3cml0ZXIsIHRoZSBNNE1QNFdfZnJlZUNvbnRleHQgbWV0aG9kCi0gKiAgICAgICAgICAgIHdhcyBpbiB0aGUgaW50ZXJmYWNlLCB3aGljaCBpcyBub3QgdGhlIGNhc2UgYW55bW9yZS4KLSAqICAgICAgICAgICAgVGhlIGNvbnRleHQgaXMgbm93IGFsd2F5cyBkZWFsbG9jYXRlZCBpbiB0aGUgTTRNUDRXX2Nsb3NlV3JpdGUgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2Nsb3NlV3JpdGUoIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEFzayB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRAotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOKSAgICBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgb3B0aW9uICAgICAgICAgICAgICAgICAoSU4pICAgIE9wdGlvbiBJRC4KLSAqIEBwYXJhbSAgICB2YWx1ZVB0ciAgICAgICAgICAgICAgIChPVVQpICAgUG9pbnRlciB0byB0aGUgb3B0aW9uIHZhbHVlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogIE5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY3VycmVudCB2ZXJzaW9uCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6ICAgIFVua25vd24gb3B0aW9uSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogICAgQmFkIHN0cmVhbSBJRCBpbiB0aGUgb3B0aW9uIHZhbHVlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0ICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEICAgICAgICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAgICAqdmFsdWVQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBBc2sgdGhlIGNvcmUgTVA0IHdyaXRlciB0byBzZXQgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgKElOL09VVCkgIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBvcHRpb24gICAgICAgICAgICAgICAoSU4pICAgICAgT3B0aW9uIElELgotICogQHBhcmFtICAgIHZhbHVlICAgICAgICAgICAgICAgIChJTikgICAgICBPcHRpb24gdmFsdWUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiAgTm90IGltcGxlbWVudGVkIGluIHRoZSBjdXJyZW50IHZlcnNpb24KLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRDogICAgVW5rbm93biBvcHRpb25JRAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiAgICBCYWQgc3RyZWFtIElEIGluIHRoZSBvcHRpb24gdmFsdWUKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgQSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19zZXRPcHRpb24oIE00T1NBX0NvbnRleHQgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCAgICAgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICAgIHZhbHVlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQXNrIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gcmV0dXJuIGl0cyBzdGF0ZS4KLSAqIEBub3RlICAgICBCeSBzZWxlY3RpbmcgYSBzcGVjaWZpYyBzdHJlYW1JRCAobm90IG51bGwpLCB0aGUgY2FsbGVyIGNhbiBvYnRhaW4KLSAqICAgICAgICAgICB0aGUgc3RhdGUgb2YgYSBzcGVjaWZpYyBzdHJlYW0uIEJ5IHVzaW5nIDAgYXMgc3RyZWFtSUQgdGhlIHJldHVybmVkCi0gKiAgICAgICAgICAgc3RhdGUgaXMgbm90IHN0cmVhbSBzcGVjaWZpYy4KLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTikgICAgIFBvaW50ZXIgdG8gdGhlIHN0YXRlIGVudW1lcmF0aW9uLgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgc3RyZWFtSUQgb2YgdGhlIHN0cmVhbSB0byByZXRyaWV2ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvLXN0YXRlICgwIGZvciBnbG9iYWwgc3RhdGUpLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiAgICBVbmtub3duIHN0cmVhbSBJRAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0U3RhdGUoIE00T1NBX0NvbnRleHQgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0V19TdGF0ZSogICAgc3RhdGVQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCAgIHN0cmVhbUlEKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IHRoZSBjdXJyZW50bHkgZXhwZWN0ZWQgZmlsZSBzaXplCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplKCBNNE9TQV9Db250ZXh0ICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogICAgICAgIGN1cnJlbnRGaWxlU2l6ZSk7Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLSNlbmRpZiAvKk00TVA0V19XUklURVJfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YWIzMmJhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWIzZ3B3cml0ZXIKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yXzNncHdyaXRlcgotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNE1QNFdfSW50ZXJmYWNlLmMgXAotICAgICAgTTRNUDRXX1V0aWxzLmMgXAotICAgICAgTTRNUDRXX1dyaXRlci5jCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyAgICAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAotICAgIC1ERFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVQotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19JbnRlcmZhY2UuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19JbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzJjNTI1MC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfSW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX0ludGVyZmFjZS5jCi0gKiBAYnJpZWYgICAgM0dQUCBmaWxlIHdyaXRlciBpbnRlcmZhY2UKLSAqIEBub3RlICAgIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93cyB0aGUgY29tbW9uIGludGVyZmFjZSBkZWZpbmVkCi0gKiAgICAgICAgICBpbiAiTTRXUklURVJfY29tbW9uLmgiLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotLyoqCi0gKiBPU0FMIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIgICAgICAgICAgICAvKio8IE9TQUwgYmFzaWMgdHlwZXMgZGVmaW5pdG9uICovCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIiAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIGZpbGUgYWNjZXNzZXMgaW1wbGVtZW50YXRpb24gKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgICAgICAgICAgICAvKio8IEluY2x1ZGUgZm9yIE9TQUwgbWVtb3J5IGFjY2Vzc2VzIGltcGxlbWVudGF0aW9uICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgICAgICAvKio8IE9TQUwgZGVidWcgdG9vbHMgKi8KLQotLyoqCi0gKiBXcml0ZXIgaW5jbHVkZXMgKi8KLSNpbmNsdWRlICJNNFdSSVRFUl9jb21tb24uaCIgICAgICAgIC8qKjwgRGVmaW5pdGlvbiBvZiB0aGUgd3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtb2R1bGUgZm9sbG93cyAqLwotCi0jaWZkZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLSNpbmNsdWRlICJNNE1QNFdfVHlwZXNfQ3N0TWVtLmgiICAgIC8qKjwgTVA0LzNHUCBjb3JlIHdyaXRlciB0eXBlcyAqLwotI2luY2x1ZGUgIk00TVA0V19Xcml0ZXJfQ3N0TWVtLmgiICAgIC8qKjwgTVA0LzNHUCBjb3JlIHdyaXRlciBmdW5jdGlvbnMgKi8KLSNlbHNlCi0jaW5jbHVkZSAiTTRNUDRXX1R5cGVzLmgiICAgICAgICAgICAgLyoqPCBNUDQvM0dQIGNvcmUgd3JpdGVyIHR5cGVzICovCi0jaW5jbHVkZSAiTTRNUDRXX1dyaXRlci5oIiAgICAgICAgICAgIC8qKjwgTVA0LzNHUCBjb3JlIHdyaXRlciBmdW5jdGlvbnMgKi8KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwotCi0vKioKLSAqIFNwZWNpZmljIGVycm9ycyBmb3IgdGhpcyBtb2R1bGUgKi8KLSNkZWZpbmUgTTRXUklURVJfM0dQX0VSUl9VTlNVUFBPUlRFRF9TVFJFQU1fVFlQRSBcCi0gICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00V1JJVEVSXzNHUCwgMHgwMDAwMDEpCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSB3cml0ZXIgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgd3JpdGVyIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Db250ZXh0ICAgIHBNUDRDb250ZXh0OyAgICAvKio8IE1QNCB3cml0ZXIgY29udGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtYXhBVXNpemVzOyAgICAgICAgLyoqPCB0aGUgbWF4aW11bSBBVSBzaXplIHBvc3NpYmxlICovCi19IE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQ7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9vcGVuV3JpdGUoTTRXUklURVJfQ29udGV4dCogcENvbnRleHQsIHZvaWQqIHBXaGF0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlclBvaW50ZXIpCi0gKiBAYnJpZWYgICAgT3BlbiBhIHdyaXRlciBzZXNzaW9uLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgIChPVVQpIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLCBhbGxvY2F0ZWQgYnkgdGhpcyBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICBvdXRwdXRGaWxlRGVzY3JpcHRvciAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSBvdXRwdXQgZmlsZSB0byBjcmVhdGUuCi0gKiBAcGFyYW0gICAgZmlsZVdyaXRlckZ1bmN0aW9uICAgICAoSU4pICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBzZXQgb2YgT1NBTAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHdyaXRlIGZ1bmN0aW9ucy4KLSAqIEBwYXJhbSAgICB0ZW1wRmlsZURlc2NyaXB0b3IgICAgIChJTikgIERlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlIHRvIG9wZW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOVUxMIGlmIG5vdCB1c2VkKQotICogQHBhcmFtICAgIGZpbGVSZWFkZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mIE9TQUwgZmlsZSByZWFkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zIChOVUxMIGlmIG5vdCB1c2VkKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBGaWxlUHRyRmN0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIG9wZW5Xcml0ZSAoSXRzIGNvcmVJRCBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9vcGVuV3JpdGUoIE00V1JJVEVSX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dHB1dEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlclBvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdGVtcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkZXJQb2ludGVyICkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNFdSSVRFUl8zR1Bfb3BlbldyaXRlIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlclBvaW50ZXIpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOiBwRmlsZVdyaXRlclBvaW50ZXIgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgY29udGV4dCAqLwotICAgICpwQ29udGV4dD1NNE9TQV9OVUxMOwotICAgIGFwQ29udGV4dCA9IChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfM0dQLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0Iik7Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRXUklURVJfM0dQX29wZW5Xcml0ZTpcCi0gICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIGNvbnRleHQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBSZXNldCBjb250ZXh0IHZhcmlhYmxlcyAqLwotICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIGFwQ29udGV4dC0+bWF4QVVzaXplcyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiAgICBSZXR1cm4gdGhlIHdyaXRlciBjb250ZXh0ICovCi0gICAgKnBDb250ZXh0ID0gKE00V1JJVEVSX0NvbnRleHQgKilhcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgICBMYXVuY2ggdGhlIG9wZW5Xcml0ZSBvZiB0aGUgTVA0IHdyaXRlciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOiBjYWxsaW5nIE00TVA0V19vcGVuV3JpdGUoKSIpOwotCi0gICAgZXJyID0gTTRNUDRXX29wZW5Xcml0ZSgmYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgb3V0cHV0RmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICBwRmlsZVdyaXRlclBvaW50ZXIsIHRlbXBGaWxlRGVzY3JpcHRvciwgcEZpbGVSZWFkZXJQb2ludGVyICk7Ci0KLSAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX29wZW5Xcml0ZSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgSW5kaWNhdGVzIHRvIHRoZSB3cml0ZXIgdGhhdCB0aGUgc2V0dXAgc2Vzc2lvbiBpcyBlbmRlZCBhbmQgdGhhdAotICogICAgICAgICAgd2Ugd2lsbCBzdGFydCB0byB3cml0ZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgc3RhcnRXcml0aW5nIChJdHMKLSAqICAgICAgICAgICAgY29yZUlEIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZyhNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nOiBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGFwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmc6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIENhbGwgdGhlIE1QNCBjb3JlIHdyaXRlciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nOiBjYWxsaW5nIE00TVA0V19zdGFydFdyaXRpbmcoKSIpOwotICAgIGVyciA9IE00TVA0V19zdGFydFdyaXRpbmcoYXBDb250ZXh0LT5wTVA0Q29udGV4dCk7Ci0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zdGFydFdyaXRpbmcgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9hZGRTdHJlYW0oCi0gKiAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiAqcFN0cmVhbURlc2NyaXB0aW9uKQotICogQGJyaWVmICAgICBBZGQgYSBzdHJlYW0gKGF1ZGlvIG9yIHZpZGVvKS4KLSAqIEBub3RlICAgICAgRGVjb2RlciBzcGVjaWZpYyBpbmZvIHByb3BlcnRpZXMgYXJlIGNvcnJlY3RseSBzZXQgYmVmb3JlIGNhbGxpbmcKLSAqICAgICAgICAgICAgdGhlIGNvcmUgd3JpdGVyIGFkZCBmdW5jdGlvbgotICogQHBhcmFtICAgICBwQ29udGV4dDogICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBzdHJlYW1EZXNjcmlwdGlvbjogICAgKElOKSBzdHJlYW0gZGVzY3JpcHRpb24uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcFN0cmVhbURlc2NyaXB0aW9uIGlzIE00T1NBX05VTEwKLSAqICAgICAgICAgICAgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIGFkZFN0cmVhbQotICogICAgICAgICAgICAoSXRzIGNvcmVJRCBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9hZGRTdHJlYW0oTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzY3JpcHRpb24pCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCAqYXBDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyAqcFZpZGVvSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyAqcEF1ZGlvSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgTTRNUDRXX1N0cmVhbUlEc2l6ZSBzaXplVmFsdWU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogcENvbnRleHQ9MHgleCwgIgotICAgICAgICAgICAgICAgICAgICJwU3RyZWFtRGVzY3JpcHRpb249MHgleCIsCi0gICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHBTdHJlYW1EZXNjcmlwdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGFwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0cmVhbURlc2NyaXB0aW9uKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogcFN0cmVhbURlc2NyaXB0aW9uIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIEFkYXB0IGF1ZGlvL3ZpZGVvIHN0cmVhbSBpbmZvcyAqLwotICAgIHN3aXRjaCAocFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICBjYXNlIE00U1lTX2tIMjYzOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06ICIKLSAgICAgICAgICAgICAgICAgICAgImFkZGluZyBhIFZpZGVvIHN0cmVhbSAoc3RyZWFtVHlwZT0weCV4KSIsCi0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqICAgIENvbW1vbiBkZXNjcmlwdGlvbnMgKi8KLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtSUQgPSBWaWRlb1N0cmVhbUlEOyAgICAvKio8IFRoZSBvbmx5IHZhbHVlcyBjaGVja2VkIGJ5IG91cgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZSB3cml0ZXIgYXJlIHN0cmVhbUlEICovCi0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnRpbWVTY2FsZSA9IDEwMDA7ICAgICAgICAgICAgLyoqPCBhbmQgdGltZVNjYWxlICovCi0KLS8qIE5vdCByZWNvbW1lbmRlZCBmb3IgdmlkZW8gZWRpdGluZyAtPiB3cml0ZSBleHBsaWNpdGVseSB0aGUgJ2JpdHInIGJveCBpbnRvICdkMjYzJyAqLwotLyogUmVtIDogaXQgaXMgUkVMIDUgb2YgM2dwcCBkb2N1bWVudGF0aW9uICovCi0vLyAgICAgICAgICAgIC8qKgotLy8gICAgICAgICAgICAgKiBBdmVyYWdlIGJpdC1yYXRlIG11c3Qgbm90IGJlIHNldCBpbiBIMjYzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBQbGF0Zm9ybTQgKi8KLS8vICAgICAgICAgICAgaWYgKE00U1lTX2tIMjYzID09IHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5hdmVyYWdlQml0cmF0ZSA9IC0xOwotLy8gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogICAgRGVjb2RlciBzcGVjaWZpYyBpbmZvICovCi0gICAgICAgICAgICBwVmlkZW9JbmZvID0gKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MgKilwU3RyZWFtRGVzY3JpcHRpb24tPmRlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gcFZpZGVvSW5mby0+SGVhZGVyLlNpemU7Ci0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPmRlY29kZXJTcGVjaWZpY0luZm8gPSAoTTRPU0FfTWVtQWRkcjMyKXBWaWRlb0luZm8tPkhlYWRlci5wQnVmOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IFZpZGVvOiBEU0k9MHgleCwgRFNJc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgIHBWaWRlb0luZm8tPkhlYWRlci5wQnVmLCBwVmlkZW9JbmZvLT5IZWFkZXIuU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tBTVI6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FNUl9XQjoKLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IGFkZGluZyBhbiBBdWRpbyBzdHJlYW0gKHN0cmVhbVR5cGU9MHgleCkiLAotICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAgICBDb21tb24gZGVzY3JpcHRpb25zICovCi0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbUlEID0gQXVkaW9TdHJlYW1JRDsgICAgLyoqPCBUaGUgb25seSB2YWx1ZSBjaGVja2VkIGJ5IG91cgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlIHdyaXRlciBpcyBzdHJlYW1JRCAqLwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqICAgIERlY29kZXIgc3BlY2lmaWMgaW5mbyAqLwotICAgICAgICAgICAgcEF1ZGlvSW5mbyA9IChNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zICopcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHBBdWRpb0luZm8tPkhlYWRlci5TaXplOwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0gKE00T1NBX01lbUFkZHIzMilwQXVkaW9JbmZvLT5IZWFkZXIucEJ1ZjsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18yKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBBdWRpbzogRFNJPTB4JXgsIERTSXNpemU9JWQiLAotICAgICAgICAgICAgICAgICBwQXVkaW9JbmZvLT5IZWFkZXIucEJ1ZiwgcEF1ZGlvSW5mby0+SGVhZGVyLlNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOlwKLSAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00V1JJVEVSXzNHUF9FUlJfVU5TVVBQT1JURURfU1RSRUFNX1RZUEUgKHN0cmVhbVR5cGU9MHgleCkiLAotICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00V1JJVEVSXzNHUF9FUlJfVU5TVVBQT1JURURfU1RSRUFNX1RZUEU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBDYWxsIHRoZSBNUDQgY29yZSB3cml0ZXIgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogY2FsbGluZyBNNE1QNFdfYWRkU3RyZWFtKCkiKTsKLSAgICBlcnIgPSBNNE1QNFdfYWRkU3RyZWFtKGFwQ29udGV4dC0+cE1QNENvbnRleHQscFN0cmVhbURlc2NyaXB0aW9uKTsKLSAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogTTRNUDRXX2FkZFN0cmVhbSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gKGVycik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgRm9yIFZpZGVvLCBzZXQgdGhlIE00TVA0V190cmFja1NpemUgT3B0aW9uICovCi0gICAgc3dpdGNoIChwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tNUEVHXzQ6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBzaXplVmFsdWUuc3RyZWFtSUQgPSBWaWRlb1N0cmVhbUlEOwotICAgICAgICAgICAgc2l6ZVZhbHVlLmhlaWdodCA9IChNNE9TQV9VSW50MTYpKHBWaWRlb0luZm8tPmhlaWdodCk7Ci0gICAgICAgICAgICBzaXplVmFsdWUud2lkdGggID0gKE00T1NBX1VJbnQxNikocFZpZGVvSW5mby0+d2lkdGgpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IFZpZGVvOiBoZWlnaHQ9JWQsIHdpZHRoPSVkIiwKLSAgICAgICAgICAgICAgICAgc2l6ZVZhbHVlLmhlaWdodCwgc2l6ZVZhbHVlLndpZHRoKTsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IGNhbGxpbmcgTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfdHJhY2tTaXplKSIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbiggYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgTTRNUDRXX3RyYWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pJnNpemVWYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IE00TVA0V19zZXRPcHRpb24gcmV0dXJucyBlcnJvciAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2Nsb3NlV3JpdGUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBDbG9zZSB0aGUgd3JpdGVyLiBUaGUgY29udGV4dCBpcyBmcmVlZCBoZXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBjbG9zZVdyaXRlIChJdHMgY29yZUlECi0gKiAgICAgICAgICAgIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX2Nsb3NlV3JpdGUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQ9KE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9jbG9zZVdyaXRlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2FsbCB0aGUgTVA0IGNvcmUgd3JpdGVyICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gYXBDb250ZXh0LT5wTVA0Q29udGV4dCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZTogY2FsbGluZyBNNE1QNFdfY2xvc2VXcml0ZSgpIik7Ci0gICAgICAgIGVyciA9IE00TVA0V19jbG9zZVdyaXRlKGFwQ29udGV4dC0+cE1QNENvbnRleHQpOwotICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZTogTTRNUDRXX2Nsb3NlV3JpdGUgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIERlYWxsb2NhdGUgb3VyIG93biBjb250ZXh0ICovCi0gICAgZnJlZShhcENvbnRleHQpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00V1JJVEVSXzNHUF9jbG9zZVdyaXRlOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX3NldE9wdGlvbigKLSAqICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gKiAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLSAqIEBicmllZiAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSB3cml0ZXIgdG8gc2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgKLSAqICAgICAgICAgICAgdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nLwotICogICAgICAgICAgICBkZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICBUaGUgb3B0aW9ucyBoYW5kbGVkIGJ5IHRoZSBjb21wb25lbnQgZGVwZW5kIG9uIHRoZSBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICBvZiB0aGUgY29tcG9uZW50LgotICogQHBhcmFtICAgICBwQ29udGV4dDogICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsCi0gKiBAcGFyYW0gICAgIHBwdGlvbklkOiAgICAgKElOKSBJRCBvZiB0aGUgb3B0aW9uIHRvIHNldC4KLSAqIEBwYXJhbSAgICAgT3B0aW9uVmFsdWUgOiAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24gdG8gc2V0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBJRCBvZiB0aGUgb3B0aW9uIGlzIG5vdCB2YWxpZC4KLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgc2V0T3B0aW9uIChJdHMgY29yZUlECi0gKiAgICAgICAgICAgIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX3NldE9wdGlvbigKLSAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDMyIG9wdGlvbklELAotICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dCA9Ci0gICAgICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE1QNFdfbWVtQWRkciBtZW12YWw7Ci0gICAgTTRTWVNfU3RyZWFtSURWYWx1ZSBvcHR2YWw7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRXUklURVJfM0dQX3NldE9wdGlvbjogcENvbnRleHQ9MHgleCwgb3B0aW9uSUQ9MHgleCxcCi0gICAgICAgICBvcHRpb25WYWx1ZT0weCV4IiwgcENvbnRleHQsIG9wdGlvbklELCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PWFwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9zZXRPcHRpb246IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIHN3aXRjaCAob3B0aW9uSUQpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogICAgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01heEFVU2l6ZToKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tNYXhBVVNpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19tYXhBVXNpemUsIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfbWF4QVVzaXplKSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gY2h1bmNrIHNpemUgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZToKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19tYXhDaHVua1NpemUsIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfbWF4Q2h1bmtTaXplKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIEZpbGUgc3RyaW5nIHNpZ25hdHVyZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZyBvcHRpb24iKTsKLSAgICAgICAgICAgIC8qIFRoZSBnaXZlbiBNNE9TQV9EYXRhT3B0aW9uIG11c3QgYWN0dWFsbHkKLSAgICAgICAgICAgICAgIGJlIGEgdGV4dCBzdHJpbmcgKi8KLSAgICAgICAgICAgIG1lbXZhbC5hZGRyID0gKE00T1NBX01lbUFkZHIzMilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIC8qKjwgdGhpcyBpcyBtYXggc3RyaW5nIHNpemUgY29waWVkIGJ5IHRoZSBjb3JlICovCi0gICAgICAgICAgICBtZW12YWwuc2l6ZSA9IDE2OwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19lbWJlZGRlZFN0cmluZywgJm1lbXZhbCk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX2VtYmVkZGVkU3RyaW5nKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIEZpbGUgaW50ZWdyYXRpb24gdGFnICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0ludGVncmF0aW9uVGFnOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa0ludGVncmF0aW9uVGFnIG9wdGlvbiIpOwotICAgICAgICAgICAgLyogVGhlIGdpdmVuIE00T1NBX0RhdGFPcHRpb24gbXVzdCBhY3R1YWxseQotICAgICAgICAgICAgICAgYmUgYSB0ZXh0IHN0cmluZyAqLwotICAgICAgICAgICAgbWVtdmFsLmFkZHIgPSAoTTRPU0FfTWVtQWRkcjMyKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgLyoqPCB0aGlzIGlzIG1heCBzdHJpbmcgc2l6ZSBjb3BpZWQgYnkgdGhlIGNvcmUgKi8KLSAgICAgICAgICAgIG1lbXZhbC5zaXplID0gc3RybGVuKChjb25zdCBjaGFyICopb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19pbnRlZ3JhdGlvblRhZywgJm1lbXZhbCk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX2ludGVncmF0aW9uVGFnKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIEZpbGUgdmVyc2lvbiBzaWduYXR1cmUgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbiBvcHRpb24iKTsKLSAgICAgICAgICAgIC8qIFRoZSBnaXZlbiBNNE9TQV9EYXRhT3B0aW9uIG11c3QgYWN0dWFsbHkKLSAgICAgICAgICAgICAgIGJlIGEgdmVyc2lvbiBudW1iZXIgKi8KLQotICAgICAgICAgICAgLyoqPCBIZXJlIDAgbWVhbnMgYm90aCBzdHJlYW1zICovCi0gICAgICAgICAgICBvcHR2YWwuc3RyZWFtSUQgPSAwOwotICAgICAgICAgICAgLyoqPCB2ZXJzaW9uIG51bWJlciAqLwotICAgICAgICAgICAgb3B0dmFsLnZhbHVlID0gKihNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19DYW1jb2RlclZlcnNpb24sICZvcHR2YWwpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19DYW1jb2RlclZlcnNpb24pIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgU29tZSBvcHRpb25zIGFyZSByZWFkLW9ubHkgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRmlsZVNpemU6Ci0gICAgICAgIGNhc2UgTTRXUklURVJfa0ZpbGVTaXplQXVkaW9Fc3RpbWF0ZWQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgidHJ5aW5nIHRvIHNldCBhIHJlYWQtb25seSBvcHRpb24hIChJRD0weCV4KSIsCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX1JFQURfT05MWTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgTWF4aW11bSBmaWxlc2l6ZSBsaW1pdGF0aW9uICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01heEZpbGVTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa01heEZpbGVTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19tYXhGaWxlU2l6ZSwgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19tYXhGaWxlU2l6ZSlcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gZmlsZSBkdXJhdGlvbiBsaW1pdGF0aW9uICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01heEZpbGVEdXJhdGlvbjoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24gb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX21heEZpbGVEdXJhdGlvbiwgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24pIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBTZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rU2V0RnR5cEJveDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tTZXRGdHlwQm94IG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LCBNNE1QNFdfc2V0RnR5cEJveCwgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19zZXRGdHlwQm94KVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKioKLSAgICAgICAgICogICAgRGVjb2RlciBTcGVjaWZpYyBJbmZvICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0RTSToKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tEU0kgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIE00TVA0V19EU0ksIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfRFNJKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyorIEguMjY0IFRyaW1taW5nICAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNVUxfUFBTX1NQUzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tNVUxfUFBTX1NQUyBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgTTRNUDRXX01VTF9QUFNfU1BTLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX0RTSSlcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qLSBILjI2NCBUcmltbWluZyAgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgICogICAgVW5rbm93biBvcHRpb24gKi8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJ0cnlpbmcgdG8gc2V0IGFuIHVua25vd24gb3B0aW9uIVwKLSAgICAgICAgICAgICAgICAgKG9wdGlvbklEPTB4JXgpIiwgb3B0aW9uSUQpOwotICAgICAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldE9wdGlvbigKLSAqICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gKiAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLSAqIEBicmllZiAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSB3cml0ZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgKLSAqICAgICAgICAgICAgdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nLwotICogICAgICAgICAgICBkZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICBUaGUgb3B0aW9ucyBoYW5kbGVkIGJ5IHRoZSBjb21wb25lbnQgZGVwZW5kIG9uIHRoZSBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICBvZiB0aGUgY29tcG9uZW50LgotICogQHBhcmFtICAgICBwQ29udGV4dDogICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsCi0gKiBAcGFyYW0gICAgIE9wdGlvbklkOiAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBnZXQuCi0gKiBAcGFyYW0gICAgIHBPcHRpb25WYWx1ZTogKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbiB0byBnZXQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIElEIG9mIHRoZSBvcHRpb24gaXMgbm90IHZhbGlkLgotICogQHJldHVybiAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IFRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIGdldE9wdGlvbiAoSXRzIGNvcmVJRAotICogICAgICAgICAgICBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRPcHRpb24oCi0gICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQzMiBvcHRpb25JRCwKLSAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAgICAgKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uOiBwQ29udGV4dD0weCV4LCBvcHRpb25JRD0weCV4LFwKLSAgICAgICAgIG9wdGlvblZhbHVlPTB4JXgiLCBwQ29udGV4dCwgb3B0aW9uSUQsIG9wdGlvblZhbHVlKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGFwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9nZXRPcHRpb246IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIHN3aXRjaCAob3B0aW9uSUQpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogICAgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01heEFVU2l6ZToKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJnZXR0aW5nIE00V1JJVEVSX2tNYXhBVVNpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfZ2V0T3B0aW9uKGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX21heEFVc2l6ZSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbiopJm9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2dldE9wdGlvbihNNE1QNFdfbWF4QVVzaXplKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gY2h1bmNrIHNpemUgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZToKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJnZXR0aW5nIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX2dldE9wdGlvbihhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19tYXhDaHVua1NpemUsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSZvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19nZXRPcHRpb24oTTRNUDRXX21heENodW5rU2l6ZSlcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBUaGUgZmlsZSBzaXplIG9wdGlvbiAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tGaWxlU2l6ZToKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJnZXR0aW5nIE00V1JJVEVSX2tGaWxlU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIC8qIGdldCB0aGUgY3VycmVudCBmaWxlIHNpemUgKi8KLSAgICAgICAgICAgIGVyciA9IE00TVA0V19nZXRDdXJyZW50RmlsZVNpemUoCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgVGhlIGZpbGUgc2l6ZSB3aXRoIGF1ZGlvIG9wdGlvbiBoYXMgaXRzIG93biBmdW5jdGlvbiBjYWxsCi0gICAgICAgICAgICAgIGluIHRoZSBNUDQgY29yZSB3cml0ZXIgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJnZXR0aW5nIE00V1JJVEVSX2tGaWxlU2l6ZUF1ZGlvRXN0aW1hdGVkIG9wdGlvbiIpOwotICAgICAgICAgICAgLyogZ2V0IHRoZSBjdXJyZW50IGZpbGUgc2l6ZSAuLi4gKi8KLSAgICAgICAgICAgIGVyciA9IE00TVA0V19nZXRDdXJyZW50RmlsZVNpemUoCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vbm8gbW9yZSBuZWVkZWQgM2dwIHdyaXRlciBoYXMgaXRzIG93biBtZWNhbmlzbQotICAgICAgICAgICAgLy8vKiAuLi4gYWRkIHRoZSBlc3RpbWF0ZWQgbmV4dCBtYXggQVUgc2l6ZSAqLwotICAgICAgICAgICAgLy8qKChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlKSArPSBhcENvbnRleHQtPm1heEFVc2l6ZXM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFVua25vd24gb3B0aW9uICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgidHJ5aW5nIHRvIGdldCBhbiB1bmtub3duIG9wdGlvbiFcCi0gICAgICAgICAgICAgICAgIChvcHRpb25JRD0weCV4KSIsIG9wdGlvbklEKTsKLSAgICAgICAgICAgIHJldHVybiAgICAoTTRPU0FfRVJSKU00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX2dldE9wdGlvbjogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zdGFydEFVKAotICogICAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gKiAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi0gKiBAYnJpZWYgICAgIFByZXBhcmUgYW4gQWNjZXNzIFVuaXQgdG8gYmUgcmVhZHkgdG8gc3RvcmUgZGF0YQotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6IChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsCi0gKiBAcGFyYW0gICAgIHN0cmVhbUlEOiAoSU4pIElkIG9mIHRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIEFjY2VzcyBVbml0Ci0gKiAgICAgICAgICAgIGlzIHJlbGF0ZWQuCi0gKiBAcGFyYW0gICAgIHBBVTogICAgICAoSU4vT1VUKSBBY2Nlc3MgVW5pdCB0byBiZSBwcmVwYXJlZC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwQVUgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogc3RyZWFtSUQgaXMgbm90IFZpZGVvU3RyZWFtSUQgbm9yCi0gKiAgICAgICAgICAgIEF1ZGlvU3RyZWFtSUQgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIHN0YXJ0QVUgKEl0cyBjb3JlSUQKLSAqICAgICAgICAgICAgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc3RhcnRBVSgKLSAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAgICAgKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogcENvbnRleHQ9MHgleCwgc3RyZWFtSUQ9JWQsIHBBVT0weCV4IiwKLSAgICAgICAgIHBDb250ZXh0LCBzdHJlYW1JRCwgcEFVKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3N0YXJ0QVU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEFVKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9zdGFydEFVOiBwQVUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigKLSAgICAgICAgICgoVmlkZW9TdHJlYW1JRCAhPSBzdHJlYW1JRCkgJiYgKEF1ZGlvU3RyZWFtSUQgIT0gc3RyZWFtSUQpKSwKLSAgICAgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogV3Jvbmcgc3RyZWFtSUQiKTsKLQotICAgIC8qKgotICAgICAqIENhbGwgdGhlIE1QNCB3cml0ZXIgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX3N0YXJ0QVU6IGNhbGxpbmcgTTRNUDRXX3N0YXJ0QVUoKSIpOwotICAgIGVyciA9IE00TVA0V19zdGFydEFVKGFwQ29udGV4dC0+cE1QNENvbnRleHQsIHN0cmVhbUlELCBwQVUpOwotICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc3RhcnRBVSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18yKCJBVTogZGF0YUFkZHJlc3M9MHgleCwgc2l6ZT0lZCIsCi0gICAgICAgICBwQVUtPmRhdGFBZGRyZXNzLCBwQVUtPnNpemUpOwotCi0gICAgLyogQ29udmVydCBvdmVyc2l6ZSB0byBhIHJlcXVlc3QgdG93YXJkIFZFUyBhdXRvbWF0b24gKi8KLSAgICBpZiAoTTRXQVJfTVA0V19PVkVSU0laRSA9PSBlcnIpCi0gICAgewotICAgICAgICBlcnIgPSBNNFdBUl9XUklURVJfU1RPUF9SRVE7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9zdGFydEFVOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX3Byb2Nlc3NBVSgKLSAqICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICogICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotICogQGJyaWVmICAgICBXcml0ZSBhbiBBY2Nlc3MgVW5pdAotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6IChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsCi0gKiBAcGFyYW0gICAgIHN0cmVhbUlEOiAoSU4pIElkIG9mIHRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIEFjY2VzcyBVbml0Ci0gKiAgICAgICAgICAgIGlzIHJlbGF0ZWQuCi0gKiBAcGFyYW0gICAgIHBBVTogICAgICAoSU4vT1VUKSBBY2Nlc3MgVW5pdCB0byBiZSB3cml0dGVuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEFVIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6IHN0cmVhbUlEIGlzIG5vdCBWaWRlb1N0cmVhbUlEIG5vcgotICogICAgICAgICAgICBBdWRpb1N0cmVhbUlEIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBwcm9jZXNzQVUKLSAqICAgICAgICAgICAgKEl0cyBjb3JlSUQgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVKAotICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dCA9Ci0gICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogIgotICAgICAgICAgICAgICAgICAgICJwQ29udGV4dD0weCV4LCBzdHJlYW1JRD0lZCwgcEFVPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgc3RyZWFtSUQsIHBBVSk7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEFVKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IHBBVSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKAotICAgICAgICAgKChWaWRlb1N0cmVhbUlEICE9IHN0cmVhbUlEKSAmJiAoQXVkaW9TdHJlYW1JRCAhPSBzdHJlYW1JRCkpLAotICAgICAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBXcm9uZyBzdHJlYW1JRCIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzQoIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IEFVOiAiCi0gICAgICAgICAiZGF0YUFkZHJlc3M9MHgleCwgc2l6ZT0lZCwgQ1RTPSVkLCBuYkZyYWc9JWQiLAotICAgICAgICAgcEFVLT5kYXRhQWRkcmVzcywgcEFVLT5zaXplLCAoTTRPU0FfVUludDMyKXBBVS0+Q1RTLCBwQVUtPm5iRnJhZyk7Ci0KLSAgICBpZihwQVUtPnNpemUgPiBhcENvbnRleHQtPm1heEFVc2l6ZXMpCi0gICAgewotICAgICAgICBhcENvbnRleHQtPm1heEFVc2l6ZXMgPSBwQVUtPnNpemU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENhbGwgdGhlIE1QNCB3cml0ZXIgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogY2FsbGluZyBNNE1QNFdfcHJvY2Vzc0FVKCkiKTsKLSAgICBlcnIgPSBNNE1QNFdfcHJvY2Vzc0FVKGFwQ29udGV4dC0+cE1QNENvbnRleHQsIHN0cmVhbUlELCBwQVUpOwotICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfcHJvY2Vzc0FVIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgLyogQ29udmVydCBvdmVyc2l6ZSB0byBhIHJlcXVlc3QgdG93YXJkIFZFUyBhdXRvbWF0b24gKi8KLSAgICBpZihNNFdBUl9NUDRXX09WRVJTSVpFID09IGVycikKLSAgICB7Ci0gICAgICAgIGVyciA9IE00V0FSX1dSSVRFUl9TVE9QX1JFUTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKAotICogICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSogVHlwZSwKLSAqICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICogICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSkKLSAqIEBicmllZiAgICAgR2V0IHRoZSAzR1BQIHdyaXRlciBjb21tb24gaW50ZXJmYWNlCi0gKiBAbm90ZSAgICAgIFJldHJpZXZlcyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyBuZWVkZWQgdG8gdXNlIHRoZSAzR1BQIHdyaXRlci4KLSAqICAgICAgICAgICAgSXQgZm9sbG93cyB0aGUgY29tbW9uIHdyaXRlciBpbnRlcmZhY2UuCi0gKiBAcGFyYW0gICAgIFR5cGU6IChPVVQpIHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIHdyaXRlci4gV2lsbCBhbHdheXMgYmUKLSAqICAgICAgICAgICAgTTRXUklURVJfazNHUFAuCi0gKiBAcGFyYW0gICAgIFNyY0dsb2JhbEludGVyZmFjZTogKE9VVCkgTWFpbiBzZXQgb2YgZnVuY3Rpb24gdG8gdXNlIHRoaXMKLSAqICAgICAgICAgICAgM0dQUCB3cml0ZXIKLSAqIEBwYXJhbSAgICAgU3JjRGF0YUludGVyZmFjZTogICAoT1VUKSBTZXQgb2YgZnVuY3Rpb24gcmVsYXRlZCB0byBkYXRhcwotICogICAgICAgICAgICB0byB1c2UgdGhpcyAzR1BQIHdyaXRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIE00T1NBX05VTEwKLSAqICAgICAgICAgICAgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKAotICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSogVHlwZSwKLSAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSkKLXsKLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UgKnBHbG9iYWw7Ci0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAqcERhdGE7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6ICIKLSAgICAgICAgICJUeXBlPTB4JXgsIFNyY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgIFNyY0RhdGFJbnRlcmZhY2U9MHgleCIsIFR5cGUsIFNyY0dsb2JhbEludGVyZmFjZSwgU3JjRGF0YUludGVyZmFjZSk7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gVHlwZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlczogVHlwZSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IFNyY0dsb2JhbEludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlczogU3JjR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gU3JjRGF0YUludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlczogU3JjRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBTZXQgdGhlIG91dHB1dCB0eXBlICovCi0gICAgKlR5cGUgPSBNNFdSSVRFUl9rM0dQUDsKLQotICAgIC8qKgotICAgICAqICAgIEFsbG9jYXRlIHRoZSBnbG9iYWwgaW50ZXJmYWNlIHN0cnVjdHVyZSAqLwotICAgIHBHbG9iYWwgPSAoTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSksCi0gICAgICAgICAgICAgICAgTTRXUklURVJfM0dQLCAoTTRPU0FfQ2hhciAqKSJNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwR2xvYmFsKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInVuYWJsZSB0byBhbGxvY2F0ZSBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UsXAotICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAqU3JjR2xvYmFsSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgKlNyY0RhdGFJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBBbGxvY2F0ZSB0aGUgZGF0YSBpbnRlcmZhY2Ugc3RydWN0dXJlICovCi0gICAgcERhdGEgPQotICAgICAgICAoTTRXUklURVJfRGF0YUludGVyZmFjZSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRXUklURVJfRGF0YUludGVyZmFjZSksCi0gICAgICAgIE00V1JJVEVSXzNHUCwgKE00T1NBX0NoYXIgKikiTTRXUklURVJfRGF0YUludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBEYXRhKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInVuYWJsZSB0byBhbGxvY2F0ZSBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlLFwKLSAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgZnJlZShwR2xvYmFsKTsKLSAgICAgICAgKlNyY0dsb2JhbEludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICpTcmNEYXRhSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgRmlsbCB0aGUgZ2xvYmFsIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KLSAgICBwR2xvYmFsLT5wRmN0T3BlbiA9IE00V1JJVEVSXzNHUF9vcGVuV3JpdGU7Ci0gICAgcEdsb2JhbC0+cEZjdEFkZFN0cmVhbSA9IE00V1JJVEVSXzNHUF9hZGRTdHJlYW07Ci0gICAgcEdsb2JhbC0+cEZjdFN0YXJ0V3JpdGluZyA9IE00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmc7Ci0gICAgcEdsb2JhbC0+cEZjdENsb3NlV3JpdGUgPSBNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZTsKLSAgICBwR2xvYmFsLT5wRmN0U2V0T3B0aW9uID0gTTRXUklURVJfM0dQX3NldE9wdGlvbjsKLSAgICBwR2xvYmFsLT5wRmN0R2V0T3B0aW9uID0gTTRXUklURVJfM0dQX2dldE9wdGlvbjsKLQotICAgIC8qKgotICAgICAqICAgIEZpbGwgdGhlIGRhdGEgaW50ZXJmYWNlIHN0cnVjdHVyZSAqLwotICAgIHBEYXRhLT5wU3RhcnRBVSA9IE00V1JJVEVSXzNHUF9zdGFydEFVOwotICAgIHBEYXRhLT5wUHJvY2Vzc0FVID0gTTRXUklURVJfM0dQX3Byb2Nlc3NBVTsKLQotICAgIC8qKgotICAgICAqICAgIFNldCB0aGUgcmV0dXJuIHZhbHVlcyAqLwotICAgICpTcmNHbG9iYWxJbnRlcmZhY2UgPSBwR2xvYmFsOwotICAgICpTcmNEYXRhSW50ZXJmYWNlID0gcERhdGE7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19VdGlscy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX1V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyZTJhZDAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX1V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfVXRpbHMuYwotICogQGJyaWVmICAgVXRpbGl0aWVzIGFuZCBwcml2YXRlIGZ1bmN0aW9ucyBmb3IgdGhlIE1QNCB3cml0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotCi0jaW5jbHVkZSAiTTRNUDRXX1V0aWxzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE1QNFdfVHlwZXMuaCIKLQotI2RlZmluZSBFUlJfQ0hFQ0soZXhwLCBlcnIpIGlmICghKGV4cCkpIHsgcmV0dXJuIGVycjsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0Qnl0ZShNNE9TQV9VQ2hhciBjLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBmaWxlRnVuY3Rpb24tPndyaXRlRGF0YShjb250ZXh0LCAoTTRPU0FfTWVtQWRkcjgpJmMsIDEpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTE2KE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKHZhbCA+PiA4KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKXZhbCwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUyNChNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gMTYpLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKHZhbCA+PiA4KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKXZhbCwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUzMihNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gMjQpLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKHZhbCA+PiAxNiksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDgpLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpdmFsLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCbG9jayhjb25zdCBNNE9TQV9VQ2hhciogQmxvY2ssIE00T1NBX1VJbnQzMiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwgTTRPU0FfQ29udGV4dCBjb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IGZpbGVGdW5jdGlvbi0+d3JpdGVEYXRhKGNvbnRleHQsIChNNE9TQV9NZW1BZGRyOClCbG9jaywgc2l6ZSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE00TVA0V19jb252ZXJ0SW50MzJCRShNNE9TQV9VSW50MzIqIHZhbFB0cikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1VDaGFyIGEsIGI7Ci0gICAgTTRPU0FfVUNoYXIqIGMgPSAoTTRPU0FfVUNoYXIqKXZhbFB0cjsKLSAgICBhICAgICAgID0gKihjKTsKLSAgICBiICAgICAgID0gKihjKzEpOwotICAgICooYykgICA9ICooYyszKTsKLSAgICAqKGMrMSkgPSAqKGMrMik7Ci0gICAgKihjKzIpID0gYjsKLSAgICAqKGMrMykgPSBhOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTTRNUDRXX3RhYmxlMzJUb0JFKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MzIgbmIpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9VSW50MzIgaTsKLSAgICBmb3IgKGk9MDsgaTxuYjsgaSsrKQotICAgICAgICBNNE1QNFdfY29udmVydEludDMyQkUoJih0YWIpW2ldKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkKiBNNE1QNFdfcmVhbGxvYyhNNE9TQV9NZW1BZGRyMzIgcHRyLCBNNE9TQV9VSW50MzIgb2xkU2l6ZSwgTTRPU0FfVUludDMyIG5ld1NpemUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9NZW1BZGRyMzIgcHRyMiA9IChNNE9TQV9NZW1BZGRyMzIpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5ld1NpemUsIE00TVA0X1dSSVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJyZWFsbG9jIik7Ci0gICAgaWYgKE00T1NBX05VTEwgIT0gcHRyMikKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXB0cjIsICh2b2lkICopcHRyLCBvbGRTaXplKTsKLSAgICB9Ci0gICAgZnJlZShwdHIpOwotICAgIHJldHVybiBwdHIyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfZnJlZUNvbnRleHQoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgTTRPU0FfVUludDMyIGk7Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIE00TVA0V19NcDRGaWxlRGF0YSogbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLypmcmVlQ29udGV4dCBpcyBub3cgY2FsbGVkIGFmdGVyIGNsb3NlV3JpdGUqLwotICAgIEVSUl9DSEVDSyggbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfY2xvc2VkLCBNNEVSUl9TVEFURSk7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9IE00TVA0V19jbG9zZWQ7Ci0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKmRlbGV0ZSBhbHNvIG90aGVyIGNodW5rcyBpZiBhbnkqLwotICAgICAgICAvKmZvciAoaT0wOyBpPD1tTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrKSovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAgICAgZm9yIChpPTA7IGk8PW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1tpXSk7Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGlmICgoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rKSAmJgotICAgICAgICAgICAgIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0pKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpOwotICAgICAgICB9Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgIC8qbm93IGR5bmFtaWMqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmspOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJKTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLypkZWxldGUgYWxzbyBvdGhlciBjaHVua3MgaWYgYW55Ki8KLSAgICAgICAgLypmb3IgKGk9MDsgaTw9bU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKykqLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgICAgIGZvciAoaT0wOyBpPD1tTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuazsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbaV0pOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBpZiAoKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuaykgJiYKLSAgICAgICAgICAgICAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdKSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAvKm5vdyBkeW5hbWljKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuaykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qbm93IGR5bmFtaWMqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1opCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgZnJlZShtTXA0RmlsZURhdGFQdHIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9Wb2lkIE00TVA0V19wdXQzMl9IaShNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDE2IEhpKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgKnRhYiAmPSAweEZGRkY7Ci0gICAgKnRhYiB8PSBIaTw8MTY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVm9pZCBNNE1QNFdfcHV0MzJfTG8oTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQxNiBMbykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgICp0YWIgJj0gMHhGRkZGMDAwMDsKLSAgICAqdGFiIHw9IExvOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX1VJbnQxNiBNNE1QNFdfZ2V0MzJfSGkoTTRPU0FfVUludDMyKiB0YWIpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICByZXR1cm4gKCp0YWIgPj4gMTYpICYgMHhGRkZGOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX1VJbnQxNiBNNE1QNFdfZ2V0MzJfTG8oTTRPU0FfVUludDMyKiB0YWIpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICByZXR1cm4gKnRhYiAmIDB4RkZGRjsKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX1dyaXRlci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX1dyaXRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZGZjNDQxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19Xcml0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19Xcml0ZXIuYwotICogQGJyaWVmICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIGNvcmUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE1QNFdfV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRNUDRXX1V0aWxzLmgiCi0KLS8qIENoZWNrIG9wdGltaXNhdGlvbiBmbGFncyA6IEJFR0lOICovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSNlcnJvciAiX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggX000TVA0V19NT09WX0ZJUlNUIgotCi0jZW5kaWYKLQotI2VuZGlmCi0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSNpZm5kZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSNlcnJvciAiX000TVA0V19VTkJVRkZFUkVEX1ZJREVPIHNob3VsZCBiZSB1c2VkIHdpdGggX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUiCi0KLSNlbmRpZgotCi0jZW5kaWYKLS8qIENoZWNrIG9wdGltaXNhdGlvbiBmbGFncyA6IEVORCAqLwotCi0jaWZuZGVmIF9NNE1QNFdfRE9OVF9VU0VfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotCi0jZW5kaWYgLypfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSCovCi0KLS8qTUFDUk9TKi8KLSNkZWZpbmUgTUFKT1JfVkVSU0lPTiAzCi0jZGVmaW5lIE1JTk9SX1ZFUlNJT04gMwotI2RlZmluZSBSRVZJU0lPTiAwCi0KLSNkZWZpbmUgRVJSX0NIRUNLKGV4cCwgZXJyKSBpZiAoIShleHApKSB7IHJldHVybiBlcnI7IH0KLSNkZWZpbmUgQ0xFQU5VUG9uRVJSKGZ1bmMpIGlmICgoZXJyID0gZnVuYykgIT0gTTROT19FUlJPUikgZ290byBjbGVhbnVwCi0KLSNkZWZpbmUgbWF4KGEsYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQotCi0vKioqKioqKioqKioqKioqLwotLypTdGF0aWMgYmxvY2tzKi8KLS8qKioqKioqKioqKioqKiovCi0KLS8qQ29tbW9uQmxvY2tzKi8KLQotY29uc3QgTTRPU0FfVUNoYXIgRGVmYXVsdF9mdHlwIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDE4LCAnZicsICd0JywgJ3knLCAncCcsICczJywgJ2cnLCAncCcsICc3JywgMHgwMCwgMHgwMCwKLSAgICAweDAzLCAweDAwLCAnMycsICdnJywgJ3AnLCAnNycsICdpJywgJ3MnLCAnbycsICdtJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2syIFtdID0KLXsKLSAgICAnbScsICdkJywgJ2EnLCAndCcKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMyBbXSA9Ci17Ci0gICAgJ20nLCAnbycsICdvJywgJ3YnLCAweDAwLCAweDAwLCAweDAwLCAweDZDLCAnbScsICd2JywgJ2gnLCAnZCcsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s0IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAzLCAweEU4Ci19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazUgW10gPQotewotICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrNiBbXSA9Ci17Ci0gICAgJ3QnLCAncicsICdhJywgJ2snLCAweDAwLCAweDAwLCAweDAwLCAweDVDLCAndCcsICdrJywgJ2gnLCAnZCcsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMQotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s3IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazdiaXMgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s4IFtdID0KLXsKLSAgICAnbScsICdkJywgJ2knLCAnYScsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsICdtJywgJ2QnLCAnaCcsICdkJywgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazkgW10gPQotewotICAgIDB4NTUsIDB4QzQsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTAgW10gPQotewotICAgICdtJywgJ2knLCAnbicsICdmJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNCwgJ2QnLCAnaScsICduJywgJ2YnLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MUMsICdkJywgJ3InLCAnZScsICdmJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAndScsICdyJywgJ2wnLCAnICcsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMQotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxMSBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdiJywgJ2wnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazEyIFtdID0KLXsKLSAgICAncycsICd0JywgJ3QnLCAncycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyIFtdID0KLXsKLSAgICAncycsICd0JywgJ3MnLCAnZCcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIFNhbXBsZURlc2NyaXB0aW9uRW50cnlTdGFydCBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazE1IFtdID0KLXsKLSAgICAncycsICd0JywgJ3MnLCAneicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTYgW10gPQotewotICAgICdzJywgJ3QnLCAncycsICdjJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxNyBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdjJywgJ28nLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBCbG9ja1NpZ25hdHVyZVNraXBIZWFkZXIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NUUsICdzJywgJ2snLCAnaScsICdwJwotfTsKLS8qIGR1ZSB0byBjdXJyZW50IGxpbWl0YXRpb25zLCBzaXplIG11c3QgYmUgMTYgKi8KLWNvbnN0IE00T1NBX1VDaGFyIEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRFbWJlZGRlZFN0cmluZyBbXSA9Ci17Ci0gICAgJ04nLCAnWCcsICdQJywgJ1MnLCAnVycsICcgJywgJ0MnLCAnQScsICdNJywgJ0MnLCAnTycsICdSJywgJ0QnLCAnRScsCi0gICAgJ1InLCAnICcKLX07Ci0vKiBmb2xsb3dzIHRoZSB2ZXJzaW9uIChsaWtlICIgMy4wLjIiKSwgdGhlbiAiIC0tICIgKi8KLS8qIGR1ZSB0byBjdXJyZW50IGxpbWl0YXRpb25zLCBzaXplIG11c3QgYmUgNjAgKi8KLWNvbnN0IE00T1NBX1VDaGFyIEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZyBbXSA9Ci17Ci0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci0KLS8qVmlkZW9CbG9ja3MqLwotLyogMzIwKjI0MCwgbm93IG5vIGxvbmdlciBoYXJkY29kZWQgKi8KLS8qIGNvbnN0IE00T1NBX1VDaGFyIFZpZGVvQmxvY2sxW10gPQotICAgIHsgMHgwMSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHgwMCwgMHgwMCB9OyAqLwotY29uc3QgTTRPU0FfVUNoYXIgVmlkZW9CbG9jazFfMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgJ2gnLCAnZCcsICdsJywgJ3InLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsICd2JywgJ2knLCAnZCcsICdlJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMiBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHhGRiwgMHhGRgotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgVmlkZW9CbG9jazQgW10gPQotewotICAgICdzJywgJ3QnLCAncycsICdzJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsgLypTVFNTKi8KLQotY29uc3QgTTRPU0FfVUNoYXIgVmlkZW9CbG9jazUgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsICd2JywgJ20nLCAnaCcsICdkJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBWaWRlb1Jlc29sdXRpb25zIFtdID0KLXsKLSAgICAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwCi19OwotCi0vKk1wNHZCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgTXA0dkJsb2NrMSBbXSA9Ci17Ci0gICAgJ20nLCAncCcsICc0JywgJ3YnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBNcDR2QmxvY2szIFtdID0KLXsKLSAgICAweDIwLCAweDExCi19OwotCi0vKkgyNjNCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrMSBbXSA9Ci17Ci0gICAgJ3MnLCAnMicsICc2JywgJzMnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjYzQmxvY2syIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBGLCAnZCcsICcyJywgJzYnLCAnMycKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjNCbG9jazJfYml0ciBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxRiwgJ2QnLCAnMicsICc2JywgJzMnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjYzQmxvY2szIFtdID0KLXsKLSAgICAnUCcsICdIJywgJ0wnLCAnUCcsIDB4MDAsIDB4MEEsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjNCbG9jazQgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsICdiJywgJ2knLCAndCcsICdyJwotfTsKLQotLypIMjY0QmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjRCbG9jazEgW10gPQotewotICAgICdhJywgJ3YnLCAnYycsICcxJwotfTsKLQotLyogU3RvcmUgdGhlIGF2Y0MgZmllbGQsIHRoZSB2ZXJzaW9uICg9MSksCi0gICAgdGhlIHByb2ZpbGUgKD02NiksIHRoZSBjb21wYXRpYmlsaXR5ICg9MCksICovCi0KLS8qIHRoZSBsZXZlbCAoPTEwKSwxMTExMTEgKyBOQUwgZmllbGQgU2l6ZSAoPSA0IC0gMSksCi0gICAgMTExICsgbnVtYmVyIG9mIFBQUyAoPTEpICovCi0KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjRCbG9jazIgW10gPQotewotICAgICAgICAvLyBSZW1vdmUgdGhlIGhhcmRjb2RlZCBEU0kgdmFsdWVzIG9mIEgyNjRCbG9jazIKLSAgICAgICAgJ2EnICwgJ3YnICwgJ2MnICwgJ0MnCi19OwotCi0vKkFNUkJsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJCbG9jazEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEFNUkJsb2NrMV8xIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDIxLCAnaCcsICdkJywgJ2wnLCAncicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgJ3MnLCAnbycsICd1JywgJ24nLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEF1ZGlvU2FtcGxlRGVzY0VudHJ5Qm9pbGVycGxhdGUgW10gPQotewotICAgIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEFNUkRTSUhlYWRlciBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgJ2QnLCAnYScsICdtJywgJ3InCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJEZWZhdWx0RFNJIFtdID0KLXsKLSAgICAnUCcsICdIJywgJ0wnLCAnUCcsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDEKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEFNUkJsb2NrNCBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgJ3MnLCAnbScsICdoJywgJ2QnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLS8qQU1SOEJsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBBTVI4QmxvY2sxIFtdID0KLXsKLSAgICAncycsICdhJywgJ20nLCAncicKLX07Ci0KLS8qQU1SMTZCbG9ja3MqLwotLypjb25zdCBNNE9TQV9VQ2hhciBBTVIxNkJsb2NrMVtdID0geyAncycsICdhJywgJ3cnLCAnYid9OyovCi0KLS8qQUFDQmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEFBQ0Jsb2NrMSBbXSA9Ci17Ci0gICAgJ20nLCAncCcsICc0JywgJ2EnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBQUNCbG9jazIgW10gPQotewotICAgIDB4NDAsIDB4MTUKLX07Ci0KLS8qTVBFR0NvbmZpZ0Jsb2NrcyAoQUFDICYgTVA0VikqLwotY29uc3QgTTRPU0FfVUNoYXIgTVBFR0NvbmZpZ0Jsb2NrMCBbXSA9Ci17Ci0gICAgJ2UnLCAncycsICdkJywgJ3MnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBNUEVHQ29uZmlnQmxvY2sxIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDA0Ci19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBNUEVHQ29uZmlnQmxvY2syIFtdID0geyAweDA1IH07Ci1jb25zdCBNNE9TQV9VQ2hhciBNUEVHQ29uZmlnQmxvY2szIFtdID0KLXsKLSAgICAweDA2LCAweDAxLCAweDAyCi19OwotCi0vKkVWUkNCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgRVZSQ0Jsb2NrM18xIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBFLCAnZCcsICdlJywgJ3YnLCAnYycKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEVWUkNCbG9jazNfMiBbXSA9Ci17Ci0gICAgJ1AnLCAnSCcsICdMJywgJ1AnLCAweDAwLCAweDAwCi19OwotCi0vKkVWUkM4QmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEVWUkM4QmxvY2sxIFtdID0KLXsKLSAgICAncycsICdlJywgJ3YnLCAnYycKLX07Ci0KLS8qKioqKioqKioqKi8KLS8qIE1ldGhvZHMgKi8KLS8qKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2dldFZlcnNpb24oTTRPU0FfVUludDggKm1ham9yLCBNNE9TQV9VSW50OCAqbWlub3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKnJldmlzaW9uICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IG1ham9yLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IG1pbm9yLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IHJldmlzaW9uLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgKm1ham9yID0gTUFKT1JfVkVSU0lPTjsKLSAgICAqbWlub3IgPSBNSU5PUl9WRVJTSU9OOwotICAgICpyZXZpc2lvbiA9IFJFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX1NUVFNfQUxMT0NfU0laRTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX1NUU1pfQUxMT0NfU0laRTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX1NUU1NfQUxMT0NfU0laRTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX0NIVU5LX0FMTE9DX05COwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFOwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFOwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkI7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotLyogc3RzY1sgXSB0YWJsZSBpcyBzcGxpdHRlZCBhdCAxMiBiaXRzICovCi0jZGVmaW5lIE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LIDQwOTUgLyogMD1ub3R1c2VkICovCi0KLSNlbHNlCi0jZGVmaW5lIE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LIDEwICAgLyogMD1ub3R1c2VkICovCi0KLSNlbmRpZgotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLU00T1NBX0VSUiBNNE1QNFdfaW5pdGlhbGl6ZUFsbG9jYXRpb25QYXJhbWV0ZXJzKE00TVA0V19NcDRGaWxlRGF0YSAqUHRyICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICBNNE9TQV9VSW50MzIgbWF4TWVtb3J5LCB2ZXNNZW1vcnk7Ci0gICAgTTRPU0FfVUludDMyIG5iVmlkZW9GcmFtZXMsIG5iQXVkaW9GcmFtZXM7Ci0gICAgTTRPU0FfVUludDMyIGF2ZXJhZ2VWaWRlb0NodW5rOwotCi0gICAgLyotLS0tLS0tLS0tLSovCi0gICAgLyogTkJfRlJBTUVTICovCi0gICAgLyotLS0tLS0tLS0tLSovCi0KLSAgICAvKiBtYWdpY2FsIGZvcm11bGEgOiBtZW1vcnkgPSB2ZXNNZW1vcnkgKyAxMiAqIGZyYW1lcmF0ZSAqIGR1cmF0aW9uICovCi0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgIHZlc01lbW9yeSA9IDB4MzIwMDA7IC8qIDIwMCBrQiAqLwotCi0jZWxzZQotCi0gICAgdmVzTWVtb3J5ID0gMHgzRTgwMDsgLyogMjUwIGtCICovCi0KLSNlbmRpZgotCi0jZGVmaW5lIFZJREVPX1BPT0xfTUVNT1JZIDEwMDAwMDAKLQotICAgIG1heE1lbW9yeSA9IFZJREVPX1BPT0xfTUVNT1JZOwotCi0gICAgaWYgKG1heE1lbW9yeSA8IHZlc01lbW9yeSkgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgbmJWaWRlb0ZyYW1lcyA9ICggbWF4TWVtb3J5IC0gdmVzTWVtb3J5KSAvIDEyOwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0VzogJWQgaW1hZ2VzIG1heCIsIG5iVmlkZW9GcmFtZXMpOwotCi0gICAgLyogVklERU8gKi8KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSAgICAvKiBhc3N1bWUgYW4gYXZlcmFnZSBvZiAyNSBmcGMgOiByZWZlcmVuY2UgPSAxNSBmcHMgKiAycyAqIDAuOCAqLwotCi0gICAgYXZlcmFnZVZpZGVvQ2h1bmsgPSAyNTAwOwotCi0jZWxzZQotCi0gICAgaWYgKE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LID4gMCkKLSAgICB7Ci0gICAgICAgIGF2ZXJhZ2VWaWRlb0NodW5rID0gMTAwICogTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTksgLSAyMAotICAgICAgICAgICAgKiAoTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTksgLSAxKTsgLyogbWFyZ2luIDIwJSAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBhc3N1bWUgYW4gYXZlcmFnZSBvZiA1MCBmcGMgKi8KLSAgICAgICAgYXZlcmFnZVZpZGVvQ2h1bmsgPSA1MDAwOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICBNNE1QNFdfU1RUU19BTExPQ19TSVpFID0gbmJWaWRlb0ZyYW1lcyAqIHNpemVvZihNNE9TQV9VSW50MzIpOwotICAgIE00TVA0V19TVFNaX0FMTE9DX1NJWkUgPSBuYlZpZGVvRnJhbWVzICogc2l6ZW9mKE00T1NBX1VJbnQxNik7Ci0gICAgTTRNUDRXX1NUU1NfQUxMT0NfU0laRSA9IG5iVmlkZW9GcmFtZXMgKiBzaXplb2YoCi0gICAgICAgIE00T1NBX1VJbnQzMik7IC8qIHZlcnkgY29uc2VydmF0aXZlIChhbGwgaW1hZ2VzIGFyZSBpbnRyYSkgKi8KLQotICAgIE00TVA0V19DSFVOS19BTExPQ19OQiA9ICggbmJWaWRlb0ZyYW1lcyAqIDEwMCkgLyBhdmVyYWdlVmlkZW9DaHVuayArIDE7Ci0KLSAgICAvKiBBVURJTyAqLwotCi0gICAgbmJBdWRpb0ZyYW1lcyA9IG5iVmlkZW9GcmFtZXM7Ci0gICAgLyogYXVkaW8gaXMgNSBmcHMsIHdoaWNoIGlzIHRoZSBzbWFsbGVzdCBmcmFtZXJhdGUgZm9yIHZpZGVvICovCi0KLSAgICBNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFID0gMTAwOyAvKiBjb21wcmVzc2VkICovCi0gICAgTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSA9IDEwMDsgLyogY29tcHJlc3NlZCAqLwotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIgPSBuYkF1ZGlvRnJhbWVzIC8gMTAgKyAxOwotCi0jZWxzZQotCi0gICAgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CID0gbmJBdWRpb0ZyYW1lcyAvIDM4ICsgMTsKLQotI2VuZGlmCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLQotI2Vsc2UKLQotICAgIC8qIFZJREVPIDUgbWluIGF0IDI1IGZwcyBudWxsLWVuYyAqLwotCi0gICAgTTRNUDRXX1NUVFNfQUxMT0NfU0laRSA9IDIwMDAwOwotICAgIE00TVA0V19TVFNaX0FMTE9DX1NJWkUgPSAxODAwMDsKLSAgICBNNE1QNFdfU1RTU19BTExPQ19TSVpFID0gNTAwMDsKLSAgICBNNE1QNFdfQ0hVTktfQUxMT0NfTkIgPSA1MDA7Ci0KLSAgICAvKiBBVURJTyAyIG1pbiBhYWMrIG51bGwtZW5jICovCi0KLSAgICBNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFID0gMzIwMDA7Ci0gICAgTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSA9IDIwMDAwOwotICAgIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQiA9IDEwMDA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLQotI2VuZGlmIC8qX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUqLwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19vcGVuV3JpdGUoTTRPU0FfQ29udGV4dCAqY29udGV4dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dHB1dEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKmZpbGVXcml0ZXJGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRlbXBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqZmlsZVJlYWRlckZ1bmN0aW9uICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gTTRPU0FfTlVMTDsKLQotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IGNvbnRleHRQdHIsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gb3V0cHV0RmlsZURlc2NyaXB0b3IsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gZmlsZVdyaXRlckZ1bmN0aW9uLCBNNEVSUl9QQVJBTUVURVIpOwotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgLyogT3B0aW9uYWwsIGZlYXR1cmUgd29uJ3QgYmUgdXNlZCBpZiBOVUxMICovCi0KLSAgICBNNE9TQV9UUkFDRTJfMSgidGVtcEZpbGVEZXNjcmlwdG9yID0gJXAiLCB0ZW1wRmlsZURlc2NyaXB0b3IpOwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gdGVtcEZpbGVEZXNjcmlwdG9yKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAidGVtcEZpbGVEZXNjcmlwdG9yIGlzIE5VTEwsIFJFU0VSVkVEX01PT1ZfRElTS19TUEFDRSBmZWF0dXJlIG5vdCB1c2VkIik7Ci0gICAgfQotCi0jZWxzZSAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotICAgIC8qIE5vdCB1c2VkIDogRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gdGVtcEZpbGVEZXNjcmlwdG9yLCBNNEVSUl9QQVJBTUVURVIpOyAqLwotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0gICAgLyogTm90IHVzZWQgOiBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBmaWxlUmVhZGVyRnVuY3Rpb24sIE00RVJSX1BBUkFNRVRFUik7ICovCi0KLSAgICAvKiBUaGUgY29udGV4dCByZXVzZSBtb2RlIHdhcyBzdXBwcmVzc2VkKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ciA9Ci0gICAgICAgIChNNE1QNFdfTXA0RmlsZURhdGEgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00TVA0V19NcDRGaWxlRGF0YSksCi0gICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiTVA0IHdyaXRlciBjb250ZXh0Iik7Ci0gICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ciAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT51cmwgPSBvdXRwdXRGaWxlRGVzY3JpcHRvcjsKLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPSBNNE9TQV9OVUxMOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9IE00T1NBX05VTEw7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhDaHVua1NpemUgPSBNNE1QNFdfRGVmYXVsdE1heENodW5rU2l6ZTsgLypkZWZhdWx0ICAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4QVVTaXplID0gTTRNUDRXX0RlZmF1bHRNYXhBdVNpemU7ICAgICAgIC8qZGVmYXVsdCAgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgPQotICAgICAgICBNNE1QNFdfRGVmYXVsdEludGVybGVhdmVEdXI7IC8qZGVmYXVsdCA9IDAsIGkuZS4gbm90IHVzZWQqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUgPSAwOyAvKmRlZmF1bHQgPSAwLCBpLmUuIG5vdCB1c2VkKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmNhbWNvZGVyVmVyc2lvbiA9IDA7IC8qZGVmYXVsdCBpcyAiIDAuMC4wIiovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9Ci0gICAgICAgIE00T1NBX05VTEw7IC8qZGVmYXVsdCBpcyBpbiBCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnID0gTTRPU0FfTlVMTDsgLypkZWZhdWx0IGlzIDAgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbiA9IDA7IC8qZGVmYXVsdCA9IDAsIGkuZS4gbm90IHVzZWQqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zID0gZmlsZVdyaXRlckZ1bmN0aW9uOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID0gTTRPU0FfRkFMU0U7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9IE00TVA0V19vcGVuZWQ7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5kdXJhdGlvbiA9IDA7IC8qaSovCi0gICAgLypwYXRjaCBmb3IgaW50ZWdyYXRpb25UYWcgMTc0IC0+IDIzOCAoKzY0KSovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSA9Ci0gICAgICAgIDIzODsgLyppbml0aWFsaXphdGlvbiB3aXRoIGNvbnN0YW50IHBhcnQgaW4gZnR5cCttZGF0K21vb3Yrc2tpcCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID0gTTRPU0FfRkFMU0U7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zQ2h1bmtEdXIgPQotICAgICAgICAwOyAvKnNldCBhbmQgdXNlZCBvbmx5IHdoZW4gZXN0aW1hdGVBdWRpb1NpemUgaXMgdHJ1ZSovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zU3RvcFRpbWUgPQotICAgICAgICAwOyAvKnNldCBhbmQgdXNlZCBvbmx5IHdoZW4gZXN0aW1hdGVBdWRpb1NpemUgaXMgdHJ1ZSovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAvKiArIENSTFY2Nzc1IC1ILjI2NCB0cmltbWluZyAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+Yk1VTFBQU1NQUyA9IE00T1NBX0ZBTFNFOwotICAgIC8qIC0gQ1JMVjY3NzUgLUguMjY0IHRyaW1taW5nICovCi0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyA9Ci0gICAgICAgIDMyOyAvKmluaXQgd2l0aCBmdHlwICsgYmVnaW5uaW5nIG9mIG1kYXQgc2l6ZSovCi0KLSNlbmRpZgotCi0jaWZkZWYgX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCA9IHRlbXBGaWxlRGVzY3JpcHRvcjsKLSAgICBtTXA0RmlsZURhdGFQdHItPmNsZWFuU2FmZXR5RmlsZSA9Ci0gICAgICAgIE00T1NBX0ZBTFNFOyAvKiBObyBuZWVkIHRvIGNsZWFuIGl0IGp1c3QgeWV0LiAqLwotCi0jZW5kaWYgICAgICAgICAgICAgICAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotCi0gICAgLyogZnR5cCBhdG9tICovCi0KLSAgICBtZW1zZXQoKHZvaWQgKikgJm1NcDRGaWxlRGF0YVB0ci0+ZnR5cCwwLAotICAgICAgICBzaXplb2YobU1wNEZpbGVEYXRhUHRyLT5mdHlwKSk7Ci0KLSAgICAqY29udGV4dFB0ciA9IG1NcDRGaWxlRGF0YVB0cjsKLQotICAgIE00TVA0V19pbml0aWFsaXplQWxsb2NhdGlvblBhcmFtZXRlcnMobU1wNEZpbGVEYXRhUHRyKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19hZGRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gKnN0cmVhbURlc2NQdHIgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotCi0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gY29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEVSUl9DSEVDSygoIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX29wZW5lZCkKLSAgICAgICAgfHwgKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX3JlYWR5KSwgTTRFUlJfU1RBVEUpOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfcmVhZHk7Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tBTVI6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgY2FzZSBNNFNZU19rRVZSQzoKLSAgICAgICAgICAgIC8qQXVkaW8qLwotICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPnN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgICAgICAgICAgLypjaGVjayBpZiBhbiBhdWRpbyB0cmFjayBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX0ZBTFNFLAotICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhUKTsKLQotICAgICAgICAgICAgLypjaGVjayBpZiBhbGxvYyBuZWVkIHRvIGJlIGRvbmUqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciA9IChNNE1QNFdfQXVkaW9UcmFja0RhdGEKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00TVA0V19BdWRpb1RyYWNrRGF0YSksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiTTRNUDRXX0F1ZGlvVHJhY2tEYXRhIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFdlIG11c3QgaW5pdCB0aGVzZSBwb2ludGVycyBpbiBjYXNlIGFuIGFsbG9jIGJlbGxvdyBmYWlscyAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1ogPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIC8qbm93IGR5bmFtaWMqLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkNodW5rIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5DaHVuayIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzID0gMTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDQwMjsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZTsgLyogaW5pdCB2YWx1ZSAqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGUgPQotICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPnRpbWVTY2FsZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbMF0gPSAwOyAgICAgLyppbml0Ki8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlWzBdID0gMDsgLyppbml0Ki8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZVswXSA9IDA7ICAgLyppbml0Ki8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rID0KLSAgICAgICAgICAgICAgICAwOyAvKjFzdCBjaHVuayBpcyBDaHVua1swXSovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgPSAwOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MgPSAwOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3JlYWR5OwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcyA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1ogPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5tYXhCaXRyYXRlID0KLSAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5tYXhCaXRyYXRlOwotCi0gICAgICAgICAgICBpZiAoc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPnRpbWVTY2FsZSA9PSA4MDAwLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAxNjA7IC8qQU1SOCt0aW1lc2NhbGU9ODAwMCA9PiBzYW1wbGUgZHVyYXRpb24gMTYwIGNvbnN0YW50Ki8KLQotICAgICAgICAgICAgICAgIC8qVXNlIGdpdmVuIERTSSBpZiBwYXNzZWQsIGVsc2UgdXNlIGRlZmF1bHQgdmFsdWUqLwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyphbXIgRFNJIGlzIDkgYnl0ZXMgbG9uZyAhKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDk7IC8qYWx3YXlzIDkgZm9yIGFtciovCi0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9PSA5LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDksIE00TVA0X1dSSVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIDkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOyAvKmRlZmF1bHQgc3RhdGljIGJsb2NrIHdpbGwgYmUgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAwOyAvKmJ1dCB0aGUgYWN0dWFsIHN0YXRpYyBkc2kgaXMgOSBieXRlcyAhKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlID09IE00U1lTX2tFVlJDKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00U1lTX2tFVlJDOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT50aW1lU2NhbGUgPT0gODAwMCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgMTYwOyAvKkVWUkMrdGltZXNjYWxlPTgwMDAgPT4gc2FtcGxlIGR1cmF0aW9uIDE2MCBjb25zdGFudCovCi0KLSAgICAgICAgICAgICAgICAvKlVzZSBnaXZlbiBEU0kgaWYgcGFzc2VkLCBlbHNlIHVzZSBkZWZhdWx0IHZhbHVlKi8KLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qZXZyYyBEU0kgaXMgNiBieXRlcyBsb25nICEqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgNjsgLyphbHdheXMgNiBmb3IgZXZyYyovCi0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9PSA2LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDYsIE00TVA0X1dSSVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIDYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOyAvKmRlZmF1bHQgc3RhdGljIGJsb2NrIHdpbGwgYmUgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAwOyAvKmJ1dCB0aGUgYWN0dWFsIHN0YXRpYyBkc2kgaXMgNiBieXRlcyAhKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qTTRTWVNfa0FBQyovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyphdmcgYml0cmF0ZSBzaG91bGQgYmUgc2V0Ki8KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGUgIT0gLTEsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPm1heEJpdHJhdGUgIT0gLTEsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRTWVNfa0FBQzsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgMDsgLypkb24ndCBrbm93IGZvciBhYWMsIHNvIHNldCAwKi8KLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLQotICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qbm8gZHNpOiByZXR1cm4gYmFkIHBhcmFtZXRlciA/Ki8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00U1lTX2tNUEVHXzQpOgotICAgICAgICBjYXNlIChNNFNZU19rSDI2NCk6Ci0gICAgICAgIGNhc2UgKE00U1lTX2tIMjYzKToKLSAgICAgICAgICAgIC8qVmlkZW8qLwotICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPnN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgICAgICAgICAgLypjaGVjayBpZiBhIHZpZGVvIHRyYWNrIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQqLwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UsCi0gICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQpOwotCi0gICAgICAgICAgICAvKmNoZWNrIGlmIGFsbG9jIG5lZWQgdG8gYmUgZG9uZSovCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyID0gKE00TVA0V19WaWRlb1RyYWNrRGF0YQotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRNUDRXX1ZpZGVvVHJhY2tEYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJNNE1QNFdfVmlkZW9UcmFja0RhdGEiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV2UgbXVzdCBpbml0IHRoZXNlIHBvaW50ZXJzIGluIGNhc2UgYW4gYWxsb2MgYmVsbG93IGZhaWxzICovCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKm5vdyBkeW5hbWljKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5DaHVuayIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotI2Vsc2UKLSAgICAgICAgICAgICAgICAvKnJlLXVzZSB0aGUgc2FtZSBjaHVuayBhbmQgZmx1c2ggaXQgd2hlbiBmdWxsKi8KLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Q2h1bmsiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRNUDRXX1RpbWUzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRNUDRXX1RpbWUzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsgPSAwOwotICAgICAgICAgICAgICAgIC8qdGFibGVzIGFyZSBub3cgZHluYW1pYyovCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfU1RUU19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzID0gMTsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfU1RTWl9BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1oiKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUU1pfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaIik7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcyA9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfU1RTU19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0NjI7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPndpZHRoID0gTTRNUDRXX0RlZmF1bHRXaWR0aDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0ID0gTTRNUDRXX0RlZmF1bHRIZWlnaHQ7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhBVVNpemU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlID0KLSAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUgPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4Q2h1bmtTaXplOyAvKiBpbml0IHZhbHVlICovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVXBlckNodW5rID0KLSAgICAgICAgICAgICAgICBNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSzsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT50aW1lU2NhbGUgPT0gMTAwMCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGUgPSAxMDAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbMF0gPSAwOyAgICAgLyppbml0Ki8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlWzBdID0gMDsgLyppbml0Ki8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZVswXSA9IDA7ICAgLyppbml0Ki8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rID0KLSAgICAgICAgICAgICAgICAwOyAvKjFzdCBjaHVuayBpcyBDaHVua1swXSovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgPSAwOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MgPSAwOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V19yZWFkeTsKLQotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa0gyNjMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCggc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGUgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIHx8IChzdHJlYW1EZXNjUHRyLT5tYXhCaXRyYXRlID09IC0xKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qdGhlIGJpdHJhdGUgd2lsbCBub3QgYmUgd3JpdHRlbiBpZiB0aGUgYml0cmF0ZSBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGZ1bGx5IHNldCAqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qcHJvcHJpZXRhcnkgc3RvcmFnZSBvZiBoMjYzIGJpdHJhdGUuCi0gICAgICAgICAgICAgICAgICAgICBXYXJuaW5nOiBub3QgdGhlIGFjdHVhbCBiaXRyYXRlIChiaXQgc2V0IHRvIDEpLiovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPm1heEJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCggMCAhPSBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgIT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKmRlY29kZXIgc3BlY2lmaWMgaW5mbyBzaXplIGlzIHN1cHBvc2VkIHRvIGJlIGFsd2F5cyA3IGJ5dGVzIGxvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID09IDcsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKnVzZSB0aGUgZGVmYXVsdCBkc2kqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZSA9PSBNNFNZU19rTVBFR180KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gMjI7IC8qZXh0cmEgYnl0ZXMgKGZyb20gaDI2MykqLwotICAgICAgICAgICAgICAgIC8qIGFsbG93IERTSSB0byBiZSBNNE9TQV9OVUxMLCBpbiB3aGljaCBjYXNlIHRoZSBhY3R1YWwgRFNJIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgc2V0IGJ5IHNldE9wdGlvbi4gKi8KLSAgICAgICAgICAgICAgICBpZiAoKCAwID09IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNUDRWIHNwZWNpZmljKi8KLSAgICAgICAgICAgICAgICAgICAgLypkZWNvZGVyIHNwZWNpZmljIGluZm8gc2l6ZSBpcyBzdXBwb3NlZCB0byBiZSBhbHdheXMgPAotICAgICAgICAgICAgICAgICAgICAgICAgMTA1IHNvIHRoYXQgRVNEIHNpemUgY2FuIGJlIGNvZGVkIHdpdGggMSBieXRlKi8KLSAgICAgICAgICAgICAgICAgICAgLyoodGhpcyBzaG91bGQgbm90IGJlIHJlc3RyaWN0aXZlIGJlY2F1c2UgZHNpIGlzIGFsd2F5cyBzaG9ydGVyICEpKi8KLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplIDwgMTA1LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qYXZnIGJpdHJhdGUgc2hvdWxkIGJlIHNldCovCi0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlICE9IC0xLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZSA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBIMjY0IHNwZWNpZmljIGluZm9ybWF0aW9uICovCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZTsKLQotICAgICAgICAgICAgICAgIGlmICgoMCAhPSBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgIT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiArIEguMjY0IHRyaW1taW5nICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9UUlVFID09IG1NcDRGaWxlRGF0YVB0ci0+Yk1VTFBQU1NQUykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2IFNQU0xlbmd0aCwgUFBTTGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2ICpEU0k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSB0aGUgRFNJIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIERTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNiAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgICAgICAgICAgICAgICAgICBTUFNMZW5ndGggPSBEU0lbNl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBQUFNMZW5ndGggPSBEU0lbMTBdOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoKHN0cmVhbURlc2NQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm8pKzEyKSwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJKSsyKSwgKHZvaWQgKikoKHN0cmVhbURlc2NQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm8pKzI4KSwgU1BTTGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSkrMiArIFNQU0xlbmd0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoKHN0cmVhbURlc2NQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm8pKzIwKSwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJKSs0ICsgU1BTTGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgoc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMjggKyBTUFNMZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQU0xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiAtIEguMjY0IHRyaW1taW5nICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSB0aGUgRFNJIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBEU0kgKFNQUyArIFBQUykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyp1c2UgdGhlIGRlZmF1bHQgZHNpKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3N0YXJ0V3JpdGluZyggTTRPU0FfQ29udGV4dCBjb250ZXh0ICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcyA9IE00T1NBX2tGaWxlV3JpdGUgfCBNNE9TQV9rRmlsZUNyZWF0ZTsKLSAgICBNNE9TQV9VSW50MzIgaTsKLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX3JlYWR5KSwgTTRFUlJfU1RBVEUpOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfd3JpdGluZzsKLQotICAgIC8qYXVkaW8gbWljcm9zdGF0ZSAqLwotICAgIC8qICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvKQotICAgIHsKLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPT0gTTRNUDRXX3JlYWR5KSwKLSAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3dyaXRpbmc7Ci0KLSAgICAgICAgLyogRmlyc3QgYXVkaW8gY2h1bmsgYWxsb2NhdGlvbiAqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKLSAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0iKTsKLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0gIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICB9Ci0KLSAgICAvKnZpZGVvIG1pY3Jvc3RhdGUqLwotICAgIC8qICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvKQotICAgIHsKLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPT0gTTRNUDRXX3JlYWR5KSwKLSAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3dyaXRpbmc7Ci0KLSAgICAgICAgLyogRmlyc3QgdmlkZW8gY2h1bmsgYWxsb2NhdGlvbiAqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKLSAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0iKTsKLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0gIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICB9Ci0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgLypzZXQgYXVkaW9Nc0NodW5rRHVyIChkdXJhdGlvbiBpbiBtcyBiZWZvcmUgYSBuZXcgY2h1bmsgaXMgY3JlYXRlZCkKLSAgICAgICAgIGZvciBhdWRpbyBzaXplIGVzdGltYXRpb24qLwotICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbywgTTRFUlJfQkFEX0NPTlRFWFQpOwotICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbywgTTRFUlJfQkFEX0NPTlRFWFQpOwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyID0KLSAgICAgICAgICAgIDIwICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUKLSAgICAgICAgICAgIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemU7Ci0KLSAgICAgICAgaWYgKCggbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyICE9IDApCi0gICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyCi0gICAgICAgICAgICA8IDIwICptTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZQotICAgICAgICAgICAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyID0gbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyOwotICAgICAgICB9Ci0gICAgfQotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgLypvcGVuIGZpbGUgaW4gd3JpdGUgYmluYXJ5IG1vZGUqLwotCi0gICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5vcGVuV3JpdGUoCi0gICAgICAgICZtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnVybCwgZmlsZU1vZGVBY2Nlc3MpOwotICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotCi0gICAgLypmdHlwIGF0b20qLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmZ0eXAubWFqb3JfYnJhbmQgIT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIFB1dCBjdXN0b21pemVkIGZ0eXAgYm94ICovCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMigxNiArIChtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzICogNCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgICAgIGVyciA9IE00TVA0V19wdXRCRTMyKE00TVBBQ19GVFlQX1RBRywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1ham9yX2JyYW5kLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAubWlub3JfdmVyc2lvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5jb21wYXRpYmxlX2JyYW5kc1tpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBQdXQgZGVmYXVsdCBmdHlwIGJveCAqLwotICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2soRGVmYXVsdF9mdHlwLCBzaXplb2YoRGVmYXVsdF9mdHlwKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICB9Ci0KLSAgICAvKmluaXQgbWRhdCB2YWx1ZSB3aXRoIDAgYnV0IHRoZSByaWdodCB2YWx1ZSBpcyBzZXQganVzdCBiZWZvcmUgdGhlIGZpbGUgaXMgY2xvc2VkKi8KLSAgICBlcnIgPSBNNE1QNFdfcHV0QkUzMigwLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazIsIHNpemVvZihDb21tb25CbG9jazIpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0jaWZkZWYgX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgIGlmICgwICE9IG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUKLSAgICAgICAgJiYgTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwpCi0gICAgewotICAgICAgICBNNE9TQV9FUlIgZXJyMiA9IE00Tk9fRVJST1I7Ci0gICAgICAgIE00T1NBX0NvbnRleHQgc2FmZXR5RmlsZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBNNE9TQV9VSW50MzIgc2FmZXR5RmlsZVNpemUgPSAwLCBhZGRlbmR1bSA9IDA7Ci0gICAgICAgIE00T1NBX1VDaGFyIGR1bW15RGF0YVsxMDBdOyAvKiBUbyBmaWxsIHRoZSBzYWZldHkgZmlsZSB3aXRoICovCi0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKCZzYWZldHlGaWxlQ29udGV4dCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCwgZmlsZU1vZGVBY2Nlc3MpOwotICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmNsZWFuU2FmZXR5RmlsZSA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyogMTAlIHNlZW1zIHRvIGJlIGEgcmVhc29uYWJsZSB3b3JzdCBjYXNlLCBidXQgYWxzbyBwcm92aXNpb24gZm9yIDFrYiBvZiBtb292IG92ZXJoZWFkLiovCi0gICAgICAgIHNhZmV0eUZpbGVTaXplID0gMTAwMCArIChtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplICogMTAgKyA5OSkgLyAxMDA7Ci0KLSAgICAgICAgLyogSGVyZSB3ZSBhZGQgc3BhY2UgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIGZhY3Qgd2UgaGF2ZSB0byBmbHVzaCBhbnkgcGVuZGluZwotICAgICAgICBjaHVuayBpbiBjbG9zZVdyaXRlLCB0aGlzIHNwYWNlIGlzIHRoZSBzdW0gb2YgdGhlIG1heGltdW0gY2h1bmsgc2l6ZXMsIGZvciBlYWNoCi0gICAgICAgIHRyYWNrLiAqLwotCi0jaWZuZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYWZldHlGaWxlU2l6ZSArPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbykKLSAgICAgICAgewotICAgICAgICAgICAgc2FmZXR5RmlsZVNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1zZXQoKHZvaWQgKilkdW1teURhdGEsIDB4Q0Esc2l6ZW9mKGR1bW15RGF0YSkpOyAvKiBGb3IgZXh0cmEgc2FmZXR5LiAqLwotCi0gICAgICAgIGZvciAoIGkgPSAwOwotICAgICAgICAgICAgaSA8IChzYWZldHlGaWxlU2l6ZSArIHNpemVvZihkdW1teURhdGEpIC0gMSkgLyBzaXplb2YoZHVtbXlEYXRhKTsKLSAgICAgICAgICAgIGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+d3JpdGVEYXRhKAotICAgICAgICAgICAgICAgIHNhZmV0eUZpbGVDb250ZXh0LCBkdW1teURhdGEsIHNpemVvZihkdW1teURhdGEpKTsKLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyogRG9uJ3QgcmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uIHlldCwgYXMgd2UgbmVlZCB0byBjbG9zZSB0aGUgZmlsZSBmaXJzdC4gKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEkgZG9uJ3QgbmVlZCB0byBrZWVwIGl0IG9wZW4uICovCi0gICAgICAgIGVycjIgPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKHNhZmV0eUZpbGVDb250ZXh0KTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVycjIpLCBlcnIyKTsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiU2FmZXR5IGZpbGUgY29ycmVjdGx5IGNyZWF0ZWQiKTsKLSAgICB9Ci0jZW5kaWYgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19uZXdBdWRpb0NodW5rKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpsZWZ0U3BhY2VJbkNodW5rICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfYXVkaW87Ci0KLSNpZm5kZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgIE00T1NBX1VJbnQzMiByZWFsbG9jTmI7Ci0KLSNlbmRpZgotCi0gICAgLyogdmlkZW8gb25seSAqLwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMV8wKCIgTTRNUDRXX25ld0F1ZGlvQ2h1bmsgLSBmbHVzaCBhdWRpbyIpOwotICAgIE00T1NBX1RSQUNFMV8yKCJjdXJyZW50IGNodW5rID0gJWQgIG9mZnNldCA9IDB4JXgiLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuaywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MpOwotCi0gICAgc2NhbGVfYXVkaW8gPSAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIC8qZmx1c2ggY2h1bmsqLwotCi0gICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0sCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiB0ZW1wID0gbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3M7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8xKAotICAgICAgICAgICAgIk00TVA0V19uZXdBdWRpb0NodW5rOiBwdXRCbG9jayBlcnJvciB3aGVuIGZsdXNoaW5nIGNodW5rOiAlI1giLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgLyogT3VjaCwgd2UgZ290IGFuIGVycm9yIHdyaXRpbmcgdG8gdGhlIGZpbGUsIGJ1dCB3ZSBuZWVkIHRvIHByb3Blcmx5IHJlYWN0IHNvIHRoYXQgdGhlCi0gICAgICAgICBzdGF0ZSBpcyBzdGlsbCBjb25zaXN0ZW50IGFuZCB3ZSBjYW4gcHJvcGVybHkgY2xvc2UgdGhlIGZpbGUgc28gdGhhdCB3aGF0IGhhcyBiZWVuCi0gICAgICAgICByZWNvcmRlZCBzbyBmYXIgaXMgbm90IGxvc3QuIFlheSBlcnJvciByZWNvdmVyeSEgKi8KLQotICAgICAgICAvKiBGaXJzdCwgd2UgZG8gbm90IGtub3cgd2hlcmUgd2UgYXJlIGluIHRoZSBmaWxlLiBQdXQgdXMgYmFjayBhdCB3aGVyZSB3ZSB3ZXJlIGJlZm9yZQotICAgICAgICBhdHRlbXB0aW5nIHRvIHdyaXRlIHRoZSBkYXRhLiBUaGF0IHdheSwgd2UncmUgY29uc2lzdGVudCB3aXRoIHRoZSBjaHVuayBzdGF0ZSBkYXRhLiAqLwotICAgICAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPnNlZWsoCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmdGVtcCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoCi0gICAgICAgICAgICAiQmFja3RyYWNraW5nIHRvIHBvc2l0aW9uIDB4JTA4WCwgc2VlayByZXR1cm5lZCAlZCBhbmQgcG9zaXRpb24gJTA4WCIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcywgZXJyLCB0ZW1wKTsKLQotICAgICAgICAvKiBUaGVuLCBkbyBub3QgdXBkYXRlIGFueSBpbmZvIHdoYXRzb2V2ZXIgaW4gdGhlIHdyaXRpbmcgc3RhdGUuIFRoaXMgd2lsbCBoYXZlIHRoZQotICAgICAgICAgY29uc2VxdWVuY2UgdGhhdCBpdCB3aWxsIGJlIGFzIGlmIHRoZSBjaHVuayBoYXMgbm90IGJlZW4gZmx1c2hlZCB5ZXQsIGFuZCB0aGVyZWZvcmUKLSAgICAgICAgIGl0IHdpbGwgYmUgZG9uZSBhcyBwYXJ0IG9mIGNsb3NlV3JpdGUgKHdoZXJlIHRoZXJlIGNvdWxkIGJlIHJvb20gdG8gZG8gc28sCi0gICAgICAgICBpZiBzb21lIGVtZXJnZW5jeSByb29tIGlzIGZyZWVkIGZvciB0aGF0IHB1cnBvc2UpLiAqLwotCi0gICAgICAgIC8qIEFuZCBsYXN0bHkgKGZvciBoZXJlKSwgcmV0dXJuIHRoYXQgd2UndmUgcmVhY2hlZCB0aGUgbGltaXQgb2YgYXZhaWxhYmxlIHNwYWNlLiAqLwotCi0gICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgIH0KLQotICAgIC8qdXBkYXRlIGNodW5rIG9mZnNldCovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtPZmZzZXRUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLQotICAgIC8qYWRkIGNodW5rIHNpemUgdG8gYWJzb2x1dGVDdXJyZW50UG9zKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyArPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAvKnVwZGF0ZSBjaHVuayBpbmZvICovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICBjaHVua1NpemVUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUzsKLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rICs9IDE7Ci0gICAgLyppZiBhdWRpbyBhbW91bnQgb2YgZGF0YSBpcyBub3QgZXN0aW1hdGVkKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSAxNjsKLQotICAgIC8qYWxsb2MgbmV3IGNodW5rKi8KLSAgICAvKm9ubHkgaWYgbm90IGFscmVhZHkgYWxsb2NhdGVkKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgID4gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmspCi0gICAgewotICAgICAgICAvKnVwZGF0ZSBMYXN0QWxsb2NhdGVkQ2h1bmsgKCAtPiA9IGN1cnJlbnRDaHVuaykqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuayArPSAxOwotCi0gICAgICAgIC8qbWF4IG5iIG9mIGNodW5rIGlzIG5vdyBkeW5hbWljKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuawotICAgICAgICAgICAgKyAzID4gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX25ld0F1ZGlvQ2h1bmsgOiBhdWRpbyBjaHVuayB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIGlmICgoKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rKQotICAgICAgICAgICAgJSBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWxsb2NOYiA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rCi0gICAgICAgICAgICAgICAgKyBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkI7Ci0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmssCi0gICAgICAgICAgICAgICAgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VDaGFyICopKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0jZWxzZQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZSwKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtTaXplVGFibGUsCi0gICAgICAgICAgICAgICAgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPQotICAgICAgICAgICAgICAgIChNNE1QNFdfVGltZTMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rVGltZU1zVGFibGUsCi0gICAgICAgICAgICAgICAgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRNUDRXX1RpbWUzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00TVA0V19UaW1lMzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsiKTsKLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10KLSAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgfQotCi0gICAgLyp1cGRhdGUgbGVmdFNwYWNlSW5DaHVuaywgY3VycmVudFBvcyBhbmQgY3VycmVudENodW5rRHVyKi8KLSAgICAqbGVmdFNwYWNlSW5DaHVuayA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyA9IDA7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIC8qIGNoZWNrIHdldGhlciB0byB1c2UgYSBuZXcgc3RzYyBvciBub3QgKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjID4gMCkKLSAgICB7Ci0gICAgICAgIGlmICgoIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRTdHNjXSAmIDB4RkZGKSAhPSAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjCi0gICAgICAgICAgICAtIDFdICYgMHhGRkYpKQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYyArPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MgKz0gMTsKLQotICAgIC8qIG1heCBuYiBvZiBjaHVuayBpcyBub3cgZHluYW1pYyAqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjCi0gICAgICAgICsgMyA+IE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3QXVkaW9DaHVuayA6IGF1ZGlvIHN0c2MgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgbmIgb2Ygc2FtcGxlcyBpbiB0aGUgbmV3IGNodW5rIHRvIDAgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzY10gPQotICAgICAgICAwICsgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rIDw8IDEyKTsKLQotI2Vsc2UKLSAgICAvKnNldCBuYiBvZiBzYW1wbGVzIGluIHRoZSBuZXcgY2h1bmsgdG8gMCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0gMDsKLQotI2VuZGlmCi0KLSAgICAvKnNldCB0aW1lIG9mIHRoZSBuZXcgY2h1bmsgdG8gbGFzdENUUyAoZm9yIGluaXRpYWxpemF0aW9uLCBidXQgdXBkYXRlZCBmdXJ0aGVyIHRvIHRoZQotICAgIENUUyBvZiB0aGUgbGFzdCBzYW1wbGUgaW4gdGhlIGNodW5rKSovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICogc2NhbGVfYXVkaW8pOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX25ld1ZpZGVvQ2h1bmsoIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKmxlZnRTcGFjZUluQ2h1bmsgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV92aWRlbzsKLQotI2lmbmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgTTRPU0FfVUludDMyIHJlYWxsb2NOYjsKLQotI2VuZGlmCi0KLSAgICAvKiBhdWRpbyBvbmx5ICovCi0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyID09IE00T1NBX05VTEwpCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19uZXdWaWRlb0NodW5rIC0gZmx1c2ggdmlkZW8iKTsKLSAgICBNNE9TQV9UUkFDRTFfMigiY3VycmVudCBjaHVuayA9ICVkICBvZmZzZXQgPSAweCV4IiwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zKTsKLQotICAgIHNjYWxlX3ZpZGVvID0gMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotICAgIC8qIHNhbXBsZXMgYXJlIGFscmVhZHkgd3JpdHRlbiB0byBmaWxlICovCi0jZWxzZQotICAgIC8qZmx1c2ggY2h1bmsqLwotCi0gICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0sCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiB0ZW1wID0gbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3M7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8xKAotICAgICAgICAgICAgIk00TVA0V19uZXdWaWRlb0NodW5rOiBwdXRCbG9jayBlcnJvciB3aGVuIGZsdXNoaW5nIGNodW5rOiAlI1giLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgLyogT3VjaCwgd2UgZ290IGFuIGVycm9yIHdyaXRpbmcgdG8gdGhlIGZpbGUsIGJ1dCB3ZSBuZWVkIHRvIHByb3Blcmx5IHJlYWN0IHNvIHRoYXQgdGhlCi0gICAgICAgICBzdGF0ZSBpcyBzdGlsbCBjb25zaXN0ZW50IGFuZCB3ZSBjYW4gcHJvcGVybHkgY2xvc2UgdGhlIGZpbGUgc28gdGhhdCB3aGF0IGhhcyBiZWVuCi0gICAgICAgICByZWNvcmRlZCBzbyBmYXIgaXMgbm90IGxvc3QuIFlheSBlcnJvciByZWNvdmVyeSEgKi8KLQotICAgICAgICAvKiBGaXJzdCwgd2UgZG8gbm90IGtub3cgd2hlcmUgd2UgYXJlIGluIHRoZSBmaWxlLiBQdXQgdXMgYmFjayBhdCB3aGVyZSB3ZSB3ZXJlIGJlZm9yZQotICAgICAgICBhdHRlbXB0aW5nIHRvIHdyaXRlIHRoZSBkYXRhLiBUaGF0IHdheSwgd2UncmUgY29uc2lzdGVudCB3aXRoIHRoZSBjaHVuayBzdGF0ZSBkYXRhLiAqLwotICAgICAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPnNlZWsoCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmdGVtcCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoCi0gICAgICAgICAgICAiQmFja3RyYWNraW5nIHRvIHBvc2l0aW9uIDB4JTA4WCwgc2VlayByZXR1cm5lZCAlZCBhbmQgcG9zaXRpb24gJTA4WCIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcywgZXJyLCB0ZW1wKTsKLSAgICAgICAgLyogVGhlbiwgZG8gbm90IHVwZGF0ZSBhbnkgaW5mbyB3aGF0c29ldmVyIGluIHRoZSB3cml0aW5nIHN0YXRlLiBUaGlzIHdpbGwgaGF2ZSB0aGUKLSAgICAgICAgIGNvbnNlcXVlbmNlIHRoYXQgaXQgd2lsbCBiZSBhcyBpZiB0aGUgY2h1bmsgaGFzIG5vdCBiZWVuIGZsdXNoZWQgeWV0LCBhbmQgdGhlcmVmb3JlIGl0Ci0gICAgICAgICB3aWxsIGJlIGRvbmUgYXMgcGFydCBvZiBjbG9zZVdyaXRlICh3aGVyZSB0aGVyZSBjb3VsZCBiZSByb29tIHRvIGRvIHNvLCBpZiBzb21lCi0gICAgICAgICBlbWVyZ2VuY3kgcm9vbSBpcyBmcmVlZCBmb3IgdGhhdCBwdXJwb3NlKS4gKi8KLQotICAgICAgICAvKiBBbmQgbGFzdGx5IChmb3IgaGVyZSksIHJldHVybiB0aGF0IHdlJ3ZlIHJlYWNoZWQgdGhlIGxpbWl0IG9mIGF2YWlsYWJsZSBzcGFjZS4KLSAgICAgICAgIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGVycm9yIG9yaWdpbmFsbHkgcmV0dXJuZWQgYnkgcHV0QmxvY2suICovCi0KLSAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIC8qdXBkYXRlIGNodW5rIG9mZnNldCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua09mZnNldFRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotCi0gICAgLyphZGQgY2h1bmsgc2l6ZSB0byBhYnNvbHV0ZUN1cnJlbnRQb3MqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zICs9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIC8qdXBkYXRlIGNodW5rIGluZm8gYmVmb3JlIHRvIGdvIGZvciBhIG5ldyBvbmUqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTaXplVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgKE00T1NBX1VJbnQzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgKiBzY2FsZV92aWRlbyk7Ci0KLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayArPSAxOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gMTY7Ci0KLSAgICAvKmFsbG9jIG5ldyBjaHVuayovCi0gICAgLypvbmx5IGlmIG5vdCBhbHJlYWR5IGFsbG9jYXRlZCovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rCi0gICAgICAgID4gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmspCi0gICAgewotICAgICAgICAvKnVwZGF0ZSBMYXN0QWxsb2NhdGVkQ2h1bmsgKCAtPiA9IGN1cnJlbnRDaHVuaykqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuayArPSAxOwotCi0gICAgICAgIC8qbWF4IG5iIG9mIGNodW5rIGlzIG5vdyBkeW5hbWljKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIGlmICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsKLSAgICAgICAgICAgICsgMyA+IE00TVA0V19DSFVOS19BTExPQ19OQikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19uZXdWaWRlb0NodW5rIDogdmlkZW8gY2h1bmsgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBpZiAoKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuaykKLSAgICAgICAgICAgICUgTTRNUDRXX0NIVU5LX0FMTE9DX05CKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWFsbG9jTmIgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuawotICAgICAgICAgICAgICAgICsgTTRNUDRXX0NIVU5LX0FMTE9DX05COwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iCi0gICAgICAgICAgICAgICAgLSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpICogc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGUsICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1NpemVUYWJsZSwgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlLCAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRNUDRXX1RpbWUzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlLCAoIHJlYWxsb2NOYgotICAgICAgICAgICAgICAgIC0gTTRNUDRXX0NIVU5LX0FMTE9DX05CKSAqIHNpemVvZihNNE1QNFdfVGltZTMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRNUDRXX1RpbWUzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgfQotI2VuZGlmIC8qX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUqLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSIpOwotICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXQotICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICB9Ci0KLSAgICAvKnVwZGF0ZSBsZWZ0U3BhY2VJbkNodW5rLCBjdXJyZW50UG9zIGFuZCBjdXJyZW50Q2h1bmtEdXIqLwotICAgICpsZWZ0U3BhY2VJbkNodW5rID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zID0gMDsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgLyogY2hlY2sgd2V0aGVyIHRvIHVzZSBhIG5ldyBzdHNjIG9yIG5vdCAqLwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MgPiAwKQotICAgIHsKLSAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50U3RzY10gJiAweEZGRikgIT0gKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICAgICAgLSAxXSAmIDB4RkZGKSkKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MgKz0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjICs9IDE7Ci0KLSAgICAvKiBtYXggbmIgb2YgY2h1bmsgaXMgbm93IGR5bmFtaWMgKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICArIDMgPiBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX25ld1ZpZGVvQ2h1bmsgOiB2aWRlbyBzdHNjIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgfQotCi0gICAgLyogc2V0IG5iIG9mIHNhbXBsZXMgaW4gdGhlIG5ldyBjaHVuayB0byAwICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2NdID0KLSAgICAgICAgMCArIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA8PCAxMik7Ci0KLSNlbHNlCi0gICAgLypzZXQgbmIgb2Ygc2FtcGxlcyBpbiB0aGUgbmV3IGNodW5rIHRvIDAqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9IDA7Ci0KLSNlbmRpZgotCi0gICAgLypzZXQgdGltZSBvZiB0aGUgbmV3IGNodW5rIHRvIGxhc3RDVFMgKGZvciBpbml0aWFsaXphdGlvbiwgYnV0IHVwZGF0ZWQgZnVydGhlciB0byB0aGUKLSAgICBDVFMgb2YgdGhlIGxhc3Qgc2FtcGxlIGluIHRoZSBjaHVuaykqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAoTTRPU0FfVUludDMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAqIHNjYWxlX3ZpZGVvKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19zdGFydEFVKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKmF1UHRyICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLQotICAgIE00T1NBX1VJbnQzMiBsZWZ0U3BhY2VJbkNodW5rOwotICAgIE00TVA0V19UaW1lMzIgY2h1bmtEdXJNczsKLQotICAgIE00T1NBX0RvdWJsZSBzY2FsZV9hdWRpbzsKLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfdmlkZW87Ci0KLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIEVSUl9DSEVDSyhhdVB0ciAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIi0tLS0tIE00TVA0V19zdGFydEFVIC0tLS0tIik7Ci0KLSAgICAvKmNoZWNrIG1hY3JvIHN0YXRlKi8KLSAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX3dyaXRpbmcpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBpZiAoc3RyZWFtSUQgPT0gQXVkaW9TdHJlYW1JRCkgLyphdWRpbyBzdHJlYW0qLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00TVA0V19zdGFydEFVIC0+IGF1ZGlvIik7Ci0KLSAgICAgICAgc2NhbGVfYXVkaW8gPQotICAgICAgICAgICAgMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLQotICAgICAgICAvKmF1ZGlvIG1pY3Jvc3RhdGUqLwotICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZQotICAgICAgICAgICAgPT0gTTRNUDRXX3dyaXRpbmcpLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nX3N0YXJ0QVU7Ci0KLSAgICAgICAgbGVmdFNwYWNlSW5DaHVuayA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplCi0gICAgICAgICAgICAtIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMigiYXVkaW8gJWQgICVkIiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcywgbGVmdFNwYWNlSW5DaHVuayk7Ci0KLSAgICAgICAgY2h1bmtEdXJNcyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICAgICAqIHNjYWxlX2F1ZGlvKSAtIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50Q2h1bmtdKTsKLQotICAgICAgICBpZiAoKGxlZnRTcGFjZUluQ2h1bmsgPCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZSkKLSAgICAgICAgICAgIHx8ICgoIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciAhPSAwKQotICAgICAgICAgICAgJiYgKGNodW5rRHVyTXMgPj0gbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyKSkpCi0gICAgICAgIHsKLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSAgICAgICAgICAgIC8qIG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3QgMSB2aWRlbyBzYW1wbGUgaW4gdGhlIGNodW5rICovCi0KLSAgICAgICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA+IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNsb3NlIHRoZSBvcGVuZWQgdmlkZW8gY2h1bmsgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IGF1ZGlvIG9uZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00TVA0V19uZXdWaWRlb0NodW5rKGNvbnRleHQsICZsZWZ0U3BhY2VJbkNodW5rKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0gICAgICAgICAgICAvKiBub3QgZW5vdWdoIHNwYWNlIGluIGN1cnJlbnQgY2h1bms6IGNyZWF0ZSBhIG5ldyBvbmUgKi8KLQotICAgICAgICAgICAgZXJyID0gTTRNUDRXX25ld0F1ZGlvQ2h1bmsoY29udGV4dCwgJmxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGF1UHRyLT5zaXplID0gbGVmdFNwYWNlSW5DaHVuazsKLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10KLSAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MpOwotCi0jZWxzZQotCi0gICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zKTsKLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkgLyp2aWRlbyBzdHJlYW0qLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00TVA0V19zdGFydEFVIC0+IHZpZGVvIik7Ci0KLSAgICAgICAgc2NhbGVfdmlkZW8gPQotICAgICAgICAgICAgMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLQotICAgICAgICAvKnZpZGVvIG1pY3Jvc3RhdGUqLwotICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZQotICAgICAgICAgICAgPT0gTTRNUDRXX3dyaXRpbmcpLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nX3N0YXJ0QVU7Ci0KLSAgICAgICAgbGVmdFNwYWNlSW5DaHVuayA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplCi0gICAgICAgICAgICAtIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsKLQotICAgICAgICBjaHVua0R1ck1zID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgICAgICogc2NhbGVfdmlkZW8pIC0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRDaHVua10pOwotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICAgICAgbGVmdFNwYWNlSW5DaHVuayA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotCi0jZW5kaWYKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMigidmlkZW8gJWQgICVkIiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcywgbGVmdFNwYWNlSW5DaHVuayk7Ci0KLSAgICAgICAgaWYgKCggbGVmdFNwYWNlSW5DaHVuayA8IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplKQotICAgICAgICAgICAgfHwgKCggbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyICE9IDApCi0gICAgICAgICAgICAmJiAoY2h1bmtEdXJNcyA+PSBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIpKQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIHx8ICgoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVwZXJDaHVuayAhPSAwKQotICAgICAgICAgICAgJiYgKCggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpCi0gICAgICAgICAgICA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVcGVyQ2h1bmspKQotCi0jZW5kaWYKLQotICAgICAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKm5vdCBlbm91Z2ggc3BhY2UgaW4gY3VycmVudCBjaHVuazogY3JlYXRlIGEgbmV3IG9uZSovCi0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfbmV3VmlkZW9DaHVuayhjb250ZXh0LCAmbGVmdFNwYWNlSW5DaHVuayk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoInN0YXJ0QVU6IHNpemUgMHgleCBwb3MgMHgleCBjaHVuayAldSIsIGF1UHRyLT5zaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmspOwotCi0gICAgICAgIE00T1NBX1RSQUNFM18xKCJhZHIgPSAweCVwIiwgYXVQdHItPmRhdGFBZGRyZXNzKTsKLQotICAgICAgICBpZiAoYXVQdHItPmRhdGFBZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMygiIGRhdGEgPSAlMDhYICUwOFggJTA4WCIsIGF1UHRyLT5kYXRhQWRkcmVzc1swXSwKLSAgICAgICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3NbMV0sIGF1UHRyLT5kYXRhQWRkcmVzc1syXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhdVB0ci0+c2l6ZSA9IGxlZnRTcGFjZUluQ2h1bms7Ci0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tIMjY0KQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10KLSAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgKyA0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10KLSAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MpOwotCi0jZWxzZQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdICsgNCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdKTsKLQotI2Vsc2UKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcwotICAgICAgICAgICAgKyA0KTsgLyogSW4gSDI2NCwgd2UgbXVzdCBzdGFydCBieSB0aGUgbGVuZ3RoIG9mIHRoZSBOQUxVLCBjb2RlZCBpbiA0IGJ5dGVzICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zKTsKLQotI2VuZGlmIC8qX000TVA0V19VTkJVRkZFUkVEX1ZJREVPKi8KLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00TVBXX3N0YXJ0QVU6IHN0YXJ0IGFkZHJlc3M6JXAsIHNpemU6JWx1LCBzdHJlYW06JWQiLAotICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MsIGF1UHRyLT5zaXplLCBzdHJlYW1JRCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfcHJvY2Vzc0FVKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCAqYXVQdHIgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRNUDRXX1RpbWUzMiBkZWx0YTsKLSAgICBNNE1QNFdfVGltZTMyIGxhc3RTYW1wbGVEdXI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgLypleHBlY3RlZFNpemUgaXMgdGhlIG1heCBmaWxlc2l6ZSB0byBmb3JlY2FzdCB3aGVuIGFkZGluZyBhIG5ldyBBVToqLwotICAgIE00T1NBX1VJbnQzMiBleHBlY3RlZFNpemUgPQotICAgICAgICAzMjsgLyppbml0aWFsaXplZCB3aXRoIGFuIGVzdGltYXRpb24gb2YgdGhlIG1heCBtZXRhZGF0YSBzcGFjZSBuZWVkZWQgZm9yIGFuIEFVLiovCi0gICAgTTRPU0FfRG91YmxlIHNjYWxlX2F1ZGlvID0gMC4wOwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV92aWRlbyA9IDAuMDsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qY2hlY2sgbWFjcm8gc3RhdGUqLwotICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfd3JpdGluZyksIE00RVJSX1NUQVRFKTsKLQotICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfcHJvY2Vzc0FVIik7Ci0KLSAgICBpZiAoc3RyZWFtSUQgPT0gQXVkaW9TdHJlYW1JRCkKLSAgICAgICAgc2NhbGVfYXVkaW8gPQotICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotCi0gICAgaWYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpCi0gICAgICAgIHNjYWxlX3ZpZGVvID0KLSAgICAgICAgMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLQotICAgIC8qIFBMIDI3LzEwLzIwMDg6IGFmdGVyIHRoZSByZXN1cmdlbmNlIG9mIHRoZSBBQUMgMTI4IGJ1ZywgSSBhZGRlZCBhIGRlYnVnIGNoZWNrIHRoYXQKLSAgICAgdGhlIGVuY29kZWQgZGF0YSBkaWRuJ3Qgb3ZlcmZsb3cgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgQVUgKi8KLQotICAgIHN3aXRjaCggc3RyZWFtSUQgKQotICAgIHsKLSAgICAgICAgY2FzZSBBdWRpb1N0cmVhbUlEOgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKGF1UHRyLT5zaXplCi0gICAgICAgICAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MKLSAgICAgICAgICAgID4gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRCwKLSAgICAgICAgICAgICJVaCBvaC4gQnVmZmVyIG92ZXJmbG93IGluIHRoZSB3cml0ZXIuIEFiYW5kb24gc2hpcCEiKTsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMihhdVB0ci0+c2l6ZQotICAgICAgICAgICAgICAgID4gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUsCi0gICAgICAgICAgICAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgIk9vcHMuIEFuIEFVIHdlbnQgb3ZlciB0aGUgZGVjbGFyZWQgTWF4IEFVIHNpemUuXAotICAgICAgICAgICAgICAgICBZb3UgbWlnaHQgd2lzaCB0byBpbnZlc3RpZ2F0ZSB0aGF0LiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBWaWRlb1N0cmVhbUlEOgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKGF1UHRyLT5zaXplCi0gICAgICAgICAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MKLSAgICAgICAgICAgICAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICJVaCBvaC4gQnVmZmVyIG92ZXJmbG93IGluIHRoZSB3cml0ZXIuIEFiYW5kb24gc2hpcCEiKTsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMihhdVB0ci0+c2l6ZQotICAgICAgICAgICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgIk9vcHMuIEFuIEFVIHdlbnQgb3ZlciB0aGUgZGVjbGFyZWQgTWF4IEFVIHNpemUuXAotICAgICAgICAgICAgICAgICAgICAgWW91IG1pZ2h0IHdpc2ggdG8gaW52ZXN0aWdhdGUgdGhhdC4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qb25seSBpZiBub3QgaW4gdGhlIGNhc2UgYXVkaW8gd2l0aCBlc3RpbWF0ZUF1ZGlvU2l6ZQotICAgIChlbHNlLCBzaXplIGFscmVhZHkgZXN0aW1hdGVkIGF0IHRoaXMgcG9pbnQpKi8KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgIHx8IChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIC8qY2hlY2sgZmlsZXNpemUgaWYgbmVlZGVkKi8KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0ZWRTaXplICs9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKyBhdVB0ci0+c2l6ZTsKLQotICAgICAgICAgICAgaWYgKChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKQotICAgICAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4cGVjdGVkU2l6ZSArPSA0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXhwZWN0ZWRTaXplID4gbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgicHJvY2Vzc0FVIDogISEgRklMRVNJWkUgRVhDRUVERUQgISEiKTsKLQotICAgICAgICAgICAgICAgIC8qIHBhdGNoIGZvciBhdXRvc3RvcCBpcyBNYXhGaWxlU2l6ZSBleGNlZWRlZCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogc3RvcCBhdCB0YXJnZXRlZCBmaWxlc2l6ZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLypjYXNlIGF1ZGlvTXNTdG9wVGltZSBoYXMgYWxyZWFkeSBiZWVuIHNldCBkdXJpbmcgdmlkZW8gcHJvY2Vzc2luZywKLSAgICAgYW5kIG5vdyBjaGVjayBpdCBmb3IgYXVkaW8qLwotICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9UUlVFKQotICAgICAgICAmJiAoc3RyZWFtSUQgPT0gQXVkaW9TdHJlYW1JRCkpCi0gICAgewotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zU3RvcFRpbWUgPD0gKGF1UHRyLT5DVFMgKnNjYWxlX2F1ZGlvKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogYnVnZml4OiBpZiBhIG5ldyBjaHVuayB3YXMganVzdCBjcmVhdGVkLCBjYW5jZWwgaXQgYmVmb3JlIHRvIGNsb3NlICovCi0gICAgICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rICE9IDApCi0gICAgICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyA9PSAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuay0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19wcm9jZXNzQVUgOiBhdWRpbyBzdG9wIHRpbWUgcmVhY2hlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RyZWFtSUQgPT0gQXVkaW9TdHJlYW1JRCkgLyphdWRpbyBzdHJlYW0qLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00TVA0V19wcm9jZXNzQVUgLT4gYXVkaW8iKTsKLQotICAgICAgICAvKmF1ZGlvIG1pY3Jvc3RhdGUqLwotICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZQotICAgICAgICAgICAgPT0gTTRNUDRXX3dyaXRpbmdfc3RhcnRBVSksIE00RVJSX1NUQVRFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3dyaXRpbmc7Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zICs9IGF1UHRyLT5zaXplOwotICAgICAgICAvKiBXYXJuaW5nOiB0aW1lIGNvbnZlcnNpb24gY2FzdCA2NHRvMzIhICovCi0gICAgICAgIGRlbHRhID0gKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUwotICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUzsKLQotICAgICAgICAvKiBERUJVRyBzdHRzIGVudHJpZXMgd2hpY2ggYXJlIGVxdWFsIHRvIDAgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIkFfREVMVEEgPSAlbGRcbiIsIGRlbHRhKTsKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA9PSAwKSAvKnRlc3QgaWYgZmlyc3QgQVUqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKnNldCBhdSBzaXplKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplID0gYXVQdHItPnNpemU7Ci0KLSAgICAgICAgICAgIC8qc2FtcGxlIGR1cmF0aW9uIGlzIGEgcHJpb3JpIGNvbnN0YW50IGluIGF1ZGlvIGNhc2UsICovCi0gICAgICAgICAgICAvKmJ1dCBpZiBhbiBBdSBhdCBsZWFzdCBoYXMgZGlmZmVyZW50IHNpemUsIGEgc3RzeiB0YWJsZSB3aWxsIGJlIGNyZWF0ZWQgKi8KLQotICAgICAgICAgICAgLyptTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uID0gZGVsdGE7ICovCi0gICAgICAgICAgICAvKlRPRE8gdGVzdCBzYW1wbGUgZHVyYXRpb24/IChzaG91bGQgYmUgMjBtcyBpbiBBTVI4LCAxNjAgdGljcyB3aXRoIHRpbWVzY2FsZSA4MDAwKSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLypjaGVjayBpZiBhdSBzaXplIGlzIGNvbnN0YW50IChhdWRpbykgKi8KLSAgICAgICAgICAgIC8qMCBzYW1wbGUgc2l6ZSBtZWFucyBub24gY29uc3RhbnQgc2l6ZSovCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgIT0gYXVQdHItPnNpemUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKmZpcnN0IEFVIHdpdGggZGlmZmVyZW50IHNpemUgPT4gbm9uIGNvbnN0YW50IHNpemUgPT4gU1RTWiB0YWJsZSBuZWVkZWQqLwotICAgICAgICAgICAgICAgICAgICAvKmNvbXB1dGF0aW9uIG9mIHRoZSBuYiBvZiBibG9jayBvZiBzaXplIE00TVA0V19TVFNaX0FMTE9DX1NJWkUgdG8gYWxsb2NhdGUqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgICAgICAgICAgICAgKiA0IC8gTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiIpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpIDwgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgICAgICAgICAgICAgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaW2ldID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RTWlttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVOYl0gPSBhdVB0ci0+c2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMDsgLyp1c2VkIGFzIGEgZmxhZyBpbiB0aGF0IGNhc2UqLwotICAgICAgICAgICAgICAgICAgICAvKm1vcmUgYnl0ZXMgaW4gdGhlIGZpbGUgaW4gdGhhdCBjYXNlOiovCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPQotICAgICAgICAgICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qZWxzZSB0YWJsZSBhbHJlYWR5IGV4aXN0cyovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIGlmICg0ICoobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICsgMykKLSAgICAgICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgICAgICAqTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19wcm9jZXNzQVUgOiBhdWRpbyBzdHN6IHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgaWYgKDQgKm1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICpNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcyArPQotICAgICAgICAgICAgICAgICAgICAgICAgMTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUU1osICggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWgotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUqLwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RTWlttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZU5iXSA9IGF1UHRyLT5zaXplOwotCi0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZWx0YSA+IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgcmVhbCBzYW1wbGUgZHVyYXRpb24qLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9IGRlbHRhOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPT0gMCkgLyp0ZXN0IGlmIGZpcnN0IEFVKi8KLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA9PSAxKSAvKnRlc3QgaWYgc2Vjb25kIEFVKi8KLSAgICAgICAgewotI2lmbmRlZiBEVVBMSUNBVEVfU1RUU19JTl9MQVNUX0FVCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1swXSArPSAxOwotCi0jZW5kaWYgLypEVVBMSUNBVEVfU1RUU19JTl9MQVNUX0FVKi8KLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdID0gZGVsdGE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiArPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLypyZXRyaWV2ZSBsYXN0IHNhbXBsZSBkZWx0YSovCi0gICAgICAgICAgICBsYXN0U2FtcGxlRHVyID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpIC0gMV07Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBpZiAoOCAqKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgKyAzKSA+PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgKk00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19wcm9jZXNzQVUgOiBhdWRpbyBzdHRzIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICAgICAgaWYgKDggKm1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MgKz0gMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUUywgKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAtIDEpICogTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotICAgICAgICAgICAgaWYgKGRlbHRhICE9IGxhc3RTYW1wbGVEdXIpIC8qbmV3IGVudHJ5IGluIHRoZSB0YWJsZSovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIgKigKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSldID0gMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSArIDFdID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgKz0KLSAgICAgICAgICAgICAgICAgICAgMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyppbmNyZWFzZSBvZiAxIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgQVVzIHdpdGggc2FtZSBkdXJhdGlvbiovCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIgKigKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgLSAyXSArPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiArPSAxOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjXSArPQotICAgICAgICAgICAgMTsKLQotI2Vsc2UKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSArPQotICAgICAgICAgICAgMTsKLQotI2VuZGlmCi0gICAgICAgIC8qIFdhcm5pbmc6IHRpbWUgY29udmVyc2lvbiBjYXN0IDY0dG8zMiEgKi8KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUyA9Ci0gICAgICAgICAgICAoTTRNUDRXX1RpbWUzMilhdVB0ci0+Q1RTOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKSAvKnZpZGVvIHN0cmVhbSovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRNUDRXX3Byb2Nlc3NBVSAtPiB2aWRlbyIpOwotCi0gICAgICAgIC8qIEluIGgyNjQsIHRoZSBzaXplIG9mIHRoZSBBVSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBkYXRhICovCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQWRkIHRoZSBzaXplIG9mIHRoZSBOQUxVIGluIEJFICovCi0gICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwVG1wRGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzIC09IDE7Ci0gICAgICAgICAgICBwVG1wRGF0YUFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjgpYXVQdHItPmRhdGFBZGRyZXNzOwotCi0gICAgICAgICAgICAvLyBiaXQgbWFuaXB1bGF0aW9uCi0gICAgICAgICAgICAqcFRtcERhdGFBZGRyZXNzKysgPSAoTTRPU0FfVUludDgpKChhdVB0ci0+c2l6ZSA+PiAyNCkgJiAweDAwMDAwMEZGKTsKLSAgICAgICAgICAgICpwVG1wRGF0YUFkZHJlc3MrKyA9IChNNE9TQV9VSW50OCkoKGF1UHRyLT5zaXplID4+IDE2KSAmIDB4MDAwMDAwRkYpOwotICAgICAgICAgICAgKnBUbXBEYXRhQWRkcmVzcysrID0gKE00T1NBX1VJbnQ4KSgoYXVQdHItPnNpemUgPj4gOCkgICYgMHgwMDAwMDBGRik7Ci0gICAgICAgICAgICAqcFRtcERhdGFBZGRyZXNzKysgPSAoTTRPU0FfVUludDgpKChhdVB0ci0+c2l6ZSkgICAgICAgJiAweDAwMDAwMEZGKTsKLQotICAgICAgICAgICAgYXVQdHItPnNpemUgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qdmlkZW8gbWljcm9zdGF0ZSovCi0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlCi0gICAgICAgICAgICA9PSBNNE1QNFdfd3JpdGluZ19zdGFydEFVKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZzsKLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotICAgICAgICAvKiBzYW1wbGVzIGFyZSB3cml0dGVuIHRvIGZpbGUgbm93ICovCi0KLSAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKChNNE9TQV9VQ2hhciAqKWF1UHRyLT5kYXRhQWRkcmVzcywgYXVQdHItPnNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLQotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiB0ZW1wID0gbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MKLSAgICAgICAgICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKAotICAgICAgICAgICAgICAgICJNNE1QNFdfcHJvY2Vzc0FVOiBwdXRCbG9jayBlcnJvciB3aGVuIHdyaXRpbmcgdW5idWZmZXJlZCB2aWRlbyBzYW1wbGU6ICUjWCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qIE91Y2gsIHdlIGdvdCBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBmaWxlLCBidXQgd2UgbmVlZCB0byBwcm9wZXJseSByZWFjdCBzbyB0aGF0Ci0gICAgICAgICAgICAgdGhlIHN0YXRlIGlzIHN0aWxsIGNvbnNpc3RlbnQgYW5kIHdlIGNhbiBwcm9wZXJseSBjbG9zZSB0aGUgZmlsZSBzbyB0aGF0IHdoYXQgaGFzCi0gICAgICAgICAgICAgIGJlZW4gcmVjb3JkZWQgc28gZmFyIGlzIG5vdCBsb3N0LiBZYXkgZXJyb3IgcmVjb3ZlcnkhICovCi0KLSAgICAgICAgICAgIC8qIEZpcnN0LCB3ZSBkbyBub3Qga25vdyB3aGVyZSB3ZSBhcmUgaW4gdGhlIGZpbGUuIFB1dCB1cyBiYWNrIGF0IHdoZXJlIHdlIHdlcmUgYmVmb3JlCi0gICAgICAgICAgICBhdHRlbXB0aW5nIHRvIHdyaXRlIHRoZSBkYXRhLiBUaGF0IHdheSwgd2UncmUgY29uc2lzdGVudCB3aXRoIHRoZSBjaHVuayBhbmQgc2FtcGxlCi0gICAgICAgICAgICAgc3RhdGUgZGF0YS5hYnNvbHV0ZUN1cnJlbnRQb3MgaXMgb25seSB1cGRhdGVkIGZvciBjaHVua3MsIGl0IHBvaW50cyB0byB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgb2YgdGhlIGNodW5rLHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGFkZCB2aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zIHRvIGtub3cgd2hlcmUgd2UKLSAgICAgICAgICAgICB3ZXJlIGluIHRoZSBmaWxlLiAqLwotICAgICAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmdGVtcCk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgICAgICJCYWNrdHJhY2tpbmcgdG8gcG9zaXRpb24gMHglMDhYLCBzZWVrIHJldHVybmVkICVkIGFuZCBwb3NpdGlvbiAlMDhYIiwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcwotICAgICAgICAgICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zLCBlcnIsIHRlbXApOwotCi0gICAgICAgICAgICAvKiBUaGVuLCBkbyBub3QgdXBkYXRlIGFueSBpbmZvIHdoYXRzb2V2ZXIgaW4gdGhlIHdyaXRpbmcgc3RhdGUuIFRoaXMgd2lsbCBoYXZlIHRoZQotICAgICAgICAgICAgIGNvbnNlcXVlbmNlIHRoYXQgaXQgd2lsbCBiZSBhcyBpZiB0aGUgc2FtcGxlIGhhcyBuZXZlciBiZWVuIHdyaXR0ZW4sIHNvIHRoZSBjaHVuawotICAgICAgICAgICAgIHdpbGwgYmUgbWVyZWx5IGNsb3NlZCBhZnRlciB0aGUgcHJldmlvdXMgc2FtcGxlICh0aGUgc2FtcGxlIHdlIGF0dGVtcHRlZCB0byB3cml0ZQotICAgICAgICAgICAgIGhlcmUgaXMgbG9zdCkuICovCi0KLSAgICAgICAgICAgIC8qIEFuZCBsYXN0bHkgKGZvciBoZXJlKSwgcmV0dXJuIHRoYXQgd2UndmUgcmVhY2hlZCB0aGUgbGltaXQgb2YgYXZhaWxhYmxlIHNwYWNlLgotICAgICAgICAgICAgIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGVycm9yIG9yaWdpbmFsbHkgcmV0dXJuZWQgYnkgcHV0QmxvY2suICovCi0KLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIGlmICgoTTRNUDRXX1RpbWUzMilhdVB0ci0+Q1RTIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdCByZXBvcnQgYXMgZXJyb3IsIGl0IHdpbGwgYWJvcnQgdGhlIGVudGlyZSBmaWxld3JpdGUuIEp1c3Qgc2tpcCB0aGlzIGZyYW1lLgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlNraXAgZnJhbWUuIFZpZGVvIGZyYW1lIGhhcyB0b28gb2xkIHRpbWVzdGFtcC4iKTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zICs9IGF1UHRyLT5zaXplOwotCi0gICAgICAgIC8qIFdhcm5pbmc6IHRpbWUgY29udmVyc2lvbiBjYXN0IDY0dG8zMiEgKi8KLSAgICAgICAgZGVsdGEgPSAoTTRNUDRXX1RpbWUzMilhdVB0ci0+Q1RTCi0gICAgICAgICAgICAtIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTOwotCi0gICAgICAgIC8qIERFQlVHIHN0dHMgZW50cmllcyB3aGljaCBhcmUgZXF1YWwgdG8gMCAqLwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiVl9ERUxUQSA9ICVsZFxuIiwgZGVsdGEpOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBpZiAoMiAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiArIDMpCi0gICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAqTTRNUDRXX1NUU1pfQUxMT0NfU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19wcm9jZXNzQVUgOiB2aWRlbyBzdHN6IHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICB9Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIFRBQkxFX1NUU1pbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KWF1UHRyLT5zaXplOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDQ7Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYgKDQgKm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgKk00TVA0V19TVFNaX0FMTE9DX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgKz0gMTsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICAgICAgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgLSAxKSAqIE00TVA0V19TVFNaX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgICogTTRNUDRXX1NUU1pfQUxMT0NfU0laRSk7Ci0KLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgIH0KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgVEFCTEVfU1RTWlttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmJdID0KLSAgICAgICAgICAgIGF1UHRyLT5zaXplOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDQ7Ci0KLSNlbmRpZgotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDApIC8qdGVzdCBpZiBmaXJzdCBBVSovCi0gICAgICAgIHsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBNNE1QNFdfcHV0MzJfTG8oJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1swXSwgMSk7Ci0gICAgICAgICAgICBNNE1QNFdfcHV0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1swXSwgMCk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1swXSA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSAwOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPT0gMSApIC8qdGVzdCBpZiBzZWNvbmQgQVUqLwotICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0sCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilkZWx0YSk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9IGRlbHRhOwotCi0jZW5kaWYKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLypyZXRyaWV2ZSBsYXN0IHNhbXBsZSBkZWx0YSovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgbGFzdFNhbXBsZUR1ciA9IE00TVA0V19nZXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMV0pOwotCi0gICAgICAgICAgICBpZiAoNCAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgKyAzKSA+PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgKk00TVA0V19TVFRTX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19wcm9jZXNzQVUgOiB2aWRlbyBzdHRzIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICAgICAgbGFzdFNhbXBsZUR1ciA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSArIDFdOwotCi0gICAgICAgICAgICBpZiAoOCAqbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgKk00TVA0V19TVFRTX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcyArPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTLCAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgIC0gMSkgKiBNNE1QNFdfU1RUU19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFRTX0FMTE9DX1NJWkUpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgfQotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUqLwotCi0gICAgICAgICAgICBpZiAoZGVsdGEgIT0gbGFzdFNhbXBsZUR1cikgLypuZXcgZW50cnkgaW4gdGhlIHRhYmxlKi8KLSAgICAgICAgICAgIHsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0xvKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYl0sIDEpOwotICAgICAgICAgICAgICAgIE00TVA0V19wdXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmJdLCAoTTRPU0FfVUludDE2KWRlbHRhKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYildID0gMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICAgICAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYikrMV0gPSBkZWx0YTsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiArPQotICAgICAgICAgICAgICAgICAgICAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKmluY3JlYXNlIG9mIDEgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBBVXMgd2l0aCBzYW1lIGR1cmF0aW9uKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxXSArPSAxOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIgKigKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSldICs9IDE7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKz0gMTsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzY10gKz0KLSAgICAgICAgICAgIDE7Ci0KLSNlbHNlCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gKz0KLSAgICAgICAgICAgIDE7Ci0KLSNlbmRpZgotCi0gICAgICAgIGlmIChhdVB0ci0+YXR0cmlidXRlID09IEFVX1JBUCkKLSAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIGlmICg0ICoobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iICsgMykKLSAgICAgICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzCi0gICAgICAgICAgICAgICAgKk00TVA0V19TVFNTX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19wcm9jZXNzQVUgOiB2aWRlbyBzdHNzIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICAgICAgaWYgKDQgKm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3NCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUU1NfQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzICs9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUU1MsICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3NCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgLSAxKSAqIE00TVA0V19TVFNTX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUU1NfQUxMT0NfU0laRSk7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBUQUJMRV9TVFNTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYl0gPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiArPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogV2FybmluZzogdGltZSBjb252ZXJzaW9uIGNhc3QgNjR0bzMyISAqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUyA9Ci0gICAgICAgICAgICAoTTRNUDRXX1RpbWUzMilhdVB0ci0+Q1RTOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotCi0gICAgLyogSSBtb3ZlZCBzb21lIHN0YXRlIG1vZGlmaWNhdGlvbiB0byBhZnRlciB3ZSBrbm93IHRoZSBzYW1wbGUgaGFzIGJlZW4gd3JpdHRlbiBjb3JyZWN0bHkuICovCi0gICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX1RSVUUpCi0gICAgICAgICYmIChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc1N0b3BUaW1lID0KLSAgICAgICAgICAgIChNNE1QNFdfVGltZTMyKShhdVB0ci0+Q1RTICogc2NhbGVfdmlkZW8pOwotICAgIH0KLQotICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgfHwgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgLyp1cGRhdGUgZmlsZVNpemUqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IGF1UHRyLT5zaXplOwotICAgIH0KLQotICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9UUlVFKQotICAgICAgICAmJiAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkpCi0gICAgewotICAgICAgICAvKnVwZGF0ZSBmaWxlc2l6ZSB3aXRoIGVzdGltYXRlZCBhdWRpbyBkYXRhIHRoYXQgd2lsbCBiZSBhZGRlZCBsYXRlci4gICAgKi8KLSAgICAgICAgLypXYXJuaW5nOiBBc3N1bXB0aW9uIGlzIG1hZGUgdGhhdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogLSBhdWRpbyBzYW1wbGVzIGhhdmUgY29uc3RhbnQgc2l6ZSAoZS5nLiBubyBzaWQpLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogLSBtYXggYXVkaW8gc2FtcGxlIHNpemUgaGFzIGJlZW4gc2V0LCBhbmQgaXMgdGhlIGFjdHVhbCBzYW1wbGUgc2l6ZS4gKi8KLQotICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zQ2h1bmtEdXIgIT0gMCwKLSAgICAgICAgICAgIE00V0FSX01QNFdfTk9UX0VWQUxVQUJMRSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgLT0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgICAgICogc2NhbGVfdmlkZW8pICogKDAuMDUvKmFsd2F5cyA1MCBBTVIgc2FtcGxlcyBwZXIgc2Vjb25kKi8KLSAgICAgICAgICAgICooTTRPU0FfRG91YmxlKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplCi0gICAgICAgICAgICArIDE2LyphZGRpdGlvbmFsIGRhdGEgZm9yIGEgbmV3IGNodW5rKi8KLSAgICAgICAgICAgIC8gKE00T1NBX0RvdWJsZSltTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1cikpOwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gKE00T1NBX1VJbnQzMikoKCBhdVB0ci0+Q1RTICogc2NhbGVfdmlkZW8pCi0gICAgICAgICAgICAqICgwLjA1LyphbHdheXMgNTAgQU1SIHNhbXBsZXMgcGVyIHNlY29uZCovCi0gICAgICAgICAgICAqKE00T1NBX0RvdWJsZSltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZQotICAgICAgICAgICAgKyAxNi8qYWRkaXRpb25hbCBkYXRhIGZvciBhIG5ldyBjaHVuayovCi0gICAgICAgICAgICAvIChNNE9TQV9Eb3VibGUpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zQ2h1bmtEdXIpKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTFfNCgicHJvY2Vzc0FVIDogc2l6ZSAweCV4IG1vZGUgJWQgZmlsZXNpemUgJWx1IGxpbWl0ICVsdSIsCi0gICAgICAgIGF1UHRyLT5zaXplLCBhdVB0ci0+YXR0cmlidXRlLCBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19jbG9zZVdyaXRlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfRVJSIGVycjIgPSBNNE5PX0VSUk9SLCBlcnIzID0gTTROT19FUlJPUjsKLQotICAgIC8qV2FybmluZzogdGVzdCBzaG91bGQgYmUgZG9uZSBoZXJlIHRvIGVuc3VyZSBjb250ZXh0LT5wQ29udGV4dCBpcyBub3QgTTRPU0FfTlVMTCwKLSAgICAgYnV0IEMgaXMgbm90IEMrKy4uLiovCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLQotICAgIE00T1NBX1VDaGFyIGNhbWNvZGVyX21haiwgY2FtY29kZXJfbWluLCBjYW1jb2Rlcl9yZXY7IC8qY2FtY29kZXIgdmVyc2lvbiovCi0gICAgTTRPU0FfQm9vbCBiQXVkaW8gPQotICAgICAgICAoKCBtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvKQotICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICE9IDApKTsgLyooKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKSAmJgotICAgICAgICAgICAgICAgICAgICAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICE9IDApKTsqLwotICAgIE00T1NBX0Jvb2wgYlZpZGVvID0KLSAgICAgICAgKCggbU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbykKLSAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAhPSAwKSk7IC8qKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiAhPSAwKSk7Ki8KLSAgICBNNE9TQV9Cb29sIGJIMjYzID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBiSDI2NCA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYk1QNFYgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJBQUMgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJFVlJDID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKmludGVybWVkaWF0ZSB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiBBLCBCLCBOLCBBQjROOwotCi0gICAgLypUcmFrIHZhcmlhYmxlcyovCi0gICAgTTRPU0FfVUludDMyIGFfdHJha0lkID0gQXVkaW9TdHJlYW1JRDsgLyogICAgIChhdWRpbz0xKSovCi0gICAgLyogZmlyc3QgdHJhayBvZmZzZXQgaXMgMzIrbW9vdlNpemUsIHNlY29uZCBlcXVhbHMgMzIrbW9vdlNpemUrMXN0X3RyYWNrX3NpemUqLwotICAgIE00T1NBX1VJbnQzMiBhX3RyYWtPZmZzZXQgPSAzMjsKLSAgICBNNE9TQV9VSW50MzIgYV9zdHRzU2l6ZSA9IDI0OyAgICAgICAgICAvKiBBIChhdWRpbz0yNCkqLwotICAgIE00T1NBX1VJbnQzMiBhX3N0c3pTaXplID0gMjA7ICAgICAgICAgIC8qIEIgKGF1ZGlvPTIwKSovCi0gICAgTTRPU0FfVUludDMyIGFfdHJha1NpemUgPSA0MDI7ICAgICAgICAgLyogICAgIChhdWRpbz00MDIpKi8KLSAgICBNNE9TQV9VSW50MzIgYV9tZGlhU2l6ZSA9IDMwMjsgICAgICAgICAvKiAgICAgKGF1ZGlvPTMwMikqLwotICAgIE00T1NBX1VJbnQzMiBhX21pbmZTaXplID0gMjI5OyAgICAgICAgIC8qICAgICAoYXVkaW89MjI5KSovCi0gICAgTTRPU0FfVUludDMyIGFfc3RibFNpemUgPSAxNjk7ICAgICAgICAgLyogICAgIChhdWRpbz0xNjkpKi8KLSAgICBNNE9TQV9VSW50MzIgYV9zdHNkU2l6ZSA9IDY5OyAgICAgICAgICAvKiAgICAgKGF1ZGlvPTY5ICkqLwotICAgIE00T1NBX1VJbnQzMiBhX2VzZFNpemUgPSA1MzsgICAgICAgICAgIC8qICAgICAoYXVkaW89NTMgKSovCi0gICAgTTRPU0FfVUludDMyIGFfZGF0YVNpemUgPSAwOyAgICAgICAgICAgLyogdGVtcDogQXQgdGhlIGVuZCwgPSBjdXJyZW50UG9zKi8KLSAgICBNNE1QNFdfVGltZTMyIGFfdHJha0R1cmF0aW9uID0gMDsgICAgICAvKiBlcXVhbHMgbGFzdENUUyovCi0gICAgTTRNUDRXX1RpbWUzMiBhX21zVHJha0R1cmF0aW9uID0gMDsKLSAgICBNNE9TQV9VSW50MzIgYV9zdHNjU2l6ZSA9IDI4OyAgICAgICAgICAvKiAxNisxMipuYmNodW5rc2F1ZGlvKi8KLSAgICBNNE9TQV9VSW50MzIgYV9zdGNvU2l6ZSA9IDIwOyAgICAgICAgICAvKiAxNis0Km5iY2h1bmtzYXVkaW8qLwotCi0gICAgTTRPU0FfVUludDMyIHZfdHJha0lkID0gVmlkZW9TdHJlYW1JRDsgLyogKHZpZGVvPTIpKi8KLSAgICAvKiBmaXJzdCB0cmFrIG9mZnNldCBpcyAzMittb292U2l6ZSwgc2Vjb25kIGVxdWFscyAzMittb292U2l6ZSsxc3RfdHJhY2tfc2l6ZSovCi0gICAgTTRPU0FfVUludDMyIHZfdHJha09mZnNldCA9IDMyOwotICAgIE00T1NBX1VJbnQzMiB2X3N0dHNTaXplID0gMDsgICAgICAvKiBBICh2aWRlbz0xNis4SikqLwotICAgIE00T1NBX1VJbnQzMiB2X3N0c3pTaXplID0gMDsgICAgICAvKiBCICh2aWRlbz0yMCs0SykqLwotICAgIE00T1NBX1VJbnQzMiB2X3RyYWtTaXplID0gMDsgLyogKGgyNjM9QStCKzROKzQyNiksIChtcDR2PUErQitkc2krNE4rNDQ4KSAqLwotICAgIE00T1NBX1VJbnQzMiB2X21kaWFTaXplID0gMDsgLyogKGgyNjM9QStCKzROKzMyNiksIChtcDR2PUErQitkc2krNE4rMzQ4KSAqLwotICAgIE00T1NBX1VJbnQzMiB2X21pbmZTaXplID0gMDsgLyogKGgyNjM9QStCKzROKzI1MyksIChtcDR2PUErQitkc2krNE4rMjc1KSAqLwotICAgIE00T1NBX1VJbnQzMiB2X3N0YmxTaXplID0gMDsgLyogKGgyNjM9QStCKzROKzE4OSksIChtcDR2PUErQitkc2krNE4rMjExKSAqLwotICAgIE00T1NBX1VJbnQzMiB2X3N0c2RTaXplID0gMDsgICAgICAvKiAoaDI2Mz0xMTcpICAgICAgICAsIChtcDR2PTEzOStkc2kgICAgKSovCi0gICAgTTRPU0FfVUludDMyIHZfZXNkU2l6ZSA9IDA7ICAgICAgIC8qIChoMjYzPTEwMSkgICAgICAgICwgKG1wNHY9MTUzK2RzaSAgICApKi8KLSAgICBNNE9TQV9VSW50MzIgdl9kYXRhU2l6ZSA9IDA7ICAgICAgLyogdGVtcDogQXQgdGhlIGVuZCwgPSBjdXJyZW50UG9zKi8KLSAgICBNNE1QNFdfVGltZTMyIHZfdHJha0R1cmF0aW9uID0gMDsgLyogZXF1YWxzIGxhc3RDVFMqLwotICAgIE00TVA0V19UaW1lMzIgdl9tc1RyYWtEdXJhdGlvbiA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHZfc3RzY1NpemUgPSAyODsgICAgIC8qIDE2KzEyKm5iY2h1bmtzdmlkZW8qLwotICAgIE00T1NBX1VJbnQzMiB2X3N0Y29TaXplID0gMjA7ICAgICAvKiAxNis0Km5iY2h1bmtzdmlkZW8qLwotCi0gICAgLyp2aWRlbyB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiB2X3N0c3NTaXplID0gMDsgLyogNCpOKzE2ICAgICBTVFNTKi8KLQotICAgIC8qYWFjICYgbXA0diB0ZW1wIHZhcmlhYmxlKi8KLSAgICBNNE9TQV9VSW50OCBkc2kgPSAwOwotCi0gICAgLypIMjY0IHZhcmlhYmxlcyovCi0gICAgTTRPU0FfVUludDMyIHZfYXZjQ1NpemUgPSAwOyAvKiBkc2krMTUqLwotCi0gICAgLypNUDRWIHZhcmlhYmxlcyovCi0gICAgTTRPU0FfVUludDMyIHZfZXNkc1NpemUgPSAwOyAgICAgICAgLyogZHNpKzM3Ki8KLSAgICBNNE9TQV9VSW50OCB2X0VTRGVzY3JpcHRvclNpemUgPQotICAgICAgICAwOyAvKiBkc2krMjMgKHdhcm5pbmc6IGNoZWNrIGRzaTwxMDUgZm9yIGNvZGluZyBzaXplIG9uIDEgYnl0ZSkqLwotICAgIE00T1NBX1VJbnQ4IHZfRENEZXNjcmlwdG9yU2l6ZSA9IDA7IC8qIGRzaSsxNSovCi0KLSAgICAvKkFBQyB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiBhX2VzZHNTaXplID0gMDsgICAgICAgIC8qIGRzaSszNyovCi0gICAgTTRPU0FfVUludDggYV9FU0Rlc2NyaXB0b3JTaXplID0KLSAgICAgICAgMDsgLyogZHNpKzIzICh3YXJuaW5nOiBjaGVjayBkc2k8MTA1IGZvciBjb2Rpbmcgc2l6ZSBvbiAxIGJ5dGUpKi8KLSAgICBNNE9TQV9VSW50OCBhX0RDRGVzY3JpcHRvclNpemUgPSAwOyAvKiBkc2krMTUqLwotCi0gICAgLypHZW5lcmFsIHZhcmlhYmxlcyovCi0KLSAgICAvKiBhdWRpbyBjaHVuayBzaXplICsgdmlkZW8gY2h1bmsgc2l6ZSovCi0gICAgTTRPU0FfVUludDMyIG1kYXRTaXplID0gODsKLSAgICBNNE9TQV9VSW50MzIgbW9vdlNpemUgPSAxMTY7IC8qIDExNiArIDQwMihhdWRpbykgKyAgICAoQStCKzROKzQyNikoaDI2Mykgb3IgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgIChBK0IrZHNpKzROKzQ0OCkobXA0dikgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgY3JlYXRpb25UaW1lOyAvKiBDICovCi0KLSAgICAvKmZsYWcgdG8gc2V0IHVwIHRoZSBjaHVuayBpbnRlcmxlYXZlIHN0cmF0ZWd5Ki8KLSAgICBNNE9TQV9Cb29sIGJJbnRlcmxlYXZlQVYgPQotICAgICAgICAoYkF1ZGlvICYmIGJWaWRlbyAmJiAobU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyICE9IDApKTsKLQotICAgIE00T1NBX0NvbnRleHQgZmlsZVdyaXRlckNvbnRleHQgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0OwotCi0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfYXVkaW8gPSAwLjA7Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX3ZpZGVvID0gMC4wOwotICAgIE00TVA0V19UaW1lMzIgZGVsdGE7Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gbW9vdlBvcywgbWRhdFBvczsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKm1hY3JvIHN0YXRlICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9IE00TVA0V19jbG9zZWQ7Ci0KLSAgICAvKmlmIG5vIGRhdGEgISovCi0gICAgaWYgKCghYkF1ZGlvKSAmJiAoIWJWaWRlbykpCi0gICAgewotICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOyAvKndvdWxkIGJlIGJldHRlciB0byByZXR1cm4gYSB3YXJuaW5nID8qLwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0jaWZkZWYgX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAvKiBSZW1vdmUgc2FmZXR5IGZpbGUgdG8gbWFrZSByb29tIGZvciB3aGF0IG5lZWRzIHRvIGJlIHdyaXR0ZW4gb3V0IGhlcmUKLSAgICAoY2h1bmsgZmx1c2hpbmcgYW5kIG1vb3YpLiAqLwotCi0gICAgaWYgKE00T1NBX1RSVUUgPT0gbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUpCi0gICAgewotICAgICAgICBNNE9TQV9Db250ZXh0IHRlbXBDb250ZXh0OwotICAgICAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPm9wZW5Xcml0ZSgmdGVtcENvbnRleHQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwsCi0gICAgICAgICAgICBNNE9TQV9rRmlsZVdyaXRlIHwgTTRPU0Ffa0ZpbGVDcmVhdGUpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKHRlbXBDb250ZXh0KTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCA9IE00T1NBX05VTEw7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCi0jZW5kaWYgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLQotICAgIGlmIChiVmlkZW8pCi0gICAgewotICAgICAgICBpZiAoKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMCi0gICAgICAgICAgICA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMCi0gICAgICAgICAgICA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1opCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUoCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpOyAvKio8IGNsb3NlIHRoZSBzdHJlYW0gYW55d2F5ICovCi0gICAgICAgICAgICBNNE1QNFdfZnJlZUNvbnRleHQoY29udGV4dCk7IC8qKjwgRnJlZSB0aGUgY29udGV4dCBjb250ZW50ICovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKnZpZGVvIG1pY3Jvc3RhdGUqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfY2xvc2VkOwotCi0gICAgICAgIC8qY3VycmVudCBjaHVuayBpcyB0aGUgbGFzdCBvbmUgYW5kIGdpdmVzIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlkZW8gY2h1bmtzICgtMSkqLwotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2X2RhdGFTaXplICs9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0gICAgICAgIH0KLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSNpZm5kZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgICAgIC8qZmx1c2ggY2h1bmsqLwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJmbHVzaCB2aWRlbyB8IENMT1NFIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8zKCJjdXJyZW50IGNodW5rID0gJWQgIG9mZnNldCA9IDB4JXggc2l6ZSA9IDB4JTA4WCIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuaywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zKTsKLQotICAgICAgICAvKnVwZGF0ZSBjaHVuayBvZmZzZXQqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3M7Ci0KLSAgICAgICAgLyphZGQgY2h1bmsgc2l6ZSB0byBhYnNvbHV0ZUN1cnJlbnRQb3MqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyArPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAvKnVwZGF0ZSBsYXN0IGNodW5rIHNpemUsIGFuZCBhZGQgdGhpcyB2YWx1ZSB0byB2X2RhdGFTaXplKi8KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTaXplVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSAgICAgICAgdl9kYXRhU2l6ZSArPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOyAvKmFkZCBsYXN0IGNodW5rIHNpemUqLwotCi0gICAgICAgIHZfdHJha0R1cmF0aW9uID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENvbW1vbkRhdGEubGFzdENUUzsgLyogZXF1YWxzIGxhc3RDVFMqLwotCi0gICAgICAgIC8qIGJ1Z2ZpeDogaWYgYSBuZXcgY2h1bmsgd2FzIGp1c3QgY3JlYXRlZCwgY2FuY2VsIGl0IGJlZm9yZSB0byBjbG9zZSAqLwotICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rICE9IDApCi0gICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuay0tOwotICAgICAgICB9Ci0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50U3RzY10gJiAweEZGRikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYy0tOwotICAgICAgICB9Ci0KLSNlbmRpZiAvKl9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTyovCi0KLSAgICAgICAgLyogTGFzdCBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgLyogSWYgd2UgaGF2ZSB0aGUgZmlsZSBkdXJhdGlvbiB3ZSB1c2UgaXQsIGVsc2Ugd2UgZHVwbGljYXRlIHRoZSBsYXN0IEFVICovCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZUR1cmF0aW9uID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogdXNlIG1heCBmaWxlIGR1cmF0aW9uIHRvIGNhbGN1bGF0ZSBkZWx0YSBvZiBsYXN0IEFVICovCi0gICAgICAgICAgICBkZWx0YSA9IG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUzsKLSAgICAgICAgICAgIHZfdHJha0R1cmF0aW9uID0gbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlRHVyYXRpb247Ci0KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGlmIG1vcmUgdGhhbiAxIGZyYW1lLCBjcmVhdGUgYSBuZXcgc3R0cyBlbnRyeSAoZWxzZSBhbHJlYWR5IGNyZWF0ZWQpICovCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIrKzsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9MbygmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMV0sIDEpOwotICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxXSwgZGVsdGEpOwotCi0jZWxzZQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICoobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICAtIDEpXSA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICoobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICAtIDEpICsgMV0gPSBkZWx0YTsKLQotI2VuZGlmCi0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGR1cGxpY2F0ZSB0aGUgZGVsdGEgb2YgdGhlIHByZXZpb3VzIGZyYW1lICovCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBpZiBtb3JlIHRoYW4gMSBmcmFtZSwgZHVwbGljYXRlIHRoZSBzdHRzIGVudHJ5IChlbHNlIGFscmVhZHkgZXhpc3RzKSAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiArPQotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfZ2V0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMV0pOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMV0gKz0gMTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIHZfdHJha0R1cmF0aW9uICs9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgICAgICogKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpICsgMV07Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIgKigKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSldICs9IDE7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19jbG9zZVdyaXRlIDogISB2aWRlb1RyYWNrUHRyLFwKLSAgICAgICAgICAgICAgICAgICAgIGNhbm5vdCBrbm93IHRoZSBkdXJhdGlvbiBvZiB0aGUgdW5pcXVlIEFVICEiKTsKLSAgICAgICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBhbiBhdWRpbyB0cmFjaywgd2UgdXNlIGl0IGFzIGEgZmlsZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIChhbmQgc28sIGFzIEFVIGR1cmF0aW9uLi4uKSAqLwotICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19jbG9zZVdyaXRlIDogISBMZXQncyB1c2UgdGhlIGF1ZGlvIHRyYWNrIGR1cmF0aW9uICEiKTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgICAgICAgICAgICAgICAgICogKDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnRpbWVzY2FsZSkpOwotICAgICAgICAgICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEVsc2UsIHdlIHVzZSBhIE1BR0lDQUwgdmFsdWUgKDY2IG1zKSAqLwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19jbG9zZVdyaXRlIDogISBObyBhdWRpbyB0cmFjayAtPiB1c2UgbWFnaWNhbCB2YWx1ZSAoNjYpICEiKTsgLyogICAgKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdID0gNjY7Ci0gICAgICAgICAgICAgICAgICAgIHZfdHJha0R1cmF0aW9uID0gNjY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRlIHRhYmxlIHNpemVzICovCi0gICAgICAgIEEgPSB2X3N0dHNTaXplID0gMTYgKyA4ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYjsgLyogQSAodmlkZW89MTYrOEopKi8KLSAgICAgICAgQiA9IHZfc3RzelNpemUgPSAyMCArIDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVOYjsgLyogQiAodmlkZW89MjArNEspKi8KLSAgICAgICAgTiA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYjsKLSAgICAgICAgQUI0TiA9IEEgKyBCICsgNCAqIE47Ci0KLSAgICAgICAgc2NhbGVfdmlkZW8gPQotICAgICAgICAgICAgMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLSAgICAgICAgdl9tc1RyYWtEdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHZfdHJha0R1cmF0aW9uICogc2NhbGVfdmlkZW8pOwotCi0gICAgICAgIC8qQ29udmVydCBpbnRlZ2VycyBpbiB0aGUgdGFibGUgZnJvbSBMRSBpbnRvIEJFKi8KLSNpZm5kZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBNNE1QNFdfdGFibGUzMlRvQkUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iKTsKLSAgICAgICAgTTRNUDRXX3RhYmxlMzJUb0JFKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUywKLSAgICAgICAgICAgIDIgKiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIpKTsKLQotI2VuZGlmCi0KLSAgICAgICAgTTRNUDRXX3RhYmxlMzJUb0JFKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYik7Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tIMjYzKQotICAgICAgICB7Ci0gICAgICAgICAgICBiSDI2MyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB2X3RyYWtTaXplID0gQUI0TiArIDQyNjsgLyogKGgyNjM9QStCKzROKzQyNikqLwotICAgICAgICAgICAgdl9tZGlhU2l6ZSA9IEFCNE4gKyAzMjY7IC8qIChoMjYzPUErQis0TiszMjYpKi8KLSAgICAgICAgICAgIHZfbWluZlNpemUgPSBBQjROICsgMjUzOyAvKiAoaDI2Mz1BK0IrNE4rMjUzKSovCi0gICAgICAgICAgICB2X3N0YmxTaXplID0gQUI0TiArIDE4OTsgLyogKGgyNjM9QStCKzROKzE4OSkqLwotICAgICAgICAgICAgdl9zdHNkU2l6ZSA9IDExNzsgICAgICAgIC8qIChoMjYzPTExNykqLwotICAgICAgICAgICAgdl9lc2RTaXplID0gMTAxOyAgICAgICAgIC8qIChoMjYzPTEwMSkqLwotCi0gICAgICAgICAgICBtb292U2l6ZSArPSBBQjROICsgNDI2OwotCi0gICAgICAgICAgICBpZiAoKChNNE9TQV9JbnQzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUpICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qdGhlIG9wdGlvbmFsICdiaXRyJyBhdG9tIGlzIGFwcGVuZGVkIHRvIHRoZSBkc2ksc28gZmlsZXNpemUgaXMgMTYgYnl0ZXMgYmlnZ2VyKi8KLSAgICAgICAgICAgICAgICB2X3RyYWtTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIHZfbWRpYVNpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgdl9taW5mU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X3N0YmxTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIHZfc3RzZFNpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgdl9lc2RTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIG1vb3ZTaXplICs9IDE2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tIMjY0KQotICAgICAgICB7Ci0gICAgICAgICAgICBiSDI2NCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAvKiBGb3IgSDI2NCB0aGVyZSBpcyBubyBkZWZhdWx0IERTSSwgYW5kIGl0cyBwcmVzZW5jZSBpcyBtYW5kYXRvcnksCi0gICAgICAgICAgICBzbyBjaGVjayB0aGUgRFNJIGhhcyBiZWVuIHNldCovCi0gICAgICAgICAgICBpZiAoMCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUKLSAgICAgICAgICAgICAgICB8fCBNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGU6IGVycm9yLCBubyBIMjY0IERTSSBoYXMgYmVlbiBzZXQhIik7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKkgyNjQgc2l6ZXMgb2YgdGhlIGF0b20qLwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGhhcmRjb2RlZCBEU0kgdmFsdWVzIG9mIEgyNjRCbG9jazIKLSAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGJNVUxQUFNTUFMgY2FzZQotICAgICAgICAgICAgdl9hdmNDU2l6ZSA9IHNpemVvZihNNE9TQV9VSW50MzIpICsgc2l6ZW9mKEgyNjRCbG9jazIpICsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemU7Ci0KLSAgICAgICAgICAgIHZfdHJha1NpemUgPSBBQjROICsgdl9hdmNDU2l6ZSArIDQxMTsKLSAgICAgICAgICAgIHZfbWRpYVNpemUgPSBBQjROICsgdl9hdmNDU2l6ZSArIDMxMTsKLSAgICAgICAgICAgIHZfbWluZlNpemUgPSBBQjROICsgdl9hdmNDU2l6ZSArIDIzODsKLSAgICAgICAgICAgIHZfc3RibFNpemUgPSBBQjROICsgdl9hdmNDU2l6ZSArIDE3NDsKLSAgICAgICAgICAgIHZfc3RzZFNpemUgPSAgICAgICAgdl9hdmNDU2l6ZSArIDEwMjsKLSAgICAgICAgICAgIHZfZXNkU2l6ZSAgPSAgICAgICAgdl9hdmNDU2l6ZSArIDg2OwotCi0gICAgICAgICAgICBtb292U2l6ZSAgICs9IEFCNE4gKyB2X2F2Y0NTaXplICsgNDExOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa01QRUdfNCkKLSAgICAgICAgewotICAgICAgICAgICAgYk1QNFYgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgLyogRm9yIE1QRUc0IHRoZXJlIGlzIG5vIGRlZmF1bHQgRFNJLCBhbmQgaXRzIHByZXNlbmNlIGlzIG1hbmRhdG9yeSwKLSAgICAgICAgICAgIHNvIGNoZWNrIHRoZSBEU0kgaGFzIGJlZW4gc2V0Ki8KLSAgICAgICAgICAgIGlmICgwID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZQotICAgICAgICAgICAgICAgIHx8IE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1QNFdfY2xvc2VXcml0ZTogZXJyb3IsIG5vIE1QRUc0IERTSSBoYXMgYmVlbiBzZXQhIik7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKk1QNFYgdmFyaWFibGVzKi8KLSAgICAgICAgICAgIGRzaSA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZTsKLSAgICAgICAgICAgIHZfZXNkc1NpemUgPSAzNyArIGRzaTsgICAgICAgICAvKiBkc2krMzcqLwotICAgICAgICAgICAgdl9FU0Rlc2NyaXB0b3JTaXplID0KLSAgICAgICAgICAgICAgICAyMwotICAgICAgICAgICAgICAgICsgZHNpOyAvKiBkc2krMjMgKHdhcm5pbmc6IGNoZWNrIGRzaTwxMDUgZm9yIGNvZGluZyBzaXplIG9uIDEgYnl0ZSkqLwotICAgICAgICAgICAgdl9EQ0Rlc2NyaXB0b3JTaXplID0gMTUgKyBkc2k7IC8qIGRzaSsxNSovCi0KLSAgICAgICAgICAgIHZfdHJha1NpemUgPSBBQjROICsgZHNpICsgNDQ4OyAvKiAobXA0dj1BK0IrZHNpKzROKzQ0OCkgICAgKi8KLSAgICAgICAgICAgIHZfbWRpYVNpemUgPSBBQjROICsgZHNpICsgMzQ4OyAvKiAobXA0dj1BK0IrZHNpKzROKzM0OCkgICAgKi8KLSAgICAgICAgICAgIHZfbWluZlNpemUgPSBBQjROICsgZHNpICsgMjc1OyAvKiAobXA0dj1BK0IrZHNpKzROKzI3NSkgICAgKi8KLSAgICAgICAgICAgIHZfc3RibFNpemUgPSBBQjROICsgZHNpICsgMjExOyAvKiAobXA0dj1BK0IrZHNpKzROKzIxMSkgICAgKi8KLSAgICAgICAgICAgIHZfc3RzZFNpemUgPSBkc2kgKyAxMzk7ICAgICAgICAvKiAobXA0dj0xMzkrZHNpKSovCi0gICAgICAgICAgICB2X2VzZFNpemUgPSBkc2kgKyAxMjM7ICAgICAgICAgLyogKG1wNHY9MTIzK2RzaSkqLwotCi0gICAgICAgICAgICBtb292U2l6ZSArPSBBQjROICsgZHNpICsgNDQ4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyp2aWRlbyB2YXJpYWJsZXMqLwotICAgICAgICB2X3N0c3NTaXplID0gMTYgKyA0ICogTjsgLyogNCpOKzE2ICAgICBTVFNTKi8KLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgICAgIC8qIHN0c2MgdXBkYXRlICovCi0KLSAgICAgICAgdl9zdHNjU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIHZfc3RibFNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICB2X21pbmZTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgdl9tZGlhU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIHZfdHJha1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBtb292U2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0KLSAgICAgICAgLyogc3RjbyB1cGRhdGUgKi8KLSAgICAgICAgdl9zdGNvU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfc3RibFNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X21pbmZTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9tZGlhU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfdHJha1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBtb292U2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0KLSNlbHNlCi0gICAgICAgIC8qc3RzYy9zdGNvIHVwZGF0ZSovCi0KLSAgICAgICAgdl9zdHNjU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3N0Y29TaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9zdGJsU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X21pbmZTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfbWRpYVNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl90cmFrU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBtb292U2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotCi0jZW5kaWYKLQotICAgICAgICAvKnVwZGF0ZSBsYXN0IGNodW5rIHRpbWUqLwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICB2X21zVHJha0R1cmF0aW9uOwotICAgIH0KLQotICAgIGlmIChiQXVkaW8pCi0gICAgewotICAgICAgICBpZiAoKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMCi0gICAgICAgICAgICA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMCi0gICAgICAgICAgICA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUoCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpOyAvKio8IGNsb3NlIHRoZSBzdHJlYW0gYW55d2F5ICovCi0gICAgICAgICAgICBNNE1QNFdfZnJlZUNvbnRleHQoY29udGV4dCk7IC8qKjwgRnJlZSB0aGUgY29udGV4dCBjb250ZW50ICovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKmF1ZGlvIG1pY3Jvc3RhdGUqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfY2xvc2VkOwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlID09IE00U1lTX2tBQUMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJBQUMgPQotICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qZWxzZSwgYXVkaW8gaXMgaW1wbGljaXRlbHkgYW1yIGluIHRoZSBmb2xsb3dpbmcqLwotICAgICAgICAgICAgZHNpID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplOyAvKnZhcmlhYmxlIHNpemUqLwotCi0gICAgICAgICAgICBhX2VzZHNTaXplID0gMzcgKyBkc2k7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRzaSszNyovCi0gICAgICAgICAgICBhX0VTRGVzY3JpcHRvclNpemUgPQotICAgICAgICAgICAgICAgIDIzCi0gICAgICAgICAgICAgICAgKyBkc2k7IC8qIGRzaSsyMyAod2FybmluZzogY2hlY2sgZHNpPDEwNSBmb3IgY29kaW5nIHNpemUgb24gMSBieXRlKSovCi0gICAgICAgICAgICBhX0RDRGVzY3JpcHRvclNpemUgPSAxNSArIGRzaTsgICAgICAgICAgICAgICAgIC8qIGRzaSsxNSovCi0KLSAgICAgICAgICAgIGFfZXNkU2l6ZSA9IGRzaSArIDczOyAvKm92ZXJ3cml0ZSBhX2VzZFNpemUgd2l0aCBhYWMgdmFsdWUqLwotICAgICAgICAgICAgLyphZGQgZGlmLiBiZXR3ZWVuIGFtciAmIGFhYyBzaXplczogKC0gNTMgKyBkc2kgKyAzNykqLwotICAgICAgICAgICAgYV9zdHNkU2l6ZSArPSBkc2kgKyAyMDsKLSAgICAgICAgICAgIGFfc3RibFNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgICAgICBhX21pbmZTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgYV9tZGlhU2l6ZSArPSBkc2kgKyAyMDsKLSAgICAgICAgICAgIGFfdHJha1NpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgICAgICBtb292U2l6ZSArPSBkc2kgKyAyMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rRVZSQykKLSAgICAgICAgewotICAgICAgICAgICAgYkVWUkMgPQotICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qZWxzZSwgYXVkaW8gaXMgaW1wbGljaXRlbHkgYW1yIGluIHRoZSBmb2xsb3dpbmcqLwotCi0gICAgICAgICAgICAvKiBldnJjIGRzaSBpcyBvbmx5IDYgYnl0ZXMgd2hpbGUgYW1yIGRzaSBpcyA5IGJ5dGVzLGFsbCBvdGhlciBibG9ja3MgYXJlIHVuY2hhbmdlZCAqLwotICAgICAgICAgICAgYV9lc2RTaXplIC09IDM7Ci0gICAgICAgICAgICBhX3N0c2RTaXplIC09IDM7Ci0gICAgICAgICAgICBhX3N0YmxTaXplIC09IDM7Ci0gICAgICAgICAgICBhX21pbmZTaXplIC09IDM7Ci0gICAgICAgICAgICBhX21kaWFTaXplIC09IDM7Ci0gICAgICAgICAgICBhX3RyYWtTaXplIC09IDM7Ci0gICAgICAgICAgICBtb292U2l6ZSAtPSAzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUoCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KTsgLyoqPCBjbG9zZSB0aGUgc3RyZWFtIGFueXdheSAqLwotICAgICAgICAgICAgICAgIE00TVA0V19mcmVlQ29udGV4dChjb250ZXh0KTsgLyoqPCBGcmVlIHRoZSBjb250ZXh0IGNvbnRlbnQgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKkNvbnZlcnQgaW50ZWdlcnMgaW4gdGhlIHRhYmxlIGZyb20gTEUgaW50byBCRSovCi0gICAgICAgICAgICBNNE1QNFdfdGFibGUzMlRvQkUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYik7Ci0gICAgICAgICAgICBhX3N0c3pTaXplICs9Ci0gICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIGFfc3RibFNpemUgKz0KLSAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgYV9taW5mU2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBhX21kaWFTaXplICs9Ci0gICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIGFfdHJha1NpemUgKz0KLSAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgbW9vdlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgfQotCi0gICAgICAgIG1vb3ZTaXplICs9IDQwMjsKLQotICAgICAgICAvKmN1cnJlbnQgY2h1bmsgaXMgdGhlIGxhc3Qgb25lIGFuZCBnaXZlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGF1ZGlvIGNodW5rcyAoLTEpKi8KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgYV9kYXRhU2l6ZSArPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICB9Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgICAgIC8qZmx1c2ggY2h1bmsqLwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImZsdXNoIGF1ZGlvIHwgQ0xPU0UiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoImN1cnJlbnQgY2h1bmsgPSAlZCAgb2Zmc2V0ID0gMHgleCIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuaywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zKTsKLQotICAgICAgICAvKnVwZGF0ZSBjaHVuayBvZmZzZXQqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3M7Ci0KLSAgICAgICAgLyphZGQgY2h1bmsgc2l6ZSB0byBhYnNvbHV0ZUN1cnJlbnRQb3MqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyArPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgIC8qdXBkYXRlIGxhc3QgY2h1bmsgc2l6ZSwgYW5kIGFkZCB0aGlzIHZhbHVlIHRvIGFfZGF0YVNpemUqLwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NpemVUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotICAgICAgICBhX2RhdGFTaXplICs9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3M7IC8qYWRkIGxhc3QgY2h1bmsgc2l6ZSovCi0KLSAgICAgICAgLyogYnVnZml4OiBpZiBhIG5ldyBjaHVuayB3YXMganVzdCBjcmVhdGVkLCBjYW5jZWwgaXQgYmVmb3JlIHRvIGNsb3NlICovCi0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgIT0gMCkKLSAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rLS07Ci0gICAgICAgIH0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRTdHNjXSAmIDB4RkZGKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjLS07Ci0gICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19VTkJVRkZFUkVEX1ZJREVPKi8KLQotICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDb21tb25EYXRhLmxhc3RDVFM7IC8qIGVxdWFscyBsYXN0Q1RTKi8KLSAgICAgICAgLyogYWRkIGxhc3Qgc2FtcGxlIGR1ciAqLwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAhPSAxKQotICAgICAgICB7Ci0jaWZkZWYgRFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVQotICAgICAgICAgICAgLyppbmNyZWFzZSBvZiAxIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgQVVzIHdpdGggc2FtZSBkdXJhdGlvbiovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgIC0gMSkgLSAyXSArPSAxOwotCi0jZW5kaWYgLypEVVBMSUNBVEVfU1RUU19JTl9MQVNUX0FVKi8KLQotICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gKz0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpIC0gMV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoMCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgICAgICA9PSBNNFNZU19rQU1SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgxMjIwMCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAzMgotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgxMDIwMCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAyNwotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg3OTUwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDIxCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDc0MDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMjAKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNjcwMCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAxOAotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg1OTAwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDE2Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDUxNTAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMTQKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNDc1MCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAxMwotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNjYWxlX2F1ZGlvID0KLSAgICAgICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0gICAgICAgIGFfbXNUcmFrRHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShhX3RyYWtEdXJhdGlvbiAqIHNjYWxlX2F1ZGlvKTsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgICAgIC8qIHN0c2MgdXBkYXRlICovCi0KLSAgICAgICAgYV9zdHNjU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIGFfc3RibFNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBhX21pbmZTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgYV9tZGlhU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIGFfdHJha1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBtb292U2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0KLSAgICAgICAgLyogc3RzbyB1cGRhdGUgKi8KLSAgICAgICAgYV9zdGNvU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfc3RibFNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX21pbmZTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9tZGlhU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfdHJha1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBtb292U2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0KLSNlbHNlCi0gICAgICAgIC8qc3RzYy9zdGNvIHVwZGF0ZSovCi0KLSAgICAgICAgYV9zdHNjU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3N0Y29TaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9zdGJsU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX21pbmZTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfbWRpYVNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV90cmFrU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBtb292U2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotCi0jZW5kaWYKLQotICAgICAgICAvKiBjb21wdXRlIHRoZSBuZXcgc2l6ZSBvZiBzdHRzKi8KLQotICAgICAgICBhX3N0dHNTaXplID0gMTYgKyA4ICogKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKTsKLQotICAgICAgICBtb292U2l6ZSArPSBhX3N0dHNTaXplIC0gMjQ7Ci0gICAgICAgIGFfbWRpYVNpemUgKz0gYV9zdHRzU2l6ZSAtIDI0OwotICAgICAgICBhX21pbmZTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLSAgICAgICAgYV9zdGJsU2l6ZSArPSBhX3N0dHNTaXplIC0gMjQ7Ci0gICAgICAgIGFfdHJha1NpemUgKz0gYV9zdHRzU2l6ZSAtIDI0OwotCi0gICAgICAgIC8qdXBkYXRlIGxhc3QgY2h1bmsgdGltZSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICBhX21zVHJha0R1cmF0aW9uOwotICAgIH0KLQotICAgIC8qIGNoYW5naW5nIHRoZSB3YXkgdGhlIG1kYXQgc2l6ZSBpcyBjb21wdXRlZC4KLSAgICBUaGUgcmVhbCBwdXJwb3NlIG9mIHRoZSBtZGF0IHNpemUgaXMgdG8ga25vdyB0aGUgYW1vdW50IHRvIHNraXAgdG8gZ2V0IHRvIHRoZSBuZXh0Ci0gICAgYXRvbSwgd2hpY2ggaXMgdGhlIG1vb3Y7IHRoZSBzaXplIG9mIG1lZGlhIGluIHRoZSBtZGF0IGlzIGFsbW9zdCBzZWNvbmRhcnkuIFRoZXJlZm9yZSwKLSAgICBpdCBpcyBvZiB1dG1vc3QgaW1wb3J0YW5jZSB0aGF0IHRoZSBtZGF0IHNpemUgInBvaW50cyIgdG8gd2hlcmUgdGhlIG1vb3YgYWN0dWFsbHkKLSAgICBiZWdpbnMuIE5vdywgdGhlIG1vb3YgYmVnaW5zIHJpZ2h0IGFmdGVyIHRoZSBsYXN0IGRhdGEgd2Ugd3JvdGUsIHNvIGhvdyBjb3VsZCB0aGUgc3VtCi0gICAgb2YgYWxsIGNodW5rIHNpemVzIGJlIGRpZmZlcmVudCBmcm9tIHRoZSB0b3RhbCBzaXplIG9mIHdoYXQgaGFzIGJlZW4gd3JpdHRlbj8gV2VsbCwgaXQKLSAgICBjYW4gaGFwcGVuIHdoZW4gdGhlIHdyaXRpbmcgd2FzIHVuZXhwZWN0ZWRseSBzdG9wcGVkIChiZWNhdXNlIG9mIGxhY2sgb2YgZGlzayBzcGFjZSwKLSAgICBmb3IgaW5zdGFuY2UpLCBpbiB0aGlzIGNhc2UgYSBjaHVuayBtYXkgYmUgcGFydGlhbGx5IHdyaXR0ZW4gKHRoZSBwYXJ0aWFsIHdyaXRlIGlzIG5vdAotICAgIG5lY2Vzc2FyaWx5IGVyYXNlZCkgYnV0IGl0IG1heSBub3QgYmUgcmVmbGVjdGVkIGluIHRoZSBjaHVuayBzaXplIGxpc3QgKHdoaWNoIG1heQotICAgIGJlbGlldmUgaXQgaGFzbid0IGJlZW4gd3JpdHRlbiBvciBvbiB0aGUgY29udHJhcnkgdGhhdCBpdCBoYXMgYmVlbiBmdWxseSB3cml0dGVuKS4gSW4KLSAgICB0aGUgY2FzZSBvZiBzdWNoIGEgbWlzbWF0Y2gsIHRoZXJlIGlzIGVpdGhlciB1bnVzZWQgZGF0YSBpbiB0aGUgbWRhdCAobm90IHZlcnkgZ29vZCwKLSAgICBidXQgdG9sZXJhYmxlKSBvciB3aGVuIHJlYWRpbmcgdGhlIGxhc3QgY2h1bmsgaXQgd2lsbCByZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1vb3YKLSAgICBhcyBwYXJ0IG9mIHRoZSBjaHVuayAod2hpY2ggbWVhbnMgdGhlIGxhc3QgY2h1bmsgd29uJ3QgYmUgY29ycmVjdGx5IGRlY29kZWQpLCBib3RoIG9mCi0gICAgd2hpY2ggYXJlIHN0aWxsIGJldHRlciB0aGFuIGxvc2luZyB0aGUgd2hvbGUgcmVjb3JkaW5nLiBJbiB0aGUgbG9uZyBydW4gaXQnbGwgcHJvYmFibHkKLSAgICBiZSBhdHRlbXB0ZWQgdG8gYWx3YXlzIGNsZWFuIHVwIGJhY2sgdG8gYSBjb25zaXN0ZW50IHN0YXRlLCBidXQgYXQgYW55IHJhdGUgaXQgaXMKLSAgICBhbHdheXMgc2FmZXIgdG8gaGF2ZSB0aGUgbWRhdCBzaXplIGJlIGNvbXB1dGVkIHVzaW5nIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbW9vdgotICAgIGFjdHVhbGx5IGJlZ2lucywgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIHNpemUgaXQgaXMgdGhvdWdodCB0aGUgbWRhdCBoYXMuCi0KLSAgICBUaGVyZWZvcmUsIEkgd2lsbCByZWNvcmQgd2hlcmUgd2UgYXJlIGp1c3QgYmVmb3JlIHdyaXRpbmcgdGhlIG1vb3YsIHRvIHNlcnZlIHdoZW4KLSAgICB1cGRhdGluZyB0aGUgbWRhdCBzaXplLiAqLwotCi0gICAgLyogbWRhdFNpemUgKz0gYV9kYXRhU2l6ZSArIHZfZGF0YVNpemU7ICovLypUT0RPIGFsbG93IGZvciBtdWx0aXBsZSBjaHVua3MqLwotCi0gICAgLyogRW5kIG9mIFBpZXJyZSBMZWJlYXVwaW4gMTkvMTIvMjAwNzogY2hhbmdpbmcgdGhlIHdheSB0aGUgbWRhdCBzaXplIGlzIGNvbXB1dGVkLiAqLwotCi0gICAgLyogZmlyc3QgdHJhayBvZmZzZXQgaXMgMzIrbW9vdlNpemUsIHNlY29uZCBlcXVhbHMgMzIrbW9vdlNpemUrMXN0X3RyYWNrX3NpemUqLwotICAgIGFfdHJha09mZnNldCArPSBtb292U2l6ZTsKLSAgICB2X3RyYWtPZmZzZXQgKz0gbW9vdlNpemUvKisgYV9kYXRhU2l6ZSovOwotCi0gICAgaWYgKGJJbnRlcmxlYXZlQVYgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgIHZfdHJha09mZnNldCArPSBhX2RhdGFTaXplOwotCi0gICAgLypzeXN0ZW0gdGltZSBzaW5jZSAxOTcwICovCi0jaWZuZGVmIF9NNE1QNFdfRE9OVF9VU0VfVElNRV9ICi0KLSAgICB0aW1lKCh0aW1lX3QgKikmY3JlYXRpb25UaW1lKTsKLSAgICAvKmNvbnZlcnQgaW50byB0aW1lIHNpbmNlIDEvMS8xOTA0IDAwaDAwIChub3JtYXRpdmUpKi8KLSAgICBjcmVhdGlvblRpbWUgKz0gMjA4Mjg0MTc2MTsgLypuYiBvZiBzZWMgYmV0d2VlbiAxOTA0IGFuZCAxOTcwKi8KLQotI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19ET05UX1VTRV9USU1FX0gqLwotCi0gICAgY3JlYXRpb25UaW1lID0KLSAgICAgICAgMHhCQkQwOTEwMDsgLyogPSA3LzExLzIwMDMgMDBoMDAgOyBpbiBoZXhhIGJlY2F1c2Ugb2YgY29kZSBzY3JhbWJsZXIgbGltaXRhdGlvbiB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2UgaW50ZWdlcnMgKi8KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19ET05UX1VTRV9USU1FX0gqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5kdXJhdGlvbiA9Ci0gICAgICAgIG1heChhX21zVHJha0R1cmF0aW9uLCB2X21zVHJha0R1cmF0aW9uKTsgLyptYXggYXVkaW8vdmlkZW8qLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLypvcGVuIGZpbGUgaW4gd3JpdGUgYmluYXJ5IG1vZGUqLwotCi0gICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5vcGVuV3JpdGUoJmZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnVybCwgMHgyMik7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotCi0gICAgLypmdHlwIGF0b20qLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmZ0eXAubWFqb3JfYnJhbmQgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgICAgIC8qIFB1dCBjdXN0b21pemVkIGZ0eXAgYm94ICovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigxNgotICAgICAgICAgICAgKyAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kcyAqIDQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoTTRNUEFDX0ZUWVBfVEFHLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1ham9yX2JyYW5kLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1pbm9yX3ZlcnNpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5mdHlwLmNvbXBhdGlibGVfYnJhbmRzW2ldLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUHV0IGRlZmF1bHQgZnR5cCBib3ggKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhEZWZhdWx0X2Z0eXAsIHNpemVvZihEZWZhdWx0X2Z0eXApLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkpOwotICAgIH0KLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAvKiBzZWVrIGlzIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLSAgICAvKiAuLi4gb3IgcmF0aGVyLCBzZWVrIHVzZWQgdG8gYmUgdXNlZCBmb3IgdGhhdCwgYnV0IGl0IGhhcyBiZWVuIGZvdW5kIHRoaXMgZnVuY3Rpb25hbGl0eQotICAgIGlzIG5vdCByZWxpYWJseSwgb3Igc29tZXRpbWVzIG5vdCBhdCBhbGwsIGltcGxlbWVudGVkIGluIHRoZSB2YXJpb3VzIE9TQUxzLCBzbyB3ZSBub3cgYXZvaWQKLSAgICB1c2luZyBpdC4gKi8KLSAgICAvKiBOb3RpY2UgdGhpcyBuZXcgbWV0aG9kIGFzc3VtZXMgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgdGhpcyB3aWxsIGJyZWFrIGlmIGV2ZXIgd2UKLSAgICBhcmUgb3ZlcndyaXRpbmcgYSBsYXJnZXIgZmlsZS4gKi8KLQotICAgIENMRUFOVVBvbkVSUihtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmdldE9wdGlvbigKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZUdldEZpbGVTaXplLCAoTTRPU0FfRGF0YU9wdGlvbiAqKSAmbW9vdlBvcykpOwotICAgIC8qIG1vb3ZQb3Mgd2lsbCBiZSB1c2VkIGFmdGVyIHdyaXRpbmcgdGhlIG1vb3YuICovCi0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobW9vdlNpemUsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMywgc2l6ZW9mKENvbW1vbkJsb2NrMyksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s0LCBzaXplb2YoQ29tbW9uQmxvY2s0KSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmR1cmF0aW9uLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazUsIHNpemVvZihDb21tb25CbG9jazUpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICBpZiAoYkF1ZGlvKQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfdHJha1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s2LCBzaXplb2YoQ29tbW9uQmxvY2s2KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfdHJha0lkLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNywgc2l6ZW9mKENvbW1vbkJsb2NrNyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX21zVHJha0R1cmF0aW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrN2Jpcywgc2l6ZW9mKENvbW1vbkJsb2NrN2JpcyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQU1SQmxvY2sxLCBzaXplb2YoQU1SQmxvY2sxKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX21kaWFTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrOCwgc2l6ZW9mKENvbW1vbkJsb2NrOCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3RyYWtEdXJhdGlvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazksIHNpemVvZihDb21tb25CbG9jazkpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUkJsb2NrMV8xLCBzaXplb2YoQU1SQmxvY2sxXzEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfbWluZlNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMCwgc2l6ZW9mKENvbW1vbkJsb2NrMTApLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdGJsU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazExLCBzaXplb2YoQ29tbW9uQmxvY2sxMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3N0dHNTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTIsIHNpemVvZihDb21tb25CbG9jazEyKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIC8qaW52ZXJ0IHRoZSB0YWJsZSBkYXRhIHRvIGJpZ2VuZGlhbiovCi0gICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMsCi0gICAgICAgICAgICAyICogKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAtIDEpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jaygoY29uc3QgTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTLAotICAgICAgICAgICAgKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpCi0gICAgICAgICAgICAqIDgsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotCi0gICAgICAgIC8qIHN0c2QgKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3RzZFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soU2FtcGxlRGVzY3JpcHRpb25IZWFkZXIsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25IZWFkZXIpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9lc2RTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIC8qIHNhbXBsZSBkZXNjIGVudHJ5IGluc2lkZSBzdHNkICovCi0gICAgICAgIGlmIChiQUFDKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFBQ0Jsb2NrMSwgc2l6ZW9mKEFBQ0Jsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChiRVZSQykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhFVlJDOEJsb2NrMSwgc2l6ZW9mKEVWUkM4QmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypldnJjKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8qQU1SOCovCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQU1SOEJsb2NrMSwgc2l6ZW9mKEFNUjhCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFtcjgqLwotICAgICAgICB9Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soU2FtcGxlRGVzY3JpcHRpb25FbnRyeVN0YXJ0LAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uRW50cnlTdGFydCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQXVkaW9TYW1wbGVEZXNjRW50cnlCb2lsZXJwbGF0ZSwKLSAgICAgICAgICAgIHNpemVvZihBdWRpb1NhbXBsZURlc2NFbnRyeUJvaWxlcnBsYXRlKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGUKLSAgICAgICAgICAgIDw8IDE2LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIC8qIERTSSBpbnNpZGUgc2FtcGxlIGRlc2MgZW50cnkgKi8KLSAgICAgICAgaWYgKGJBQUMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX2VzZHNTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazApLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKGFfRVNEZXNjcmlwdG9yU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2sxLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2sxKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZShhX0RDRGVzY3JpcHRvclNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQUFDQmxvY2syLCBzaXplb2YoQUFDQmxvY2syKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTI0KG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSAqIDUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1heEJpdHJhdGUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMiwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMiksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2szLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2szKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChiRVZSQykKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDggbG9jYWxEc2lbNl07Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgbG9jYWxJOwotCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEVWUkNCbG9jazNfMSwgc2l6ZW9mKEVWUkNCbG9jazNfMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotCi0gICAgICAgICAgICAvKiBjb3B5IHRoZSBkZWZhdWx0IGJsb2NrIGluIGEgbG9jYWwgdmFyaWFibGUqLwotICAgICAgICAgICAgZm9yICggbG9jYWxJID0gMDsgbG9jYWxJIDwgNjsgbG9jYWxJKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvY2FsRHNpW2xvY2FsSV0gPSBFVlJDQmxvY2szXzJbbG9jYWxJXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGNvbXB1dGVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlIHBlciBhdSAqLwotICAgICAgICAgICAgLyogYW5kIHN0b3JlcyBpdCBpbiB0aGUgRFNJKi8KLSAgICAgICAgICAgIC8qIGFzc3VtZXMgYSBjaGFyIGlzIGVub3VnaCB0byBzdG9yZSB0aGUgZGF0YSovCi0gICAgICAgICAgICBsb2NhbERzaVs1XSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgLyAxNjApLypFVlJDIDEgZnJhbWUgZHVyYXRpb24qLzsKLQotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY29weSB2ZW5kb3IgbmFtZSAqLwotICAgICAgICAgICAgICAgIGZvciAoIGxvY2FsSSA9IDA7IGxvY2FsSSA8IDQ7IGxvY2FsSSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsRHNpW2xvY2FsSV0gPSAoTTRPU0FfVUludDgpKAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0lbbG9jYWxJXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhsb2NhbERzaSwgNiwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKkFNUjgqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50OCBsb2NhbERzaVs5XTsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2NhbEk7Ci0KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQU1SRFNJSGVhZGVyLCBzaXplb2YoQU1SRFNJSGVhZGVyKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgICAgIC8qIGNvcHkgdGhlIGRlZmF1bHQgYmxvY2sgaW4gYSBsb2NhbCB2YXJpYWJsZSovCi0gICAgICAgICAgICBmb3IgKCBsb2NhbEkgPSAwOyBsb2NhbEkgPCA5OyBsb2NhbEkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9jYWxEc2lbbG9jYWxJXSA9IEFNUkRlZmF1bHREU0lbbG9jYWxJXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGNvbXB1dGVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlIHBlciBhdSAqLwotICAgICAgICAgICAgLyogYW5kIHN0b3JlcyBpdCBpbiB0aGUgRFNJKi8KLSAgICAgICAgICAgIC8qIGFzc3VtZXMgYSBjaGFyIGlzIGVub3VnaCB0byBzdG9yZSB0aGUgZGF0YSovCi0gICAgICAgICAgICAvKiBBTEVSVCEgVGhlIHBvdGVudGlhbCBvZiB0aGUgZm9sbG93aW5nIGxpbmUgb2YgY29kZSB0byBleHBsb2RlIGluIG91ciBmYWNlCi0gICAgICAgICAgICBpcyBlbm9ybW91cyB3aGVuIGFueXRoaW5nIChzYW1wbGUgcmF0ZSBvciB3aGF0ZXZlcikgd2lsbCBjaGFuZ2UuIFRoaXMKLSAgICAgICAgICAgIGNhbGN1bGF0aW9uIHdvdWxkIGJlIE1VQ0ggYmV0dGVyIGhhbmRsZWQgYnkgdGhlIFZFUyBvciB3aGF0ZXZlciBkZWFscyB3aXRoCi0gICAgICAgICAgICB0aGUgZW5jb2RlciBtb3JlIGRpcmVjdGx5LiAqLwotICAgICAgICAgICAgbG9jYWxEc2lbOF0gPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbgotICAgICAgICAgICAgICAgIC8gMTYwKS8qQU1SIE5CIDEgZnJhbWUgZHVyYXRpb24qLzsKLQotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY29weSB2ZW5kb3IgbmFtZSAqLwotICAgICAgICAgICAgICAgIGZvciAoIGxvY2FsSSA9IDA7IGxvY2FsSSA8IDQ7IGxvY2FsSSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsRHNpW2xvY2FsSV0gPSAoTTRPU0FfVUludDgpKAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0lbbG9jYWxJXSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogY29weSB0aGUgTW9kZSBTZXQgKi8KLSAgICAgICAgICAgICAgICBmb3IgKCBsb2NhbEkgPSA1OyBsb2NhbEkgPCA3OyBsb2NhbEkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gKE00T1NBX1VJbnQ4KSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJW2xvY2FsSV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobG9jYWxEc2ksIDksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICB9Ci0KLSAgICAgICAgLyplbmQgdHJhayovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3N0c3pTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTUsIHNpemVvZihDb21tb25CbG9jazE1KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKjAgdmFsdWUgZm9yIHNhbXBsZXNpemUgbWVhbnMgbm90IGNvbnN0YW50IEFVIHNpemUqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jaygoY29uc3QgTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICAgICAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKiA0LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3N0c2NTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTYsIHNpemVvZihDb21tb25CbG9jazE2KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICAoIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlW2ldCi0gICAgICAgICAgICA+PiAxMikgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbaV0gJiAweEZGRiksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rCi0gICAgICAgICAgICArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGkgKyAxLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdGNvU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE3LCBzaXplb2YoQ29tbW9uQmxvY2sxNyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfdHJha09mZnNldCwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBhX3RyYWtPZmZzZXQgKz0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXTsKLQotICAgICAgICAgICAgaWYgKCggYkludGVybGVhdmVBViA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA+PSBpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhX3RyYWtPZmZzZXQgKz0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlW2ldLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQU1SQmxvY2s0LCBzaXplb2YoQU1SQmxvY2s0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0gICAgfQotCi0gICAgaWYgKGJWaWRlbykKLSAgICB7Ci0gICAgICAgIC8qdHJhayovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3RyYWtTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNiwgc2l6ZW9mKENvbW1vbkJsb2NrNiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3RyYWtJZCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazcsIHNpemVvZihDb21tb25CbG9jazcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9tc1RyYWtEdXJhdGlvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazdiaXMsIHNpemVvZihDb21tb25CbG9jazdiaXMpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIC8qIEluIHRoZSB0cmFjayBoZWFkZXIgd2lkdGggYW5kIGhlaWdodCBhcmUgMTYuMTYgZml4ZWQgcG9pbnQgdmFsdWVzLAotICAgICAgICBzbyBzaGlmdCBsZWZ0IHRoZSByZWd1bGFyIGludGVnZXIgdmFsdWUgYnkgMTYuICovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPndpZHRoIDw8IDE2LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0Ci0gICAgICAgICAgICA8PCAxNiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfbWRpYVNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s4LCBzaXplb2YoQ29tbW9uQmxvY2s4KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfdHJha0R1cmF0aW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrOSwgc2l6ZW9mKENvbW1vbkJsb2NrOSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soVmlkZW9CbG9jazFfMSwgc2l6ZW9mKFZpZGVvQmxvY2sxXzEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfbWluZlNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMCwgc2l6ZW9mKENvbW1vbkJsb2NrMTApLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdGJsU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazExLCBzaXplb2YoQ29tbW9uQmxvY2sxMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0dHNTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTIsIHNpemVvZihDb21tb25CbG9jazEyKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBmb3IgKCBpID0gMDsKLSAgICAgICAgICAgIGkgPCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYjsKLSAgICAgICAgICAgIGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihNNE1QNFdfZ2V0MzJfTG8oCi0gICAgICAgICAgICAgICAgJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1tpXSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKE00TVA0V19nZXQzMl9IaSgKLSAgICAgICAgICAgICAgICAmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTW2ldKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMsCi0gICAgICAgICAgICAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKSAqIDgsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotCi0jZW5kaWYKLQotICAgICAgICAvKiBzdHNkICovCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3RzZFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soU2FtcGxlRGVzY3JpcHRpb25IZWFkZXIsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25IZWFkZXIpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9lc2RTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIC8qIHNhbXBsZSBkZXNjIGVudHJ5IGluc2lkZSBzdHNkICovCi0gICAgICAgIGlmIChiTVA0VikKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNcDR2QmxvY2sxLCBzaXplb2YoTXA0dkJsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoYkgyNjMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrMSwgc2l6ZW9mKEgyNjNCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJIMjY0KQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjRCbG9jazEsIHNpemVvZihIMjY0QmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjY0Ki8KLSAgICAgICAgfQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uRW50cnlTdGFydCwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMSwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTE2KG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+d2lkdGgsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMTYobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5oZWlnaHQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFZpZGVvUmVzb2x1dGlvbnMsIHNpemVvZihWaWRlb1Jlc29sdXRpb25zKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTIsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUyKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0KLSAgICAgICAgLyogRFNJIGluc2lkZSBzYW1wbGUgZGVzYyBlbnRyeSAqLwotICAgICAgICBpZiAoYkgyNjMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoZSBoMjYzIGRzaSBnaXZlbiB0aHJvdWdoIHRoZSBhcGkgbXVzdCBiZSA3IGJ5dGVzLCB0aGF0IGlzLCBpdCBzaGFsbCBub3QgaW5jbHVkZQotICAgICAgICAgICAgIHRoZSBvcHRpb25hbCBiaXRyYXRlIGJveC4gSG93ZXZlciwgaWYgdGhlIGJpdHJhdGUgaW5mb3JtYXRpb24gaXMgc2V0IGluIHRoZSBzdHJlYW0KLSAgICAgICAgICAgICBoYW5kbGVyLCBhIGJpdHJhdGUgYm94IGlzIGFwcGVuZGVkIGhlcmUgdG8gdGhlIGRzaSAqLwotICAgICAgICAgICAgaWYgKCgoTTRPU0FfSW50MzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlKSAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazJfYml0ciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEgyNjNCbG9jazJfYml0ciksCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyogZDI2MyBib3ggd2l0aCBiaXRyIGF0b20gKi8KLQotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2szLCBzaXplb2YoSDI2M0Jsb2NrMyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrNCwgc2l6ZW9mKEgyNjNCbG9jazQpLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2MyovCi0gICAgICAgICAgICAgICAgLyogUGllcnJlIExlYmVhdXBpbiAyMDA4LzA0LzI5OiB0aGUgdHdvIGZvbGxvd2luZyBsaW5lcyB1c2VkIHRvIGJlIHN3YXBwZWQ7Ci0gICAgICAgICAgICAgICAgSSBjaGFuZ2VkIHRvIHRoaXMgb3JkZXIgaW4gb3JkZXIgdG8gY29uZm9ybSB0byAzR1BQLiAqLwotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2MyovCi0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazIsIHNpemVvZihIMjYzQmxvY2syKSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKiBkMjYzIGJveCAqLwotCi0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazMsIHNpemVvZihIMjYzQmxvY2szKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2MyovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJNUDRWKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgYnVmZmVyU2l6ZURCID0gNSAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgYXZnQml0cmF0ZTsgLypidWZmZXJTaXplREIgc2V0IHRvIDUgdGltZXMgdGhlIGJpdHJhdGUqLwotCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9lc2RzU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMCwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMCksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKHZfRVNEZXNjcmlwdG9yU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMSwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMSksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKHZfRENEZXNjcmlwdG9yU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTXA0dkJsb2NrMywgc2l6ZW9mKE1wNHZCbG9jazMpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTI0KGJ1ZmZlclNpemVEQiwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2syLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2syKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazMsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazMpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiSDI2NCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDE2IHBwc0xlbnRnaCA9IDA7IC8qIFBQUyBsZW5ndGggKi8KLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBzcHNMZW50Z2ggPSAwOyAvKiBTUFMgbGVuZ3RoICovCi0gICAgICAgICAgICBNNE9TQV9VQ2hhciAqdG1wRFNJID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0k7IC8qIERTSSAqLwotICAgICAgICAgICAgTTRPU0FfVUludDE2IE51bWJlck9mUFBTOwotICAgICAgICAgICAgTTRPU0FfVUludDE2IGxDbnRQUFM7Ci0KLSAgICAgICAgICAgIC8qIFB1dCB0aGUgYXZjQyAoaGVhZGVyICsgRFNJKSBzaXplICovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9hdmNDU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjY0Ki8KLSAgICAgICAgICAgIC8qIFB1dCB0aGUgYXZjQyBoZWFkZXIgKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2NEJsb2NrMiwgc2l6ZW9mKEgyNjRCbG9jazIpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjQqLwotICAgICAgICAgICAgLyogUHV0IHRoZSBEU0kgKFNQUyArIFBQUykgaW50IHRoZSAzZ3AgZm9ybWF0Ki8KLSAgICAgICAgICAgIC8qIFNQUyBsZW5ndGggaW4gQkUgKi8KLQotICAgICAgICAgICAgaWYgKCgweDAxICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJWzBdKSB8fAotICAgICAgICAgICAgICAgICAoMHg0MiAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSVsxXSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIiEhISBNNE1QNFdfY2xvc2VXcml0ZSBFUlJPUiA6IGludmFsaWQgQVZDQyAweCVYIDB4JVgiLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSVswXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0lbMV0pOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBEbyBub3Qgc3RyaXAgdGhlIERTSQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKCBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkgKTsvKmgyNjQqLwotCi0gICAgICAgIH0KLQotICAgICAgICAvKmVuZCB0cmFrKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3RzelNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNSwgc2l6ZW9mKENvbW1vbkJsb2NrMTUpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaW2ldLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiAqIDQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotCi0jZW5kaWYKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdHNjU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE2LCBzaXplb2YoQ29tbW9uQmxvY2sxNiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjCi0gICAgICAgICAgICArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVtpXQotICAgICAgICAgICAgPj4gMTIpICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW2ldICYgMHhGRkYpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoaSArIDEsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlW2ldLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0Y29TaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTcsIHNpemVvZihDb21tb25CbG9jazE3KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rCi0gICAgICAgICAgICArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCggYkludGVybGVhdmVBViA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA+PSBpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2X3RyYWtPZmZzZXQgKz0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3RyYWtPZmZzZXQsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgdl90cmFrT2Zmc2V0ICs9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdHNzU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soVmlkZW9CbG9jazQsIHNpemVvZihWaWRlb0Jsb2NrNCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jaygoY29uc3QgTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iICogNCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soVmlkZW9CbG9jazUsIHNpemVvZihWaWRlb0Jsb2NrNSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgIH0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAvKm1kYXQqLwotCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1kYXRTaXplLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazIsIHNpemVvZihDb21tb25CbG9jazIpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAvKndyaXRlIGRhdGEsIGFjY29yZGluZyB0byB0aGUgaW50ZXJsZWF2ZSBtb2RlIChkZWZhdWx0IGlzIG5vdCBpbnRlcmxlYXZlZCkqLwotICAgIGlmIChiSW50ZXJsZWF2ZUFWID09IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgaWYgKGJBdWRpbykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgICAgICAgICAgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rW2ldLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8gKHByZXZpb3VzbHkgYV9kYXRhU2l6ZSkqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJWaWRlbykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgICAgICAgICAgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rW2ldLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8gKHByZXZpb3VzbHkgYV9kYXRhU2l6ZSkqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyppbiB0aGlzIG1vZGUsIHdlIGhhdmUgYXVkaW8gYW5kIHZpZGVvIHRvIGludGVybGVhdmUqLwotICAgIHsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbWF4KG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmspOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuaykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rW2ldLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8gKHByZXZpb3VzbHkgYV9kYXRhU2l6ZSkqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaSA8PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuaykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rW2ldLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8gKHByZXZpb3VzbHkgYV9kYXRhU2l6ZSkqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgLypza2lwKi8KLQotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQmxvY2tTaWduYXR1cmVTa2lwSGVhZGVyLAotICAgICAgICBzaXplb2YoQmxvY2tTaWduYXR1cmVTa2lwSGVhZGVyKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgLyogV3JpdGUgZW1iZWRkZWQgc3RyaW5nICovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEVtYmVkZGVkU3RyaW5nLAotICAgICAgICAgICAgc2l6ZW9mKEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRFbWJlZGRlZFN0cmluZyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZywgMTYsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgfQotCi0gICAgLyogV3JpdGUgdmVzIGNvcmUgdmVyc2lvbiAqLwotICAgIGNhbWNvZGVyX21haiA9IChNNE9TQV9VQ2hhcikobU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gLyAxMDApOwotICAgIGNhbWNvZGVyX21pbiA9Ci0gICAgICAgIChNNE9TQV9VQ2hhcikoKCBtTXA0RmlsZURhdGFQdHItPmNhbWNvZGVyVmVyc2lvbiAtIDEwMCAqIGNhbWNvZGVyX21haikKLSAgICAgICAgLyAxMCk7Ci0gICAgY2FtY29kZXJfcmV2ID0KLSAgICAgICAgKE00T1NBX1VDaGFyKShtTXA0RmlsZURhdGFQdHItPmNhbWNvZGVyVmVyc2lvbiAtIDEwMCAqIGNhbWNvZGVyX21haiAtIDEwCi0gICAgICAgICogY2FtY29kZXJfbWluKTsKLQotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgnICcsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKShjYW1jb2Rlcl9tYWogKyAnMCcpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKCcuJywgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKGNhbWNvZGVyX21pbiArICcwJyksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoJy4nLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikoY2FtY29kZXJfcmV2ICsgJzAnKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgLyogV3JpdGUgaW50ZWdyYXRpb24gdGFnICovCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jaygoY29uc3QgTTRPU0FfVUNoYXIgKikiIC0tICIsIDQsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgIHNpemVvZihCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcsIDYwLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIH0KLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAvKm92ZXJ3cml0ZSBtZGF0IHNpemUqLwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCAhPSAwKQotICAgICAgICBtZGF0UG9zPSAxNiArIG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHMgKiA0OwotICAgIGVsc2UKLSAgICAgICAgbWRhdFBvcyA9IDI0OwotCi0gICAgbW9vdlBvcyA9IG1vb3ZQb3MgLSBtZGF0UG9zOwotICAgIG1kYXRTaXplID0gbW9vdlBvczsKLQotICAgIENMRUFOVVBvbkVSUihtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPnNlZWsoZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJm1kYXRQb3MpKTsgLypzZWVrIGFmdGVyIGZ0eXAuLi4qLwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtZGF0U2l6ZSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi1jbGVhbnVwOgotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgZmlsZSBldmVuIGlmIGFuIGVycm9yIG9jY3VyZWQgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KQotICAgIHsKLSAgICAgICAgZXJyMiA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUobU1wNEZpbGVEYXRhUHRyLT4KLSAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KTsgLyoqPCBjbG9zZSB0aGUgc3RyZWFtIGFueXdheSAqLwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycjIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1QNFdfY2xvc2VXcml0ZTogZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycjIpOwotICAgICAgICB9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgLyogUmVtb3ZlIHNhZmV0eSBmaWxlIGlmIHN0aWxsIHByZXNlbnQgKGhlcmUgaXQgaXMgY2xlYW51cCBpbiBjYXNlIG9mIGVycm9yIGFuZCBOT1QgdGhlIG5vcm1hbAotICAgIHJlbW92YWwgb2YgdGhlIHNhZmV0eSBmaWxlIHRvIGZyZWUgZW1lcmdlbmN5IHNwYWNlIGZvciB0aGUgbW9vdikuICovCi0KLSAgICBpZiAoTTRPU0FfVFJVRSA9PSBtTXA0RmlsZURhdGFQdHItPmNsZWFuU2FmZXR5RmlsZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0NvbnRleHQgdGVtcENvbnRleHQ7Ci0gICAgICAgIGVycjMgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPm9wZW5Xcml0ZSgmdGVtcENvbnRleHQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwsCi0gICAgICAgICAgICBNNE9TQV9rRmlsZVdyaXRlIHwgTTRPU0Ffa0ZpbGVDcmVhdGUpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycjIpCi0gICAgICAgICAgICBlcnIyID0gZXJyMzsKLQotICAgICAgICBpZiAoTTROT19FUlJPUgotICAgICAgICAgICAgIT0gZXJyMykgLyogTm8gc2Vuc2UgY2xvc2luZyBpZiB3ZSBjb3VsZG4ndCBvcGVuIGluIHRoZSBmaXJzdCBwbGFjZS4gKi8KLSAgICAgICAgewotICAgICAgICAgICAgZXJyMyA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKHRlbXBDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyMikKLSAgICAgICAgICAgICAgICBlcnIyID0gZXJyMzsKLSAgICAgICAgfQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwgPSBNNE9TQV9OVUxMOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmNsZWFuU2FmZXR5RmlsZSA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0KLSAgICAvKiBEZWxldGUgZW1iZWRkZWQgc3RyaW5nICovCi0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nKQotICAgIHsKLSAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogRGVsZXRlIGludGVncmF0aW9uIHRhZyAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcpCi0gICAgewotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE00TVA0V19mcmVlQ29udGV4dCgpIGlzIG5vdyBhIHByaXZhdGUgbWV0aG9kLCBjYWxsZWQgb25seSBmcm9tIGhlcmUqLwotICAgIGVycjMgPSBNNE1QNFdfZnJlZUNvbnRleHQoY29udGV4dCk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIzKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19jbG9zZVdyaXRlOiBNNE1QNFdfZnJlZUNvbnRleHQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycjMpOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hvb3NlIHdoaWNoIGVycm9yIGNvZGUgdG8gcmV0dXJuICovCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgZ2l2ZSBwcmlvcml0eSB0byBtYWluIGVycm9yICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfY2xvc2VXcml0ZTogcmV0dXJuaW5nIGVycj0weCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIyKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRXJyb3IgZnJvbSBjbG9zZVdyaXRlIGlzIHJldHVybmVkIGlmIHRoZXJlIGlzIG5vIG1haW4gZXJyb3IgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19jbG9zZVdyaXRlOiByZXR1cm5pbmcgZXJyMj0weCV4IiwgZXJyMik7Ci0gICAgICAgIHJldHVybiBlcnIyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBFcnJvciBmcm9tIE00TVA0V19mcmVlQ29udGV4dCBpcyByZXR1cm5lZCBvbmx5IGlmIHRoZXJlIGlzIG5vIG1haW4gZXJyb3IgYW5kCi0gICAgICAgICAgbm8gY2xvc2UgZXJyb3IgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19jbG9zZVdyaXRlOiByZXR1cm5pbmcgZXJyMz0weCV4IiwgZXJyMyk7Ci0gICAgICAgIHJldHVybiBlcnIzOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2dldE9wdGlvbiggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICp2YWx1ZVB0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00U1lTX1N0cmVhbUlEVmFsdWUgKnN0cmVhbUlEdmFsdWVQdHIgPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19TdHJlYW1JRHNpemUgKnN0cmVhbUlEc2l6ZVB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRNUDRXX21lbUFkZHIgKm1lbUFkZHJQdHIgPSBNNE9TQV9OVUxMOwotICAgIC8qICAgIE00TVA0V19Xcml0ZUNhbGxCYWNrKiAgICBjYWxsQmFja1B0ciA9IE00T1NBX05VTEw7Ki8KLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEVSUl9DSEVDSygoIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX29wZW5lZCkKLSAgICAgICAgfHwgKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX3JlYWR5KSwgTTRFUlJfU1RBVEUpOwotCi0gICAgc3dpdGNoKCBvcHRpb24gKQotICAgIHsKLSAgICAgICAgY2FzZSAoTTRNUDRXX21heEFVcGVyQ2h1bmspOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfbWF4Q2h1bmtTaXplKToKLQotICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopKCp2YWx1ZVB0cik7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgKEF1ZGlvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9IG1NcDRGaWxlRGF0YVB0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfbWF4Q2h1bmtJbnRlcik6Ci0KLSAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopKCp2YWx1ZVB0cik7Ci0KLSAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLSAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9IChNNE9TQV9VSW50MzIpbU1wNEZpbGVEYXRhUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgSW50ZXJsZWF2ZUR1cjsgLyp0aW1lIGNvbnZlcnNpb24gISovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfZW1iZWRkZWRTdHJpbmcpOgotICAgICAgICBtZW1BZGRyUHRyID0gKE00TVA0V19tZW1BZGRyICopKCp2YWx1ZVB0cik7Ci0gICAgICAgIC8qbWVtQWRkclB0ciBtdXN0IGhhdmUgYmVlbiBhbHJlYWR5IGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyCi0gICAgICAgIGFuZCBtZW1BZGRyUHRyLT5zaXplIGluaXRpYWxpemVkIHdpdGggdGhlIG1heCBwb3NzaWJsZSBsZW5ndGggaW4gYnl0ZXMqLwotICAgICAgICBFUlJfQ0hFQ0sobWVtQWRkclB0ci0+c2l6ZSA+PSAxNiwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPmFkZHIgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgLyptZW1BZGRyUHRyLT5zaXplIGlzIHVwZGF0ZWQgd2l0aCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHN0cmluZyovCi0gICAgICAgIG1lbUFkZHJQdHItPnNpemUgPSAxNjsKLSAgICAgICAgLyppZiBubyB2YWx1ZSB3YXMgc2V0LCByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nICovCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nLCAxNik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAodm9pZCAqKUJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRFbWJlZGRlZFN0cmluZywKLSAgICAgICAgICAgIDE2KTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfaW50ZWdyYXRpb25UYWcpOgotICAgICAgICBtZW1BZGRyUHRyID0gKE00TVA0V19tZW1BZGRyICopKCp2YWx1ZVB0cik7Ci0gICAgICAgIC8qbWVtQWRkclB0ciBtdXN0IGhhdmUgYmVlbiBhbHJlYWR5IGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyCi0gICAgICAgIGFuZCBtZW1BZGRyUHRyLT5zaXplIGluaXRpYWxpemVkIHdpdGggdGhlIG1heCBwb3NzaWJsZSBsZW5ndGggaW4gYnl0ZXMqLwotICAgICAgICBFUlJfQ0hFQ0sobWVtQWRkclB0ci0+c2l6ZSA+PSA2MCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPmFkZHIgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgLyptZW1BZGRyUHRyLT5zaXplIGlzIHVwZGF0ZWQgd2l0aCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHN0cmluZyovCi0gICAgICAgIG1lbUFkZHJQdHItPnNpemUgPSA2MDsKLSAgICAgICAgLyppZiBubyB2YWx1ZSB3YXMgc2V0LCByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nIDAgKi8KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcsIDYwKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICh2b2lkICopQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgNjApOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19DYW1jb2RlclZlcnNpb24pOgotCi0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotCi0gICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPSBtTXA0RmlsZURhdGFQdHItPmNhbWNvZGVyVmVyc2lvbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19wcmVXcml0ZUNhbGxCYWNrKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgLypjYWxsQmFja1B0ciA9IChNNE1QNFdfV3JpdGVDYWxsQmFjayopKCp2YWx1ZVB0cik7Ci0gICAgICAgICpjYWxsQmFja1B0ciA9IG1NcDRGaWxlRGF0YVB0ci0+UHJlV3JpdGVDYWxsQmFjazsKLSAgICAgICAgYnJlYWs7Ki8KLQotICAgIGNhc2UgKE00TVA0V19wb3N0V3JpdGVDYWxsQmFjayk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgIC8qY2FsbEJhY2tQdHIgPSAoTTRNUDRXX1dyaXRlQ2FsbEJhY2sqKSgqdmFsdWVQdHIpOwotICAgICAgICAqY2FsbEJhY2tQdHIgPSBtTXA0RmlsZURhdGFQdHItPlBvc3RXcml0ZUNhbGxCYWNrOwotICAgICAgICBicmVhazsqLwotCi0gICAgY2FzZSAoTTRNUDRXX21heEFVc2l6ZSk6Ci0KLSAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopKCp2YWx1ZVB0cik7Ci0KLSAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgKEF1ZGlvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgKFZpZGVvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLSAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9IG1NcDRGaWxlRGF0YVB0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfSU9EKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgIGNhc2UgKE00TVA0V19FU0QpOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgY2FzZSAoTTRNUDRXX1NEUCk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfdHJhY2tTaXplKToKLSAgICAgICAgc3RyZWFtSURzaXplUHRyID0gKE00TVA0V19TdHJlYW1JRHNpemUgKikoKnZhbHVlUHRyKTsKLSAgICAgICAgc3RyZWFtSURzaXplUHRyLT53aWR0aCA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+d2lkdGg7Ci0gICAgICAgIHN0cmVhbUlEc2l6ZVB0ci0+aGVpZ2h0ID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5oZWlnaHQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX2VzdGltYXRlQXVkaW9TaXplKToKLSAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopKCp2YWx1ZVB0cik7Ci0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpbU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfTU9PVmZpcnN0KToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgIGNhc2UgKE00TVA0V19WMl9NT09GKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgIGNhc2UgKE00TVA0V19WMl90YmxDb21wcmVzKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19zZXRPcHRpb24oIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiB2YWx1ZSApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00U1lTX1N0cmVhbUlEVmFsdWUgKnN0cmVhbUlEdmFsdWVQdHIgPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19TdHJlYW1JRHNpemUgKnN0cmVhbUlEc2l6ZVB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRNUDRXX21lbUFkZHIgKm1lbUFkZHJQdHIgPSBNNE9TQV9OVUxMOwotICAgIE00U1lTX1N0cmVhbUlEbWVtQWRkciAqc3RyZWFtSURtZW1BZGRyUHRyOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLyogVmVyaWZ5IHN0YXRlICovCi0gICAgc3dpdGNoKCBvcHRpb24gKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE1QNFdfbWF4RmlsZUR1cmF0aW9uOgotICAgICAgICBjYXNlIE00TVA0V19EU0k6Ci0gICAgICAgICAgICAvKiB0aGlzIHBhcmFtIGNhbiBiZSBzZXQgYXQgdGhlIGVuZCBvZiBhIHJlY29yZGluZyAqLwotICAgICAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnN0YXRlICE9IE00TVA0V19jbG9zZWQpLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00TVA0V19zZXRGdHlwQm94OgotICAgICAgICAgICAgLyogdGhpcyBwYXJhbSBjYW4gb25seSBiZSBzZXQgYmVmb3JlIHN0YXJ0aW5nIGFueSB3cml0ZSAqLwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX29wZW5lZCwgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qIGluIGdlbmVyYWwgcGFyYW1zIGNhbiBiZSBzZXQgYXQgb3BlbiBvciByZWFkeSBzdGFnZSAqLwotICAgICAgICAgICAgRVJSX0NIRUNLKCggbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfb3BlbmVkKQotICAgICAgICAgICAgICAgIHx8IChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19yZWFkeSksIE00RVJSX1NUQVRFKTsKLSAgICB9Ci0KLSAgICAvKiBTZXQgb3B0aW9uICovCi0gICAgc3dpdGNoKCBvcHRpb24gKQotICAgIHsKLSAgICAgICAgY2FzZSAoTTRNUDRXX21heEFVcGVyQ2h1bmspOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfbWF4Q2h1bmtTaXplKToKLQotICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopdmFsdWU7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgKEF1ZGlvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRDsgLyptYXliZSB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBhZGRlZCB5ZXQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfU1RSRUFNX0lEOyAvKm1heWJlIHRoZSBzdHJlYW0gaGFzIG5vdCBiZWVuIGFkZGVkIHlldCovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qSW4gTTRNUDRXX29wZW5lZCBzdGF0ZSwgbm8gc3RyZWFtIGlzIHByZXNlbnQgeWV0LCBzbyBvbmx5IGdsb2JhbCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICBuZWVkcyB0byBiZSB1cGRhdGVkLiovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4Q2h1bmtTaXplID0gc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfbWF4Q2h1bmtJbnRlcik6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKXZhbHVlOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICgwKTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmFsbCBzdHJlYW1zKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE1QNFdfVGltZTMyKXN0cmVhbUlEdmFsdWVQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7IC8qdGltZSBjb252ZXJzaW9uISovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgICAgIC8qbm90IG1lYW5pbmdmdWxsIHRvIHNldCB0aGlzIHBhcmFtZXRlciBvbiBhIHN0cmVhbUlEIGJhc2lzKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhGaWxlU2l6ZSk6Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplID0gKihNNE9TQV9VSW50MzIgKil2YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19lbWJlZGRlZFN0cmluZyk6Ci0gICAgICAgICAgICBtZW1BZGRyUHRyID0gKE00TVA0V19tZW1BZGRyICopdmFsdWU7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgKiBJZiBtZW1BZGRyUHRyLT5zaXplID4gMTYgYnl0ZXMsIHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlIHRydW5jYXRlZC4KLSAgICAgICAgICAgICogSWYgbWVtQWRkclB0ci0+c2l6ZSA8IDE2IGJ5dGVzLCB0aGVuIHJldHVybiBNNEVSUl9QQVJBTUVURVIKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobWVtQWRkclB0ci0+c2l6ZSA+PSAxNiwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDE2LCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopImVtYmVkZGVkU3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyplbHNlLCBqdXN0IG92ZXJ3cml0ZSB0aGUgcHJldmlvdXNseSBzZXQgc3RyaW5nKi8KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcsCi0gICAgICAgICAgICAgICAgKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLCAxNik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfaW50ZWdyYXRpb25UYWcpOgotICAgICAgICAgICAgbWVtQWRkclB0ciA9IChNNE1QNFdfbWVtQWRkciAqKXZhbHVlOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogSWYgbWVtQWRkclB0ci0+c2l6ZSA+IDYwIGJ5dGVzLCB0aGVuIHRoZSBzdHJpbmcgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gICAgICAgICAgICAqIElmIG1lbUFkZHJQdHItPnNpemUgPCA2MCBieXRlcywgdGhlbiBwYWQgd2l0aCAwCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDYwLCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopImludGVncmF0aW9uVGFnIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyplbHNlLCBqdXN0IG92ZXJ3cml0ZSB0aGUgcHJldmlvdXNseSBzZXQgc3RyaW5nKi8KLSAgICAgICAgICAgIGlmIChtZW1BZGRyUHRyLT5zaXplIDwgNjApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICAgICAgICAgIDYwKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsIG1lbUFkZHJQdHItPnNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopbWVtQWRkclB0ci0+YWRkciwgNjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX0NhbWNvZGVyVmVyc2lvbik6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKXZhbHVlOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uID0gc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgICAgIC8qbm90IG1lYW5pbmdmdWxsIHRvIHNldCB0aGlzIHBhcmFtZXRlciBvbiBhIHN0cmVhbUlEIGJhc2lzKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19wcmVXcml0ZUNhbGxCYWNrKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAvKm1NcDRGaWxlRGF0YVB0ci0+UHJlV3JpdGVDYWxsQmFjayA9ICooTTRNUDRXX1dyaXRlQ2FsbEJhY2sqKXZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ki8KLQotICAgICAgICBjYXNlIChNNE1QNFdfcG9zdFdyaXRlQ2FsbEJhY2spOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIC8qbU1wNEZpbGVEYXRhUHRyLT5Qb3N0V3JpdGVDYWxsQmFjayA9ICooTTRNUDRXX1dyaXRlQ2FsbEJhY2sqKXZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ki8KLQotICAgICAgICBjYXNlIChNNE1QNFdfbWF4QVVzaXplKToKLQotICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopdmFsdWU7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgKEF1ZGlvU3RyZWFtSUQpOgotCi0gICAgICAgICAgICAgICAgICAgIC8qaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKSovCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKFZpZGVvU3RyZWFtSUQpOgotCi0gICAgICAgICAgICAgICAgICAgIC8qaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKSovCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZSA9IHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19JT0QpOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfRVNEKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX1NEUCk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V190cmFja1NpemUpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHNpemVQdHIgPSAoTTRNUDRXX1N0cmVhbUlEc2l6ZSAqKXZhbHVlOwotCi0gICAgICAgICAgICBpZiAoKHN0cmVhbUlEc2l6ZVB0ci0+c3RyZWFtSUQgIT0gVmlkZW9TdHJlYW1JRCkKLSAgICAgICAgICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aCA9IHN0cmVhbUlEc2l6ZVB0ci0+d2lkdGg7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHNpemVQdHItPmhlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19lc3RpbWF0ZUF1ZGlvU2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKXZhbHVlOwotCi0gICAgICAgICAgICAvKnNoYWxsIG5vdCBzZXQgdGhpcyBvcHRpb24gYmVmb3JlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zIHdlcmUgYWRkZWQqLwotICAgICAgICAgICAgLypub25zZW5zZSB0byBzZXQgdGhpcyBvcHRpb24gaWYgbm90IGluIGNhc2UgYXVkaW8rdmlkZW8qLwotICAgICAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgIHx8IChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9Cb29sKXN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX01PT1ZmaXJzdCk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19WMl9NT09GKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX1YyX3RibENvbXByZXMpOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfbWF4RmlsZUR1cmF0aW9uKToKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZUR1cmF0aW9uID0gKihNNE9TQV9VSW50MzIgKil2YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19zZXRGdHlwQm94KToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZTsKLQotICAgICAgICAgICAgICAgIEVSUl9DSEVDSygoIChNNE1QNENfRnR5cEJveCAqKXZhbHVlKS0+bWFqb3JfYnJhbmQgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgICAgICAgICAgICAgIC8qIENvcHkgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5mdHlwID0gKihNNE1QNENfRnR5cEJveCAqKXZhbHVlOwotCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIGdsb2JhbCBwb3NpdGlvbiB2YXJpYWJsZXMgd2l0aCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbW1vbiBhbmQKLSAgICAgICAgICAgICAgICAgdXNlciBibG9jayAqLwotICAgICAgICAgICAgICAgIHNpemUgPQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzICogc2l6ZW9mKE00T1NBX1VJbnQzMik7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyA9IDgvKm1kYXQqLyArIDE2ICsgc2l6ZTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplID0gMjE4LyptZGF0K21vb3Yrc2tpcCovICsgMTYgKyBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX0RTSSk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyID0gKE00U1lTX1N0cmVhbUlEbWVtQWRkciAqKXZhbHVlOwotCi0gICAgICAgICAgICAgICAgLyogTmVzdGVkIHN3aXRjaCEgV2hlZSEgKi8KLSAgICAgICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEbWVtQWRkclB0ci0+c3RyZWFtSUQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQXVkaW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgKFZpZGVvU3RyZWFtSUQpOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm90ZWN0IERTSSBzZXR0aW5nIDogb25seSBvbmNlIGFsbG93ZWQgb24gYSBnaXZlbiBzdHJlYW0gKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEudHJhY2tUeXBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00U1lTX2tIMjYzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19zZXRPcHRpb246IGRzaSBhbHJlYWR5IHNldCAhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19zZXRPcHRpb246IEJhZCBIMjYzIGRzaSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmRlY29kZXIgc3BlY2lmaWMgaW5mbyBzaXplIGlzIHN1cHBvc2VkIHRvIGJlIGFsd2F5cyA3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyBsb25nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUgPT0gNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBkc2kgYWxyZWFkeSBzZXQgISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwID09IHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IHN0cmVhbUlEbWVtQWRkclB0ci0+YWRkcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBCYWQgTVBFRzQgZHNpISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qTVA0ViBzcGVjaWZpYyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUgPCAxMDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbUlEbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiArIEguMjY0IHRyaW1taW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfVFJVRSA9PSBtTXA0RmlsZURhdGFQdHItPmJNVUxQUFNTUFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3Qgc3RyaXAgdGhlIERTSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBEU0kgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbjogaW4gc2V0IG9wdGlvbiBEU0kgc2l6ZSA9JWQiXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBEU0kgKFNQUyArIFBQUykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsIE00TVA0X1dSSVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbUlEbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0gSC4yNjQgdHJpbW1pbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19zZXRPcHRpb246IGRzaSBhbHJlYWR5IHNldCAhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCggMCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogQmFkIEgyNjQgZHNpISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBEU0kgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBEU0kgKFNQUyArIFBQUykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbUlEbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiBILjI2NCBUcmltbWluZyAgKi8KLSAgICAgICAgY2FzZSBNNE1QNFdfTVVMX1BQU19TUFM6Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmJNVUxQUFNTUFMgPSAqKE00T1NBX0ludDggKil2YWx1ZTsKLSAgICAgICAgICAgIC8qIEguMjY0IFRyaW1taW5nICAqLwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19nZXRTdGF0ZSggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE1QNFdfU3RhdGUgKnN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHN3aXRjaCggc3RyZWFtSUQgKQotICAgIHsKLSAgICAgICAgY2FzZSAoMCk6Ci0gICAgICAgICAgICAqc3RhdGUgPSBtTXA0RmlsZURhdGFQdHItPnN0YXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoQXVkaW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpzdGF0ZSA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKFZpZGVvU3RyZWFtSUQpOgotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqc3RhdGUgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpwQ3VycmVudEZpbGVTaXplICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgRVJSX0NIRUNLKHBDdXJyZW50RmlsZVNpemUgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAqcEN1cnJlbnRGaWxlU2l6ZSA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemU7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTk9USUNFIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQ0ZWM3Zi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0Zyb20yaVRvTW9ub18xNi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvRnJvbTJpVG9Nb25vXzE2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2ZmZiM2YuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvRnJvbTJpVG9Nb25vXzE2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfRlJPTTJJVE9NT05PXzE2X0hfCi0jZGVmaW5lIF9GUk9NMklUT01PTk9fMTZfSF8KLQotCi12b2lkIEZyb20yaVRvTW9ub18xNiggIGNvbnN0IHNob3J0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IG4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmICAvKiBfRlJPTTJJVE9NT05PXzE2X0hfICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9MVk1fVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0xWTV9UeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjg5NzRkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0xWTV9UeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgbmFtZTogICAgICAgICAgTFZNX1R5cGVzLmgKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSGVhZGVyIGZpbGUgZGVmaW5pbmcgdGhlIHN0YW5kYXJkIExpZmVWaWJlcyB0eXBlcyBmb3IgdXNlIGluIHRoZSBhcHBsaWNhdGlvbiBsYXllciAgKi8KLS8qICBpbnRlcmZhY2Ugb2YgYWxsIExpZmVWaWJlcyBtb2R1bGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBMVk1fVFlQRVNfSAotI2RlZmluZSBMVk1fVFlQRVNfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMVk1fTlVMTCAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgcG9pbnRlciAqLwotCi0jZGVmaW5lIExWTV9UUlVFICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgLyogQm9vbGVhbnMgKi8KLSNkZWZpbmUgTFZNX0ZBTFNFICAgICAgICAgICAgICAgMAotCi0jZGVmaW5lIExWTV9NQVhJTlRfOCAgICAgICAgICAgIDEyNyAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyIHNpemUgKi8KLSNkZWZpbmUgTFZNX01BWElOVF8xNiAgICAgICAgICAgMzI3NjcKLSNkZWZpbmUgTFZNX01BWElOVF8zMiAgICAgICAgICAgMjE0NzQ4MzY0NwotI2RlZmluZSBMVk1fTUFYRU5VTSAgICAgICAgICAgICAyMTQ3NDgzNjQ3Ci0KLSNkZWZpbmUgTFZNX01PRFVMRUlEX01BU0sgICAgICAgMHhGRjAwICAgICAgICAgICAgICAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxpbmcgbW9kdWxlIElECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gY2FsbGJhY2tJZCAqLwotI2RlZmluZSBMVk1fRVZFTlRJRF9NQVNLICAgICAgICAweDAwRkYgICAgICAgICAgICAgIC8qIE1hc2sgdG8gZXh0cmFjdCB0aGUgY2FsbGJhY2sgZXZlbnQgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tJZCAqLwotCi0vKiBNZW1vcnkgdGFibGUqLwotI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgICAgMCAgIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgICAgMSAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBkYXRhIG1lbW9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICAgIDIgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgY29lZmZpY2llbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUICAgICAgICAgICAgMyAgIC8qIE9mZnNldCB0byB0ZW1wb3JhcnkgbWVtb3J5IHJlZ2lvbiAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQmFzaWMgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgTFZNX0NIQVI7ICAgICAgICAgICAvKiBBU0NJSSBjaGFyYWN0ZXIgKi8KLQotdHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBMVk1fSU5UODsgICAgICAgICAgIC8qIFNpZ25lZCA4LWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBjaGFyICAgICAgIExWTV9VSU5UODsgICAgICAgICAgLyogVW5zaWduZWQgOC1iaXQgd29yZCAqLwotCi10eXBlZGVmICAgICBzaG9ydCAgICAgICAgICAgICAgIExWTV9JTlQxNjsgICAgICAgICAgLyogU2lnbmVkIDE2LWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIExWTV9VSU5UMTY7ICAgICAgICAgLyogVW5zaWduZWQgMTYtYml0IHdvcmQgKi8KLQotdHlwZWRlZiAgICAgbG9uZyAgICAgICAgICAgICAgICBMVk1fSU5UMzI7ICAgICAgICAgIC8qIFNpZ25lZCAzMi1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdW5zaWduZWQgbG9uZyAgICAgICBMVk1fVUlOVDMyOyAgICAgICAgIC8qIFVuc2lnbmVkIDMyLWJpdCB3b3JkICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTdGFuZGFyZCBFbnVtZXJhdGVkIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogT3BlcmF0aW5nIG1vZGUgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9NT0RFX09GRiAgICA9IDAsCi0gICAgTFZNX01PREVfT04gICAgID0gMSwKLSAgICBMVk1fTU9ERV9EVU1NWSAgPSBMVk1fTUFYRU5VTQotfSBMVk1fTW9kZV9lbjsKLQotCi0vKiBGb3JtYXQgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9TVEVSRU8gICAgICAgICAgPSAwLAotICAgIExWTV9NT05PSU5TVEVSRU8gICAgPSAxLAotICAgIExWTV9NT05PICAgICAgICAgICAgPSAyLAotICAgIExWTV9TT1VSQ0VfRFVNTVkgICAgPSBMVk1fTUFYRU5VTQotfSBMVk1fRm9ybWF0X2VuOwotCi0KLS8qIFdvcmQgbGVuZ3RoICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fMTZfQklUICAgICAgPSAwLAotICAgIExWTV8zMl9CSVQgICAgICA9IDEsCi0gICAgTFZNX1dPUkRMRU5HVEhfRFVNTVkgPSBMVk1fTUFYRU5VTQotfSBMVk1fV29yZExlbmd0aF9lbjsKLQotCi0vKiBMVk0gc2FtcGxpbmcgcmF0ZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9GU184MDAwICA9IDAsCi0gICAgTFZNX0ZTXzExMDI1ID0gMSwKLSAgICBMVk1fRlNfMTIwMDAgPSAyLAotICAgIExWTV9GU18xNjAwMCA9IDMsCi0gICAgTFZNX0ZTXzIyMDUwID0gNCwKLSAgICBMVk1fRlNfMjQwMDAgPSA1LAotICAgIExWTV9GU18zMjAwMCA9IDYsCi0gICAgTFZNX0ZTXzQ0MTAwID0gNywKLSAgICBMVk1fRlNfNDgwMDAgPSA4LAotICAgIExWTV9GU19JTlZBTElEID0gTFZNX01BWEVOVU0tMSwKLSAgICBMVk1fRlNfRFVNTVkgPSBMVk1fTUFYRU5VTQotfSBMVk1fRnNfZW47Ci0KLQotLyogTWVtb3J5IFR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEEgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBLAotICAgIExWTV9QRVJTSVNURU5UX0ZBU1RfREFUQSAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEsCi0gICAgTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiwKLSAgICBMVk1fVEVNUE9SQVJZX0ZBU1QgICAgICAgICAgPSBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNULAotICAgIExWTV9NRU1PUllUWVBFX0RVTU1ZICAgICAgICA9IExWTV9NQVhFTlVNCi19IExWTV9NZW1vcnlUeXBlc19lbjsKLQotCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCi0gICAgTFZNX01lbW9yeVR5cGVzX2VuICAgICAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KLX0gTFZNX01lbW9yeVJlZ2lvbl9zdDsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFN0YW5kYXJkIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBMVk1fSU5UMzIgKCpMVk1fQ2FsbGJhY2spKHZvaWQgICAgICAgICAgKnBDYWxsYmFja0RhdGEsICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2UsICAgLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gdG8gYSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgaW4gdGhlIGNhbGxiYWNrKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgR2VuZXJhbFB1cnBvc2UgKTsgICAvKiBHZW5lcmFsIHB1cnBvc2UgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiB0byBiZSB1c2VkIGFzIGNhbGxiYWNrIElEKSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAgLyogTFZNX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX0NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmU1OTZkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWwgICAgICAgIE00QURfQ29tbW9uLmgKLSAqIEBicmllZiAgICBBdWRpbyBTaGVsbCBEZWNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgY29tbW9uIGludGVyZmFjZXMgdGhhdCBhdWRpbyBkZWNvZGVyIHNoZWxscyBtdXN0IGltcGxlbWVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEFEX0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNEFEX0NPTU1PTl9IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00REFfVHlwZXMuaCIKLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRBRF9Db250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00QURfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgQXVkaW8gZGVjb2RlciBvcHRpb25zLgotICogQG5vdGUgICAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gYSBkZWNvZGVyIHZpYQotICogICAgICAgICAgICBNNEFEX2dldE9wdGlvbl9mY3QvTTRBRF9zZXRPcHRpb25fZmN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmbGFnIG9mIHByZXNlbmNlIG9mIHByb3RlY3Rpb24gKi8KLSAgICBNNEFEX2tPcHRpb25JRF9Qcm90ZWN0aW9uQWJzZW50ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRERUNPREVSX0FVRElPLCAweDAxKSwKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgYmxvYyAqLwotICAgIE00QURfa09wdGlvbklEX05iRnJhbWVQZXJCbG9jICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRERUNPREVSX0FVRElPLCAweDAyKSwKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQUFDIGRlY29kZXIgdXNlciBwYXJhbWV0ZXJzICovCi0gICAgTTRBRF9rT3B0aW9uSURfVXNlclBhcmFtICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00REVDT0RFUl9BVURJTywgMHgwMyksCi0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgQUFDIHN0ZWFtIHR5cGUgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9TdHJlYW1UeXBlICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCAsIE00REVDT0RFUl9BVURJTywgMHgxMCksCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG51bWJlciBvZiB1c2VkIGJ5dGVzIGluIHRoZSBsYXRlc3QgZGVjb2RlCi0gICAgICh1c2VkIG9ubHkgd2hlbiBkZWNvZGluZyBBQUMgZnJvbSBBRElGIGZpbGUpICovCi0gICAgTTRBRF9rT3B0aW9uSURfVXNlZEJ5dGVzICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCAsIE00REVDT0RFUl9BVURJTywgMHgxMSksCi0KLSAgICAvKiBSZWFkZXIgSW50ZXJmYWNlICovCi0gICAgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MDEyKSwKLQotICAgIC8qIEF1ZGlvIEFjY2VzcyBVbml0ICovCi0gICAgTTRBRF9rT3B0aW9uSURfQXVkaW9BVSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDEzKSwKLQotICAgIC8qIFJlYWRlciBlcnJvciBjb2RlICovCi0gICAgTTRBRF9rT3B0aW9uSURfR2V0QXVkaW9BVUVyckNvZGUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgxNCksCi0KLSAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9BdWRpb05iQ2hhbm5lbHMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgxNSksCi0KLSAgICAvKiBTYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9BdWRpb1NhbXBGcmVxdWVuY3kgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgxNiksCi0KLSAgICAvKiBBdWRpbyBBVSBDVFMgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9BdUNUUyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDE3KQotCi19IE00QURfT3B0aW9uSUQ7Ci0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNF9rVW5rbm93biA9IDAsICAgIC8qIFVua25vd24gc3RyZWFtIHR5cGUgKi8KLSAgICBNNF9rQUFDLCAgICAgICAgICAgIC8qIE00X2tBQUNfTUFJTiBvciBNNF9rQUFDX0xDIG9yIE00X2tBQUNfU1NSIG9yIE00X2tBQUNfTFRQICAgICovCi0gICAgTTRfa0FBQ3BsdXMsICAgICAgICAvKiBEZWNvZGVyIHR5cGUgaXMgQUFDIHBsdXMgKi8KLSAgICBNNF9rZUFBQ3BsdXMgICAgICAgIC8qIERlY29kZXIgdHlwZSBpcyBlbmhhbmNlZCBBQUMgcGx1cyAqLwotfSBNNF9BQUNUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00QURfVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdWRpbyB0eXBlcyB1c2VkIHRvIGNyZWF0ZSBkZWNvZGVycwotICogQG5vdGUgICAgVGhpcyBlbnVtIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVlBTIHRvIGlkZW50aWZ5IGEgY3VycmVudGx5IHN1cHBvcnRlZAotICogICAgICAgICAgICBhdWRpbyBkZWNvZGVyIGludGVyZmFjZS4gRWFjaCBkZWNvZGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCBvbmUgb2YgdGhpcyB0eXBlIGFzc29jaWF0ZWQuCi0gKiAgICAgICAgICAgIFdoZW4gYSBkZWNvZGVyIGluc3RhbmNlIGlzIG5lZWRlZCwgdGhpcyB0eXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkKLSAqICAgICAgICAgICAgYW5kIHJldHJpZXZlIGl0cyBpbnRlcmZhY2UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRBRF9rVHlwZUFNUk5CID0gMCwKLSAgICBNNEFEX2tUeXBlQU1SV0IsCi0gICAgTTRBRF9rVHlwZUFBQywKLSAgICBNNEFEX2tUeXBlTVAzLAotICAgIE00QURfa1R5cGVQQ00sCi0gICAgTTRBRF9rVHlwZUJCTXVzaWNFbmdpbmUsCi0gICAgTTRBRF9rVHlwZVdNQSwKLSAgICBNNEFEX2tUeXBlUk1BLAotICAgIE00QURfa1R5cGVBRFBDTSwKLSAgICBNNEFEX2tUeXBlX05CICAvKiBudW1iZXIgb2YgZGVjb2RlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi0KLX0gTTRBRF9UeXBlIDsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00QURfQnVmZmVyCi0gKiBAYnJpZWYgICAgICAgIFN0cnVjdHVyZSB0byBkZXNjcmliZSBhIGJ1ZmZlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgbV9kYXRhQWRkcmVzczsKLSAgICBNNE9TQV9VSW50MzIgICAgbV9idWZmZXJTaXplOwotICAgIGludDY0X3QgICAgICAgICBtX3RpbWVTdGFtcFVzOwotfSBNNEFEX0J1ZmZlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgQWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKE9VVCkgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhOiAgICAgICAgKElOKSAgICBQb2ludGVyIHRvIFVzZXIgZGF0YQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX2NyZWF0ZV9mY3QpKE00QURfQ29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgdm9pZCogcFVzZXJEYXRhKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBEZXN0cm95cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIEFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9kZXN0cm95X2ZjdCkgICAgKE00QURfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBEZWNvZGVzIHRoZSBnaXZlbiBhdWRpbyBkYXRhCi0gKiBAbm90ZSAgICBQYXJzZXMgYW5kIGRlY29kZXMgdGhlIG5leHQgYXVkaW8gZnJhbWUsIGZyb20gdGhlIGdpdmVuIGJ1ZmZlci4KLSAqICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHBJbnB1dEJ1ZmZlclNpemUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnQKLSAqICAgICAgICAgICAgb2YgZGF0YSBhY3R1YWxseSByZWFkLgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIGlucHV0QnVmZmVyOiAgICAgICAgKElOL09VVClJbnB1dCBEYXRhIGJ1ZmZlci4gSXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGF1ZGlvIGZyYW1lLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIG11c3QgYmUgdXBkYXRlZCBpbnNpZGUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIHJlZmxlY3QgdGhlIHNpemUgb2YgdGhlIGFjdHVhbGx5IGRlY29kZWQgZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gdGhlIGZpcnN0IGZyYW1lIGluIHBJbnB1dEJ1ZmZlcikKLSAqIEBwYXJhbSAgIGRlY29kZWRQQ01CdWZmZXI6ICAgIChPVVQpICAgT3V0cHV0IFBDTSBidWZmZXIgKGRlY29kZWQgZGF0YSkuCi0gKiBAcGFyYW0gICBqdW1waW5nOiAgICAgICAgICAgIChJTikgICAgTTRPU0FfVFJVRSBpZiBhIGp1bXAgd2FzIGp1c3QgZG9uZSwgTTRPU0FfRkFMU0Ugb3RoZXJ3aXNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfc3RlcF9mY3QpICAgIChNNEFEX0NvbnRleHQgY29udGV4dCwgTTRBRF9CdWZmZXIgKnBJbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0J1ZmZlciAqcERlY29kZWRQQ01CdWZmZXIsIE00T1NBX0Jvb2wganVtcGluZyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldHMgdGhlIGRlY29kZXIgdmVyc2lvbgotICogQG5vdGUgICAgVGhlIHZlcnNpb24gaXMgZ2l2ZW4gaW4gYSBNNF9WZXJzaW9uSW5mbyBzdHJ1Y3R1cmUKLSAqCi0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgKE9VVCkgICAgICAgIFBvaW50ZXIgdG8gdGhlIHZlcnNpb24gc3RydWN0dXJlCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIGdpdmVuIHBvaW50ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfZ2V0VmVyc2lvbl9mY3QpKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgQUFDIGNvcmUgZGVjb2RlciBhY2NvcmRpbmcgdG8KLSAqICAgICAgICAgICAgdGhlIHN0cmVhbSBwcm9wZXJ0aWVzIGFuZCB0byB0aGUgb3B0aW9ucyB0aGF0IG1heQotICogICAgICAgICAgICBoYXZlIGJlZW4gc2V0IHVzaW5nIE00QURfc2V0T3B0aW9uX2ZjdAotICogQG5vdGUgICAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgQUFDIGRlY29kZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBlc3BlY2lhbGx5IGJ5IHRoZSBBQUMgZGVjb2RlcgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChJTi9PVVQpICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKElOKSAgICBQb2ludGVyIHRvIGFuIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9zdGFydF9mY3QpICAgIChNNEFEX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBSZXNldCB0aGUgaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXIKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX3Jlc2V0X2ZjdCkgICAgKE00QURfQ29udGV4dCBjb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIHNldCBlbiBvcHRpb24gdmFsdWUgb2YgdGhlIGF1ZGlvIGRlY29kZXIKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKElOKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFEX3NldE9wdGlvbl9mY3QpIChNNEFEX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSBhdWRpbyBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChPVVQpICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QURfZ2V0T3B0aW9uX2ZjdCkgKE00QURfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRBRF9JbnRlcmZhY2UKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZ2VuZXJpYyBhdWRpbyBkZWNvZGVyIGludGVyZmFjZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9mIG9uZSBhdWRpbyBkZWNvZGVyIHR5cGUuCi0gKiAgICAgICAgICAgICAgICBUaGUgZGVjb2RlciB0eXBlIGlzIG9uZSBvZiB0aGUgTTRBRF9UeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000QURfSW50ZXJmYWNlCi17Ci0KLSAgICBNNEFEX2NyZWF0ZV9mY3QqICAgICAgICBtX3BGY3RDcmVhdGVBdWRpb0RlYzsKLSAgICBNNEFEX3N0YXJ0X2ZjdCogICAgICAgICAgICBtX3BGY3RTdGFydEF1ZGlvRGVjOwotICAgIE00QURfc3RlcF9mY3QqICAgICAgICAgICAgbV9wRmN0U3RlcEF1ZGlvRGVjOwotICAgIE00QURfZ2V0VmVyc2lvbl9mY3QqICAgIG1fcEZjdEdldFZlcnNpb25BdWRpb0RlYzsKLSAgICBNNEFEX2Rlc3Ryb3lfZmN0KiAgICAgICAgbV9wRmN0RGVzdHJveUF1ZGlvRGVjOwotICAgIE00QURfcmVzZXRfZmN0KiAgICAgICAgICAgIG1fcEZjdFJlc2V0QXVkaW9EZWM7Ci0gICAgTTRBRF9zZXRPcHRpb25fZmN0KiAgICAgICAgbV9wRmN0U2V0T3B0aW9uQXVkaW9EZWM7Ci0gICAgTTRBRF9nZXRPcHRpb25fZmN0KiAgICAgICAgbV9wRmN0R2V0T3B0aW9uQXVkaW9EZWM7Ci0KLX0gTTRBRF9JbnRlcmZhY2U7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKl9fTTRBRF9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9OdWxsLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX051bGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzgxNDBjZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX051bGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00QURfTnVsbC5oCi0gKiBAYnJpZWYgICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIGRlY29kZXIgcHVibGljIGludGVyZmFjZSB0aGF0IGRvIG5vdGhpbmcKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBnZXRJbnRlcmZhY2UgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000QURfTlVMTF9IX18KLSNkZWZpbmUgX19NNEFEX05VTExfSF9fCi0KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlclR5cGUgICAgICAgIDogcG9pbnRlciBvbiBhbiBNNEFEX1R5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGRlY29kZXIgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyBkZWNvZGVyCi0gKiBAcGFyYW0gcERlY29kZXJJbnRlcmZhY2UgICA6IGFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGlzIGRlY29kZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSAqCi0gKiBAcmV0dXJuIDogTTROT19FUlJPUiAgaWYgT0sKLSAqICAgICAgICAgICBNNEVSUl9BTExPQyBpZiBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFEX05VTExfZ2V0SW50ZXJmYWNlKCBNNEFEX1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRBRF9JbnRlcmZhY2UgKipwRGVjb2RlckludGVyZmFjZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRBRF9OVUxMX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QUlSX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBSVJfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1NDEzNjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBSVJfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRBSVJfQVBJLmgKLSAqIEBicmllZiAgQXJlYSBvZiBJbnRlcmVzdCBSZXNpemVyICBBUEkKLSAqIEBub3RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBNNEFJUl9BUElfSAotI2RlZmluZSBNNEFJUl9BUElfSAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0jaW5jbHVkZSAiTTRDb21tb25fdHlwZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBUWVBFUyBERUZJTklUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEFJUl9JbnB1dEZvcm1hdFR5cGUKLSAqIEBicmllZiAgICAgVGhlIGZvbGxvd2luZyBlbnVtZXJhdGlvbiBsaXN0cyB0aGUgZGlmZmVyZW50IGFjY2VwdGVkIGZvcm1hdCBmb3IgdGhlIEFJUi4KLSAqIFRvIGJlIGF2YWlsYWJsZSwgdGhlIGFzc29jaWF0ZWQgY29tcGlsYXRpb24gZmxhZyBtdXN0IGJlIGRlZmluZWQsIGVsc2UsCi0gKiB0aGUgQUlSIHdpbGwgcmV0dXJuIGFuIGVycm9yIChjb21waWxhdGlvbiBmbGFnIDogTTRBSVJfWFhYWFhYX0ZPUk1BVF9TVVBQT1JURUQpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00QUlSX2tZVVY0MjBQLAotICAgIE00QUlSX2tZVVY0MjBBUCwKLSAgICBNNEFJUl9rSlBHCi19TTRBSVJfSW5wdXRGb3JtYXRUeXBlIDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICAgIE00QUlSX0Nvb3JkaW5hdGVzCi0gKiBAYnJpZWYgICAgIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgWCBhbmQgWSBjb29yZGluYXRlcyBpbiBhIGdpdmVuIHBpY3R1cmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgbV94OyAgICAvKio8IFggY29vcmRpbmF0ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX3k7ICAgIC8qKjwgWSBjb29yZGluYXRlICovCi19TTRBSVJfQ29vcmRpbmF0ZXM7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgICAgICBNNEFJUl9TaXplCi0gKiBAYnJpZWYgICAgIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGRpbWVuc2lvbiBvZiBhIGdpdmVuIHBpY3R1cmUgYXJlYS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICBtX3dpZHRoOyAgICAvKio8IFdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgIG1faGVpZ2h0OyAgICAvKio8IEhlaWdodCAqLwotfU00QUlSX1NpemU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgICAgICBNNEFJUl9QYXJhbXMKLSAqIEBicmllZiAgICAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgcGFyYW1ldGVycyBuZWVkZWQgdG8gZ2V0IGEgcmVzaXplZCBST0kgKFJlZ2lvbiBvZiBpbnRlcmVzdCkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNEFJUl9Db29yZGluYXRlcyAgICAgICAgbV9pbnB1dENvb3JkOyAgICAgICAgICAgIC8qKjwgWCBhbmQgWSBwb3NpdGlvbm5pbmcgaW4gdGhlIGlucHV0IG9mIHRoZSBmaXJzdCBpbnRlcmVzdGluZyBwaXhlbCAodG9wLWxlZnQpICovCi0gICAgTTRBSVJfU2l6ZSAgICAgICAgICAgICAgICBtX2lucHV0U2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIGludGVyZXN0aW5nIGFyZWEgaW5zaWRlIGlucHV0ICh3aWR0aCBhbmQgaGVpZ2h0KSovCi0gICAgTTRBSVJfU2l6ZSAgICAgICAgICAgICAgICBtX291dHB1dFNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBvdXRwdXQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIG1fYk91dHB1dFN0cmlwZTsgICAgICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSB3aWxsIGhhdmUgdG8gcHJvdmlkZSBvdXRwdXQgcGVyIHN0cmlwZSBvciBub3QgKi8KLSAgICBNNENPTU1PTl9PcmllbnRhdGlvbiAgICAgICAgbV9vdXRwdXRPcmllbnRhdGlvbjsgICAgLyoqPCBEZXNpcmVkIG9yaWVudGF0aW9uIG9mIHRoZSBBSVIgb3V0cHV0ICovCi19TTRBSVJfUGFyYW1zOwotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgRVJST1JTIERFRklOSVRJT05TICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoaXMgZXJyb3IgbWVhbnMgdGhhdCB0aGUgcmVxdWVzdGVkIHZpZGVvIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLwotI2RlZmluZSBNNEVSUl9BSVJfRk9STUFUX05PVF9TVVBQT1JURUQgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRBSVIsMHgwMDAwMDEpCi0KLS8qIFRoaXMgZXJyb3IgbWVhbnMgdGhhdCB0aGUgaW5wdXQgb3Igb3V0cHV0IHNpemUgaXMgaW5jb3JyZWN0ICovCi0jZGVmaW5lIE00RVJSX0FJUl9JTExFR0FMX0ZSQU1FX1NJWkUgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRBSVIsMHgwMDAwMDIpCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBQVUJMSUMgQVBJIERFRklOSVRJT05TICoqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCk7Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgQUlSLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4vT1VUKSBBZGRyZXNzIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZQotICogQHBhcmFtICAgIGlucHV0Rm9ybWF0OiAgICAoSU4pIGlucHV0IGZvcm1hdCB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLiBJbnZhbGlkIGZvcm1hdFR5cGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IGlzIGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQsTTRBSVJfSW5wdXRGb3JtYXRUeXBlIGlucHV0Rm9ybWF0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVzdHJveXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUiBjb21wb25lbnQKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZSB0byBkZXN0cm95Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiBJbnRlcm5hbCBzdGF0ZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGlzIGZ1bmN0aW9uIGNhbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgY29uZmlndXJlIHRoZSBBSVIuCi0gKiBAbm90ZSAgICBJdCB3aWxsIHNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBjb29yZGluYXRlcyBhbmQgc2l6ZXMsCi0gKiAgICAgICAgICAgIGFuZCBpbmRpY2F0ZXMgaWYgd2Ugd2lsbCBwcm9jZWVkIGluIHN0cmlwZSBvciBub3QuCi0gKiAgICAgICAgICAgIEluIGNhc2UgYSBNNEFJUl9nZXQgaW4gc3RyaXBlIG1vZGUgd2FzIG9uIGdvaW5nLCBpdCB3aWxsIGNhbmNlbCB0aGlzIHByZXZpb3VzCi0gKiAgICAgICAgICAgIHByb2Nlc3NpbmcgYW5kIHJlc2V0IHRoZSBnZXQgcHJvY2Vzcy4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAgICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQotICogQHBhcmFtICAgIHBQYXJhbXMtPm1fYk91dHB1dFN0cmlwZTooSU4pIFN0cmlwZSBtb2RlLgotICogQHBhcmFtICAgIHBQYXJhbXMtPm1faW5wdXRDb29yZDogICAgKElOKSBYLFkgY29vcmRpbmF0ZXMgb2YgdGhlIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0LgotICogQHBhcmFtICAgIHBQYXJhbXMtPm1faW5wdXRTaXplOiAgICAoSU4pIGlucHV0IFJPSSBzaXplLgotICogQHBhcmFtICAgIHBQYXJhbXMtPm1fb3V0cHV0U2l6ZTogICAgKElOKSBvdXRwdXQgc2l6ZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICAgIE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDogdGhlIHJlcXVlc3RlZCBpbnB1dCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcyk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfZ2V0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIHRoZSByZXF1ZXN0ZWQgcmVzaXplZCBhcmVhIG9mIGludGVyZXN0IGFjY29yZGluZyB0bwotICogICAgICAgICAgICBzZXR0aW5ncyBwcm92aWRlZCBpbiBNNEFJUl9jb25maWd1cmUuCi0gKiBAbm90ZSAgICBJbiBjYXNlIHRoZSBpbnB1dCBmb3JtYXQgdHlwZSBpcyBKUEVHLCBpbnB1dCBwbGFuZShzKQotICogICAgICAgICAgICBpbiBwSW4gaXMgbm90IHVzZWQuIEluIG5vcm1hbCBtb2RlLCBkaW1lbnNpb24gc3BlY2lmaWVkIGluIG91dHB1dCBwbGFuZShzKSBzdHJ1Y3R1cmUKLSAqICAgICAgICAgICAgbXVzdCBiZSB0aGUgc2FtZSB0aGFuIHRoZSBvbmUgc3BlY2lmaWVkIGluIE00QUlSX2NvbmZpZ3VyZS4gSW4gc3RyaXBlIG1vZGUsIG9ubHkKLSAqICAgICAgICAgICAgdGhlIHdpZHRoIHdpbGwgYmUgdGhlIHNhbWUsIGhlaWdodCB3aWxsIGJlIHRha2VuIGFzIHRoZSBzdHJpcGUgaGVpZ2h0ICh0eXBpY2FsbHkgMTYpLgotICogICAgICAgICAgICBJbiBub3JtYWwgbW9kZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsIG9uY2UgdG8gZ2V0IHRoZSBmdWxsIG91dHB1dCBwaWN0dXJlLiBJbiBzdHJpcGUKLSAqICAgICAgICAgICAgbW9kZSwgaXQgaXMgY2FsbGVkIGZvciBlYWNoIHN0cmlwZSB0aWxsIHRoZSB3aG9sZSBwaWN0dXJlIGhhcyBiZWVuIHJldHJpZXZlZCxhbmQKLSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBvdXRwdXQgc3RyaXBlIGluIHRoZSBvdXRwdXQgcGljdHVyZSBpcyBpbnRlcm5hbGx5IGluY3JlbWVudGVkCi0gKiAgICAgICAgICAgIGF0IGVhY2ggc3RlcC4KLSAqICAgICAgICAgICAgQW55IGNhbGwgdG8gTTRBSVJfY29uZmlndXJlIGR1cmluZyBzdHJpcGUgcHJvY2VzcyB3aWxsIHJlc2V0IHRoaXMgb25lIHRvIHRoZQotICogICAgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBpY3R1cmUuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgICBwSW46ICAgICAgICAgICAgKElOKSBQbGFuZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbnB1dCBQbGFuZShzKS4KLSAqIEBwYXJhbSAgICBwT3V0OiAgICAgICAgKElOL09VVCkgIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIG91dHB1dCBQbGFuZShzKS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCk7Ci0KLQotCi0jZW5kaWYgLyogTTRBSVJfQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QU1SUl9Db3JlUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFNUlJfQ29yZVJlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDcxMGYzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QU1SUl9Db3JlUmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00QU1SUl9Db3JlUmVhZGVyLmgKLSAqIEBicmllZiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgQU1SIHBhcnNlcgotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQVBJIGRlZi4gZm9yIEFNUiBQYXJzZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000QU1SX0NPUkVSRUFERVJfSF9fCi0jZGVmaW5lIF9fTTRBTVJfQ09SRVJFQURFUl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfU3RyZWFtLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBTVIgcmVhZGVyIEVycm9ycyAmIFdhcm5pbmdzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEUgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRBTVJfUkVBREVSLCAweDAwMDAwMSkKLSNkZWZpbmUgTTRFUlJfQU1SX05PVF9DT01QTElBTlQgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRBTVJfUkVBREVSLCAweDAwMDAwMikKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNEFNUlJfU3RhdGUKLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIEFNUiByZWFkZXIgc3RhdGVzCi0gKiBAbm90ZSAgICAgICAgVGhlc2Ugc3RhdGVzIGFyZSB1c2VkIGludGVybmFseSwgYnV0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSBvdXRzaWRlIHRoZSByZWFkZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtewotICAgIE00QU1SUl9rT3BlbmluZyAgICA9IDB4MDEwMCwKLSAgICBNNEFNUlJfa09wZW5lZCAgICA9IDB4MDEwMSwKLSAgICBNNEFNUlJfa1JlYWRpbmcgPSAweDAyMDAsCi0gICAgTTRBTVJSX2tSZWFkaW5nX25leHRBVSA9IDB4MDIwMSwKLSAgICBNNEFNUlJfa0Nsb3NlZCA9IDB4MzAwCi19TTRBTVJSX1N0YXRlOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9vcGVuUmVhZCAoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRlclBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pOwotKiBAYnJpZWYgICAgTTRBTVJSX09wZW5SZWFkIHBhcnNlcyB0aGUgbWV0YSBkYXRhIG9mIHRoZSBBTVIgYW5kIGFsbG9jYXRlcyBkYXRhIHN0cnVjdHVyZQotKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgZmlsZSBhbmQgY3JlYXRlcyBhIGNvbnRleHQgZm9yIEFNUiAgUGFyc2VyLgotKiAgICAgICAgICAgIC0gc2V0cyBjb250ZXh0IHRvIG51bGwgaWYgZXJyb3Igb2NjdXJlZC4KLSogQHBhcmFtICAgIHBDb250ZXh0KE9VVCkgICAgICAgIDogQU1SIFJlYWRlciBjb250ZXh0IGFsbG9jYXRlZCBpbiB0aGUgZnVuY3Rpb24KLSogQHBhcmFtICAgIHBGaWxlRGVzc2NyaXB0b3IoSU4pOiBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGlucHV0IGZpbGUKLSogQHBhcmFtICAgIHBGaWxlRnVuY3Rpb24oSU4pICAgIDogcG9pbnRlciB0byBmaWxlIGZ1bmN0aW9uIGZvciBmaWxlIGFjY2VzcwotKgotKiBAcmV0dXJucyAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IHBDb250ZXh0IGFuZC9vciBwRmlsZURlc2NyaXB0b3IgaXMgTlVMTAotKiBAcmV0dXJucyAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQgOiBmaWxlIGNhbm5vdCBiZSBmb3VuZAotKiBAcmV0dXJucyAgICBNNEFNUlJfRVJSX0FNUl9OT1RfQ09NUExJQU5UIDogVHRoZSBpbnB1dCBpcyBub3QgYSBBTVIgZmlsZQotKiBAcmV0dXJucyAgICBNNE9TQV9GSUxFICAgICAgICA6IFNlZSBPU0FMIGZpbGUgU3BlYy4gZm9yIGRldGFpbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9vcGVuUmVhZCAoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogcFN0cmVhbURlc2MgKTsKLSogQGJyaWVmICAgIFJlYWRzIHRoZSBuZXh0IGF2YWlsYWJsZSBzdHJlYW0gaW4gdGhlIGZpbGUKLSogQG5vdGUgICAgICAgIEdldCB0aGUgc3RyZWFtIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJlYW0uCi0qICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBzdHJlYW0gaW4gQU1SIGZpbGUuCi0qIEBwYXJhbSAgICBDb250ZXh0KElOL09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHBhcmFtICAgIHBTdHJlYW1EZXNjKE9VVCk6IERlc2NyaXB0aW9uIG9mIHRoZSBuZXh0IHJlYWQgc3RyZWFtCi0qCi0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSogQHJldHVybnMgICAgIE00QU1SUl9XQVJfTk9fTU9SRV9TVFJFQU0gOiBUaGVyZSBhcmUgbm8gbW9yZSBzdHJlYW1zIGluIHRoZSBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRBTVJSX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogcFN0cmVhbURlc2MgKTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9zdGFydFJlYWRpbmcoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlEcyApOwotKiBAYnJpZWYgICAgUHJlcGFyZXMgdGhlIEFNUiByZWFkaW5nIG9mIHRoZSBzcGVjaWZpZWQgc3RyZWFtIElkcwotKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZGVyIHJlYWRpbmcuCi0qIEBwYXJhbSAgICBDb250ZXh0KElOL09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHBhcmFtICAgIHBTdHJlYW1JRHMoSU4pICAgIDogQXJyYXkgb2Ygc3RyZWFtIElkcyB0byBiZSBwcmVwYXJlZC4KLSoKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICA6IEF0bGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9zdGFydFJlYWRpbmcoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlEcyApOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX25leHRBVShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEIFN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQXUpOwotKiBAYnJpZWYgICAgUmVhZHMgdGhlIGFjY2VzcyB1bml0IGludG8gdGhlIHByb3ZpZGluZyBzdHJlYW0KLSogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBtZW1vcnkgdG8gZGF0YUFkZHJlc3MgZmlsZWQgYW5kIGNvcGllZCB0aGUgZGF0YS4KLSogICAgICAgICAgICAtVGhlIEFwcGxpY2F0aW9uIHNob3VsZCBub3QgZnJlZSB0aGUgZGF0YUFkZHJlc3MgcG9pbnRlci4KLSogQHBhcmFtICAgIENvbnRleHQoSU4vT1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcGFyYW0gICAgU3RyZWFtSUQoSU4pICAgIDogU2VsZWN0cyB0aGUgc3RyZWFtCi0qIEBwYXJhbSAgICBwQXUoSU4vT1VUKSAgICAgICAgOiBBY2Nlc3MgVW5pdAotKgotKiBAcmV0dXJucyAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgOiBBdGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSogQHJldHVybnMgICAgIE00V0FSX05PX0RBVEFfWUVUICAgIDogdGhlcmUgICAgaXMgbm8gZW5vdWdoIGRhdGEgb24gdGhlIHN0cmVhbSBmb3IgbmV3IGFjY2VzcyB1bml0Ci0qIEByZXR1cm5zICAgICBNNFdBUl9FTkRfT0ZfU1RSRUFNICAgIDogVGhlcmUgYXJlIG5vIG1vcmUgYWNjZXNzIHVuaXQgaW4gdGhlIHN0cmVhbQotKiBAcmV0dXJucyAgICAgTTRBTVJSX0VSUl9JTlZBTElEX0ZSQU1FX1RZUEUgOiBjdXJyZW50IGZyYW1lIGhhcyBubyB2YWxpZCBmcmFtZSB0eXBlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBTdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEF1KTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9mcmVlQVUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBTdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEF1KTsKLSogQGJyaWVmICAgIE5vdGlmeSB0aGUgQVJNIFJlYWRlciB0aGF0IGFwcGxpY2F0aW9uIHdpbGwgbm8gbG9uZ2VyIHVzZSAiQVUiCi0qIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBtZW1vcnkgcG9pbnRlZCBieSBwQXUtPmRhdGFBZGRyZXNzIHBvaW50ZXIKLSogICAgICAgICAgICAtQ2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIHJlYWRlciBiYWNrIHRvIHJlYWRpbmcuCi0qIEBwYXJhbSAgICBDb250ZXh0KElOL09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHBhcmFtICAgIFN0cmVhbUlEKElOKSAgICA6IFNlbGVjdHMgdGhlIHN0cmVhbQotKiBAcGFyYW0gICAgcEF1KElOKSAgICAgICAgICAgIDogQWNjZXNzIFVuaXQKLSoKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICA6IEF0bGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9mcmVlQVUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBTdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEF1KTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9zZWVrKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwgTTRPU0FfVGltZSB0aW1lLAotKiAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX3NlZWtBY2Nlc3NNb2RlICAgIHNlZWtNb2RlLCBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTKTsKLSogQGJyaWVmICAgIFRoZSBmdW5jdGlvbiBzZWVrcyB0aGUgdGFyZ2V0ZWQgdGltZSBpbiB0aGUgZ2l2ZSBzdHJlYW0gYnkgc3RyZWFtSWQuCi0qIEBub3RlICAgICAgICBFYWNoIGZyYW1lIGlzIG9mIDIwIG1zIGR1cmF0aW9uLCwgYnVpbGRzIHRoZSBzZWVrIHRhYmxlIGFuZCBwb2ludHMKLSogICAgICAgICAgICB0aGUgZmlsZSBwb2ludGVyIHRvIHN0YXJ0aW5nIGZvciB0aGUgcmVxdWlyZWQgQVUuCi0qIEBwYXJhbSAgICBDb250ZXh0KElOL09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHBhcmFtICAgIFN0cmVhbUlEKElOKSAgICA6IEFycmF5IG9mIHN0cmVhbSBJRHMuCi0qIEBwYXJhbSAgICB0aW1lKElOKSAgICAgICAgOiB0YXJnZXRlZCB0aW1lCi0qIEBwYXJhbSAgICBzZWVrTW9kZShJTikgICAgOiBTZWxlY3RzIHRoZSBzZWVrIG1vZGUKLSogQHBhcmFtICAgIHBPYnRhaW5DVFMoT1VUKSAgICA6IFJldHVybmVkIHRpbWUgbmVhcmVzdCB0byB0YXJnZXQuCi0qCi0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgOiBBdGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSogQHJldHVybnMgICAgIE00V0FSX0lOVkFMSURfVElNRSAgICA6IHRpbWUgY2Fubm90IGJlIHJlYWNoZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX3NlZWsoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELCBNNE9TQV9UaW1lIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU2Vla0FjY2Vzc01vZGUgICAgc2Vla01vZGUsIE00T1NBX1RpbWUqIHBPYnRhaW5DVFMpOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX2Nsb3NlUmVhZChNNE9TQV9Db250ZXh0IENvbnRleHQpOwotKiBAYnJpZWYgICAgQU1SIHJlYWRlciBjbG9zZXMgdGhlIGZpbGUKLSogQHBhcmFtICAgIENvbnRleHQoSU4/T1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX2Nsb3NlUmVhZChNNE9TQV9Db250ZXh0IENvbnRleHQpOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX2dldFN0YXRlKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRBTVJSX1N0YXRlKiBwU3RhdGUsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkKTsKLSogQGJyaWVmICAgIEdldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEFNUiByZWFkZXIKLSogQHBhcmFtICAgIENvbnRleHQoSU4vT1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcGFyYW0gICAgcFN0YXRlKE9VVCkgICAgICAgIDogQ29yZSBBTVIgcmVhZGVyIHN0YXRlCi0qIEBwYXJhbSAgICBzdHJlYW1JZChJTikgICAgOiBTZWxlY3RzIHRoZSBzdHJlYW0gMCBmb3IgYWxsCi0qCi0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICAgICAgOiAgICBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICA6ICAgIGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogICAgQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX2dldFN0YXRlKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRBTVJSX1N0YXRlKiBwU3RhdGUsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFNUlJfZ2V0VmVyc2lvbiAgICAoTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKQotICogQGJyaWVmICAgIEdldHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgQU1SIHJlYWRlcgotICogQHBhcmFtICAgIHZlcnNpb24oT1VUKSAgICA6IHRoZSBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgdGhlIHZlcnNpb24gbnVtYmVycwotICoKLSAqIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICAgICAgOiAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgOiAgICB2ZXJzaW9uIGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX2dldFZlcnNpb24gICAgKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QU1SUl9nZXRtYXhBVXNpemUgICAgKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRPU0FfVUludDMyICpwTWF4QXVTaXplKQotICogQGJyaWVmICAgIENvbXB1dGVzIHRoZSBtYXhpbXVtIGFjY2VzcyB1bml0IHNpemUgb2YgYSBzdHJlYW0KLSAqCi0gKiBAcGFyYW0gICAgQ29udGV4dCAgICAgICAgKElOKSAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcE1heEF1U2l6ZSAgICAoT1VUKSBNYXhpbXVtIEFjY2VzcyBVbml0IHNpemUgaW4gdGhlIHN0cmVhbQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBPbmUgb2YgdGhlIGlucHV0IHBvaW50ZXIgaXMgTTRPU0FfTlVMTCAoRGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX2dldG1heEFVc2l6ZShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00T1NBX1VJbnQzMiAqcE1heEF1U2l6ZSk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMqLwotI2VuZGlmIC8qX19NNEFNUl9DT1JFUkVBREVSX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000Q29tbW9uX3R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNENvbW1vbl90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTZhMGZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000Q29tbW9uX3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRDb21tb25fVHlwZXMuaAotICogQGJyaWVmICBkZWZpbmVzIGNvbW1vbiBzdHJ1Y3R1cmVzCi0gKiBAbm90ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIE00Q09NTU9OX1RZUEVTX0gKLSNkZWZpbmUgTTRDT01NT05fVFlQRVNfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgTTRDT01NT05fTWV0YWRhdGFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRDT01NT05fa1Vua25vd25NZXRhRGF0YVR5cGUsCi0gICAgLyogTG9jYWwgZmlsZXMgKi8KLSAgICBNNENPTU1PTl9rVGFnSUQzdjEsICAgICAgICAgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gVEFHIElEMyBWMSAqLwotICAgIE00Q09NTU9OX2tUYWdJRDN2MiwgICAgICAgICAgICAgICAgLyoqPCAgTWV0YWRhdGEgZnJvbSBUQUcgSUQzIFYyICovCi0gICAgTTRDT01NT05fa0FTRkNvbnRlbnREZXNjLCAgICAgICAgLyoqPCAgTWV0YWRhdGEgZnJvbSBBU0YgY29udGVudCBkZXNjcmlwdGlvbiAgKi8KLQotICAgIE00Q09NTU9OX2szR3BwQXNzZXRNb3ZpZUJveCwgICAgLyoqPCAgTWV0YWRhdGEgZnJvbSBhIDNncHAgZmlsZSAobW92aWUgYm94KSAqLwotICAgIE00Q09NTU9OX2szR3BwQXNzZXRUcmFja0JveCwgICAgLyoqPCAgTWV0YWRhdGEgZnJvbSBhIDNncHAgZmlsZSAodHJhY2sgYm94KSAqLwotCi0gICAgLyogU3RyZWFtaW5nICovCi0gICAgTTRDT01NT05fa01ldGFEYXRhU2RwU2Vzc2lvbiwgICAgLyoqPCAgTWV0YWRhdGEgZnJvbSBhbiBTRFAgZmlsZSAoU2Vzc2lvbiBsZXZlbCkgKi8KLSAgICBNNENPTU1PTl9rTWV0YURhdGFTZHBBdWRpbywgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYW4gU0RQIGZpbGUgKG1lZGlhIGF1ZGlvIGxldmVsKSAqLwotICAgIE00Q09NTU9OX2tNZXRhRGF0YVNkcFZpZGVvLCAgICAgICAgLyoqPCAgTWV0YWRhdGEgZnJvbSBhbiBTRFAgZmlsZSAobWVkaWEgdmlkZW8gbGV2ZWwpICovCi0KLSAgICBNNENPTU1PTl9rSnBlZ0V4aWYgICAgICAgICAgICAgICAgLyoqPCBFWElGIGluIEpQRUcgKi8KLX0gTTRDT01NT05fTWV0YWRhdGFUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00VlBTX0VuY29kaW5nRm9ybWF0Ci0gKiBAYnJpZWYgICAgICAgIFRleHQgZW5jb2RpbmcgZm9ybWF0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRDT01NT05fa0VuY0Zvcm1hdFVua25vd24gICAgPSAwLCAgICAgIC8qKjwgVW5rbm93biBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE00Q09NTU9OX2tFbmNGb3JtYXRBU0NJSSAgICA9IDEsICAgICAgICAvKio8IElTTy04ODU5LTEuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgICAgICAgICAgICAgICAgKi8KLSAgICBNNENPTU1PTl9rRW5jRm9ybWF0VVRGOCAgICAgICAgPSAyLCAgICAgLyoqPCBVVEYtOCBlbmNvZGVkIFVuaWNvZGUgLiBUZXJtaW5hdGVkIHdpdGggJDAwICAgICovCi0gICAgTTRDT01NT05fa0VuY0Zvcm1hdFVURjE2ICAgID0gMyAgICAgICAgIC8qKjwgVVRGLTE2IGVuY29kZWQgVW5pY29kZS4gVGVybWluYXRlZCB3aXRoICQwMCAwMCAqLwotfSAgTTRDT01NT05fRW5jb2RpbmdGb3JtYXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlBTX1N0cmluZwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHN0cmluZyBhdHRyaWJ1dGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgbV9wU3RyaW5nOyAgICAgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGV4dCAgICAgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdWlTaXplOyAgICAgICAgICAgICAgICAvKio8IFRleHQgc2l6ZSBpbiBieXRlcyAgICAgICAgKi8KLSAgICBNNENPTU1PTl9FbmNvZGluZ0Zvcm1hdCAgICBtX0VuY29kaW5nRm9ybWF0OyAgICAvKio8IFRleHQgZW5jb2RpbmcgZm9ybWF0ICAgICovCi0KLX0gTTRDT01NT05fU3RyaW5nOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNENPTU1PTl9CdWZmZXIKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBnZW5lcmljIGJ1ZmZlciBhdHRyaWJ1dGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgbV9wQnVmZmVyOyAgICAgICAgLyoqPCBQb2ludGVyIHRvIGJ1ZmZlciAgICAgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fc2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgYnVmZmVyIGluIGJ5dGVzICAgICovCi19IE00Q09NTU9OX0J1ZmZlcjsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRDT01NT05fa01pbWVUeXBlX05PTkUsCi0gICAgTTRDT01NT05fa01pbWVUeXBlX0pQRywKLSAgICBNNENPTU1PTl9rTWltZVR5cGVfUE5HLAotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9CTVAsICAgLyogYml0bWFwLCB3aXRoIGhlYWRlciAqLwotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9SR0IyNCwgLyogcmF3IFJHQiAyNCBiaXRzICovCi0gICAgTTRDT01NT05fa01pbWVUeXBlX1JHQjU2NSwgLyogcmF3LCBSR0IgMTYgYml0cyAqLwotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9ZVVY0MjAsCi0gICAgTTRDT01NT05fa01pbWVUeXBlX01QRUc0X0lGcmFtZSAvKiBSQzogdG8gc3VwcG9ydCBQViBhcnQgKi8KLQotfSBNNENPTU1PTl9NaW1lVHlwZTsKLQotLyogcGljdHVyZSB0eXBlIGRlZmluaXRpb24gZnJvbSBpZDN2MiB0YWcqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRDT01NT05fa1BpY1R5cGVfT3RoZXIgICAgICAgICAgICAgICAgPSAweDAwLAotICAgIE00Q09NTU9OX2tQaWNUeXBlXzMyXzMyX0ljb24gICAgICAgICAgICA9IDB4MDEsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfT3RoZXJfSWNvbiAgICAgICAgICAgID0gMHgwMiwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9Gcm9udENvdmVyICAgICAgICAgICAgPSAweDAzLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0JhY2tDb3ZlciAgICAgICAgICAgID0gMHgwNCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9MZWFmbGV0UGFnZSAgICAgICAgICAgID0gMHgwNSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9NZWRpYSAgICAgICAgICAgICAgICA9IDB4MDYsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTGVhZEFydGlzdCAgICAgICAgICAgID0gMHgwNywKLSAgICBNNENPTU1PTl9rUGljVHlwZV9BcnRpc3QgICAgICAgICAgICAgICAgPSAweDA4LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0NvbmR1Y3RvciAgICAgICAgICAgID0gMHgwOSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9PcmNoZXN0cmEgICAgICAgICAgICA9IDB4MEEsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQ29tcG9zZXIgICAgICAgICAgICA9IDB4MEIsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTHlyaWNpc3QgICAgICAgICAgICA9IDB4MEMsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfUmVjb3JkaW5nTG9jYXRpb24gICAgPSAweDBELAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0R1cmluZ1JlY29yZGluZyAgICAgICAgPSAweDBFLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0R1cmluZ1BlcmZvcm1hbmNlICAgID0gMHgwRiwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9Nb3ZpZVNjcmVlbkNhcHR1cmUgICAgPSAweDEwLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0JyaWdodENvbG91cmVkRmlzaCAgICA9IDB4MTEsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfSWxsdXN0cmF0aW9uICAgICAgICA9IDB4MTIsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQXJ0aXN0TG9nbyAgICAgICAgICAgID0gMHgxMywKLSAgICBNNENPTU1PTl9rUGljVHlwZV9TdHVkaW9Mb2dvICAgICAgICAgICAgPSAweDE0Ci19IE00Q09NTU9OX1BpY3R1cmVUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00Q09NTU9OX09yaWVudGF0aW9uCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBwb3NzaWJsZSBvcmllbnRhdGlvbiBvZiBhIGZyYW1lIGFzIGRlc2NyaWJlZAotICogICAgICAgICAgICBpbiB0aGUgRVhJRiBzdGFuZGFyZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duID0gMCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0LAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0LAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0LAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbUxlZnQsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbSwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0Qm90dG9tCi19TTRDT01NT05fT3JpZW50YXRpb24gOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNEVYSUZDX0xvY2F0aW9uCi0gKiBAYnJpZWYgICAgICAgIFRoZSBJbWFnZSBHUFMgbG9jYXRpb24gKGV4YW1wbGUgOiA0OLA1Mi4yMScgKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfRmxvYXQgICAgZGVncmVlczsKLSAgICBNNE9TQV9GbG9hdCAgICBtaW5zZWM7Ci19IE00Q09NTU9OX0xvY2F0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNENPTU1PTl9NZXRhRGF0YUFsYnVtQXJ0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZmllbGRzIG9mIGEgYWxidW0gYXJ0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNENPTU1PTl9NaW1lVHlwZSAgICBtX21pbWVUeXBlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV91aVNpemU7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICBtX3BEYXRhOwotCi0gICAgTTRDT01NT05fU3RyaW5nICAgICAgICBtX3BEZXNjcmlwdGlvbjsKLQotfSBNNENPTU1PTl9NZXRhRGF0YUFsYnVtQXJ0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNENPTU1PTl9NZXRhRGF0YUZpZWxkcwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGZpZWxkcyBvZiBtZXRhZGF0YSBpbmZvcm1hdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRDT01NT05fTWV0YWRhdGFUeXBlICAgIG1fTWV0YWRhdGFUeXBlOwotCi0gICAgLyogTWV0YSBkYXRhIGZpZWxkcyAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BUaXRsZTsgICAgICAgICAgICAvKio8IFRpdGxlIGZvciB0aGUgbWVkaWEgICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcEFydGlzdDsgICAgICAgICAgICAvKio8IFBlcmZvcm1lciBvciBhcnRpc3QgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQWxidW07ICAgICAgICAgICAgLyoqPCBBbGJ1bSB0aXRsZSBmb3IgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcEF1dGhvcjsgICAgICAgICAgICAvKio8IEF1dGhvciBvZiB0aGUgbWVkaWEgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wR2VucmU7ICAgICAgICAgICAgLyoqPCBHZW5yZSAoY2F0ZWdvcnkgYW5kIHN0eWxlKSBvZiB0aGUgbWVkaWEgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wRGVzY3JpcHRpb247ICAgICAgICAvKio8IENhcHRpb24gb3IgZGVzY3JpcHRpb24gZm9yIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BDb3B5UmlnaHRzOyAgICAgICAgLyoqPCBOb3RpY2UgYWJvdXQgb3JnYW5pemF0aW9uIGhvbGRpbmcgY29weXJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbWVkaWEgZmlsZSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BSZWNvcmRpbmdZZWFyOyAgICAvKio8IFJlY29yZGluZyB5ZWFyIGZvciB0aGUgbWVkaWEgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wUmF0aW5nOyAgICAgICAgICAgIC8qKjwgTWVkaWEgcmF0aW5nICovCi0KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQ2xhc3NpZmljYXRpb247ICAgIC8qKjwgQ2xhc3NpZmljYXRpb24gb2YgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcEtleVdvcmRzOyAgICAgICAgLyoqPCBNZWRpYSBrZXl3b3JkcyAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BMb2NhdGlvbjsgICAgICAgIC8qKjwgTG9jYXRpb24gaW5mb3JtYXRpb24gKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wVXJsOyAgICAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBvZiB0aGUgcmVzb3VyY2UgKi8KLQotICAgIE00T1NBX1VJbnQ4ICAgICAgICBtX3VpVHJhY2tOdW1iZXI7ICAgIC8qKjwgVHJhY2sgbnVtYmVyIGZvciB0aGUgbWVkaWEqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX3VpRHVyYXRpb247ICAgICAgICAvKio8IFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKi8KLQotICAgIE00Q09NTU9OX01ldGFEYXRhQWxidW1BcnQgICAgbV9hbGJ1bUFydDsgICAgLyoqPCBBbGJ1bUFydCBkZXNjcmlwdGlvbiAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICAgICAgICAgICAgICBtX3BNb29kOyAgICAvKio8IE1vb2Qgb2YgdGhlIG1lZGlhICovCi0KLSAgICAvKio8IE1vZGlmcyBBQ08gNC8xMi8wNyA6IGFkZCBFeGlmIHNwZWNpZmljIGluZm9zICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcENyZWF0aW9uRGF0ZVRpbWU7ICAgIC8qKjwgZGF0ZSBhbmQgdGltZSBvcmlnaW5hbCBpbWFnZSB3YXMgZ2VuZXJhdGVkICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcExhc3RDaGFuZ2VEYXRlVGltZTsgICAgLyoqPCBmaWxlIGNoYW5nZSBkYXRlIGFuZCB0aW1lICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcE1hbnVmYWN0dXJlcjsgICAgICAgIC8qKjwgbWFudWZhY3R1cmVyIG9mIGltYWdlIGlucHV0IGVxdWlwbWVudCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BNb2RlbDsgICAgICAgICAgICAgICAgLyoqPCBtb2RlbCBvZiBpbWFnZSBpbnB1dCBlcXVpcG1lbnQgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wU29mdHdhcmU7ICAgICAgICAgICAgLyoqPCBzb2Z0d2FyZSB1c2VkICovCi0gICAgTTRDT01NT05fT3JpZW50YXRpb24gbV9PcmllbnRhdGlvbjsgICAgICAgIC8qKjwgT3JpZW50YXRpb24gb2YgdGhlIHBpY3R1cmUgKi8KLQotICAgIC8qKjwgTW9kaWZzIEZTIDI5LzA4LzA4IDogYWRkaXRpb25uYWwgRXhpZiBpbmZvcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX3dpZHRoOyAgICAgICAgICAgIC8qKjwgaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzICovCi0gICAgTTRPU0FfVUludDMyICAgIG1faGVpZ2h0OyAgICAgICAgICAgIC8qKjwgaW1hZ2UgaGVpZ2h0IGluIHBpeGVscyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX3RodW1ibmFpbFNpemU7ICAgIC8qKjwgc2l6ZSBvZiB0aGUgdGh1bWJuYWlsICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcExhdGl0dWRlUmVmOyAgICAgICAgLyoqPCBMYXRpdHVkZSByZWZlcmVuY2UgKi8KLSAgICBNNENPTU1PTl9Mb2NhdGlvbiBtX2xhdGl0dWRlOyAgICAgICAgLyoqPCBMYXRpdHVkZSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BMb25naXR1ZGVSZWY7ICAgIC8qKjwgTG9uZ2l0dWRlIHJlZmVyZW5jZSAqLwotICAgIE00Q09NTU9OX0xvY2F0aW9uIG1fbG9uZ2l0dWRlOyAgICAgICAgLyoqPCBMb25naXR1ZGUgICovCi0KLX0gTTRDT01NT05fTWV0YURhdGFGaWVsZHM7Ci0KLQotI2VuZGlmIC8qTTRDT01NT05fVFlQRVNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REFfVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REFfVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThjYWI3ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERBX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00REFfVHlwZXMuaAotICogQGJyaWVmICAgIERhdGEgYWNjZXNzIHR5cGUgZGVmaW5pdGlvbgotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgbWVkaWEgc3BlY2lmaWMgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNERBX1RZUEVTX0hfXwotI2RlZmluZSBfX000REFfVFlQRVNfSF9fCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qX19jcGx1c3BsdXMqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00X1N0cmVhbVR5cGUKLSAqIEBicmllZiAgICAgICAgVHlwZSB1c2VkIHRvIGRlc2NyaWJlIGEgc3RyZWFtIChhdWRpbyBvciB2aWRlbyBkYXRhIGZsb3cpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00REFfU3RyZWFtVHlwZVVua25vd24gICAgICAgICAgICAgICAgPSAtMSwgICAgLyoqPCBVbmtub3cgdHlwZSAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQgICAgICAgICAgICA9IDAsICAgIC8qKjwgTVBFRy00IHZpZGVvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzICAgICAgICAgICAgPSAxLCAgICAvKio8IEgyNjMgdmlkZW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQgICAgPSAyLCAgICAvKio8IEFtciBuYXJyb3cgYmFuZCBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQgICAgICAgID0gMywgICAgLyoqPCBBbXIgd2lkZSBiYW5kIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEFBQyBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBNUDMgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb01KcGVnICAgICAgICAgICAgPSA2LCAgICAvKio8IE1KUEVHIHZpZGVvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9QY20gICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFdhdiBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvTWlkaSAgICAgICAgICAgID0gOCwgICAgLyoqPCBNaWRpIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YyAgICAgICAgPSA5LCAgICAvKio8IE1QRUctNCBBVkMgdmlkZW8gKGgyNjQpICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRFRTICAgICAgICAgICAgPSAxMCwgICAgLyoqPCBBQUMgQURUUyBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURJRiAgICAgICAgICAgID0gMTEsICAgIC8qKjwgQUFDIEFESUYgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb1dtYSAgICAgICAgICAgICAgICA9IDEyLCAgICAvKio8IFdNQSBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvV212ICAgICAgICAgICAgICAgID0gMTMsICAgIC8qKjwgV01WIHZpZGVvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9SZWFsICAgICAgICAgICAgPSAxNCwgICAvKio8IFJFQUwgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb1JlYWwgICAgICAgICAgICA9IDE1LCAgIC8qKjwgUkVBTCB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYyAgICAgICAgICAgID0gMTYsICAgLyoqPCBFdnJjIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVGltZWRUZXh0ICAgICAgICAgICAgPSAyMCwgICAgLyoqPCBUaW1lZCBUZXh0ICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9CYmEgICAgICAgICAgICAgICAgPSAyMSwgICAgLyoqPCBCZWF0IEJyZXcgYXVkaW8gZm9tYXQgKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb1NtYWYgICAgICAgICAgICA9IDIyLCAgICAvKio8IFNNQUYgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0ltZWxvZHkgICAgICAgICAgICA9IDIzLCAgICAvKio8IElNRUxPRFkgYXVkaW8qLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvWG1mICAgICAgICAgICAgICAgID0gMjQsICAgIC8qKjwgWE1GIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9CcGMgICAgICAgICAgICAgICAgPSAyNSwgICAgLyoqPCBCUEMgYXVkaW8gKi8KLQotICAgIC8qIEFEUENNICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9BRFBjbSAgICAgICAgICAgID0gMjYsICAgIC8qKjwgQURQQ00gKi8KLQotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvQVJHQjg4ODggICAgICAgID0gMjcKLX0gTTRfU3RyZWFtVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfU3RyZWFtSGFuZGxlcgotICogQGJyaWVmICAgICAgICBCYXNlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHN0cmVhbS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X1N0cmVhbVR5cGUgICAgbV9zdHJlYW1UeXBlOyAgICAgICAgICAgICAgICAvKio8IFN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fc3RyZWFtSWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IFN0cmVhbSBJZCAodW5pcXVlIG51bWJlciBkZWZpbm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cmVhbSkgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgbV9kdXJhdGlvbjsgICAgICAgICAgICAgICAgICAgIC8qKjwgRHVyYXRpb24gb2YgdGhlIHN0cmVhbSBpbiBtaWxsaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2F2ZXJhZ2VCaXRSYXRlOyAgICAgICAgICAgIC8qKjwgQXZlcmFnZSBiaXRyYXRlIGluIGtiL3MgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9tYXhBVVNpemU7ICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBzaXplIG9mIGFuIEFjY2VzcyBVbml0ICovCi0gICAgTTRPU0FfVUludDgqICAgIG1fcERlY29kZXJTcGVjaWZpY0luZm87ICAgICAgICAvKio8IFBvaW50ZXIgb24gc3BlY2lmaWMgaW5mb3JtYXRpb24gcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY3JlYXRlIGEgZGVjb2RlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOyAgICAvKio8IFNpemUgb2YgdGhlIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIGFib3ZlICovCi0gICAgdm9pZCogICAgICAgICAgICBtX3BVc2VyRGF0YTsgICAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIG9uIFVzZXIgRGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbml0aWFsaXplZCBieSB0aGUgdXNlcikgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9zdHJ1Y3RTaXplOyAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICBtX2JTdHJlYW1Jc09LOyAgICAgICAgICAgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgc3RyZWFtIGhhcyBubyBlcnJvcnMgYWZ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2luZyBpcyBmaW5pc2hlZCAqLwotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbzsgICAgICAgIC8qKjwgUG9pbnRlciBvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgdG8gY3JlYXRlIGEgZGVjb2RlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBzcGVjaWZpYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gcG9pbnRlciBhYm92ZSAqLwotICAgIC8vIE1QRUc0ICYgQUFDIGRlY29kZXJzIHJlcXVpcmUgRVNEUyBpbmZvCi0gICAgTTRPU0FfVUludDgqICAgIG1fcEVTRFNJbmZvOyAgICAgICAgICAgICAgICAvKio8IFBvaW50ZXIgb24gTVBFRzQgb3IgQUFDIEVTRFMgYm94ICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fRVNEU0luZm9TaXplOyAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIE1QRUc0IG9yIEFBQyBFU0RTIGJveCAqLwotfSBNNF9TdHJlYW1IYW5kbGVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIKLSAqIEBicmllZiAgICAgICAgRXh0ZW5kZWQgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgdmlkZW8gc3RyZWFtLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgICBtX2Jhc2ljUHJvcGVydGllczsgICAgICAgIC8qKjwgQXVkaW8tVmlkZW8gc3RyZWFtIGNvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3ZpZGVvV2lkdGg7ICAgICAgICAgICAgLyoqPCBXaWR0aCBvZiB0aGUgdmlkZW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV92aWRlb0hlaWdodDsgICAgICAgICAgICAvKio8IEhlaWdodCBvZiB0aGUgdmlkZW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgbV9hdmVyYWdlRnJhbWVSYXRlOyAgICAgICAgLyoqPCBBdmVyYWdlIGZyYW1lIHJhdGUgb2YgdGhlIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3RyZWFtICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICB2aWRlb1JvdGF0aW9uRGVncmVlczsgICAgICAgIC8qKjwgVmlkZW8gcm90YXRpb24gZGVncmVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3N0cnVjdFNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLX0gTTRfVmlkZW9TdHJlYW1IYW5kbGVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIKLSAqIEBicmllZiAgICAgICAgRXh0ZW5kZWQgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGFuIGF1ZGlvIHN0cmVhbS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X1N0cmVhbUhhbmRsZXIgICAgbV9iYXNpY1Byb3BlcnRpZXM7ICAgICAgICAvKio8IEF1ZGlvLVZpZGVvIHN0cmVhbSBjb21tb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9uYkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBhdWRpbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEtbW9ubywgMi1zdGVyZW8pICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX2J5dGVGcmFtZUxlbmd0aDsgICAgICAgIC8qKjwgU2l6ZSBvZiBmcmFtZSBzYW1wbGVzIGluIGJ5dGVzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX2J5dGVTYW1wbGVTaXplOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgICAgLyoqPCBTYW1wbGUgZnJlcXVlbmN5IGluIGtIeiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi19IE00X0F1ZGlvU3RyZWFtSGFuZGxlcjsKLQotI2lmZGVmIE00VlBTX1NVUFBPUlRfVFRFWFQKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfVGV4dFN0cmVhbUhhbmRsZXIKLSAqIEBicmllZiAgICAgICAgRXh0ZW5kZWQgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgdGV4dCBzdHJlYW0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9TdHJlYW1IYW5kbGVyICAgIG1fYmFzaWNQcm9wZXJ0aWVzOyAgICAvKio8IEF1ZGlvLVZpZGVvIHN0cmVhbSBjb21tb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV90cmFja1dpZHRoOyAgICAgICAgLyoqPCBXaWR0aCBvZiB0aGUgdmlkZW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV90cmFja0hlaWdodDsgICAgICAgIC8qKjwgSGVpZ2h0IG9mIHRoZSB2aWRlbyBpbiB0aGUgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3RyYWNrWHBvczsgICAgICAgIC8qKjwgWCBwb3NpdGlvbiBvZiB0aGUgdGV4dCB0cmFjayBpbiB2aWRlbyBhcmVhICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3RyYWNrWXBvczsgICAgICAgIC8qKjwgWSBwb3NpdGlvbiBvZiB0aGUgdGV4dCB0cmFjayBpbiB2aWRlbyBhcmVhICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICBiYWNrX2NvbF9yZ2JhWzRdOyAgICAvKio8IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIFJHQkEgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIHVpTGVuZ2h0OyAgICAgICAgICAgIC8qKjwgdGhlIHN0cmluZyBsZW5naHQgaW4gYnl0ZXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIGRpc3BfZmxhZzsgICAgICAgICAgICAvKio8IHRoZSB3YXkgdGV4dCB3aWxsIGJlIGRpc3BsYXllZCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgaG9yaXpfanVzdGlmOyAgICAgICAgLyoqPCB0aGUgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uIG9mIHRoZSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICB2ZXJ0aV9qdXN0aWY7ICAgICAgICAvKio8IHRoZSB2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uIG9mIHRoZSB0ZXh0ICovCi0gICAgLyogc3R5bGUgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIHN0eWxfc3RhcnRfY2hhcjsgICAgLyoqPCB0aGUgZmlyc3QgY2hhcmFjdGVyIGltcGFjdGVkIGJ5IHN0eWxlICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBzdHlsX2VuZF9jaGFyOyAgICAgICAgLyoqPCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW1wYWN0ZWQgYnkgc3R5bGUgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIGZvbnRJRDsgICAgICAgICAgICAgICAgLyoqPCBJRCBvZiB0aGUgZm9udCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgZmFjZV9zdHlsZTsgICAgICAgICAgICAvKio8IHRoZSB0ZXh0IGZhY2Utc3R5bGU6IGJvbGQsIGl0YWxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZWQsIHBsYWluKGRlZmF1bHQpICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICBmb250X3NpemU7ICAgICAgICAgICAgLyoqPCBzaXplIGluIHBpeGVsIG9mIGZvbnQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIHRleHRfY29sX3JnYmFbNF07ICAgIC8qKjwgdGhlIHRleHQgY29sb3IgaW4gUkdCQSAqLwotICAgIC8qIGJveCAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgYm94X3RvcDsgICAgICAgICAvKio8IHRoZSB0b3AgcG9zaXRpb24gb2YgdGV4dCBib3ggaW4gdGhlIHRyYWNrIGFyZWEgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIGJveF9sZWZ0OyAgICAgICAgLyoqPCB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0ZXh0IGJveCBpbiB0aGUgdHJhY2sgYXJlYSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgYm94X2JvdHRvbTsgICAgICAvKio8IHRoZSBib3R0b20gcG9zaXRpb24gb2YgdGV4dCBib3ggaW4gdGhlIHRyYWNrIGFyZWEgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIGJveF9yaWdodDsgICAgICAgLyoqPCB0aGUgcmlnaHQgcG9zaXRpb24gb2YgdGV4dCBib3ggaW4gdGhlIHRyYWNrIGFyZWEgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLX0gTTRfVGV4dFN0cmVhbUhhbmRsZXI7Ci0KLSNlbmRpZiAvKk00VlBTX1NVUFBPUlRfVFRFWFQqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9BY2Nlc3NVbml0Ci0gKiBAYnJpZWYgICAgICAgIFN0cnVjdHVyZSB0byBkZXNjcmliZSBhbiBhY2Nlc3MgdW5pdC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3N0cmVhbUlEOyAgICAgICAvKio8IElkIG9mIHRoZSBzdHJlYW0gdG8gZ2V0IGFuIEFVIGZyb20gKi8KLSAgTTRPU0FfTWVtQWRkcjggICAgICAgIG1fZGF0YUFkZHJlc3M7ICAgICAgLyoqPCBQb2ludGVyIHRvIGEgbWVtb3J5IGFyZWEgd2l0aCB0aGUgZW5jb2RlZCBkYXRhICovCi0gIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fc2l6ZTsgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZGF0YUFkcmVzcyBhcmVhICovCi0gIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1fQ1RTOyAgICAgICAgICAgIC8qKjwgQ29tcG9zaXRpb24gVGltZSBTdGFtcCBmb3IgdGhlIEFjY2VzcyBVbml0ICovCi0gIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1fRFRTIDsgICAgICAgICAgIC8qKjwgRGVjb2RlZCBUaW1lIFN0YW1wIGZvciB0aGUgQWNjZXNzIFVuaXQgKi8KLSAgTTRPU0FfVUludDggICAgICAgICAgICBtX2F0dHJpYnV0ZTsgICAgICAgLyoqPCBSQVAgaW5mb3JtYXRpb24gJiBBVSBjb3JydXB0ZWQgKi8KLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9tYXhzaXplOyAgICAgICAgLyoqPCBNYXhpbXVtIHNpemUgb2YgdGhlIEFVICovCi0gIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgIC8qKjwgU3RydWN0dXJlIHNpemUgKi8KLX0gTTRfQWNjZXNzVW5pdDsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLSNlbmRpZiAvKiBfX000REFfVFlQRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9Db21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTNlMzA2Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRERUNPREVSX0NvbW1vbi5oCi0gKiBAYnJpZWYgIFNoZWxsIERlY29kZXIgY29tbW9uIGludGVyZmFjZSBkZWNsYXJhdGlvbgotICogQG5vdGUgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGNvbW1vbiBpbnRlcmZhY2VzIHRoYXQgZGVjb2RlciBzaGVsbHMgbXVzdCBpbXBsZW1lbnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000REVDT0RFUl9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRERUNPREVSX0NPTU1PTl9IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0KLS8qIC0tLS0tIEVycm9ycyBhbmQgV2FybmluZ3MgLS0tLS0gKi8KLQotLyoqCi0gKiBXYXJuaW5nOiB0aGVyZSBpcyBubyBuZXcgZGVjb2RlZCBmcmFtZSB0byByZW5kZXIgc2luY2UgdGhlIGxhc3QgcmVuZGVyaW5nCi0gKi8KLSNkZWZpbmUgTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00REVDT0RFUl9DT01NT04sIDB4MDAwMSkKLS8qKgotICogV2FybmluZzogdGhlIGRlYmxvY2tpbmcgZmlsdGVyIGlzIG5vdCBpbXBsZW1lbnRlZAotICovCi0jZGVmaW5lIE00V0FSX0RFQkxPQ0tJTkdfRklMVEVSX05PVF9JTVBMRU1FTlRFRCBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRERUNPREVSX0NPTU1PTixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMikKLQotCi0vKiBFcnJvcjogU3RyZWFtIEgyNjMgcHJvZmlsZXMgKG90aGVyIHRoYW4gIDApIGFyZSBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIE00RVJSX0RFQ09ERVJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9NUEVHNCwgMHgwMDAxKQotLyogRXJyb3I6IFN0cmVhbSBIMjYzIG5vdCBiYXNlbGluZSBub3Qgc3VwcG9ydGVkIChTdXBwb3J0ZWQgc2l6ZXMgYXJlIENJRiwgUUNJRiBvciBTUUNJRikgKi8KLSNkZWZpbmUgTTRFUlJfREVDT0RFUl9IMjYzX05PVF9CQVNFTElORSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX01QRUc0LCAweDAwMDIpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBBVkMgZGVjb2RlciBwcm9maWxlIGFuZCBsZXZlbCBmb3IgdGhlIGN1cnJlbnQgaW5zdGFuY2UKLSAqIEBub3RlICAgIFRoaXMgb3B0aW9ucyBjYW4gYmUgcmVhZCBmcm9tIGRlY29kZXIgdmlhIE00REVDT0RFUl9nZXRPcHRpb25fZmN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzEgPSAwLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8xYiwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMV8xLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8xXzIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzFfMywKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMiwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMl8xLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8yXzIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzMsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzNfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfM18yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF80LAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF80XzEsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzRfMiwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfNSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfNV8xLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfYW5kX0xldmVsX091dF9PZl9SYW5nZSA9IDI1NQotfSBNNERFQ09ERVJfQVZDUHJvZmlsZUxldmVsOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00REVDT0RFUl9PcHRpb25JRAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBkZWNvZGVyIG9wdGlvbnMKLSAqIEBub3RlICAgIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGEgZGVjb2RlciB2aWEgTTRERUNPREVSX2dldE9wdGlvbl9mY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKioKLSAgICBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIGNvcmUgZGVjb2RlcgotICAgICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9WZXJzaW9uICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwMSksCi0gICAgLyoqCi0gICAgR2V0IHRoZSBzaXplIG9mIHRoZSBjdXJyZW50bHkgZGVjb2RlZCB2aWRlbwotICAgICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9WaWRlb1NpemUgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDIpLAotICAgIC8qKgotICAgIFNldCB0aGUgY29udmVyc2lvbiBmaWx0ZXIgdG8gdXNlIGF0IHJlbmRlcmluZwotICAgICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDMpLAotICAgIC8qKgotICAgIEFjdGl2YXRlIHRoZSBEZWJsb2NraW5nIGZpbHRlcgotICAgICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9EZWJsb2NraW5nRmlsdGVyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDA0KSwKLSAgICAvKioKLSAgICBHZXQgbmV4IHJlbmRlcmVkIGZyYW1lIENUUwotICAgICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9OZXh0UmVuZGVyZWRGcmFtZUNUUyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNSksCi0KLSAgICAvKioKLSAgICBTZXQgdGhlIFlVViBkYXRhIHRvIHRoZSBkdW1teSB2aWRlbyBkZWNvZGVyCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX0RlY1l1dkRhdGEgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDYpLAotICAgIC8qKgotICAgIFNldCB0aGUgWVVWIGRhdGEgd2l0aCBjb2xvciBlZmZlY3QgYXBwbGllZCB0byB0aGUgZHVtbXkgdmlkZW8gZGVjb2RlcgotICAgICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91cyA9Ci0gICAgICAgIE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwNyksCi0KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3RDb250aWd1b3VzID0KLSAgICAgICAgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDA4KSwKLQotICAgIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdCA9Ci0gICAgICAgIE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwOSksCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN1cHBvcnRlZCB2aWRlbyBkZWNvZGVycyBhbmQgY2FwYWJpbGl0aWVzICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9WaWRlb0RlY29kZXJzQW5kQ2FwYWJpbGl0aWVzID0KLSAgICAgICAgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDEwKSwKLQotICAgIC8qIGNvbW1vbiB0byBNUEVHNCBkZWNvZGVycyAqLwotICAgIC8qKgotICAgICAqIEdldCB0aGUgRGVjb2RlckNvbmZpZ0luZm8gKi8KLSAgICBNNERFQ09ERVJfTVBFRzRfa09wdGlvbklEX0RlY29kZXJDb25maWdJbmZvID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9NUEVHNCwgMHgwMSksCi0KLSAgICAvKiBsYXN0IGRlY29kZWQgY3RzICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9BVkNMYXN0RGVjb2RlZEZyYW1lQ1RTID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVZDLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSkKLS8qIExhc3QgZGVjb2RlZCBjdHMgKi8KLQotfSBNNERFQ09ERVJfT3B0aW9uSUQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvCi0gKiBAYnJpZWYgICAgQ29udGFpbnMgaW5mbyByZWFkIGZyb20gdGhlIE1QRUctNCBWaWRlb09iamVjdExheWVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDggICAgICAgIHVpUHJvZmlsZTsgICAgICAgICAgICAgICAgLyoqPCBwcm9maWxlIGFuZCBsZXZlbCBhcyBkZWZpbmVkIGluIHRoZSBWaXN1YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBTZXF1ZW5jZSBoZWFkZXIsIGlmIHByZXNlbnQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlUaW1lU2NhbGU7ICAgICAgICAgICAgLyoqPCB0aW1lIHNjYWxlIGFzIHBhcnNlZCBpbiBWT0wgaGVhZGVyICovCi0gICAgTTRPU0FfVUludDggICAgICAgIHVpVXNlT2ZSZXN5bmNoTWFya2VyOyAgICAvKio8IFVzYWdlIG9mIHJlc3luY2hyb25pemF0aW9uIG1hcmtlciAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgIGJEYXRhUGFydGl0aW9uOyAgICAgICAgICAgIC8qKjwgSWYgMSBkYXRhIHBhcnRpdGlvbmluZyBpcyB1c2VkLiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgIGJVc2VPZlJWTEM7ICAgICAgICAgICAgICAgIC8qKjwgVXNhZ2Ugb2YgUlZMQyBmb3IgdGhlIHN0cmVhbSAqLwotCi19IE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbzsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00REVDT0RFUl9WaWRlb1NpemUKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgdmlkZW8gc2l6ZSAod2lkdGggYW5kIGhlaWdodCkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHZpYSB0aGUgTTRERUNPREVSX2dldE9wdGlvbl9mY3QKLSAqICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGRlY29kZWQgdmlkZW8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRERUNPREVSX1ZpZGVvU2l6ZQotewotICAgIE00T1NBX1VJbnQzMiAgIG1fdWlXaWR0aDsgICAgLyoqPCB2aWRlbyB3aWR0aCAgaW4gcGl4ZWxzICovCi0gICAgTTRPU0FfVUludDMyICAgbV91aUhlaWdodDsgICAgLyoqPCB2aWRlbyBoZWlnaHQgaW4gcGl4ZWxzICovCi0KLX0gTTRERUNPREVSX1ZpZGVvU2l6ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRERUNPREVSX091dHB1dEZpbHRlcgotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb252ZXJzaW9uIGZpbHRlcgotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgcG9pbnRlciBhbmQgaXRzIHVzZXIgZGF0YSB2aWEgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICBNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdCAgICB3aXRoIHRoZSBvcHRpb24KLSAqICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000REVDT0RFUl9PdXRwdXRGaWx0ZXIKLXsKLSAgICBNNE9TQV9Wb2lkICAgKm1fcEZpbHRlckZ1bmN0aW9uOyAgICAvKio8IHBvaW50ZXIgdG8gdGhlIGZpbHRlciBmdW5jdGlvbiAqLwotICAgIE00T1NBX1ZvaWQgICAqbV9wRmlsdGVyVXNlckRhdGE7ICAgIC8qKjwgdXNlciBkYXRhIG9mIHRoZSBmaWx0ZXIgICAgICAgICovCi0KLX0gTTRERUNPREVSX091dHB1dEZpbHRlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNERFQ09ERVJfVmlkZW9UeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIHZpZGVvIHR5cGVzIHVzZWQgdG8gY3JlYXRlIGRlY29kZXJzCi0gKiBAbm90ZSAgICBUaGlzIGVudW0gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBWUFMgdG8gaWRlbnRpZnkgYSBjdXJyZW50bHkgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgIHZpZGVvIGRlY29kZXIgaW50ZXJmYWNlLiBFYWNoIGRlY29kZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIG9uZSBvZiB0aGlzIHR5cGUgYXNzb2NpYXRlZC4KLSAqICAgICAgICAgICAgV2hlbiBhIGRlY29kZXIgaW5zdGFuY2UgaXMgbmVlZGVkLCB0aGlzIHR5cGUgaXMgdXNlZCB0byBpZGVudGlmeSBhbmQKLSAqICAgICAgICAgICAgYW5kIHJldHJpZXZlIGl0cyBpbnRlcmZhY2UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNCA9IDAsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVNSlBFRywKLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZUFWQywKLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZVdNViwKLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZVJFQUwsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVZVVY0MjBQLAotCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVfTkIgIC8qIG51bWJlciBvZiBkZWNvZGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLQotfSBNNERFQ09ERVJfVmlkZW9UeXBlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQzMiBtUHJvZmlsZTsKLSAgICBNNE9TQV9VSW50MzIgbUxldmVsOwotfSBWaWRlb1Byb2ZpbGVMZXZlbDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFZpZGVvUHJvZmlsZUxldmVsICpwcm9maWxlTGV2ZWw7Ci0gICAgTTRPU0FfVUludDMyIHByb2ZpbGVOdW1iZXI7Ci19IFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRfU3RyZWFtVHlwZSBjb2RlYzsKLSAgICBWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllcyAqY29tcG9uZW50OwotICAgIE00T1NBX1VJbnQzMiBjb21wb25lbnROdW1iZXI7Ci19IFZpZGVvRGVjb2RlcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFZpZGVvRGVjb2RlciAqZGVjb2RlcjsKLSAgICBNNE9TQV9VSW50MzIgZGVjb2Rlck51bWJlcjsKLX0gTTRERUNPREVSX1ZpZGVvRGVjb2RlcnM7Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICBhbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChJTikgICAgUG9pbnRlciB0byBhIHZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbgotICogQHBhcmFtICAgIHBHbG9iYWxJbnRlcmZhY2U6ICAoSU4pICAgIFBvaW50ZXIgdG8gdGhlIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSBzdHJ1Y3R1cmUgdGhhdCBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYnkgdGhlIGRlY29kZXIgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbQotICogQHBhcmFtICAgIHBEYXRhSW50ZXJmYWNlOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gdGhlIE00UkVBREVSX0RhdGFJbnRlcmZhY2Ugc3RydWN0dXJlIHRoYXQgbXVzdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGJ5IHRoZSBkZWNvZGVyIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0KLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdCAgICAgICAgKElOKSAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZGVjb2RlZCBkYXRhIGFyZSBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9jcmVhdGVfZmN0KSAgICAoTTRPU0FfQ29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBEYXRhSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGRlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9kZXN0cm95X2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLXRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGVjb2RlcgotICogICAgICAgICAgLXRoZSBzaXplICh3aWR0aHhoZWlnaHQpIG9mIHRoZSBpbWFnZQotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgIChJTikgICAgICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgIChJTi9PVVQpICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikgd2hlcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gaXMgc3RvcmVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9nZXRPcHRpb25fZmN0KShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIHNldCBhbiBvcHRpb24gdmFsdWUgb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKiAgICAgICAgICAtdGhlIGNvbnZlcnNpb24gZmlsdGVyIHRvIHVzZSBhdCByZW5kZXJpbmcKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChJTikgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBUaGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgb3B0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfc2V0T3B0aW9uX2ZjdCkoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgRGVjb2RlIEFjY2VzcyBVbml0cyB1cCB0byBhIHRhcmdldCB0aW1lCi0gKiBAbm90ZSAgICBQYXJzZSBhbmQgZGVjb2RlIHRoZSBzdHJlYW0gdW50aWwgaXQgaXMgcG9zc2libGUgdG8gb3V0cHV0IGEgZGVjb2RlZCBpbWFnZSBmb3Igd2hpY2gKLSAqICAgICAgICAgICAgdGhlIGNvbXBvc2l0aW9uIHRpbWUgaXMgZXF1YWwgb3IgZ3JlYXRlciB0byB0aGUgcGFzc2VkIHRhcmdldGVkIHRpbWUKLSAqICAgICAgICAgIFRoZSBkYXRhIGFyZSByZWFkIGZyb20gdGhlIHJlYWRlciBkYXRhIGludGVyZmFjZQotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcFRpbWU6ICAgICAgICAoSU4vT1VUKSAgICBJTjogVGltZSB0byBkZWNvZGUgdXAgdG8gKGluIG1pbGxpIHNlY29uZGVzKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6VGltZSBvZiB0aGUgbGFzdCBkZWNvZGVkIGZyYW1lIChpbiBtcykKLSAqIEBwYXJhbSAgIGJKdW1wOiAgICAgIChJTikgICAgICAgIDAgaWYgbm8ganVtcCBvY2N1cmVkIGp1c3QgYmVmb3JlIHRoaXMgY2FsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBpZiBhIGEganVtcCBoYXMganVzdCBiZWVuIG1hZGUKLSAqIEBwYXJhbSAgIHRvbGVyYW5jZTogICAgICAoSU4pICAgICAgICBXZSBtYXkgZGVjb2RlIGFuIGVhcmxpZXIgZnJhbWUgd2l0aGluIHRoZSB0b2xlcmFuY2UuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHRpbWUgZGlmZmVyZW5jZSBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00V0FSX05PX01PUkVfQVUgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgYWNjZXNzIHVuaXQgdG8gZGVjb2RlIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX2RlY29kZV9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X01lZGlhVGltZSogcFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSnVtcCwgTTRPU0FfVUludDMyIHRvbGVyYW5jZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFJlbmRlcnMgdGhlIHZpZGVvIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgIHBUaW1lOiAgICAgICAoSU4vT1VUKSAgIElOOiBUaW1lIHRvIHJlbmRlciB0byAoaW4gbWlsbGkgc2Vjb25kZXMpCi0gKiAgICAgICAgICAgICAgICBPVVQ6VGltZSBvZiB0aGUgYWN0dWFsbHkgcmVuZGVyZWQgZnJhbWUgKGluIG1zKQotICogQHBhcmFtICAgIHBPdXRwdXRQbGFuZTooT1VUKSAgICAgICAgT3V0cHV0IHBsYW5lIGZpbGxlZCB3aXRoIGRlY29kZWQgZGF0YSAoY29udmVydGVkKQotICogQHBhcmFtICAgYkZvcmNlUmVuZGVyOihJTikgICAgICAgMSBpZiB0aGUgaW1hZ2UgbXVzdCBiZSByZW5kZXJlZCBldmVuIGl0IGhhcyBhbHJlYWR5IGJlZW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgaWYgbm90IChpbiB3aGljaCBjYXNlIHRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgIE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICAgIElmIHRoZSBmcmFtZSB0byByZW5kZXIgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX3JlbmRlcl9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X01lZGlhVGltZSogcFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwdXRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJGb3JjZVJlbmRlcik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZQotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBnZW5lcmljIHZpZGVvIGRlY29kZXIgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgb2Ygb25lIHZpZGVvIGRlY29kZXIgdHlwZS4KLSAqICAgICAgICAgICAgICAgIFRoZSBkZWNvZGVyIHR5cGUgaXMgb25lIG9mIHRoZSBNNERFQ09ERVJfVmlkZW9UeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000REVDT0RFUl9WaWRlb0ludGVyZmFjZQotewotICAgIE00REVDT0RFUl9jcmVhdGVfZmN0KiAgICAgICAgbV9wRmN0Q3JlYXRlOwotICAgIE00REVDT0RFUl9kZXN0cm95X2ZjdCogICAgICAgIG1fcEZjdERlc3Ryb3k7Ci0gICAgTTRERUNPREVSX2dldE9wdGlvbl9mY3QqICAgIG1fcEZjdEdldE9wdGlvbjsKLSAgICBNNERFQ09ERVJfc2V0T3B0aW9uX2ZjdCogICAgbV9wRmN0U2V0T3B0aW9uOwotICAgIE00REVDT0RFUl9kZWNvZGVfZmN0KiAgICAgICAgbV9wRmN0RGVjb2RlOwotICAgIE00REVDT0RFUl9yZW5kZXJfZmN0KiAgICAgICAgbV9wRmN0UmVuZGVyOwotfSBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2U7Ci0KLSNlbmRpZiAvKl9fTTRERUNPREVSX0NPTU1PTl9IX18qLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX051bGwuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9OdWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0N2Q4NTcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX051bGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZEX051bGwuaAotICogQGJyaWVmICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIGEgIm51bGwiIHZpZGVvIGRlY29kZXIsaS5lLiBhIGRlY29kZXIKLSAqICAgICAgICAgIHRoYXQgZG9lcyBub3QgZG8gYWN0dWFsIGRlY29kaW5nLgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGdldEludGVyZmFjZSBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRERUNPREVSX05VTExfSF9fCi0jZGVmaW5lIF9fTTRERUNPREVSX05VTExfSF9fCi0KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVjb2RlcgotICogQHBhcmFtIHBEZWNvZGVyVHlwZSAgICAgICAgOiBQb2ludGVyIHRvIGEgTTRERUNPREVSX1ZpZGVvVHlwZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGRlY29kZXIgdHlwZQotICogQHBhcmFtIHBEZWNvZGVySW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBkZWNvZGVyLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0gKgotICogQHJldHVybnMgOiBNNE5PX0VSUk9SICBpZiBPSwotICogICAgICAgICAgICBNNEVSUl9BTExPQyBpZiBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9nZXRJbnRlcmZhY2UoIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNERFQ09ERVJfTlVMTF9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfQXVkaW9Db21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9BdWRpb0NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmEwMmEwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9BdWRpb0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEVOQ09ERVJfQXVkaW9Db21tb24uaAotICogQGJyaWVmICAgIFZFUyBhdWRpbyBlbmNvZGVycyBzaGVsbCBpbnRlcmZhY2UuCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdHlwZXMgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBWRVMgdG8gYWJzdHJhY3QgYXVkaW8gZW5jb2RlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRFTkNPREVSX0FVRElPQ09NTU9OX0hfXwotI2RlZmluZSBfX000RU5DT0RFUl9BVURJT0NPTU1PTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIgICAgIC8qIGZvciBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKCkgKi8KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotI2RlZmluZSBNNEVOQ09ERVJfQVVESU9fTkJfQ0hBTk5FTFNfTUFYIDIKLS8qIFdBUk5JTkc6IHRoaXMgdmFsdWUgbXVzdCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZ3JhYmJlZCAqLwotLy8jZGVmaW5lIE00RU5DT0RFUl9BVURJT19QQ01fU0FNUExFX05VTUJFUiA5NjAgICAgLyogaW1wb3NlZCBieSB0aGUgQUFDIGVuY29kZXIuICovCi0jZGVmaW5lIE00RU5DT0RFUl9BVURJT19QQ01fU0FNUExFX05VTUJFUiAxMDI0ICAgIC8qIGltcG9zZWQgYnkgdGhlIEFBQyBlbmNvZGVyLiAqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRFTkNPREVSX0F1ZGlvX09wdGlvbklECi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBjb3JlIEFBQyBzaGVsbCBlbmNvZGVyIG9wdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAvKiBNYXhpbXVtIGdlbmVyYXRlZCBBVSBzaXplICovCi0gICAgTTRFTkNPREVSX0F1ZGlvX21heEFVc2l6ZSAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsTTRFTkNPREVSX0FVRElPLCAweDAxKQotCi19IE00RU5DT0RFUl9BdWRpb19PcHRpb25JRDsKLQotCi0gLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfU2FtcGxpbmdGcmVxdWVuY3kKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgYXVkaW8gc2FtcGxpbmcgZnJlcXVlbmN5LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rODAwMEh6ID0gODAwMCwKLSAgICBNNEVOQ09ERVJfazExMDI1SHogPSAxMTAyNSwKLSAgICBNNEVOQ09ERVJfazEyMDAwSHogPSAxMjAwMCwKLSAgICBNNEVOQ09ERVJfazE2MDAwSHogPSAxNjAwMCwKLSAgICBNNEVOQ09ERVJfazIyMDUwSHogPSAyMjA1MCwKLSAgICBNNEVOQ09ERVJfazI0MDAwSHogPSAyNDAwMCwKLSAgICBNNEVOQ09ERVJfazMyMDAwSHogPSAzMjAwMCwKLSAgICBNNEVOQ09ERVJfazQ0MTAwSHogPSA0NDEwMCwKLSAgICBNNEVOQ09ERVJfazQ4MDAwSHogPSA0ODAwMAotfSBNNEVOQ09ERVJfU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXVkaW8gY29tcHJlc3Npb24gZm9ybWF0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa0FNUk5CID0gMCwKLSAgICBNNEVOQ09ERVJfa0FBQywKLSAgICBNNEVOQ09ERVJfa0F1ZGlvTlVMTCwgICAgLyoqPCBObyBjb21wcmVzc2lvbiAqLwotICAgIE00RU5DT0RFUl9rTVAzLAotICAgIE00RU5DT0RFUl9rQXVkaW9fTkIgICAgICAgIC8qIG51bWJlciBvZiBlbmNvZGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLQotfSBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0NoYW5uZWxOdW1iZXIKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rTW9ubyAgPSAwLAotICAgIE00RU5DT0RFUl9rU3RlcmVvLAotICAgIE00RU5DT0RFUl9rU3RlcmVvTm9JbnRlcmxlYXZlCi19IE00RU5DT0RFUl9DaGFubmVsTnVtYmVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9BdWRpb0JpdHJhdGUKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIGJpdHJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rQXVkaW9fNF83NV9LQlBTICAgID0gNDc1MCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzVfMTVfS0JQUyAgICA9IDUxNTAsCi0gICAgTTRFTkNPREVSX2tBdWRpb181XzlfS0JQUyAgICA9IDU5MDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb182XzdfS0JQUyAgICA9IDY3MDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb183XzRfS0JQUyAgICA9IDc0MDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb183Xzk1X0tCUFMgICAgPSA3OTUwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fOF9LQlBTICAgICAgICA9IDgwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xMF8yX0tCUFMgICAgPSAxMDIwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzEyXzJfS0JQUyAgICA9IDEyMjAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTZfS0JQUyAgICA9IDE2MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMjRfS0JQUyAgICA9IDI0MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMzJfS0JQUyAgICA9IDMyMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNDBfS0JQUyAgICA9IDQwMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNDhfS0JQUyAgICA9IDQ4MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNTZfS0JQUyAgICA9IDU2MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNjRfS0JQUyAgICA9IDY0MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fODBfS0JQUyAgICA9IDgwMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fOTZfS0JQUyAgICA9IDk2MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTEyX0tCUFMgICAgPSAxMTIwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xMjhfS0JQUyAgICA9IDEyODAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzE0NF9LQlBTICAgID0gMTQ0MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTYwX0tCUFMgICAgPSAxNjAwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xOTJfS0JQUyAgICA9IDE5MjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzIyNF9LQlBTICAgID0gMjI0MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMjU2X0tCUFMgICAgPSAyNTYwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18zMjBfS0JQUyAgICA9IDMyMDAwMAotfSBNNEVOQ09ERVJfQXVkaW9CaXRyYXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00RU5DT0RFUl9BYWNSZWd1bGF0aW9uCi0gKiBAYnJpZWYgICAgICAgIFRoZSBjdXJyZW50IG1vZGUgb2YgdGhlIGJpdHJhdGUgcmVndWxhdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa0FhY1JlZ3VsTm9uZSA9IDAsICAgIC8qKjwgbm8gYml0cmF0ZSByZWd1bGF0aW9uICovCi0gICAgTTRFTkNPREVSX2tBYWNCaXRSZXNlcnZvaXIgICAgICAgIC8qKjwgYmV0dGVyIHF1YWxpdHksIGJ1dCBtb3JlIENQVSBjb25zdW1lZCAqLwotfSBNNEVOQ09ERVJfQWFjUmVndWxhdGlvbjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfQW1yU0lECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIFNJRCBvZiB0aGUgQU1SIGVuY29kZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tBbXJOb1NJRCA9IDAgICAgIC8qKjwgbm8gU0lEICovCi19IE00RU5DT0RFUl9BbXJTSUQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9BYWNQYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFsbCB0aGUgc2V0dGluZ3Mgc3BlY2lmaWMgdG8gdGhlIEFBQyBlbmNvZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRFTkNPREVSX0FhY1JlZ3VsYXRpb24gICAgUmVndWxhdGlvbjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJIaWdoU3BlZWQ7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiVE5TOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYlBOUzsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJJUzsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJNUzsKLX0gTTRFTkNPREVSX0FhY1BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0F1ZGlvUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbGwgdGhlIHNldHRpbmdzIGF2YWxhaWJsZSB3aGVuIGVuY29kaW5nIGF1ZGlvLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHNfTTRFTkNPREVSX0F1ZGlvUGFyYW1zCi17Ci0gICAgTTRFTkNPREVSX1NhbXBsaW5nRnJlcXVlbmN5ICAgIEZyZXF1ZW5jeTsgICAgLyoqPCB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgTTRFTkNPREVSX0NoYW5uZWxOdW1iZXIgICAgICAgIENoYW5uZWxOdW07ICAgIC8qKjwgdGhlIG51bWJlIG9mIGNoYW5uZWxzIChtb25vLCBzdGVyZW8sIC4uKSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0JpdHJhdGUgICAgICAgIEJpdHJhdGU7ICAgIC8qKjwgIGJpdHJhdGUsIHNlZSBlbnVtICAqLwotICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCAgICAgICAgRm9ybWF0OyAgICAgICAgLyoqPCAgYXVkaW8gY29tcHJlc3Npb24gZm9ybWF0LCBBTVIsIEFBQyAuLi4gICovCi0gICAgdW5pb24gewotICAgICAgICBNNEVOQ09ERVJfQWFjUGFyYW1zICAgICAgICBBYWNQYXJhbTsKLSAgICAgICAgTTRFTkNPREVSX0FtclNJRCAgICAgICAgQW1yU0lEOwotICAgIH0gU3BlY2lmUGFyYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgdGhlIGF1ZGlvIGVuY29kZXIgc3BlY2lmaWMgcGFyYW1ldGVycyAqLwotfSBNNEVOQ09ERVJfQXVkaW9QYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZGVjb2RlciBzcGVjaWZpYyBpbmZvIGJ1ZmZlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgIHBJbmZvOyAgICAgICAgLyoqPCB0aGUgYnVmZmVyIGFkcmVzcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBpbmZvU2l6ZTsgICAgLyoqPCB0aGUgYnVmZmVyIHNpemUgaW4gYnl0ZXMgKi8KLX0gTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBkYXRhIGJ1ZmZlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgdGhlIHRhYmxlIG9mIGJ1ZmZlcnMgKHVudXNlZCBidWZmZXJzIGFyZSBzZXQgdG8gTlVMTCkgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICBwVGFibGVCdWZmZXJbTTRFTkNPREVSX0FVRElPX05CX0NIQU5ORUxTX01BWF07Ci0gICAgLyoqPCB0aGUgdGFibGUgb2YgdGhlIHNpemUgb2YgY29ycmVzcG9uZGluZyBidWZmZXIgYXQgc2FtZSBpbmRleCAqLwotICAgIE00T1NBX1VJbnQzMiAgICBwVGFibGVCdWZmZXJTaXplW000RU5DT0RFUl9BVURJT19OQl9DSEFOTkVMU19NQVhdOwotfSBNNEVOQ09ERVJfQXVkaW9CdWZmZXI7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX2luaXQpICAgICAgICAoTTRPU0FfQ29udGV4dCogaENvbnRleHQsIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9jbGVhblVwKSAgICAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9vcGVuKSAgICAgICAgKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00RU5DT0RFUl9BdWRpb1BhcmFtcyAqcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbyAqZGVjU3BlY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBncmFiYmVyQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9jbG9zZSkgICAgICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX3N0ZXApICAgICAgICAgKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00RU5DT0RFUl9BdWRpb0J1ZmZlciAqaW5CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyICpvdXRCdWZmZXIpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfZ2V0T3B0aW9uKSAgICAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfT3B0aW9uSUQgICAgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKnZhbHVlUHRyKTsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZQotICogQGJyaWVmICAgIERlZmluZXMgYWxsIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIGFuIGF1ZGlvIGVuY29kZXIgc2hlbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZQotewotICAgIE00QUVfaW5pdCogICAgICAgIHBGY3RJbml0OwotICAgIE00QUVfY2xlYW5VcCogICAgcEZjdENsZWFuVXA7Ci0gICAgTTRBRV9vcGVuKiAgICAgICAgcEZjdE9wZW47Ci0gICAgTTRBRV9jbG9zZSogICAgICAgIHBGY3RDbG9zZTsKLSAgICBNNEFFX3N0ZXAqICAgICAgICBwRmN0U3RlcDsKLSAgICBNNEFFX2dldE9wdGlvbiogICAgcEZjdEdldE9wdGlvbjsKLX0gTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRFTkNPREVSX0FVRElPQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9jb21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTA2NDYwMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00RU5DT0RFUl9jb21tb24uaAotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHR5cGVzIGludGVybmFsbHkgdXNlZCBieSB0aGUgVkVTIHRvIGFic3RyYWN0IGVuY29kZXJzCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRFTkNPREVSX0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNEVOQ09ERVJfQ09NTU9OX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyoqCi0gKiBWaWRlbyBwcmVwcm9jZXNzaW5nIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNFZQUF9BUEkuaCIKLQotLyoqCi0gKiBXcml0ZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00V1JJVEVSX2NvbW1vbi5oIgotCi0vKiBJTUFHRSBTVEFCICovCi0vKiBwZXJjZW50YWdlIG9mIGltYWdlIHN1cHByZXNzZWQgKGNvbXB1dGVkIGZyb20gdGhlIHN0YW5kYXJkIGRpbWVuc2lvbikuKi8KLSNkZWZpbmUgTTRFTkNPREVSX1NUQUJfRklMVEVSX0NST1BfUEVSQ0VOVEFHRSAxMAotICAgICAgICAvKiBXQVJOSU5HOiB0YWtlIHRoZSBpbmZlcmlvciBldmVuIGRpbWVuc2lvbiwgZXg6IDEwJSBmb3IgUUNJRiBvdXRwdXQgPT4gMTkyeDE1OCAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9PcGVuTW9kZQotICogQGJyaWVmICAgIERlZmluaXRpb24gb2Ygb3BlbiBtb2RlIGZvciB0aGUgZW5jb2Rlci4KLSAqIEBub3RlICAgIERFRkFVTFQgIDogcG9pbnRlciB0byBNNEVOQ09ERVJfb3BlbigpIHdoaWNoIHVzZSBkZWZhdWx0IHBhcmFtZXRlcnMKLSAqICAgICAgICAgIEFEVkFOQ0VEIDogcG9pbnRlciB0byBNNEVOQ09ERVJfb3Blbl9hZHZhbmNlZCgpIHdoaWNoIGFsbG93IHRvIGN1c3RvbWl6ZQotICogICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfT1BFTl9ERUZBVUxULAotICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VECi19IE00RU5DT0RFUl9PcGVuTW9kZTsKLQotIC8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0ZyYW1lUmF0ZQotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBlbmNvZGVkIHZpZGVvIGZyYW1lcmF0ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2s1X0ZQUywKLSAgICBNNEVOQ09ERVJfazdfNV9GUFMsCi0gICAgTTRFTkNPREVSX2sxMF9GUFMsCi0gICAgTTRFTkNPREVSX2sxMl81X0ZQUywKLSAgICBNNEVOQ09ERVJfazE1X0ZQUywKLSAgICBNNEVOQ09ERVJfazIwX0ZQUywKLSAgICBNNEVOQ09ERVJfazI1X0ZQUywKLSAgICBNNEVOQ09ERVJfazMwX0ZQUywKLSAgICBNNEVOQ09ERVJfa1ZBUklBQkxFX0ZQUywgICAgICAgICAgICAvKio8IFZhcmlhYmxlIHZpZGVvIGJpdHJhdGUgKi8KLSAgICBNNEVOQ09ERVJfa1VTRV9USU1FU0NBTEUgICAgICAgICAgICAvKio8IEFkdmFuY2VkIGVuY29kaW5nLCB1c2UgdGltZXNjYWxlIGluZGljYXRpb24gcmF0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIGZyYW1lcmF0ZSAqLwotfSBNNEVOQ09ERVJfRnJhbWVSYXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9JbnB1dEZvcm1hdAotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSB2aWRlbyBmb3JtYXQgb2YgdGhlIGdyYWJiaW5nLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rSVlVVjQyMD0wLCAvKio8IFlVViA0OjI6MCBwbGFuYXIgKHN0YW5kYXJkIGlucHV0IGZvciBtcGVnLTQgdmlkZW8pICovCi0gICAgTTRFTkNPREVSX2tJWVVWNDIyLCAgIC8qKjwgWVVWNDIyIHBsYW5hciAqLwotICAgIE00RU5DT0RFUl9rSVlVWVYsICAgICAvKio8IFlVVjQyMiBpbnRlcmxhY2VkLCBsdW1hIGZpcnN0ICovCi0gICAgTTRFTkNPREVSX2tJVVlWWSwgICAgIC8qKjwgWVVWNDIyIGludGVybGFjZWQsIGNocm9tYSBmaXJzdCAqLwotICAgIE00RU5DT0RFUl9rSUpQRUcsICAgICAvKio8IEpQRUcgY29tcHJlc3NlZCBmcmFtZXMgKi8KLSAgICBNNEVOQ09ERVJfa0lSR0I0NDQsICAgLyoqPCBSR0IgMTIgYml0cyA0OjQ6NCAqLwotICAgIE00RU5DT0RFUl9rSVJHQjU1NSwgICAvKio8IFJHQiAxNSBiaXRzIDU6NTo1ICovCi0gICAgTTRFTkNPREVSX2tJUkdCNTY1LCAgIC8qKjwgUkdCIDE2IGJpdHMgNTo2OjUgKi8KLSAgICBNNEVOQ09ERVJfa0lSR0IyNCwgICAgLyoqPCBSR0IgMjQgYml0cyA4Ojg6OCAqLwotICAgIE00RU5DT0RFUl9rSVJHQjMyLCAgICAvKio8IFJHQiAzMiBiaXRzICAqLwotICAgIE00RU5DT0RFUl9rSUJHUjQ0NCwgICAvKio8IEJHUiAxMiBiaXRzIDQ6NDo0ICovCi0gICAgTTRFTkNPREVSX2tJQkdSNTU1LCAgIC8qKjwgQkdSIDE1IGJpdHMgNTo1OjUgKi8KLSAgICBNNEVOQ09ERVJfa0lCR1I1NjUsICAgLyoqPCBCR1IgMTYgYml0cyA1OjY6NSAqLwotICAgIE00RU5DT0RFUl9rSUJHUjI0LCAgICAvKio8IEJHUiAyNCBiaXRzIDg6ODo4ICovCi0gICAgTTRFTkNPREVSX2tJQkdSMzIgICAgIC8qKjwgQkdSIDMyIGJpdHMgICovCi19IE00RU5DT0RFUl9JbnB1dEZvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfRm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIHZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tNUEVHNCA9IDAsCi0gICAgTTRFTkNPREVSX2tIMjYzLAotICAgIE00RU5DT0RFUl9rSDI2NCwKLSAgICBNNEVOQ09ERVJfa0pQRUcsCi0gICAgTTRFTkNPREVSX2tNSlBFRywKLSAgICBNNEVOQ09ERVJfa05VTEwsCi0gICAgTTRFTkNPREVSX2tZVVY0MjAsICAgICAgICAgICAgLyoqPCBObyBjb21wcmVzc2lvbiAqLwotICAgIE00RU5DT0RFUl9rWVVWNDIyLCAgICAgICAgICAgIC8qKjwgTm8gY29tcHJlc3Npb24gKi8KLQotICAgIE00RU5DT0RFUl9rVmlkZW9fTkIgLyogbnVtYmVyIG9mIGRlY29kZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotfSBNNEVOQ09ERVJfRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9GcmFtZVdpZHRoCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBmcmFtZSBXaWR0aC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfU1FDSUZfV2lkdGggPSAxMjgsIC8qKjwgU1FDSUYgMTI4eDk2ICovCi0gICAgTTRFTkNPREVSX1FRVkdBX1dpZHRoID0gMTYwLCAvKio8IFFRVkdBIDE2MHgxMjAgKi8KLSAgICBNNEVOQ09ERVJfUUNJRl9XaWR0aCAgPSAxNzYsIC8qKjwgUUNJRiAxNzZ4MTQ0ICovCi0gICAgTTRFTkNPREVSX1FWR0FfV2lkdGggID0gMzIwLCAvKio8IFFWR0EgMzIweDI0MCAqLwotICAgIE00RU5DT0RFUl9DSUZfV2lkdGggICA9IDM1MiwgLyoqPCBDSUYgMzUyeDI4OCAqLwotICAgIE00RU5DT0RFUl9WR0FfV2lkdGggICA9IDY0MCwgLyoqPCBWR0EgNjQweDQ4MCAqLwotICAgIE00RU5DT0RFUl9TVkdBX1dpZHRoICA9IDgwMCwgLyoqPCBTVkdBIDgwMHg2MDAgKi8KLSAgICBNNEVOQ09ERVJfWEdBX1dpZHRoICAgPSAxMDI0LCAvKio8IFhHQSAxMDI0eDc2OCAqLwotICAgIE00RU5DT0RFUl9YVkdBX1dpZHRoICA9IDEyODAsIC8qKjwgWFZHQSAxMjgweDEwMjQgKi8KLS8qICtQUiBMVjU4MDcgKi8KLSAgICBNNEVOQ09ERVJfV1ZHQV9XaWR0aCAgPSA4MDAsIC8qKjwgV1ZHQSA4MDAgeCA0ODAgKi8KLSAgICBNNEVOQ09ERVJfTlRTQ19XaWR0aCAgPSA3MjAsIC8qKjwgTlRTQyA3MjAgeCA0ODAgKi8KLS8qIC1QUiBMVjU4MDcgKi8KLQotLyogK0NSIEdvb2dsZSAqLwotICAgIE00RU5DT0RFUl82NDBfMzYwX1dpZHRoICAgPSA2NDAsICAvKio8IDY0MHgzNjAgKi8KLSAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgTTRFTkNPREVSXzg1NF80ODBfV2lkdGggICA9IDg0OCwgIC8qKjwgODQ4eDQ4MCAqLwotICAgIE00RU5DT0RFUl8xMjgwXzcyMF9XaWR0aCAgPSAxMjgwLCAvKio8IDcyMHAgMTI4MHg3MjAgKi8KLSAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoICA9IDEwODgsIC8qKjwgNzIwcCAxMDg4eDcyMCAqLwotICAgIE00RU5DT0RFUl85NjBfNzIwX1dpZHRoICAgPSA5NjAsICAvKio8IDcyMHAgOTYweDcyMCAqLwotICAgIE00RU5DT0RFUl8xOTIwXzEwODBfV2lkdGggPSAxOTIwICAvKio8IDEwODBwIDE5MjB4MTA4MCAqLwotLyogLUNSIEdvb2dsZSAqLwotCi19IE00RU5DT0RFUl9GcmFtZVdpZHRoOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodAotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgZnJhbWUgSGVpZ2h0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9TUUNJRl9IZWlnaHQgPSA5NiwgIC8qKjwgU1FDSUYgMTI4eDk2ICovCi0gICAgTTRFTkNPREVSX1FRVkdBX0hlaWdodCA9IDEyMCwgLyoqPCBRUVZHQSAxNjB4MTIwICovCi0gICAgTTRFTkNPREVSX1FDSUZfSGVpZ2h0ICA9IDE0NCwgLyoqPCBRQ0lGIDE3NngxNDQgKi8KLSAgICBNNEVOQ09ERVJfUVZHQV9IZWlnaHQgID0gMjQwLCAvKio8IFFWR0EgMzIweDI0MCAqLwotICAgIE00RU5DT0RFUl9DSUZfSGVpZ2h0ICAgPSAyODgsIC8qKjwgQ0lGIDM1MngyODggKi8KLSAgICBNNEVOQ09ERVJfVkdBX0hlaWdodCAgID0gNDgwLCAvKio8IFZHQSAzNDB4NDgwICovCi0gICAgTTRFTkNPREVSX1NWR0FfSGVpZ2h0ICA9IDYwMCwgLyoqPCBTVkdBIDgwMHg2MDAgKi8KLSAgICBNNEVOQ09ERVJfWEdBX0hlaWdodCAgID0gNzY4LCAvKio8IFhHQSAxMDI0eDc2OCAqLwotICAgIE00RU5DT0RFUl9YVkdBX0hlaWdodCAgPSAxMDI0LCAvKio8IFhWR0EgMTI4MHgxMDI0ICovCi0vKiArUFIgTFY1ODA3ICovCi0gICAgTTRFTkNPREVSX1dWR0FfSGVpZ2h0ICA9IDQ4MCwgLyoqPCBXVkdBIDgwMCB4IDQ4MCAqLwotICAgIE00RU5DT0RFUl9OVFNDX0hlaWdodCAgPSA0ODAsIC8qKjwgTlRTQyA3MjAgeCA0ODAgKi8KLS8qIC1QUiBMVjU4MDcgKi8KLQotLyogK0NSIEdvb2dsZSAqLwotICAgIE00RU5DT0RFUl82NDBfMzYwX0hlaWdodCAgPSAzNjAsIC8qKjwgNjQweDM2MCAqLwotICAgIE00RU5DT0RFUl84NTRfNDgwX0hlaWdodCAgPSA0ODAsIC8qKjwgODU0eDQ4MCAqLwotICAgIE00RU5DT0RFUl8xMjgwXzcyMF9IZWlnaHQgPSA3MjAsIC8qKjwgNzIwcCAxMjgweDcyMCAqLwotICAgIE00RU5DT0RFUl8xMDgwXzcyMF9IZWlnaHQgPSA3MjAsIC8qKjwgNzIwcCAxMDgweDcyMCAqLwotICAgIE00RU5DT0RFUl85NjBfNzIwX0hlaWdodCAgPSA3MjAsIC8qKjwgNzIwcCA5NjB4NzIwICovCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgIE00RU5DT0RFUl8xOTIwXzEwODBfSGVpZ2h0ID0gMTA4OCAvKio8IDEwODBwIDE5MjB4MTA4MCAqLwotLyogLUNSIEdvb2dsZSAqLwotfSBNNEVOQ09ERVJfRnJhbWVIZWlnaHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0JpdHJhdGUKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIGJpdHJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rMjhfS0JQUyAgPSAyODAwMCwKLSAgICBNNEVOQ09ERVJfazQwX0tCUFMgID0gNDAwMDAsCi0gICAgTTRFTkNPREVSX2s2NF9LQlBTICA9IDY0MDAwLAotICAgIE00RU5DT0RFUl9rOTZfS0JQUyAgPSA5NjAwMCwKLSAgICBNNEVOQ09ERVJfazEyOF9LQlBTID0gMTI4MDAwLAotICAgIE00RU5DT0RFUl9rMTkyX0tCUFMgPSAxOTIwMDAsCi0gICAgTTRFTkNPREVSX2syNTZfS0JQUyA9IDI1NjAwMCwKLSAgICBNNEVOQ09ERVJfazM4NF9LQlBTID0gMzg0MDAwLAotICAgIE00RU5DT0RFUl9rNTEyX0tCUFMgPSA1MTIwMDAsCi0gICAgTTRFTkNPREVSX2s4MDBfS0JQUyA9IDgwMDAwMAotCi19IE00RU5DT0RFUl9CaXRyYXRlOwotCi0vKiBJTUFHRSBTVEFCICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00RU5DT0RFUl9TdGFiTW9kZQotICogQGJyaWVmICAgICAgICBUaGUgY3VycmVudCBtb2RlIG9mIHRoZSBzdGFiaWxpemF0aW9uIGZpbHRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa1N0YWJPZmYgPSAwLCAgICAgICAgLyoqPCBzdGFiaWxpemF0aW9uIGZpbHRlciBpcyBkaXNhYmxlZCAqLwotICAgIE00RU5DT0RFUl9rU3RhYkNlbnRlcmVkLCAgICAvKio8IHN0YWJpbGl6YXRpb24gZmlsdGVyIGlzIGVuYWJsZWQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmlkZW8gaW5wdXQgYW5kIG91dHB1dCBtdXN0IGhhdmUgdGhlIHNhbWUgZGltZW5zaW9ucy4gT3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSB3aWxsIGhhdmUgYmxhY2sgYm9yZGVycyAqLwotICAgIE00RU5DT0RFUl9rU3RhYkdyYWJNb3JlICAgICAgICAvKio8IHN0YWJpbGl6YXRpb24gZmlsdGVyIGlzIGVuYWJsZWQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmlkZW8gaW5wdXQgZGltZW5zaW9ucyBtdXN0IGJlIGJpZ2dlciB0aGFuIG91dHB1dC4gVGhlIHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW5kaWNhdGVkIGJ5IE00RU5DT0RFUl9TVEFCX0ZJTFRFUl9DUk9QX1BFUkNFTlRBR0UgKi8KLQotfSBNNEVOQ09ERVJfU3RhYk1vZGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00RU5DT0RFUl9GcmFtZU1vZGUKLSAqIEBicmllZiAgICAgICAgVmFsdWVzIHRvIGRyaXZlIHRoZSBlbmNvZGVyIGJlaGF2aW91ciAodHlwZSBvZiBmcmFtZXMgcHJvZHVjZWQpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tOb3JtYWxGcmFtZSA9IDAsICAgLyoqPCBsZXQgdGhlIGVuY29kZXIgZGVjaWRlIHdoaWNoIHR5cGUgb2YgZnJhbWUgdG8gZW5jb2RlICovCi0gICAgTTRFTkNPREVSX2tMYXN0RnJhbWUgICA9IDEsICAgLyoqPCBmb3JjZSBlbmNvZGVyIHRoZSBmbHVzaCBhbGwgaXRzIGJ1ZmZlcnMgYmVjYXVzZSBpdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IGZyYW1lICAqLwotICAgIE00RU5DT0RFUl9rSUZyYW1lICAgICAgPSAyICAgIC8qKjwgZm9yY2UgZW5jb2RlciB0byBnZW5lcmF0ZSBhbiBJIGZyYW1lICovCi0KLX0gTTRFTkNPREVSX0ZyYW1lTW9kZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX1BhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBzZXR0aW5ncyBhdmFsYWlibGUgd2hlbiBlbmNvZGluZy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIElucHV0ICovCi0gICAgTTRFTkNPREVSX0lucHV0Rm9ybWF0ICAgIElucHV0Rm9ybWF0OyAgICAgICAgLyoqPCBJbnB1dCB2aWRlbyBmb3JtYXQgKGdyYWJiaW5nKSAqLwotICAgIE00RU5DT0RFUl9GcmFtZVdpZHRoICAgIElucHV0RnJhbWVXaWR0aDsgICAgLyoqPCBJbnB1dCBGcmFtZSB3aWR0aCAoZ3JhYmJpbmcpICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIElucHV0RnJhbWVIZWlnaHQ7ICAgIC8qKjwgSW5wdXQgRnJhbWUgaGVpZ2h0IChncmFiYmluZykgKi8KLQotICAgIC8qIE91dHB1dCAqLwotICAgIE00RU5DT0RFUl9GcmFtZVdpZHRoICAgIEZyYW1lV2lkdGg7ICAgICAgICAgICAgLyoqPCBGcmFtZSB3aWR0aCAgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQgICAgRnJhbWVIZWlnaHQ7ICAgICAgICAvKio8IEZyYW1lIGhlaWdodCAgKi8KLSAgICBNNEVOQ09ERVJfQml0cmF0ZSAgICAgICAgQml0cmF0ZTsgICAgICAgICAgICAvKio8IEJpdHJhdGUsIHNlZSBlbnVtICAqLwotICAgIE00RU5DT0RFUl9GcmFtZVJhdGUgICAgICAgIEZyYW1lUmF0ZTsgICAgICAgICAgICAvKio8IEZyYW1lcmF0ZSwgc2VlIGVudW0gICovCi0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgRm9ybWF0OyAgICAgICAgICAgICAgICAvKio8IFZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdCwgSDI2MywgTVBFRzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSlBFRyAuLi4gICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICB2aWRlb1Byb2ZpbGU7IC8qKiB2aWRlbyBwcm9maWxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICB2aWRlb0xldmVsOyAgIC8qKiB2aWRlbyBsZXZlbCAqLwotfSBNNEVOQ09ERVJfUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBhZHZhbmNlZCBzZXR0aW5ncyBhdmFpbGFibGUgZm9yIE1QRUctNCBlbmNvZGluZy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqIElucHV0IHBhcmFtZXRlcnMgKGdyYWJiZXIgY291cGxlZCB3aXRoIGVuY29kZXIpOiAqLwotICAgIE00RU5DT0RFUl9JbnB1dEZvcm1hdCAgICBJbnB1dEZvcm1hdDsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCB2aWRlbyBmb3JtYXQgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBJbnB1dEZyYW1lV2lkdGg7ICAgICAgICAgICAgLyoqPCBJbnB1dCBGcmFtZSB3aWR0aCAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgICBJbnB1dEZyYW1lSGVpZ2h0OyAgICAgICAgICAgIC8qKjwgSW5wdXQgRnJhbWUgaGVpZ2h0ICovCi0KLSAgICAvKioKLSAgICAgKiBDb21tb24gc2V0dGluZ3MgZm9yIEgyNjMgYW5kIE1QRUctNDogKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBGcmFtZVdpZHRoOyAgICAgICAgICAgICAgICAgICAgLyoqPCBGcmFtZSB3aWR0aCAgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQgICAgRnJhbWVIZWlnaHQ7ICAgICAgICAgICAgICAgIC8qKjwgRnJhbWUgaGVpZ2h0ICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIEJpdHJhdGU7ICAgICAgICAgICAgICAgICAgICAvKio8IEZyZWUgdmFsdWUgZm9yIHRoZSBiaXRyYXRlICovCi0gICAgLyoqPCBGcmFtZXJhdGUgKGlmIHNldCB0byBNNEVOQ09ERVJfa1VTRV9USU1FU0NBTEUgdXNlIHVpUmF0ZUZhY3RvciAmIHVpVGltZVNjYWxlIGluc3RlYWQpICovCi0gICAgTTRFTkNPREVSX0ZyYW1lUmF0ZSAgICAgICAgRnJhbWVSYXRlOwotICAgIC8qKjwgVmlkZW8gY29tcHJlc3Npb24gZm9ybWF0OiBIMjYzIG9yIE1QRUc0ICovCi0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgRm9ybWF0OwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgdmlkZW9Qcm9maWxlOyAvKiogb3V0cHV0IHZpZGVvIHByb2ZpbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgIHZpZGVvTGV2ZWw7ICAgLyoqIG91dHB1dCB2aWRlbyBsZXZlbCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpSG9yaXpvbnRhbFNlYXJjaFJhbmdlOyAvKio8IFNldCB0byAwIHdpbGwgdXNlIGRlZmF1bHQgdmFsdWUgKDE1KSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpVmVydGljYWxTZWFyY2hSYW5nZTsgICAvKio8IFNldCB0byAwIHdpbGwgdXNlIGRlZmF1bHQgdmFsdWUgKDE1KSAqLwotICAgIC8qKjwgU2V0IHRvIDAgd2lsbCB1c2UgZGVmYXVsdCB2YWx1ZSAoMHg3RkZGIGkuZS4gbGV0IGVuZ2luZSBkZWNpZGUgd2hlbiB0byBwdXQgYW4gSSkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWU7Ci0gICAgLyoqPCBFbmFibGUgaWYgcHJpb3JpdHkgaXMgcXVhbGl0eSwgRGlzYWJsZSBpZiBwcmlvcml0eSBpcyBmcmFtZXJhdGUgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJJbnRlcm5hbFJlZ3VsYXRpb247Ci0gICAgLyoqPCBSYXRpbyBiZXR3ZWVuIHRoZSBlbmNvZGVyIGZyYW1lIHJhdGUgYW5kIHRoZSBhY3R1YWwgZnJhbWUgcmF0ZSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpUmF0ZUZhY3RvcjsKLSAgICAvKio8IEkgZnJhbWVzIHBlcmlvZGljaXR5LCBzZXQgdG8gMCB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlJVm9wUGVyaW9kOwotICAgIC8qKjwgTW90aW9uIGVzdGltYXRpb24gW2RlZmF1bHQ9MCAoYWxsIHRvb2xzKSwgZGlzYWJsZT04IChubyB0b29sKV0gKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICB1aU1vdGlvbkVzdGltYXRpb25Ub29sczsKLQotICAgIC8qKgotICAgICAqIFNldHRpbmdzIGZvciBNUEVHLTQgb25seTogKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVRpbWVTY2FsZTsgICAgICAgICAgICAgICAgLyoqPCBGcmVlIHZhbHVlIGZvciB0aGUgdGltZXNjYWxlICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiRXJyb3JSZXNpbGllbmNlOyAgICAgICAgICAgLyoqPCBEaXNhYmxlZCBieSBkZWZhdWx0ICovCi0gICAgLyoqPCBEaXNhYmxlZCBieSBkZWZhdWx0IChpZiBlbmFibGVkLCBiRXJyb3JSZXNpbGllbmNlIHNob3VsZCBiZSBlbmFibGVkIHRvbyEpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiRGF0YVBhcnRpdGlvbmluZzsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiQWNQcmVkaWN0aW9uOyAgICAgICAgICAgLyoqPCBBQyBwcmVkaWN0aW9uIFtkZWZhdWx0PTEsIGRpc2FibGU9MF0gKi8KLQotfSBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9TdGlsbFBpY3R1cmVQYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFsbCB0aGUgc2V0dGluZ3MgYXZhbGFpYmxlIHdoZW4gZW5jb2Rpbmcgc3RpbGwKLSAqICAgICAgICAgICAgcGljdHVyZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00RU5DT0RFUl9GcmFtZVdpZHRoICAgIEZyYW1lV2lkdGg7ICAgICAgICAgICAgLyoqPCBGcmFtZSB3aWR0aCAgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQgICAgRnJhbWVIZWlnaHQ7ICAgICAgICAvKio8IEZyYW1lIGhlaWdodCAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBRdWFsaXR5OyAgICAgICAgICAgIC8qKjwgQml0cmF0ZSwgc2VlIGVudW0gICovCi0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgSW5wdXRGb3JtYXQ7ICAgICAgICAvKio8IFlVViA0MjAgb3IgNDIyICAqLwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIEZvcm1hdDsgICAgICAgICAgICAgICAgLyoqPCBWaWRlbyBjb21wcmVzc2lvbiBmb3JtYXQsIEgyNjMsIE1QRUc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUpQRUcgLi4uICAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgUHJlUHJvY2Vzc05lZWRlZDsgICAgLyoqPCBJcyB0aGUgY2FsbCB0byB0aGUgVlBQIGlzIG5lY2Vzc2FyeSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgRW5jb2RpbmdQZXJTdHJpcGVzOyAgICAvKio8IElzIGVuY29kaW5nIHBlciBzdHJpcGVzICovCi0KLX0gTTRFTkNPREVSX1N0aWxsUGljdHVyZVBhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0hlYWRlcgotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGJ1ZmZlciB3aGVyZSB0aGUgc2VxdWVuY2UgaGVhZGVyIGlzIHB1dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgIHBCdWY7ICAgICAgICAvKio8IEJ1ZmZlciBmb3IgdGhlIGhlYWRlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICBTaXplOyAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBkYXRhICovCi0KLX0gTTRFTkNPREVSX0hlYWRlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgIE00RU5DT0RFUl9PcHRpb25JRAotICogQGJyaWVmIFRoaXMgZW51bXMgZGVmaW5lcyBhbGwgYXZhbGFpYmxlIG9wdGlvbnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqPCBzZXQgdGhlIGZyYWdtZW50IHNpemUsIG9wdGlvbiB2YWx1ZSBpcyBNNE9TQV9VSW50MzIgdHlwZSAqLwotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfVmlkZW9GcmFnbWVudFNpemUgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9DT01NT04sIDB4MDEpLAotCi0gICAgLyoqPCBzZXQgdGhlIHN0YWJpbGl6YXRpb24gZmlsdGVyaW5nLCBvcHRpb24gdmFsdWUgaXMgTTRFTkNPREVSX1N0YWJNb2RlIHR5cGUgKi8KLSAgICBNNEVOQ09ERVJfa09wdGlvbklEX0ltYWdlU3RhYmlsaXphdGlvbiAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDAyKSwKLQotICAgIC8qKjwgcHJldmVudCB3cml0dGluZyBvZiBhbnkgQVUsIG9wdGlvbiB2YWx1ZSBpcyBNNE9TQV9Cb29sIHR5cGUgKi8KLSAgICBNNEVOQ09ERVJfa09wdGlvbklEX0luc3RhbnRTdG9wICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDAzKSwKLQotICAgIC8qKjwgZ2V0IHRoZSBEU0kgKGVuY29kZXIgaGVhZGVyKSBnZW5lcmF0ZWQgYnkgdGhlIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfUkVBRCAsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9DT01NT04sIDB4MDQpLAotLyorIENSIExWNjc3NSAtSC4yNjQgVHJpbW1pbmcgICovCi0KLSAgICBNNEVOQ09ERVJfa09wdGlvbklEX1NldEgyNjRQcm9jZXNzTkFMVWZjdHNQdHI9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDA1KSwKLSAgICBNNEVOQ09ERVJfa09wdGlvbklEX0gyNjRQcm9jZXNzTkFMVUNvbnRleHQgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfUkVBRCAsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9DT01NT04sIDB4MDYpCi0vKi1DUiBMVjY3NzUgLUguMjY0IFRyaW1taW5nICAqLwotfSBNNEVOQ09ERVJfT3B0aW9uSUQ7Ci0KLS8qKyBDUiBMVjY3NzUgLUguMjY0IFRyaW1taW5nICAqLwotdHlwZWRlZiBNNE9TQV9FUlIgKEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVX2ZjdCkoTTRPU0FfVm9pZCphaW5zdGFuY2UsTTRPU0FfVUludDgqIGluYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAgaW5idWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqb3V0YnVmZiwgTTRPU0FfSW50MzIgKm91dGJ1Zl9zaXplKTsKLS8vKi0gQ1IgTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAgKi8KLQotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNEVOQ09ERVJfQ29udGV4dDsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9pbml0KSAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsCi0gICAgICAgIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKLSAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLAotICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEKLSk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfb3BlbikgKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVLAotICAgICAgICBNNE9TQV9Wb2lkKiBwUGFyYW1zICAgICAvKiBDYW4gYmUgTTRFTkNPREVSX1BhcmFtcywgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfU3RpbGxQaWN0dXJlUGFyYW1zICovCi0pOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3N0YXJ0KSAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9zdG9wKSAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9wYXVzZSkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfcmVzdW1lKSAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9jbG9zZSkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfY2xlYW51cCkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfcmVndWxCaXRSYXRlKSAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX2VuY29kZSkgKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJblBsYW5lLAotICAgICAgICBNNE9TQV9Eb3VibGUgQ3RzLAotICAgICAgICBNNEVOQ09ERVJfRnJhbWVNb2RlIEZyYW1lTW9kZQotKTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9zZXRPcHRpb24pICAgICgKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwKLSAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZQotKTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9nZXRPcHRpb24pICAgICgKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwKLSAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZQotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZQotICogQGJyaWVmICAgIERlZmluZXMgYWxsIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIGFuIGVuY29kZXIgc2hlbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi10eXBlZGVmIHN0cnVjdCBfTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZQotewotICAgIE00RU5DT0RFUl9pbml0KiAgICAgICAgICAgICAgICBwRmN0SW5pdDsKLSAgICBNNEVOQ09ERVJfb3BlbiogICAgICAgICAgICAgICAgcEZjdE9wZW47Ci0KLSAgICBNNEVOQ09ERVJfc3RhcnQqICAgICAgICAgICAgcEZjdFN0YXJ0OyAgICAgICAgICAvKiBHcmFiYmVyIG1vZGUgKi8KLSAgICBNNEVOQ09ERVJfc3RvcCogICAgICAgICAgICAgICAgcEZjdFN0b3A7ICAgICAgICAgICAvKiBHcmFiYmVyIG1vZGUgKi8KLQotICAgIE00RU5DT0RFUl9wYXVzZSogICAgICAgICAgICBwRmN0UGF1c2U7ICAgICAgICAgIC8qIEdyYWJiZXIgbW9kZSAqLwotICAgIE00RU5DT0RFUl9yZXN1bWUqICAgICAgICAgICAgcEZjdFJlc3VtZTsgICAgICAgICAvKiBHcmFiYmVyIG1vZGUgKi8KLQotICAgIE00RU5DT0RFUl9jbG9zZSogICAgICAgICAgICBwRmN0Q2xvc2U7Ci0gICAgTTRFTkNPREVSX2NsZWFudXAqICAgICAgICAgICAgcEZjdENsZWFudXA7Ci0KLSAgICBNNEVOQ09ERVJfcmVndWxCaXRSYXRlKiAgICAgcEZjdFJlZ3VsQml0UmF0ZTsKLSAgICBNNEVOQ09ERVJfZW5jb2RlKiAgICAgICAgICAgIHBGY3RFbmNvZGU7ICAgICAgICAgLyogU3RhbmRhbG9uZSBtb2RlICovCi0KLSAgICBNNEVOQ09ERVJfc2V0T3B0aW9uKiAgICAgICAgcEZjdFNldE9wdGlvbjsKLSAgICBNNEVOQ09ERVJfZ2V0T3B0aW9uKiAgICAgICAgcEZjdEdldE9wdGlvbjsKLX0gTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000RU5DT0RFUl9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRPU0FfQ29yZUlELmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNE9TQV9Db3JlSUQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQwOGZjOC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNE9TQV9Db3JlSUQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE9TQV9Db3JlSUQuaAotICogQGJyaWVmICBkZWZpbmVzIHRoZSB1bmlxdWVzIGNvbXBvbmVudCBpZGVudGlmaWVycyB1c2VkIGZvciBtZW1vcnkgbWFuYWdlbWVudAotICogICAgICAgICBhbmQgb3B0aW9uSUQgbWVjaGFuaXNtCi0gKiBAbm90ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRPU0FfQ09SRUlEX0hfXwotI2RlZmluZSBfX000T1NBX0NPUkVJRF9IX18KLQotLyogQ29yZUlkIGFyZSBkZWZpbmVkIG9uIDE0IGJpdHMgKi8KLS8qIHdlIHN0YXJ0IGZyb20gMHgwMTAwLCBsb3dlciB2YWx1ZXMgYXJlIHJlc2VydmVkIGZvciBvc2FsIGNvcmUgY29tcG9uZW50cyAqLwotCi0vKiByZWFkZXIgc2hlbGxzKi8KLSNkZWZpbmUgTTRSRUFERVJfQ09NTU9OICAgICAweDAxMDAKLSNkZWZpbmUgTTRSRUFERVJfQVZJICAgICAgICAweDAxMDEKLSNkZWZpbmUgTTRSRUFERVJfQU1SICAgICAgICAweDAxMDIKLSNkZWZpbmUgTTRSRUFERVJfM0dQICAgICAgICAweDAxMDMKLSNkZWZpbmUgTTRSRUFERVJfTkVUICAgICAgICAweDAxMDQKLSNkZWZpbmUgTTRSRUFERVJfM0dQX0hUVFAgICAweDAxMDUKLSNkZWZpbmUgTTRSRUFERVJfTVAzICAgICAgICAweDAxMDYKLSNkZWZpbmUgTTRSRUFERVJfV0FWICAgICAgICAweDAxMDcKLSNkZWZpbmUgTTRSRUFERVJfTUlESSAgICAgICAweDAxMDgKLSNkZWZpbmUgTTRSRUFERVJfQVNGICAgICAgICAweDAxMDkKLSNkZWZpbmUgTTRSRUFERVJfUkVBTCAgICAgICAgMHgwMTBBCi0jZGVmaW5lIE00UkVBREVSX0FBQyAgICAgICAgMHgwMTBCCi0jZGVmaW5lIE00UkVBREVSX0ZMRVggICAgICAgIDB4MDEwQwotI2RlZmluZSBNNFJFQURFUl9CQkEgICAgICAgIDB4MDEwRAotI2RlZmluZSBNNFJFQURFUl9TWU5USEVTSVNfQVVESU8gICAgMHgwMTBFCi0jZGVmaW5lIE00UkVBREVSX0pQRUcgICAgICAgIDB4MDEwRgotCi0KLS8qIHdyaXRlciBzaGVsbHMqLwotI2RlZmluZSBNNFdSSVRFUl9DT01NT04gICAgIDB4MDExMAotI2RlZmluZSBNNFdSSVRFUl9BVkkgICAgICAgIDB4MDExMQotI2RlZmluZSBNNFdSSVRFUl9BTVIgICAgICAgIDB4MDExMgotI2RlZmluZSBNNFdSSVRFUl8zR1AgICAgICAgIDB4MDExMwotI2RlZmluZSBNNFdSSVRFUl9KUEVHICAgICAgICAweDAxMTYKLSNkZWZpbmUgTTRXUklURVJfTVAzICAgICAgICAweDAxMTcKLQotLyogZGVjb2RlciBzaGVsbHMgKi8KLSNkZWZpbmUgTTRERUNPREVSX0NPTU1PTiAgICAweDAxMjAKLSNkZWZpbmUgTTRERUNPREVSX0pQRUcgICAgICAweDAxMjEKLSNkZWZpbmUgTTRERUNPREVSX01QRUc0ICAgICAweDAxMjIKLSNkZWZpbmUgTTRERUNPREVSX0FVRElPICAgICAweDAxMjMKLSNkZWZpbmUgTTRERUNPREVSX0FWQyAgICAgICAweDAxMjQKLSNkZWZpbmUgTTRERUNPREVSX01JREkgICAgICAweDAxMjUKLSNkZWZpbmUgTTRERUNPREVSX1dNQSAgICAgICAgMHgwMTI2Ci0jZGVmaW5lIE00REVDT0RFUl9XTVYgICAgICAgIDB4MDEyNwotI2RlZmluZSBNNERFQ09ERVJfUk1WICAgICAgICAweDAxMjgKLSNkZWZpbmUgTTRERUNPREVSX1JNQSAgICAgICAgMHgwMTI5Ci0jZGVmaW5lIE00REVDT0RFUl9BQUMgICAgICAgMHgwMTJBCi0jZGVmaW5lIE00REVDT0RFUl9CRUFUQlJFVyAgMHgwMTJCCi0jZGVmaW5lIE00REVDT0RFUl9FWFRFUk5BTCAgMHgwMTJDCi0KLS8qIGVuY29kZXIgc2hlbGxzICovCi0jZGVmaW5lIE00RU5DT0RFUl9DT01NT04gICAgMHgwMTMwCi0jZGVmaW5lIE00RU5DT0RFUl9KUEVHICAgICAgMHgwMTMxCi0jZGVmaW5lIE00RU5DT0RFUl9NUEVHNCAgICAgMHgwMTMyCi0jZGVmaW5lIE00RU5DT0RFUl9BVURJTyAgICAgMHgwMTMzCi0jZGVmaW5lIE00RU5DT0RFUl9WSURfTlVMTCAgMHgwMTM0Ci0jZGVmaW5lIE00RU5DT0RFUl9NSlBFRyAgICAgICAgMHgwMTM1Ci0jZGVmaW5lIE00RU5DT0RFUl9NUDMgICAgICAgIDB4MDEzNgotI2RlZmluZSBNNEVOQ09ERVJfSDI2NCAgICAgICAgMHgwMTM3Ci0jZGVmaW5lIE00RU5DT0RFUl9BQUMgICAgICAgIDB4MDEzOAotI2RlZmluZSBNNEVOQ09ERVJfQU1STkIgICAgICAgIDB4MDEzOQotI2RlZmluZSBNNEVOQ09ERVJfQVVEX05VTEwgIDB4MDEzQQotI2RlZmluZSBNNEVOQ09ERVJfRVhURVJOQUwgIDB4MDEzQgotCi0vKiBjb3JlcyAqLwotI2RlZmluZSBNNEpQR19ERUNPREVSICAgICAgIDB4MDE0MAotI2RlZmluZSBNNEpQR19FTkNPREVSICAgICAgIDB4MDE0MQotCi0jZGVmaW5lIE00TVA0X0RFQ09ERVIgICAgICAgMHgwMTQyCi0jZGVmaW5lIE00TVA0X0VOQ09ERVIgICAgICAgMHgwMTQzCi0KLSNkZWZpbmUgTTRBVklfQ09NTU9OICAgICAgICAweDAxNDQKLSNkZWZpbmUgTTRBVklfUkVBREVSICAgICAgICAweDAxNDUKLSNkZWZpbmUgTTRBVklfV1JJVEVSICAgICAgICAweDAxNDYKLQotI2RlZmluZSBNNEhUVFBfRU5HSU5FICAgICAgIDB4MDE0NwotCi0jZGVmaW5lIE00T1NBX1RNUEZJTEUgICAgICAgMHgwMTQ4Ci0jZGVmaW5lIE00VE9PTF9USU1FUiAgICAgICAgMHgwMTQ5Ci0KLSNkZWZpbmUgTTRBTVJfUkVBREVSICAgICAgICAweDAxNEEKLQotI2RlZmluZSBNNE1QM19SRUFERVIgICAgICAgIDB4MDE0QgotCi0jZGVmaW5lIE00V0FWX1JFQURFUiAgICAgICAgMHgwMTRDCi0jZGVmaW5lIE00V0FWX1dSSVRFUiAgICAgICAgMHgwMTRECi0jZGVmaW5lIE00V0FWX0NPTU1PTiAgICAgICAgMHgwMTRFCi0KLSNkZWZpbmUgTTRBRFRTX1JFQURFUiAgICAgICAgMHgwMTRGCi0jZGVmaW5lIE00QURJRl9SRUFERVIgICAgICAgIDB4MDE2QQotCi0jZGVmaW5lIE00U1BTICAgICAgICAgICAgICAgMHgwMTUwCi0jZGVmaW5lIE00RVhJRl9ERUNPREVSICAgICAgMHgwMTUxCi0jZGVmaW5lIE00RVhJRl9FTkNPREVSICAgICAgMHgwMTUyCi0jZGVmaW5lIE00R0lGX0RFQ09ERVIgICAgICAgMHgwMTUzCi0jZGVmaW5lIE00R0lGX0VOQ09ERVIgICAgICAgMHgwMTU0Ci0jZGVmaW5lIE00UE5HX0RFQ09ERVIgICAgICAgMHgwMTU1Ci0jZGVmaW5lIE00UE5HX0VOQ09ERVIgICAgICAgMHgwMTU2Ci0jZGVmaW5lIE00V0JNUF9ERUNPREVSICAgICAgMHgwMTU3Ci0jZGVmaW5lIE00V0JNUF9FTkNPREVSICAgICAgMHgwMTU4Ci0KLSNkZWZpbmUgTTRBTVJfV1JJVEVSICAgICAgICAweDAxNTkgICAgLyoqPCBubyByb29tIHRvIHB1dCBpdCBhbG9uZyBNNEFNUl9SRUFERVIgKi8KLQotCi0jZGVmaW5lIE00QVZDX0RFQ09ERVIgICAgICAgMHgwMTVBCi0jZGVmaW5lIE00QVZDX0VOQ09ERVIgICAgICAgMHgwMTVCCi0KLSNkZWZpbmUgTTRBU0ZfUkVBREVSICAgICAgICAweDAxNUMKLSNkZWZpbmUgTTRXTURSTV9BR0VOVCAgICAgICAgMHgwMTVECi0jZGVmaW5lIE00TUlESV9SRUFERVIgICAgICAgIDB4MDE2MiAgICAvKio8IG5vIHJvb20gYmVmb3JlIHRoZSBwcmVzZW50ZXJzICovCi0jZGVmaW5lIE00Uk1fUkVBREVSICAgICAgICAgMHgxNjMKLSNkZWZpbmUgTTRSTVZfREVDT0RFUiAgICAgICAgMHgxNjQKLSNkZWZpbmUgTTRSTUFfREVDT0RFUiAgICAgICAgMHgxNjUKLQotI2RlZmluZSBNNFRPT0xfWE1MICAgICAgICAgICAgMHgwMTY2Ci0jZGVmaW5lIE00VE9PTF9FRlIgICAgICAgICAgICAweDAxNjcgICAgLyoqPCBEZWNyeXB0aW9uIG1vZHVsZSBmb3IgVmlkZW8gQXJ0aXN0ICovCi0jZGVmaW5lIE00SUFMX0ZUTiAgICAgICAgICAgIDB4MDE2OCAgICAvKiBGVE4gaW1wbGVtZW50YXRpb24gb2YgdGhlIElBTCAqLwotI2RlZmluZSBNNEZUTiAgICAgICAgICAgICAgICAweDAxNjkgICAgLyogRlROIGxpYnJhcnkgKi8KLQotLyogcHJlc2VudGVyICovCi0jZGVmaW5lIE00UFJFU0VOVEVSX0FVRElPICAgMHgwMTYwCi0jZGVmaW5lIE00UFJFU0VOVEVSX1ZJREVPICAgMHgwMTYxCi0KLS8qIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlcyAodnBzLCBldGMuLikqLwotI2RlZmluZSBNNFZQUyAgICAgICAgICAgICAgIDB4MDE3MAotI2RlZmluZSBNNFZUUyAgICAgICAgICAgICAgIDB4MDE3MQotI2RlZmluZSBNNFZYUyAgICAgICAgICAgICAgIDB4MDE3MgotI2RlZmluZSBNNENBTExCQUNLICAgICAgICAgIDB4MDE3MwotI2RlZmluZSBNNFZFUyAgICAgICAgICAgICAgIDB4MDE3NAotI2RlZmluZSBNNFBSRVBST0NFU1NfVklERU8gIDB4MDE3NQotI2RlZmluZSBNNEdSQUJfQVVESU8gICAgICAgIDB4MDE3NgotI2RlZmluZSBNNEdSQUJfVklERU8gICAgICAgIDB4MDE3NwotI2RlZmluZSBNNFZTU0FWSSAgICAgICAgICAgIDB4MDE3OAotI2RlZmluZSBNNFZTUzNHUFAgICAgICAgICAgIDB4MDE3OQotI2RlZmluZSBNNFBUTzNHUFAgICAgICAgICAgIDB4MDE3QQotI2RlZmluZSBNNFBWWF9QQVJTRVIgICAgICAgIDB4MDE3QgotI2RlZmluZSBNNFZDUyAgICAgICAgICAgICAgICAweDAxN0MKLSNkZWZpbmUgTTRNQ1MgICAgICAgICAgICAgICAgMHgwMTdECi0jZGVmaW5lIE00TU5NQyAgICAgICAgICAgICAgICAweDAxODAgICAgLyoqPCBtbm0gY29udHJvbGxlciAqLwotI2RlZmluZSBNNFRURVhUX1BBUlNFUiAgICAgIDB4MDE4MSAgICAvKio8IHRpbWVkIHRleHQgKi8KLSNkZWZpbmUgTTRNTSAgICAgICAgICAgICAgICAweDAxODIgICAgLyoqPCBNdXNpYyBtYW5hZ2VyICovCi0jZGVmaW5lIE00TURQICAgICAgICAgICAgICAgIDB4MDE4MyAgICAvKio8IE1ldGFkYXRhIHBhcnNlciAqLwotI2RlZmluZSBNNE1NU1FMQ09SRSAgICAgICAgICAgIDB4MDE4NAotI2RlZmluZSBNNFZQU0lMICAgICAgICAgICAgICAgIDB4MDE4NQotI2RlZmluZSBNNEZJTEVJTCAgICAgICAgICAgIDB4MDE4NiAvKiBJTCBmaWxlIEludGVyZmFjZSAqLwotI2RlZmluZSBNNE1VICAgICAgICAgICAgICAgIDB4MDE4NwotI2RlZmluZSBNNFZFRSAgICAgICAgICAgICAgICAweDAxODggIC8qKjwgVmlkZW8gZWZmZWN0IGVuZ2luZSAqLwotI2RlZmluZSBNNFZBICAgICAgICAgICAgICAgIDB4MDE4OSAvKiBWaWRlb0FydGlzdCAqLwotI2RlZmluZSBNNEpUUyAgICAgICAgICAgICAgICAweDAxOEEKLSNkZWZpbmUgTTRKVFNJTCAgICAgICAgICAgICAgICAweDAxOEIKLSNkZWZpbmUgTTRBSVIgICAgICAgICAgICAgICAgMHgwMThDICAvKio8IEFJUiAqLwotI2RlZmluZSBNNFNQRSAgICAgICAgICAgICAgICAweDAxOEQgIC8qKjwgU3RpbGwgcGljdHVyZSBlZGl0b3IgKi8KLSNkZWZpbmUgTTRWUyAgICAgICAgICAgICAgICAweDAxOEUgICAgLyoqPCBWaWRlbyBTdHVkaW8gKHhWU1MpICovCi0jZGVmaW5lIE00VkVTSUwgICAgICAgICAgICAgICAgMHgwMThGICAgIC8qKjwgVkVTIGlsICovCi0jZGVmaW5lIE00SUQzICAgICAgICAgICAgICAgIDB4MDE5MCAgICAvKio8IElEMyBUYWcgTW9kdWxlICovCi0jZGVmaW5lIE00U0MgICAgICAgICAgICAgICAgMHgwMTkxICAgIC8qKjwgTWVkaWEgU2Nhbm5lciAqLwotI2RlZmluZSBNNFRHICAgICAgICAgICAgICAgIDB4MDE5MiAgLyoqPCBUaHVtYm5haWwgR2VuZXJhdG9yKi8KLSNkZWZpbmUgTTRUUyAgICAgICAgICAgICAgICAweDAxOTMgICAgLyoqPCBUaHVtYm5haWwgc3RvcmFnZSAqLwotI2RlZmluZSBNNE1CICAgICAgICAgICAgICAgIDB4MDE5NCAgICAvKio8IE1lZGlhIGJyb3dzZXIgKi8KLQotLyogaGlnaCBsZXZlbCBhcHBsaWNhdGlvbiAodGVzdCBvciBjbGllbnQgYXBwKSAqLwotI2RlZmluZSBNNEFQUExJICAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBNNFZBX0FQUExJICAgICAgICAgICAgMHgwMjAxICAgIC8qKjwgVmlkZW8gQXJ0aXN0IHRlc3QgYXBwbGljYXRpb24gKi8KLQotLyogZXh0ZXJuYWwgY29tcG9uZW50cyAoSFcgdmlkZW8gY29kZWNzLCBldGMuKSAqLwotI2RlZmluZSBNNFZEX0VYVEVSTkFMICAgICAgICAweDAzMDAKLSNkZWZpbmUgTTRWRV9FWFRFUk5BTCAgICAgICAgMHgwMzAxCi0KLQotLyogcHJpb3JpdHkgdG8gY29tYmluZSB3aXRoIG1vZHVsZSBpZHMgKi8KLSNkZWZpbmUgTTRISUdIX1BSSU9SSVRZICAgICAweEMwMDAKLSNkZWZpbmUgTTRNRURJVU1fUFJJT1JJVFkgICAweDgwMDAKLSNkZWZpbmUgTTRMT1dfUFJJT1JJVFkgICAgICAweDQwMDAKLSNkZWZpbmUgTTRERUZBVUxUX1BSSU9SSVRZICAweDAwMDAKLQotCi0jZW5kaWYgLypfX000T1NBX0NPUkVJRF9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFBDTVJfQ29yZVJlYWRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRQQ01SX0NvcmVSZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmFmYzUwYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFBDTVJfQ29yZVJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFdBVl9XYXZSZWFkZXIuaAotICogQGJyaWVmICAgV0FWIFJlYWRlciBkZWNsYXJhdGlvbnMKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyBvZiB0aGUgV0FWIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotCi0jZGVmaW5lIE00UENNQ19FUlJfUENNX05PVF9DT01QTElBTlQgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00V0FWX0NPTU1PTiwweDAwMDAwMSkKLSNkZWZpbmUgTTRQQ01DX0VSUl9QQ01fTk9fU1BBQ0VfQVZBSUwgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRXQVZfQ09NTU9OLDB4MDAwMDAyKQotI2RlZmluZSBNNFBDTUNfRVJSX1BDTV9OT1RfU1VQUE9SVEVEICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFdBVl9DT01NT04sMHgwMDAwMDMpCi0KLSNkZWZpbmUgTTRQQ01DX1dBUl9FTkRfT0ZfU1RSRUFNICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRXQVZfQ09NTU9OICwweDAwMDAwMSkKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRXQVZDX0RlY29kZXJTcGVjaWZpY0luZm8KLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBkZWNvZGVyIFNwZWNpZmljIGluZm9ybWF0aW9ucwotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIFdBViByZWFkZXIgdG8gc3RvcmUgYWxsCi0gKiAgICAgICAgICAgICAgZGVjb2RlciBzcGVjaWZpYyBpbmZvcm1hdGlvbnM6Ci0gKiAgICAgICAgICAgICAgLSBTYW1wbGUgRnJlcXVlbmN5Ci0gKiAgICAgICAgICAgICAgLSBBdmVyYWdlIEJ5dGVzIHBlciBzZWNvbmQKLSAqICAgICAgICAgICAgICAtIE51bWJlciBvZiBjaGFubmVscyAoMSBvciAyKQotICogICAgICAgICAgICAgIC0gTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSAoOCBvciAxNikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyICAgIFNhbXBsZUZyZXF1ZW5jeTsKLSAgICBNNE9TQV9VSW50MzIgICAgQXZnQnl0ZXNQZXJTZWM7Ci0gICAgTTRPU0FfVUludDMyICAgIERhdGFMZW5ndGg7Ci0gICAgTTRPU0FfVUludDE2ICAgIG5iQ2hhbm5lbHM7Ci0gICAgTTRPU0FfVUludDE2ICAgIEJpdHNQZXJTYW1wbGU7Ci19IE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00V0FWUl9TdGF0ZQotICogQGJyaWVmICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIFdBViBSZWFkZXIgU3RhdGVzCi0gKiBAbm90ZSAgICBUaGUgc3RhdGUgYXV0b21hdG9uIGlzIGRvY3VtZW50ZWQgc2VwYXJhdGVseQotICogICAgICAgICAgY29uc3VsdCB0aGUgZGVzaWduIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00UENNUl9rSW5pdCAgICA9IDB4MDAwMCwKLSAgICBNNFBDTVJfa09wZW5pbmcgPSAweDAxMDAsCi0gICAgTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZCA9IDB4MDEwMSwKLSAgICBNNFBDTVJfa1JlYWRpbmcgPSAweDAyMDAsCi0gICAgTTRQQ01SX2tSZWFkaW5nX25leHRBVSAgPSAweDAyMDEsCi0gICAgTTRQQ01SX2tDbG9zZWQgID0gMHgwMzAwCi19IE00UENNUl9TdGF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFdBVlJfT3B0aW9uSUQKLSAqIEBicmllZiAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBXQVYgUmVhZGVyIG9wdGlvbnMKLSAqIEBub3RlICAgIE9ubHkgb25lIG9wdGlvbiBpcyBhdmFpbGFibGU6Ci0gKiAgICAgICAgICAtIE00V0FWUl9rUENNYmxvY2tTaXplOiBzZXRzIHRoZSBzaXplIG9mIHRoZSBQQ00gYmxvY2sgdG8gcmVhZAotICogICAgICAgICAgICBmcm9tIFdBViBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFBDTVJfa1BDTWJsb2NrU2l6ZSAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRXQVZfUkVBREVSLCAweDAxKQotfSBNNFBDTVJfT3B0aW9uSUQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00V0FWUl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgV0FWIFJlYWRlciBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIFdBViBSZWFkZXIgY2FsbHMgdG8gc3RvcmUKLSAqICAgICAgICAgICAgICB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNJbmZvOy8qKjwgUG9pbnRlciB0byB0aGUgZGVjb2RlciBzcGVjaWZpYyBpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBjb250YWluZWQgaW4gcFN0cmVhbURlc2MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9ubHkgdXNlZCB0byBmcmVlLi4uKSAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICBtX3BGaWxlUmVhZEZ1bmM7LyoqPCBUaGUgT1NBTCBzZXQgb2YgcG9pbnRlciB0byBmdW5jdGlvbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgbWFuYWdlbWVudCAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICBtX2ZpbGVDb250ZXh0OyAgLyoqPCBUaGUgY29udGV4dCBuZWVkZWQgYnkgT1NBTCB0byBtYW5hZ2UgRmlsZSAqLwotICAgIE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvICBtX2RlY29kZXJDb25maWc7LyoqPCBTcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciBkZWNvZGVyICovCi0gICAgTTRQQ01SX1N0YXRlICAgICAgICAgICAgICAgIG1fc3RhdGU7ICAgICAgICAvKio8IHN0YXRlIG9mIHRoZSB3YXYgcmVhZGVyICovCi0gICAgTTRQQ01SX1N0YXRlICAgICAgICAgICAgICAgIG1fbWljcm9TdGF0ZTsgICAvKio8IHN0YXRlIG9mIHRoZSByZWFkIHdhdiBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9ibG9ja1NpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgcmVhZCBibG9jayAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtX29mZnNldDsgICAgICAgLyoqPCBPZmZzZXQgb2YgdGhlIFBDTSByZWFkIChpLmUgbV9vZmZzZXQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgd2l0aG91dCB3YXYgaGVhZGVyKSAqLwotICAgIE00T1NBX01lbUFkZHIzMiAgICAgICAgICAgICBtX3BBdUJ1ZmZlcjsgICAgLyoqPCBSZS11c2VkIGJ1ZmZlciBmb3IgQVUgY29udGVudCBzdG9yYWdlICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgIG1fZGF0YVN0YXJ0T2Zmc2V0Oy8qKjwgb2Zmc2V0IG9mIHRoZSBwY20gZGF0YSBiZWdpbm5pbmcgaW50bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgKi8KLX0gTTRQQ01SX0NvbnRleHQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFByb3RvdHlwZXMgb2YgYWxsIFdBViByZWFkZXIgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBDTVJfb3BlblJlYWQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVGdW5jdGlvbik7Ci1NNE9TQV9FUlIgTTRQQ01SX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogcFN0cmVhbURlc2MpOwotTTRPU0FfRVJSIE00UENNUl9zdGFydFJlYWRpbmcoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlEcyk7Ci1NNE9TQV9FUlIgTTRQQ01SX25leHRBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotTTRPU0FfRVJSIE00UENNUl9mcmVlQVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLU00T1NBX0VSUiBNNFBDTVJfc2VlayhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsIE00T1NBX1RpbWUgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TZWVrQWNjZXNzTW9kZSBzZWVrQWNjZXNzTW9kZSwgTTRPU0FfVGltZSogcE9idGFpbkNUUyk7Ci1NNE9TQV9FUlIgTTRQQ01SX2Nsb3NlUmVhZChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotTTRPU0FfRVJSIE00UENNUl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwVmFsdWUpOwotTTRPU0FfRVJSIE00UENNUl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIFZhbHVlKTsKLU00T1NBX0VSUiBNNFBDTVJfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pOwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfM2dwQ29tLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl8zZ3BDb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjJhNWEwMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl8zZ3BDb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRSRUFERVJfM2dwQ29tLmgKLSAqIEBicmllZiAgICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgM2dwIHJlYWRlcgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBnZW5lcmljIHNoZWxsIGludGVyZmFjZSByZXRyaWV2aW5nIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgIG9mIHRoZSAzR1AgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9fTTRSRUFERVJfM0dQQ09NX0hfXwotI2RlZmluZSBfX000UkVBREVSXzNHUENPTV9IX18KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqIEVycm9yOiBGdW5jdGlvbiBNNFJFQURFUl9Db20zR1BfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlLgotICovCi0jZGVmaW5lIE00RVJSX05PX1ZJREVPX1NUUkVBTV9SRVRSSUVWRURfWUVUICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRSRUFERVJfM0dQLCAweDAwMDAwMSkKLQotLyoqCi0gKiBFcnJvcjogTm8gdmlkZW8gc3RyZWFtIEgyNjMgaW4gZmlsZS4KLSAqLwotI2RlZmluZSBNNEVSUl9WSURFT19OT1RfSDI2MyAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00UkVBREVSXzNHUCwgMHgwMDAwMDIpCi0KLS8qKgotICogVGhlcmUgaGFzIGJlZW4gYSBwcm9ibGVtIHdpdGggdGhlIGRlY29kZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiwgc2VlbXMgdG8gYmUgaW52YWxpZCAqLwotI2RlZmluZSBNNEVSUl9SRUFERVIzR1BfREVDT0RFUl9DT05GSUdfRVJST1IgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00UkVBREVSXzNHUCwgMHgwMDAwMDMpCi0KLSNkZWZpbmUgTTRSRUFERVJfQ09NM0dQX01BWFZJREVPU1RSRUFNICA1Ci0jZGVmaW5lIE00UkVBREVSX0NPTTNHUF9NQVhBVURJT1NUUkVBTSAgNQotI2RlZmluZSBNNFJFQURFUl9DT00zR1BfTUFYVEVYVFNUUkVBTSAgIDUKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgIG1fcEZGQ29udGV4dDsgICAgLyoqPCBjb3JlIGZpbGUgZm9ybWF0IGNvbnRleHQgKi8KLQotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9BdWRpb1N0cmVhbXNbTTRSRUFERVJfQ09NM0dQX01BWEFVRElPU1RSRUFNXTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fcEF1ZGlvU3RyZWFtOyAgICAvKio8IHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYWxsb2NhdGVkIGF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gaGFuZGxlciAqLwotCi0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX1ZpZGVvU3RyZWFtc1tNNFJFQURFUl9DT00zR1BfTUFYVklERU9TVFJFQU1dOwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9wVmlkZW9TdHJlYW07ICAgIC8qKjwgcG9pbnRlciB0byB0aGUgY3VycmVudCBhbGxvY2F0ZWQgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBoYW5kbGVyICovCi0KLSNpZmRlZiBNNFZQU19TVVBQT1JUX1RURVhUCi0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX1RleHRTdHJlYW1zW000UkVBREVSX0NPTTNHUF9NQVhURVhUU1RSRUFNXTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fcFRleHRTdHJlYW07ICAgIC8qKjwgcG9pbnRlciB0byB0aGUgY3VycmVudCBhbGxvY2F0ZWQgdGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGhhbmRsZXIgKi8KLSNlbmRpZiAvKk00VlBTX1NVUFBPUlRfVFRFWFQqLwotCi19IE00UkVBREVSX0NvbTNHUF9Db250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBNNFJFQURFUl8zR1BfQnVmZmVyIChidXQgbm90aGluZyBzcGVjaWZpYyB0byAzR1AsIG5vciB0byBhIHJlYWRlciAhKQotICogQGJyaWVmICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgYnVmZmVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXhjaGFuZ2UgZGF0YSAoc2hvdWxkIGJlIGluIE9TQUwpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgc2l6ZTsgICAgICAgICAgICAvKio8IHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICBkYXRhQWRkcmVzczsgICAgLyoqPCB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyICovCi19IE00UkVBREVSXzNHUF9CdWZmZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRSRUFERVJfM0dQX09wdGlvbklECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIHJlYWRlciBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSAzR1AgZm9ybWF0LgotICogQG5vdGUgICAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gYSAzR1AgcmVhZGVyIHZpYSBNNFJFQURFUl8zR1BfZ2V0T3B0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKgotICAgICAqIEdldCB0aGUgRGVjb2RlckNvbmZpZ0luZm8gZm9yIEgyNjMsCi0gICAgICogb3B0aW9uIHZhbHVlIG11c3QgYmUgYSBwb2ludGVyIHRvIE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllcyBhbGxvY2F0ZWQgYnkgY2FsbGVyICovCi0gICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9IMjYzUHJvcGVydGllcyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfM0dQLCAweDAxKSwKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgUHVycGxlIExhYnMgZHJtIGluZm9ybWF0aW9uICovCi0gICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9QdXJwbGVMYWJzRHJtID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl8zR1AsIDB4MDIpLAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBGYXN0IG9wZW4gbW9kZSAoT25seSB0aGUgZmlyc3QgQVUgb2YgZWFjaCBzdHJlYW0gd2lsbCBiZSBwYXJzZWQgLT4gbGVzcyBDUFUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIFJBTSkuICovCi0gICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl8zR1AsIDB4MDMpLAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBBdWRpbyBvbmx5IG1vZGUgKHRoZSB2aWRlbyBzdHJlYW0gd29uJ3QgYmUgb3BlbmVkKSAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfQXVkaW9Pbmx5ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRSRUFERVJfM0dQLCAweDA0KSwKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgVmlkZW8gb25seSBtb2RlICh0aGUgYXVkaW8gc3RyZWFtIHdvbid0IGJlIG9wZW5lZCkgKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1ZpZGVvT25seSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00UkVBREVSXzNHUCwgMHgwNSksCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5leHQgdmlkZW8gQ1RTICovCi0gICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9nZXROZXh0VmlkZW9DVFMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSXzNHUCwgMHgwNikKLQotfSBNNFJFQURFUl8zR1BfT3B0aW9uSUQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRSRUFERVJfM0dQX0gyNjNQcm9wZXJ0aWVzCi0gKiBAYnJpZWYgICAgQ29udGFpbnMgaW5mbyBhYm91dCBIMjYzIHN0cmVhbSByZWFkIGZyb20gdGhlIDNHUCBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCB0aGUgcHJvZmlsZSBhcyBkZWZpbmVkIGluIHRoZSBWaXN1YWwgT2JqZWN0IFNlcXVlbmNlIGhlYWRlciwgaWYgcHJlc2VudCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICB1aVByb2ZpbGU7Ci0gICAgLyoqPCB0aGUgbGV2ZWwgYXMgZGVmaW5lZCBpbiB0aGUgVmlzdWFsIE9iamVjdCBTZXF1ZW5jZSBoZWFkZXIsIGlmIHByZXNlbnQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgdWlMZXZlbDsKLQotfSBNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCB0aGUgbmV4dCBzdHJlYW0gZm91bmQgaW4gdGhlIDNncCBmaWxlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwTWVkaWFGYW1pbHk6ICAgIChPVVQpICAgIFBvaW50ZXIgdG8gYSB1c2VyIGFsbG9jYXRlZCBNNFJFQURFUl9NZWRpYUZhbWlseSB0aGF0IHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgZmFtaWx5IG9mIHRoZSBmb3VuZCBzdHJlYW0KLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKE9VVCkgICAgUG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBmb3VuZCBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00V0FSX05PX01PUkVfU1RSRUFNICAgIE5vIG1vcmUgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgbWVkaWEgKGFsbCBzdHJlYW1zIGZvdW5kKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9Db20zR1BfZ2V0TmV4dFN0cmVhbUhhbmRsZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgIGFjY2VzcyB1bml0IChBVSkKLSAqIEBub3RlICAgIEFuIEFVIGlzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhbW91bnQgb2YgZGF0YSB0byBiZSBkZWNvZGVkIGJ5IGEgZGVjb2Rlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0ICAgICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBhdSBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbml0aWFsaXplZCBieSBjYWxsaW5nIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgY3JlYXRpb24pCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJucyAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0NvbTNHUF9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBDbGVhbnMgdXAgdGhlIHN0cmVhbSBoYW5kbGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIHJlYWRlciBzaGVsbAotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoSU4vT1VUKSBTdHJlYW0gaGFuZGxlcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIFRoZSBjb250ZXh0IGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9Db20zR1BfY2xlYW5VcEhhbmRsZXIoTTRfU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFJFQURFUl8zR1BDT01fSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0Ftci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQW1yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2ZTdmOTcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQW1yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00UkVBREVSX0Ftci5oCi0gKiBAYnJpZWYgIEdlbmVyaWMgZW5jYXBzdWxhdGlvbiBvZiB0aGUgY29yZSBhbXIgcmVhZGVyCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgZ2VuZXJpYyBzaGVsbCBpbnRlcmZhY2UgcmV0cmlldmluZyBmdW5jdGlvbgotICogICAgICAgICBvZiB0aGUgQU1SIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNFJFQURFUl9BTVJfSF9fCi0jZGVmaW5lIF9fTTRSRUFERVJfQU1SX0hfXwotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiBSZXRyaWV2ZXMgdGhlIGdlbmVyaWMgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGUgcmVhZGVyCi0qCi0qIEBwYXJhbSBwTWVkaWFUeXBlICAgICAgICAgICAgIDogUG9pbnRlciBvbiBhIE00UkVBREVSX01lZGlhVHlwZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBtZWRpYSB0eXBlIHN1cHBvcnRlZCBieSB0aGlzIHJlYWRlcgotKiBAcGFyYW0gcFJkckdsb2JhbEludGVyZmFjZSA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGdsb2JhbCBpbnRlcmZhY2UKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIHJlYWRlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW4tYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCi0qIEBwYXJhbSBwUmRyRGF0YUludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZGF0YSBpbnRlcmZhY2UKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIHJlYWRlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW4tYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCi0qCi0qIEByZXR1cm5zIDogTTROT19FUlJPUiAgICAgaWYgT0sKLSogICAgICAgICAgICAgRVJSX0FMTE9DICAgICAgaWYgYW4gYWxsb2NhdGlvbiBmYWlsZWQKLSogICAgICAgICAgICBFUlJfUEFSQU1FVEVSICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNFJFQURFUl9BTVJfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODg2M2E3ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDcxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFJFQURFUl9Db21tb24uaAotICogQGJyaWVmICBTaGVsbCBSZWFkZXIgY29tbW9uIGludGVyZmFjZSBkZWNsYXJhdGlvbgotICogQG5vdGUgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGNvbW1vbiBpbnRlcmZhY2VzIHRoYXQgcmVhZGVyIHNoZWxscyBtdXN0IGltcGxlbWVudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRSRUFERVJfQ09NTU9OX0hfXwotI2RlZmluZSBfX000UkVBREVSX0NPTU1PTl9IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTREQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00Q29tbW9uX3R5cGVzLmgiCi0KLS8qIEVSUk9SUyAqLwotI2RlZmluZSBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00UkVBREVSX0NPTU1PTiwgMHgwMDAxKQotCi0vKiBXQVJOSU5HUyAqLwotI2RlZmluZSBNNFdBUl9SRUFERVJfTk9fTUVUQURBVEEgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00UkVBREVSX0NPTU1PTiwgMHgwMDAxKQotI2RlZmluZSBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00UkVBREVSX0NPTU1PTiwgMHgwMDAyKQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIE1lZGlhIHR5cGVzIHVzZWQgdG8gY3JlYXRlIG1lZGlhIHJlYWRlcnMKLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZQUyB0byBpZGVudGlmeSBhIGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAqICAgICAgICAgIG1lZGlhIHJlYWRlciBpbnRlcmZhY2UuIEVhY2ggcmVhZGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCBvbmUgb2YgdGhpcyB0eXBlIGFzc29jaWF0ZWQuCi0gKiAgICAgICAgICBXaGVuIGEgcmVhZGVyIGluc3RhbmNlIGlzIG5lZWRlZCwgdGhpcyB0eXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kCi0gKiAgICAgICAgICBhbmQgcmV0cmlldmUgaXRzIGludGVyZmFjZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlVW5rbm93biAgICAgICAgPSAtMSwgICAgLyoqPCBVbmtub3duIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlM0dQUCAgICAgICAgICAgID0gMCwgICAgLyoqPCAzR1BQIGZpbGUgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBVkkgICAgICAgICAgICA9IDEsICAgIC8qKjwgQVZJIGZpbGUgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBTVIgICAgICAgICAgICA9IDIsICAgIC8qKjwgQU1SIGZpbGUgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVNUDMgICAgICAgICAgICA9IDMsICAgIC8qKjwgTVAzIGZpbGUgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVSVFNQICAgICAgICAgICAgPSA0LCAgICAvKio8IFJUU1AgbmV0d29yayBhY2Nlc3NlZCBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZTNHUFBIVFRQICAgICAgICA9IDUsICAgIC8qKjwgUHJvZ3Jlc3NpdmVseSBkb3dubG9hZGVkIDNHUFAgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZVBWSFRUUCAgICAgICAgPSA2LCAgICAvKio8IFBhY2tldCBWaWRlbyBIVFRQIHByb3ByaWV0YXJ5IHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlV0FWICAgICAgICAgICAgPSA3LCAgICAvKio8IFdBViBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlM0dQRVhUSFRUUCAgICA9IDgsICAgIC8qKjwgQW4gZXh0ZXJuYWwgcHJvZ3Jlc3NpdmVseSBkb3dubG9hZGVkIDNHUFAgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFBQyAgICAgICAgICAgID0gOSwgICAgLyoqPCBBRFRTIGFuZCBBRElGIEFBQyBzdXBwb3J0ICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZVJFQUwgICAgICAgICAgICA9IDEwLCAgICAvKio8IFJFQUwgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBU0YgICAgICAgICAgICA9IDExLCAgICAvKio8IEFTRiBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUZMRVhUSU1FICAgICAgICA9IDEyLCAgICAvKio8IEZsZXhUaW1lIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQkJBICAgICAgICAgICAgPSAxMywgICAgLyoqPCBCZWF0YnJldyBhdWRpbyBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZVNZTlRIQVVESU8gICAgPSAxNCwgICAgLyoqPCBTeW50aGVzaXMgYXVkaW8gTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVQQ00gICAgICAgICAgICA9IDE1LCAgICAvKio8IFBDTSBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUpQRUcgICAgICAgICAgICA9IDE2LCAgICAvKio8IEpQRUcgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVHSUYgICAgICAgICAgICA9IDE3LCAgICAvKio8IEdJRiBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFESUYgICAgICAgICAgICA9IDE4LCAgICAvKio8IEFBQy1BRFRTIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQURUUyAgICAgICAgICAgID0gMTksICAgIC8qKjwgQUFDLUFEVFMgTWVkaWEgdHlwZSAqLwotCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZV9OQiAgLyogbnVtYmVyIG9mIHJlYWRlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi0KLX0gTTRSRUFERVJfTWVkaWFUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIE1lZGlhIGZhbWlseSBvZiBhIHN0cmVhbQotICogQG5vdGUgICAgVGhpcyBlbnVtIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVlBTIHRvIGlkZW50aWZ5IHdoYXQga2luZCBvZiBzdHJlYW0KLSAqICAgICAgICAgIGhhcyBiZWVuIHJldHJpZXZlZCB2aWEgZ2V0TmV4dFN0cmVhbSgpIGZ1bmN0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UkVBREVSX2tNZWRpYUZhbWlseVVua25vd24gICA9IC0xLAotICAgIE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvICAgICA9IDAsCi0gICAgTTRSRUFERVJfa01lZGlhRmFtaWx5QXVkaW8gICAgID0gMSwKLSAgICBNNFJFQURFUl9rTWVkaWFGYW1pbHlUZXh0ICAgICAgPSAyCi19IE00UkVBREVSX01lZGlhRmFtaWx5OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFJFQURFUl9PcHRpb25JRAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSByZWFkZXIgb3B0aW9ucwotICogQG5vdGUgICAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcmVhZCBmcm9tIGEgcmVhZGVyIHZpYSBNNFJFQURFUl9nZXRPcHRpb25fZmN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqCi0gICAgR2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgbW92aWUgKGluIG1zKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDApLAotCi0gICAgLyoqCi0gICAgR2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBjb3JlIHJlYWRlcgotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1ZlcnNpb24gID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDEpLAotCi0gICAgLyoqCi0gICAgR2V0IHRoZSBjb3B5cmlnaHQgZnJvbSB0aGUgbWVkaWEgKGlmIHByZXNlbnQpCi0gICAgKGN1cnJlbnRseSBpbXBsZW1lbnRlZCBmb3IgM0dQUCBvbmx5OiBjb3B5cmlnaHQgZ2V0IGZyb20gdGhlIGNwcnQgYXRvbSBpbiB0aGUgdWR0YSBpZiBwcmVzZW50KQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0NvcHlyaWdodD0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDIpLAotCi0KLSAgICAvKioKLSAgICBTZXQgdGhlIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zIHRvIHRoZSByZWFkZXIgKHR5cGUgb2YgdmFsdWU6IE00T1NBX0ZpbGVSZWFkUG9pbnRlciopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9DT01NT04sIDMpLAotCi0gICAgLyoqCi0gICAgU2V0IHRoZSBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucyB0byB0aGUgcmVhZGVyICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVdyaXRlckZjdHNQdHIgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9DT01NT04sIDQpLAotCi0gICAgLyoqCi0gICAgU2V0IHRoZSBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucyB0byB0aGUgcmVhZGVyICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9OZXRGdW5jdGlvbiopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhTmV0RmN0c1B0ciA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCA1KSwKLQotICAgIC8qKgotICAgIENyZWF0aW9uIHRpbWUgaW4gc2VjLiBzaW5jZSBtaWRuaWdodCwgSmFuLiAxLCAxOTcwICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9VSW50MzIqKQotICAgIChhdmFpbGFibGUgb25seSBmb3IgM0dQUCBjb250ZW50LCBpbmNsdWRpbmcgUEdEKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0NyZWF0aW9uVGltZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCA2KSwKLQotICAgIC8qKgotICAgIEJpdHJhdGUgaW4gYnBzICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9Eb3VibGUqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgNyksCi0KLSAgICAvKioKLSAgICBUYWcgSUQzdjEgb2YgTVAzIHNvdXJjZSAodHlwZSBvZiB2YWx1ZTogTTRNUDNSX0lEM1RhZyopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfTXAzSWQzdjFUYWcgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgOCksCi0KLSAgICAvKioKLSAgICBUYWcgSUQzdjIgb2YgTVAzIHNvdXJjZSAodHlwZSBvZiB2YWx1ZTogTTRNUDNSX0lEM1RhZyopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfTXAzSWQzdjJUYWcgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgOSksCi0KLSAgICAvKioKLSAgICBOdW1iZXIgb2YgQWNjZXNzIFVuaXQgaW4gdGhlIEF1ZGlvIHN0cmVhbSAodHlwZSBvZiB2YWx1ZTogTTRPU0FfVUludDMyKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9HZXROdW1iZXJPZkF1ZGlvQXUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHhBKSwKLQotICAgIC8qKgotICAgIE51bWJlciBvZiBmcmFtZXMgcGVyIGJsb2MKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9HZXROYmZyYW1lUGVyQmxvYyAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAweEIpLAotCi0gICAgLyoqCi0gICAgRmxhZyBmb3IgcHJvdGVjdGlvbiBwcmVzZW5jZQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldFByb3RlY3RQcmVzZW5jZSAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAweEMpLAotCi0gICAgLyoqCi0gICAgU2V0IERSTSBDb250ZXh0Ci0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0RFJNQ29udGV4dCAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweEQpLAotCi0gICAgLyoqCi0gICAgR2V0IEFTRiBDb250ZW50IERlc2NyaXB0aW9uIE9iamVjdAotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0NvbnRlbnREZXNjcmlwdGlvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweEUpLAotCi0gICAgLyoqCi0gICAgR2V0IEFTRiBDb250ZW50IERlc2NyaXB0aW9uIE9iamVjdAotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0V4dGVuZGVkQ29udGVudERlc2NyaXB0aW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9DT01NT04sIDB4RiksCi0KLSAgICAvKioKLSAgICBHZXQgQXNzZXQgM2dwcCBGaWVsZHMKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF8zZ3BBc3NldEZpZWxkcyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDEwKSwKLQotICAgIC8qKgotICAgIFNldCB0aGUgbWF4IG1ldGFkYXRhIHNpemUgc3VwcG9ydGVkIGluIHRoZSByZWFkZXIKLSAgICBPbmx5IHJlbGV2YW50IGluIDNncCBwYXJzZXIgdGlsbCBub3csIGJ1dCBjYW4gYmUgdXNlZCBmb3Igb3RoZXIgcmVhZGVycwotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX01heE1ldGFkYXRhU2l6ZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00UkVBREVSX0NPTU1PTiwgMHgxMSksCi0KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfR2V0TWV0YWRhdGEgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxMiksCi0gICAgLyoqCi0gICAgR2V0IDNncHAgJ2Z0eXAnIGF0b20KLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF8zZ3BGdHlwQm94ICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDEzKSwKLQotCi0gICAgLyogdmFsdWUgaXMgTTRPU0FfQm9vbCogKi8KLSAgICAvKiByZXR1cm4gdGhlIGRybSBwcm90ZWN0aW9uIHN0YXR1cyBvZiB0aGUgZmlsZSovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX2lzUHJvdGVjdGVkID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTQpLAotCi0gICAgLyogdmFsdWUgaXMgYSB2b2lkKiAqLwotICAgIC8qIHJldHVybiB0aGUgYWdncmVnYXRlIHJpZ2h0cyBvZiB0aGUgZmlsZSovCi0gICAgLyogVGhlIGJ1ZmZlciBtdXN0IGJlIGFsbG9jYXRlZCBieSB0aGUgYXBwbGljYXRpb24gYW5kIG11c3QgYmUgYmlnIGVub3VnaCovCi0gICAgLyogQnkgZGVmYXVsdCwgdGhlIHNpemUgZm9yIFdNRFJNIGlzIDc2IGJ5dGVzICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX2dldEFnZ3JlZ2F0ZVJpZ2h0cyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE1KSwKLSAgICAvKioKLSAgICBHZXQgQVNGIENvbnRlbnQgRGVzY3JpcHRpb24gT2JqZWN0Ci0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfRXh0ZW5kZWRDb250ZW50RW5jcnlwdGlvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9DT01NT04sIDB4MTYpLAotCi0gICAgLyoqCi0gICAgTnVtYmVyIG9mIEFjY2VzcyBVbml0IGluIHRoZSBWaWRlbyBzdHJlYW0gKHR5cGUgb2YgdmFsdWU6IE00T1NBX1VJbnQzMiopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfR2V0TnVtYmVyT2ZWaWRlb0F1ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTcpLAotCi0gICAgLyoqCi0gICAgQ2h1bmsgbW9kZSBhY3RpdmF0aW9uICBzaXplIGluIGNhc2Ugb2YgSlBHIHJlYWRlciAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9KcGVnQ2h1bmNrU2l6ZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE4KSwKLQotICAgIC8qKgotICAgIENoZWNrIGlmIEFTRiBmaWxlIGNvbnRhaW5zIHZpZGVvICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX2hhc1ZpZGVvID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTkpLAotCi0gICAgLyoqCi0gICAgIFNldCBzcGVjaWZpYyByZWFkIG1vZGUgZm9yIFJhbmRvbSBBY2Nlc3MgSlBFRyAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9KcGVnUkFNb2RlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRSRUFERVJfQ09NTU9OLCAweDIwKSwKLQotICAgIC8qKgotICAgIEdldCBUaHVtYm5haWwgYnVmZmVyIGluIGNhc2Ugb2YgSlBHIHJlYWRlciAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9KcGVnVGh1bWJuYWlsID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MjEpLAotCi0gICAgLyoqCi0gICAgR2V0IEZQREFUQSBidWZmZXIgaW4gY2FzZSBvZiBKUEcgcmVhZGVyICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0pwZWdGUERhdGEgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgyMiksCi0KLSAgICAvKioKLSAgICBHZXQgSlBFRyBpbmZvIChwcm9ncmVzc2l2ZSwgc3Vic2FtcGxpbmcpICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0pwZWdJbmZvPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgyMykKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi19IE00UkVBREVSX09wdGlvbklEOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9Db3B5UmlnaHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGNvcHlSaWdodCBkZXNjcmlwdGlvbgotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGNvcHlSaWdodCBvZiB0aGUgbWVkaWEKLSAqICAgICAgICAgICAgICAoaWYgcHJlc2VudCkgdmlhIHRoZSBnZXRPcHRpb24oKSBmdW5jdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9Db3B5UmlnaHQKLXsKLSAgICAvKioKLSAgICBQb2ludGVyIHRvIGNvcHlyaWdodCBkYXRhIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAgICAqLwotICAgIE00T1NBX1VJbnQ4KiAgIG1fcENvcHlSaWdodDsKLQotICAgIC8qKgotICAgIFBvaW50ZXIgdG8gY29weXJpZ2h0IHNpemUuIFRoZSBwQ29weVJpZ2h0U2l6ZSBtdXN0Ci0gICAgYmUgSW5pdGlhbGl6ZWQgd2l0aCB0aGUgc2l6ZSBhdmFpbGFibGUgaW4gdGhlIHBDb3B5UmlnaHQgYnVmZmVyCi0gICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICBtX3VpQ29weVJpZ2h0U2l6ZTsKLQotfSBNNFJFQURFUl9Db3B5UmlnaHQ7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9TdHJlYW1EYXRhT3B0aW9uCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBnZW5lcmljIHN0cmVhbSBkYXRhIG9wdGlvbgotICogQG5vdGUgICAgICAgIEl0IGlzIHVzZWQgaXMgdXNlZCB0byBzZXQgb3IgZ2V0IGEgc3RyZWFtIHNwZWNpZmljIGRhdGEgZGVmaW5lZAotICogICAgICAgICAgICAgIGJ5IGEgcmVsZXZhbnQgcmVhZGVyIG9wdGlvbiBJRC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfU3RyZWFtRGF0YU9wdGlvbgotewotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICBtX3BTdHJlYW1IYW5kbGVyOyAvKio8IGlkZW50aWZpZXIgb2YgdGhlIHN0cmVhbSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICBtX3BPcHRpb25WYWx1ZTsgICAvKio8IHZhbHVlIG9mIHRoZSBkYXRhIG9wdGlvbiB0byBnZXQgb3IgdG8gc2V0ICovCi0KLX0gTTRSRUFERVJfU3RyZWFtRGF0YU9wdGlvbjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNF9FbmNvZGluZ0Zvcm1hdAotICogQGJyaWVmICAgICAgICBUZXh0IGVuY29kaW5nIGZvcm1hdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8vIHR5cGVkZWYgZW51bQotLy8gewotLy8gICAgIE00X2tFbmNGb3JtYXRVbmtub3duICAgID0gMCwgICAgLyoqPCBVbmtub3duIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vLyAgICAgTTRfa0VuY0Zvcm1hdEFTQ0lJICAgICAgICA9IDEsICAvKio8IElTTy04ODU5LTEuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgICAgICAgICAgICAgICAgICAgKi8KLS8vICAgICBNNF9rRW5jRm9ybWF0VVRGOCAgICAgICAgPSAyLCAgIC8qKjwgVVRGLTggZW5jb2RlZCBVbmljb2RlIC4gVGVybWluYXRlZCB3aXRoICQwMCAgICAgICAqLwotLy8gICAgIE00X2tFbmNGb3JtYXRVVEYxNiAgICAgICAgPSAzICAgLyoqPCBVVEYtMTYgZW5jb2RlZCBVbmljb2RlLiBUZXJtaW5hdGVkIHdpdGggJDAwIDAwICAgICovCi0vKn0gIE00X0VuY29kaW5nRm9ybWF0OyovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1N0cmluZ0F0dHJpYnV0ZXMKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBzdHJpbmcgYXR0cmlidXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLy8gdHlwZWRlZiBzdHJ1Y3QKLS8vIHsKLS8vICAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIG1fcFN0cmluZzsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGV4dCAgICAgICAgKi8KLS8vICAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdWlTaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0ZXh0ICAgICAgICAgICAgKi8KLS8vICAgICBNNF9FbmNvZGluZ0Zvcm1hdCAgICBtX0VuY29kaW5nRm9ybWF0OyAgICAvKio8IFRleHQgZW5jb2RpbmcgZm9ybWF0ICAgICovCi0vLyB9IE00X1N0cmluZ0F0dHJpYnV0ZXM7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfQnVmZmVyCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBidWZmZXIgaW4gYWxsIHJlYWRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQ4KiAgIG1fcERhdGE7Ci0gICAgTTRPU0FfVUludDMyICAgbV91aUJ1ZmZlclNpemU7Ci19IE00UkVBREVSX0J1ZmZlcjsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aVNlc3Npb25JZDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3VpTWVkaWFJZDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3VpTmJJbnN0YW5jZTsKLSAgICBNNE9TQV9DaGFyKiogICAgICAgICAgICBtX3BJbnN0YW5jZTsKLX0gTTRfU2RwQXNzZXRJbnN0YW5jZTsKLS8qCi10eXBlZGVmIGVudW0KLXsKLSAgICAgTTRSRUFERVJfa1Vua25vd25Gb3JtYXQgICAgPSAwLAotICAgICBNNFJFQURFUl9rVGFnSUQzVjEsCi0gICAgIE00UkVBREVSX2tUYWdJRDNWMiwKLSAgICBNNFJFQURFUl9rQVNGQ29udGVudERlc2MsCi0gICAgTTRSRUFERVJfazNHcHBBc3NldEJveEZyb21VRFRBLAotICAgIE00UkVBREVSX2szR3BwQXNzZXRCb3hGcm9tU0RQLAotICAgIE00UkVBREVSX2tKcGVnRXhpZgotfSBNNFJFQURFUl9NZXRhRGF0YVR5cGU7Ki8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF8zZ3BBc3NldEZpZWxkcwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGZpZWxkcyBvZiBhIDNncHAgYXNzZXQgaW5mb3JtYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00Q09NTU9OX01ldGFEYXRhRmllbGRzICAgIG1fbWV0YWRhdGE7Ci0KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3VpU2Vzc2lvbklEOyAgICAvKiBGb3IgU0RQICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aU1lZGlhSUQ7ICAgIC8qIEZvciBTRFAgKi8KLQotCi0gICAgLyogTm90ZTogVGhlIHR3byBmb2xsb3dpbmcgZmllbGRzIHdlcmUgYWRkZWQgZm9yIGludGVybmFsIHVzZQotICAgICAgICAoRm9yIE11c2ljIG1hbmFnZXIgcHJvamVjdC4uKSAhISAqLwotICAgIE00X1N0cmVhbVR5cGUgICAgICAgbV9WaWRlb1N0cmVhbVR5cGU7ICAgIC8qKjwgVmlkZW8gc3RyZWFtIHR5cGUgKi8KLSAgICBNNF9TdHJlYW1UeXBlICAgICAgIG1fQXVkaW9TdHJlYW1UeXBlOyAgICAvKio8IEF1ZGlvIHN0cmVhbSB0eXBlICovCi0KLX0gTTRfTWV0YURhdGFGaWVsZHM7Ci0KLQotI2RlZmluZSBNNF9NRVRBREFUQV9TVFJfTkIgICAgMjIgLyogb25lIHN0cmluZyBpbiBhbGJ1bSBhcnQgc3RydWN0dXJlKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3VpTmJCdWZmZXI7Ci0gICAgTTRfU2RwQXNzZXRJbnN0YW5jZSogICAgbV9wQXNzZXRJbmZvSW5zdDsgICAgLyogU2V0IG9mIDNncHAgYXNzZXQgYm94ZXMgKi8KLSAgICBNNENPTU1PTl9NZXRhRGF0YUFsYnVtQXJ0ICAgICAgICBtX2FsYnVtQXJ0OyAgICAgICAgICAgIC8qIFJDOiBQViBzcGVjaWZpYyBhbGJ1bSBhcnQ6YWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgYmVjYXVzZSB0aGlzIHR5cGUgaXMgdXNlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gYmVsb3cgaW4gc3RyZWFtaW5nICovCi0KLX0gTTRSRUFERVJfbmV0SW5mb3M7Ci0KLQotdHlwZWRlZiB1bmlvbgotewotICAgIE00UkVBREVSX0J1ZmZlciAgICAgICAgbV9wVGFnSUQzQnVmZmVyWzJdOyAgICAgICAgLyogVGFnIElEMyBWMSwgVjIgKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIE00UkVBREVSX0J1ZmZlciAgICAgICAgbV9wQXNmRGVzY0NvbnRlbnQ7ICAgIC8qIEFTRiBkZXNjcmlwdGlvbiBjb250ZW50IGJ1ZmZlciAqLwotICAgICAgICBNNFJFQURFUl9CdWZmZXIgICAgICAgIG1fcEFzZkV4dERlc2NDb250ZW50OyAvKiBBU0YgZXh0ZW5kZWQgZGVzY3JpcHRpb24gY29udGVudCBidWZmZXIgKi8KLSAgICB9IG1fYXNmOwotICAgIE00X01ldGFEYXRhRmllbGRzICAgIG1fcE1ldGFkYXRhRmllbGRzOyAgICAgIC8qIEFscmVhZHkgcGFyc2VkIGFuZCBmaWxsZWQgM2dwcCBhc3NldCBmaWVsZHMgKi8KLSAgICBNNFJFQURFUl9uZXRJbmZvcyAgICBtX3BBc3NldEluZm9JbnN0YW5jZTsgICAvKiBTZXQgb2YgM2dwcCBhc3NldCBib3hlcyBpbiB0aGUgc2RwIGZpbGUgKi8KLQotfSBNNF9NZXRhZGF0YUJ1ZmZlcjsKLQotCi0KLQotLyoqKioqKioqKioqIFJFQURFUiBHTE9CQUwgSW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIGNyZWF0ZSB0aGUgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgIChPVVQpICAgIHBvaW50ZXIgb24gYSByZWFkZXIgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX2NyZWF0ZV9mY3QpICAgICAgICAgIChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGRlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9kZXN0cm95X2ZjdCkgICAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBvcGVuIHRoZSByZWFkZXIgYW5kIGluaXRpYWxpemVzIGl0cyBjcmVhdGVkIGluc3RhbmNlCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uLCBmb3IgdGhlIG5ldHdvcmsgcmVhZGVyLCBzZW5kcyB0aGUgREVTQ1JJQkUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcEZpbGVEZXNjcmlwdG9yOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gcHJvcHJpZXRhcnkgZGF0YSBpZGVudGlmeWluZyB0aGUgbWVkaWEgdG8gb3BlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9vcGVuX2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX2Nsb3NlX2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwTWVkaWFGYW1pbHk6ICAgIChPVVQpICAgIHBvaW50ZXIgdG8gYSB1c2VyIGFsbG9jYXRlZCBNNFJFQURFUl9NZWRpYUZhbWlseSB0aGF0IHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCB3aXRoIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoT1VUKSAgICBwb2ludGVyIHRvIGEgc3RyZWFtIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIGZvdW5kIHN0cmVhbSBkZXNjcmlwdGlvbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00V0FSX05PX01PUkVfU1RSRUFNICAgIG5vIG1vcmUgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgbWVkaWEgKGFsbCBzdHJlYW1zIGZvdW5kKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9nZXROZXh0U3RyZWFtX2ZjdCkgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXIpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChJTikgICAgIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBoYW5kbGVyIHRvIHdoaWNoIHRoZSBhY2Nlc3MgdW5pdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBhc3NvY2lhdGVkCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQ6ICAgIChJTi9PVVQpIHBvaW50ZXIgdG8gdGhlIGFjY2VzcyB1bml0IChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgc3RhcnRzIHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICBvbmx5IG5lZWRlZCBmb3IgbmV0d29yayB1bnRpbCBub3cuLi4KLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfc3RhcnRfZmN0KSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBzdG9wIHJlYWRpbmcKLSAqIEBub3RlICAgIG9ubHkgbmVlZGVkIGZvciBuZXR3b3JrIHVudGlsIG5vdy4uLiAobWFrZXMgYSBwYXVzZSkKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfc3RvcF9mY3QpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC10aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3Qgc3RyZWFtIG9mIHRoZSBtZWRpYQotICogICAgICAgICAgLXRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcmVhZGVyCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKE9VVCkgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfZ2V0T3B0aW9uX2ZjdCkgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIHNldCBlbiBvcHRpb24gdmFsdWUgb2YgdGhlIHJlYWRkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKiAgICAgICAgICAtIG5vdGhpbmcgZm9yIHRoZSBtb21lbnQKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoSU4pICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikgd2hlcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX3NldE9wdGlvbl9mY3QpICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAganVtcCBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCB0aW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgICB0aGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwVGltZSAgICAgICAgICAgIChJTi9PVVQpIElOOiAgdGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IHRoZSB0aW1lIHRvIHdoaWNoIHRoZSBzdHJlYW0gcmVhbGx5IGp1bXBlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICB0aGUgc3RyZWFtSUQgZG9lcyBub3QgZXhpc3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgIChNNFJFQURFUl9qdW1wX2ZjdCkgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwVGltZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgcmVzZXQgdGhlIHN0cmVhbSwgdGhhdCBpcyBzZWVrIGl0IHRvIGJlZ2lubmluZyBhbmQgbWFrZSBpdCByZWFkeSB0byBiZSByZWFkCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gcmVzZXQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgICAoTTRSRUFERVJfcmVzZXRfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGdldCB0aGUgdGltZSBvZiB0aGUgY2xvc2VzdCBSQVAgYWNjZXNzIHVuaXQgYmVmb3JlIHRoZSBnaXZlbiB0aW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgICB0aGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBzZWFyY2gKLSAqIEBwYXJhbSAgICBwVGltZSAgICAgICAgICAgIChJTi9PVVQpIElOOiAgdGhlIHRpbWUgdG8gc2VhcmNoIGZyb20gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSAoY3RzKSBvZiB0aGUgcHJlY2VkaW5nIFJBUCBBVS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICB0aGUgc3RyZWFtSUQgZG9lcyBub3QgZXhpc3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgIChNNFJFQURFUl9nZXRQcmV2UmFwVGltZV9mY3QpIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBUaW1lKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZ2VuZXJpYyBtZWRpYSByZWFkZXIgR0xPQkFMIGludGVyZmFjZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGNvbmNlcm5pbmcKLSAqICAgICAgICAgICAgICAgIGNyZWF0aW9uIGFuZCBjb250cm9sIG9mIG9uZSByZWFkZXIgdHlwZS4KLSAqICAgICAgICAgICAgICAgIFRoZSByZWFkZXIgdHlwZSBpcyBvbmUgb2YgdGhlIE00UkVBREVSX01lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNFJFQURFUl9jcmVhdGVfZmN0KiAgICAgICAgICAgIG1fcEZjdENyZWF0ZTsKLSAgICBNNFJFQURFUl9kZXN0cm95X2ZjdCogICAgICAgICAgIG1fcEZjdERlc3Ryb3k7Ci0gICAgTTRSRUFERVJfb3Blbl9mY3QqICAgICAgICAgICAgICBtX3BGY3RPcGVuOwotICAgIE00UkVBREVSX2Nsb3NlX2ZjdCogICAgICAgICAgICAgbV9wRmN0Q2xvc2U7Ci0gICAgTTRSRUFERVJfZ2V0T3B0aW9uX2ZjdCogICAgICAgICBtX3BGY3RHZXRPcHRpb247Ci0gICAgTTRSRUFERVJfc2V0T3B0aW9uX2ZjdCogICAgICAgICBtX3BGY3RTZXRPcHRpb247Ci0gICAgTTRSRUFERVJfZ2V0TmV4dFN0cmVhbV9mY3QqICAgICBtX3BGY3RHZXROZXh0U3RyZWFtOwotICAgIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QqICAgICAgbV9wRmN0RmlsbEF1U3RydWN0OwotICAgIE00UkVBREVSX3N0YXJ0X2ZjdCogICAgICAgICAgICAgbV9wRmN0U3RhcnQ7Ci0gICAgTTRSRUFERVJfc3RvcF9mY3QqICAgICAgICAgICAgICBtX3BGY3RTdG9wOwotICAgIE00UkVBREVSX2p1bXBfZmN0KiAgICAgICAgICAgICAgbV9wRmN0SnVtcDsKLSAgICBNNFJFQURFUl9yZXNldF9mY3QqICAgICAgICAgICAgIG1fcEZjdFJlc2V0OwotICAgIE00UkVBREVSX2dldFByZXZSYXBUaW1lX2ZjdCogICAgbV9wRmN0R2V0UHJldlJhcFRpbWU7Ci0KLX0gTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlOwotCi0KLS8qKioqKioqKioqKioqIFJFQURFUiBEQVRBIEludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXRzIGFuIGFjY2VzcyB1bml0IChBVSkgZnJvbSB0aGUgc3RyZWFtIGhhbmRsZXIgc291cmNlLgotICogQG5vdGUgICAgQW4gQVUgaXMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGFtb3VudCBvZiBkYXRhIHRvIGJlIGRlY29kZWQgYnkgYSBkZWNvZGVyIChhdWRpby92aWRlbykuCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgICAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdCAgICAgICAgKElOL09VVCkgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIGF1IHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIsIGFuZCBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0IGFmdGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24pCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm5zICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm5zICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgICAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0gKiBAcmV0dXJucyAgICBNNFdBUl9OT19EQVRBX1lFVCAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVub3VnaCBkYXRhIG9uIHRoZSBzdHJlYW0gZm9yIG5ldwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgdW5pdAotICogQHJldHVybnMgICAgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgICAgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuZCBvZiBzdHJlYW0pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgICAoTTRSRUFERVJfZ2V0TmV4dEF1X2ZjdCkoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZQotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBnZW5lcmljIG1lZGlhIHJlYWRlciBEQVRBIGludGVyZmFjZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGNvbmNlcm5pbmcKLSAqICAgICAgICAgICAgICAgIGRhdGEgYWNjZXNzIGZvciBvbmUgcmVhZGVyIHR5cGUuKHRob3NlIGZ1bmN0aW9ucyBhcmUgdHlwaWNhbGx5IGNhbGxlZCBmcm9tCi0gKiAgICAgICAgICAgICAgICBhIGRlY29kZXIpIFRoZSByZWFkZXIgdHlwZSBpcyBvbmUgb2YgdGhlIE00UkVBREVSX01lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9EYXRhSW50ZXJmYWNlCi17Ci0gICAgTTRSRUFERVJfZ2V0TmV4dEF1X2ZjdCogICBtX3BGY3RHZXROZXh0QXU7Ci0KLSAgICAvKioKLSAgICBzdG9yZXMgdGhlIGNvbnRleHQgY3JlYXRlZCBieSB0aGUgTTRSRUFERVJfY3JlYXRlX2ZjdCgpIGZ1bmN0aW9uCi0gICAgc28gaXQgaXMgYWNjZXNzaWJsZSB3aXRob3V0ICBkZWNvZGVyCi0gICAgKi8KLSAgICBNNE9TQV9Db250ZXh0IG1fcmVhZGVyQ29udGV4dDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLX0gTTRSRUFERVJfRGF0YUludGVyZmFjZTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZW5kaWYgLypfX000UkVBREVSX0NPTU1PTl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9QY20uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX1BjbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGZjODU3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX1BjbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UkVBREVSX1BjbS5oCi0gKiBAYnJpZWYgICAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIHdhdiByZWFkZXIKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgZ2VuZXJpYyBzaGVsbCBpbnRlcmZhY2UgcmV0cmlldmluZyBmdW5jdGlvbgotICogICAgICAgICAgICBvZiB0aGUgd2F2IHJlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNFJFQURFUl9QQ01fSF9fCi0jZGVmaW5lIF9fTTRSRUFERVJfUENNX0hfXwotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiBSZXRyaWV2ZXMgdGhlIGdlbmVyaWMgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGUgcmVhZGVyCi0qCi0qIEBwYXJhbSBwTWVkaWFUeXBlICAgICAgICAgICAgIDogUG9pbnRlciBvbiBhIE00UkVBREVSX01lZGlhVHlwZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBtZWRpYSB0eXBlIHN1cHBvcnRlZCBieSB0aGlzIHJlYWRlcgotKiBAcGFyYW0gcFJkckdsb2JhbEludGVyZmFjZSA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGdsb2JhbCBpbnRlcmZhY2UKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIHJlYWRlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW4tYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCi0qIEBwYXJhbSBwUmRyRGF0YUludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZGF0YSBpbnRlcmZhY2UKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIHJlYWRlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW4tYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCi0qCi0qIEByZXR1cm5zIDogTTROT19FUlJPUiAgICAgaWYgT0sKLSogICAgICAgICAgICAgRVJSX0FMTE9DICAgICAgaWYgYW4gYWxsb2NhdGlvbiBmYWlsZWQKLSogICAgICAgICAgICBFUlJfUEFSQU1FVEVSICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRSRUFERVJfUENNX0hfXyovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19BY2Nlc3NVbml0LmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19BY2Nlc3NVbml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1MDM2N2MuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfQWNjZXNzVW5pdC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdC5oCi0gKiBAYnJpZWYgICAgICAgIEFjY2VzcyB1bml0IG1hbmlwdWxhdGlvbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlLAotICogICAgICAgICAgICAgICBhbmQgZGVjbGFyZXMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgaXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00U1lTX0FDQ0VTU1VOSVRfSAotI2RlZmluZSBNNFNZU19BQ0NFU1NVTklUX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0jaW5jbHVkZSAiTTRTWVNfU3RyZWFtLmgiCi0KLS8qKiBUaGUgYXR0cmlidXRlIG9mIGEgZnJhZ21lbnQqLwotdHlwZWRlZiBlbnVtIHsKLSAgTTRTWVNfa0ZyYWdBdHRyT2sgICAgICAgID0gMDEsIC8qKjwgVGhlIGZyYWdtZW50IGlzIGNvcnJlY3QsIHRoZXJlIGlzIG5vIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplIGNhbm5vdCBiZSAwKSovCi0gIE00U1lTX2tGcmFnQXR0ckNvcnJ1cHRlZCA9IDAyLCAvKio8IFRoZSBmcmFnbWVudCBpcyBjb3JydXB0ZWQgKHRoZXJlIGlzIGF0IGxlYXN0IGEgYml0IG9yIGJ5dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciBzb21ld2hlcmUgaW4gdGhlIGZyYWdtZW50IChzaXplIGNhbm5vdCBiZSAwKSovCi0gIE00U1lTX2tGcmFnQXR0ckxvc3QgICAgICA9IDAzICAvKio8IFRoZSBmcmFnbWVudCBpcyBsb3N0LCBzbyB0aGUgc2l6ZSBtdXN0IGJlIDAuKi8KLX0gTTRTWVNfRnJhZ0F0dHI7Ci0KLQotLyoqIEEgRnJhZ21lbnQgaXMgYSBwaWVjZSBvZiBhY2Nlc3MgdW5pdC4gSXQgY2FuIGJlIGRlY29kZWQgd2l0aG91dCBkZWNvZGluZyB0aGUgb3RoZXJzKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTTRPU0FfTWVtQWRkcjggIGZyYWdBZGRyZXNzOyAgIC8qKjwgVGhlIGRhdGEgcG9pbnRlci4gQWxsIGZyYWdtZW50cyBvZiB0aGUgc2FtZSBhY2Nlc3MgdW5pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgY29udGlndW91cyBpbiBtZW1vcnkqLwotICBNNE9TQV9VSW50MzIgICAgc2l6ZTsgICAgICAgICAgLyoqPCBUaGUgc2l6ZSBvZiB0aGUgZnJhZ21lbnQuIEl0IG11c3QgYmUgMCBpZiBmcmFnbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdnZWQgJ2xvc3QnKi8KLSAgTTRTWVNfRnJhZ0F0dHIgIGlzQ29ycnVwdGVkOyAgIC8qKjwgVGhlIGF0dHJpYnV0ZSBvZiB0aGlzIGZyYWdtZW50Ki8KLX0gTTRTWVNfRnJhZzsKLQotLyoqPCBUaGUgYXR0cmlidXRlIG9mIGFuIGFjY2VzcyB1bml0Ki8KLXR5cGVkZWYgTTRPU0FfVUludDggTTRTWVNfQVVfQXR0cjsKLQotI2RlZmluZSBBVV9Db3JydXB0ZWQgICAweDAxIC8qKjwgQXQgbGVhc3Qgb25lIGZyYWdtZW50IG9mIHRoZSBhY2Nlc3MgdW5pdCBpcyBmbGFnZ2VkIGNvcnJ1cHRlZC4qLwotI2RlZmluZSBBVV9QX0ZyYW1lICAgICAweDAyIC8qKjwgVGhlIGFjY2VzcyB1bml0IGlzIGEgUF9mcmFtZSovCi0jZGVmaW5lIEFVX1JBUCAgICAgICAgIDB4MDQgLyoqPCBUaGUgYWNjZXNzIHVuaXQgaXMgYSByYW5kb20gYWNjZXNzIHBvaW50LiovCi0KLQotLyoqIEFuIGFjY2VzcyB1bml0IGlzIHRoZSBzbWFsbGVzdCBwaWVjZSBvZiBkYXRhIHdpdGggdGltaW5nIGluZm9ybWF0aW9uLiovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiAgICBzdHJlYW0gOwotICBNNE9TQV9NZW1BZGRyMzIgICAgICAgICAgICAgZGF0YUFkZHJlc3M7IC8qKjwgVGhlIGRhdGEgcG9pbnRlci4gVGhlIHNpemUgb2YgdGhpcyBibG9jawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIHNpemUpIG11c3QgYmUgYSAzMi1iaXRzIGludGVnZXIgbXVsdGlwbGUqLwotICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgc2l6ZTsgICAgICAgIC8qKjwgVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGFBZGRyZXNzLiBUaGUgc2l6ZSBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgbWF0Y2ggYSAzMi1iaXRzIHdvcmQgYm91bmRhcnkuKi8KLSAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIENUUzsgICAgICAgICAvKio8IFRoZSBDb21wb3NpdGlvbiBUaW1lIFN0YW1wKi8KLSAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIERUUzsgICAgICAgICAvKio8IFRoZSBEZWNvZGVkIFRpbWUgU3RhbXAqLwotICBNNFNZU19BVV9BdHRyICAgICAgICAgICAgICAgYXR0cmlidXRlOyAgIC8qKjwgVGhlIGF0dHJpYnV0ZSBvZiB0aGUgYWNjZXNzIHVuaXQqLwotICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgbmJGcmFnOyAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBmcmFnbWVudHMuIEl0IGNhbiBiZSAwIGlmIHRoZXJlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBmcmFnbWVudC4qLwotICBNNFNZU19GcmFnKiogICAgICAgICAgICAgICAgZnJhZzsgICAgICAgIC8qKjwgQW4gYXJyYXkgb2YgJ25iRnJhZycgZnJhZ21lbnRzLiBJdCBzdG9yZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMgc3RydWN0dXJlLiBUaGUgb3JpZ2luYWwgZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgb2YgZnJhZyBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gTTRTWVNfRnJhZyogZnJhZ1tdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBNNFNZU19GcmFnKiogZnJhZyBzaW5jZSB0aGUgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgb2Ygc3VjaCBzeW50YXggaXMgb25seSBhIE1pY3Jvc29mdCBleHRlbnNpb24gb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBDIGNvbXBpbGVyLiAqLwotfSBNNFNZU19BY2Nlc3NVbml0OwotCi0vKiBFcnJvciBjb2RlcyAqLwotI2RlZmluZSBNNEVSUl9BVV9OT19NT1JFX0ZSQUcgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNFNZU19DTUFQSSwweDAwMDAwMSkKLSNkZWZpbmUgTTRFUlJfQVVfQlVGRkVSX09WRVJGTE9XICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRTWVNfQ01BUEksMHgwMDAwMDIpCi0jZGVmaW5lIE00RVJSX0FVX0JBRF9JTkRFWCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00U1lTX0NNQVBJLDB4MDAwMDAzKQotI2RlZmluZSBNNEVSUl9OT1RfRU5PVUdIX0ZSQUcgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNFNZU19DTUFQSSwweDAwMDAwNCkKLQotCi0KLSNlbmRpZiAvKk00U1lTX0FDQ0VTU1VOSVRfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX1N0cmVhbS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfU3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhYjBjZTcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfU3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00U1lTX1N0cmVhbS5oCi0gKiBAYnJpZWYgICAgICAgIFN0cmVhbSBtYW5pcHVsYXRpb24KLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00U1lTX1NUUkVBTV9ICi0jZGVmaW5lIE00U1lTX1NUUkVBTV9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLQotdHlwZWRlZiBNNE9TQV9VSW50MzIgTTRTWVNfU3RyZWFtSUQ7Ci0KLS8qKiBUaGUgc3RyZWFtVHlwZSB0eXBlIHByb3ZpZGVzIGEgd2F5IHRvIGRpc3Rpbmd1aXNoIGFsbCBzdHJlYW1zIChBQUMsIEFNUiwgWVVWNDIwLCBNUEVHLTQgVmlkZW8sCi0gICAgIEgyNjMpLiBTdHJlYW0gdHlwZXMgY2FuIGJlIHNvcnRlZCBpbiAyIHdheXM6Ci1AYXJnICAgU29tZSBvZiB0aGVtIGFyZSByYXcgZGF0YSwgb3RoZXJzIGFyZSBlbmNvZGVkCi1AYXJnICAgU29tZSBvZiB0aGVtIGFyZSByZWxhdGVkIHRvIGFuIGF1ZGlvIG1lZGlhLCBhIHZpZGVvIG1lZGlhLi4uCi1AbiBTbyBhIHNwZWNpZmljIG5hbWluZyBjb252ZW50aW9uIGhhcyBiZWVuIGRlc2lnbmVkIHRvIGFsbG93IGEgcXVpY2sgcGFyc2luZyBvZiB0aGUgc3RyZWFtVHlwZQotICAgIHZhbHVlIHRvIHJldHVybiB0aGUgYWJvdmUgY2F0ZWdvcmllcy4gU3RyZWFtVHlwZSBpcyBhbiB1bi1zaWduZWQgaW50ZWdlciBvbiAxNiBiaXRzLgotQGFyZyAgIFRoZSBmaXJzdCBieXRlIChNU0IpIGRlZmluZXMgdGhlIGNvZGVjIHR5cGUuIEl0IGNhbiBiZSBlaXRoZXIgQXVkaW8sVmlkZW8sIFBpY3R1cmUsCi0gICAgICAgICBUZXh0IG9yIFNjZW5lLgotQGFyZyAgIFRoZSBzZWNvbmQgYnl0ZSAoTFNCKSBkZWZpbmVzIHRoZSBzdWItY29kZWNzIHR5cGUgKGllIFlVVjQyMCwgUENNXzE2IGJpdHMsIEFNUi4uLikuCi0gICAgICAgIE1vcmVvdmVyIGlmIHRoaXMgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDB4ODAgdGhlIHN0cmVhbSBpcyBhIHJhdyBzdHJlYW0sIGVsc2UgdGhlIHN0cmVhbQotICAgICAgICBpcyBhbiBlbmNvZGVkIG9uZQotQG4gICAweDAwMDAgaXMgYSBmb3JiaWRkZW4gdmFsdWUsIGl0IGRlc2NyaWJlcyBhbiB1bmtub3duIHN0cmVhbSAqLwotCi10eXBlZGVmIGVudW0gewotICAgTTRTWVNfa1Vua25vd24gICAgICAgPSAweDAwMDAsCi0gICAvKiBTdHJlYW0gdHlwZSBkZWZpbml0aW9uCi0gICAgICAgMHhZWVpaICAgOiBZWSBpcyB0aGUgY29kZWMgdHlwZSAoQXVkaW8sIFZpZGVvLCBQaWN0dXJlLCBTY2VuZSAuLi4pCi0gICAgICAgICAgICAgICAgICBaWiBpcyB0aGUgc3ViLWNvZGVjIHR5cGUgKEFBQywgQU1SICwgLi4uKQotICAgICAgICAgICAgICAgICAgICAgaWYgWlogaXMgZ3JlYXRlciB0aGFuIDB4ODAgaXQgaXMgYSByYXcgZm9ybWF0Ki8KLQotICAgLyogQXVkaW8gb25lcyAgIDogUmFuZ2UgZnJvbSBbMHgwMTAwLTB4MDFGRl0qLwotICAgTTRTWVNfa0F1ZGlvVW5rbm93biAgPSAweDAxMDAsCi0gICBNNFNZU19rQUFDICAgICAgICAgICA9IDB4MDEwMSwKLSAgIE00U1lTX2tDRUxQICAgICAgICAgID0gMHgwMTAyLAotICAgTTRTWVNfa0FNUiAgICAgICAgICAgPSAweDAxMDMsCi0gICBNNFNZU19rQU1SX1dCICAgICAgICA9IDB4MDEwNCwKLSAgIE00U1lTX2tNUDMgICAgICAgICAgID0gMHgwMTA1LAotICAgTTRTWVNfa01JREkgICAgICAgICAgPSAweDAxMDYsCi0gICBNNFNZU19rV01BICAgICAgICAgICA9IDB4MDEwNywKLSAgIE00U1lTX2tSRUFMQVVESU8gICAgID0gMHgwMTA4LAotICAgTTRTWVNfa0VWUkMgICAgICAgICAgICA9IDB4MDEwOSwKLSAgIE00U1lTX2tQQ01fMTZiaXRzUyAgID0gMHgwMTgxLCAvKiBQQ00gMTYgYml0cyBTaWduZWQgKi8KLSAgIE00U1lTX2tQQ01fMTZiaXRzVSAgID0gMHgwMTgyLCAvKiBQQ00gMTYgYml0cyBVbi1zaWduZWQgKi8KLSAgIE00U1lTX2tQQ01fOGJpdHNVICAgID0gMHgwMTgzLCAvKiBQQ00gIDggYml0cyBVbi1zaWduZWQgKi8KLS8qIEZpeEFBIDIwMDgvMDMvMDMgdHlwZXM6IE00U1lTX2tQQ01fMTZiaXRzUywgTTRTWVNfa1BDTV8xNmJpdHNVIGFuZCBNNFNZU19rUENNXzhiaXRzVQotICAgYXJlIG5vdyBvbmx5IHVzZWQgYnkgQXVkaW9NaXhlciBhbmQgUmVhZGVyQVZJID0+IEFuIHVwZGF0ZSBpcyBuZWNlc3NhcnkgaW4gdGhlIGZ1dHVyZSBmb3IgdXNlCi0gICB0eXBlIE00U1lTX2tQQ00gKi8KLSAgIE00U1lTX2tYTUYgICAgICAgICAgICA9IDB4MDE4NCwKLSAgIE00U1lTX2tTTUFGICAgICAgICAgID0gMHgwMTg1LAotICAgTTRTWVNfa0lNRUwgICAgICAgICAgPSAweDAxODYsCi0gICBNNFNZU19rQkJBICAgICAgICAgICAgPSAweDAxODcsCi0gICBNNFNZU19rQlBDICAgICAgICAgICAgPSAweDAxODgsCi0gICBNNFNZU19rQURQQ00gICAgICAgICA9IDB4MDE4OSwgIC8qIEFEUENNIGFkZGVkICovCi0gICBNNFNZU19rUENNICAgICAgICAgICA9IDB4MDE5MCwgIC8qIHN0cmVhbSB0eXBlIGFkZGVkOiBQQ007ICBQUjI1NjkgZml4QUEgKi8KLSAgIE00U1lTX2tBdWRpb0FsbCAgICAgICAgPSAweDAxRkYsICAvKiBhbGwgYXVkaW8gc3RyZWFtcyAqLwotCi0gICAvKiBWaWRlbyBvbmVzICAgOiBSYW5nZSBbMHgwMjAwLTB4MDJGRl0qLwotICAgTTRTWVNfa1ZpZGVvVW5rbm93biAgPSAweDAyMDAsCi0gICBNNFNZU19rTVBFR180ICAgICAgICA9IDB4MDIwMSwKLSAgIE00U1lTX2tIMjYzICAgICAgICAgID0gMHgwMjAyLAotICAgTTRTWVNfa0gyNjNwcCAgICAgICAgPSAweDAyMDMsCi0gICBNNFNZU19rSDI2NCAgICAgICAgICA9IDB4MDIwNCwKLSAgIE00U1lTX2tSRUFMVklERU8gICAgID0gMHgwMjA1LAotICAgTTRTWVNfa1lVVjQyMCAgICAgICAgPSAweDAyODEsCi0gICBNNFNZU19rUkdCMzIgICAgICAgICA9IDB4MDI4MiwKLSAgIE00U1lTX2tCR1IzMiAgICAgICAgID0gMHgwMjgzLAotICAgTTRTWVNfa1JHQjI0ICAgICAgICAgPSAweDAyODQsCi0gICBNNFNZU19rQkdSMjQgICAgICAgICA9IDB4MDI4NSwKLSAgIE00U1lTX2tWaWRlb0FsbCAgICAgICAgPSAweDAyRkYsICAvKiBhbGwgdmlkZW8gc3RyZWFtcyAqLwotCi0gIC8qIFBpY3R1cmUgb25lcyA6IFJhbmdlIFsweDAzMDAtMHgwM0ZGXSovCi0gICBNNFNZU19rUGljdHVyZVVua25vd24gPSAweDAzMDAsCi0gICBNNFNZU19rSlBFRyAgICAgICAgICAgPSAweDAzMDEsCi0gICBNNFNZU19rR0lGICAgICAgICAgICAgPSAweDAzMDIsCi0gICBNNFNZU19rQk1QICAgICAgICAgICAgPSAweDAzODMsCi0gICBNNFNZU19rU3RpbGxBbGwgICAgICAgICA9IDB4MDNGRiwgIC8qIGFsbCBzdGlsbCBwaWN0dXJlIHN0cmVhbXMgKi8KLQotICAgLyogVGV4dCBvbmVzICAgIDogUmFuZ2UgWzB4MDQwMC0weDA0RkZdKi8KLSAgIE00U1lTX2tUZXh0VW5rbm93biAgPSAweDA0MDAsCi0gICBNNFNZU19rVGltZWRUZXh0ICAgID0gMHgwNDAxLAotICAgTTRTWVNfa1VURjggICAgICAgICA9IDB4MDQ4MSwKLSAgIE00U1lTX2tVVEYxNiAgICAgICAgPSAweDA0ODIsCi0gICBNNFNZU19rVUNTMiAgICAgICAgID0gMHgwNDgzLAotICAgTTRTWVNfa1RleHRBbGwgICAgICAgPSAweDA0RkYsICAvKiBhbGwgdGV4dCBzdHJlYW1zICovCi0KLSAgIC8qIFNjZW5lICYgR3JhcGhpY3Mgb25lcyAgIDogUmFuZ2UgWzB4MDUwMC0weDA1RkZdKi8KLSAgIE00U1lTX2tTY2VuZVVua25vd24gID0gMHgwNTAwLAotICAgTTRTWVNfa1NNSUwgICAgICAgICAgPSAweDA1MDEsCi0gICBNNFNZU19rQklGUyAgICAgICAgICA9IDB4MDUwMiwKLSAgIE00U1lTX2tTY2VuZUFsbCAgICAgICAgPSAweDA1RkYsICAvKiBhbGwgc2NlbmUgc3RyZWFtcyAqLwotCi0gICAvKiBoaW50ZWQgb25lcyAgIDogUmFuZ2UgWzB4MDYwMC0weDA2RkZdKi8KLSAgIE00U1lTX2tIaW50ZWRVbmtub3duID0gMHgwNjAwLAotICAgTTRTWVNfa1JUUCAgICAgICAgICAgPSAweDA2MDEsCi0gICBNNFNZU19rTVBFRzJfVFMgICAgICA9IDB4MDYwMiwKLSAgIE00U1lTX2tIaW50ZWRBbGwgICAgICAgID0gMHgwNkZGLCAgLyogYWxsIHBhY2tldGl6ZWQgc3RyZWFtcyAqLwotCi0gICAvKiBNUEVHLTQgc3lzdGVtIG9uZXMgOiBSYW5nZSBbMHgwNzAwLTB4MDdGRl0qLwotICAgTTRTWVNfa1N5c1Vua25vd24gICAgPSAweDA3MDAsCi0gICBNNFNZU19rT0RTICAgICAgICAgICA9IDB4MDcwMSwKLSAgIE00U1lTX2tJUE1QICAgICAgICAgID0gMHgwNzAyLAotICAgTTRTWVNfa09DSSAgICAgICAgICAgPSAweDA3MDMsCi0gICBNNFNZU19rU3lzQWxsICAgICAgICA9IDB4MDdGRiAvKiBhbGwgc3lzdGVtIHN0cmVhbXMqLwotfSBNNFNZU19TdHJlYW1UeXBlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgTTRTWVNfU3RyZWFtSUQgICAgIHN0cmVhbUlEIDsKLSAgIE00T1NBX1VJbnQzMiAgICAgIHZhbHVlIDsKLX0gTTRTWVNfU3RyZWFtSURWYWx1ZSA7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIE00U1lTX1N0cmVhbUlEICAgIHN0cmVhbUlEIDsKLSAgIE00T1NBX1VJbnQzMiAgICAgIHNpemUgOwotICAgTTRPU0FfTWVtQWRkcjMyICAgYWRkciA7Ci19IE00U1lTX1N0cmVhbUlEbWVtQWRkciA7Ci0KLS8qKiBUaGlzIHN0cnVjdXJlIGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhc3NvY2lhdGVkIHRvIGEgc3RyZWFtKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTTRTWVNfU3RyZWFtSUQgICBzdHJlYW1JRDsgICAgLyoqPCBUaGUgSUQgb2YgdGhlIHN0cmVhbS4gSXQgbXVzdCBiZSB1bmlxdWUgZm9yIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGllIGluIGEgTVA0IGZpbGUsIHR3byB0cmFja3MgY2FuIG5vdCBoYXZlIHR3byB0aW1lcyB0aGUgc2FtZSBJRCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlzIGZvcmJpZGRlbi4qLwotICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGU7ICAgIC8qKjwgVGhlIHN0cmVhbSB0eXBlIG9mIHRoZSBzdHJlYW0qLwotICBNNE9TQV9VSW50OCAgICAgIHByb2ZpbGVMZXZlbDsgIC8qKjwgVGhlIHByb2ZpbGUgJiBsZXZlbCBvZiBhIHN0cmVhbS4gSXQgaXMgcmVsYXRlZCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0eXBlICYgdGhlIGRlZmluaXRpb24gY29tZXMgZnJvbSB0aGUgc3RhbmRhcmQgYm9kaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBNUEVHLTQgVmlkZW8gJiBNUEVHLTQgQXVkaW8pLiBTb21lIHZhbHVlcyBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1kZWZpbmVkOiAweEZFPXVzZXJQcml2YXRlIDB4RkY9bm8gUHJvZmlsZSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbCBzcGVjaWZpZWQqLwotICBNNE9TQV9VSW50MzIgICAgIGRlY29kZXJTcGVjaWZpY0luZm9TaXplOyAgLyoqPCBUaGUgZGVjb2RlciBjb25maWd1cmF0aW9uLiBUaGVzZSBieXRlcyBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCB0byBpbml0aWFsaXNlIGEgZGVjb2Rlci4qLwotICBNNE9TQV9NZW1BZGRyMzIgIGRlY29kZXJTcGVjaWZpY0luZm87IC8qKjwgVGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgZGVjb2RlciBzcGVjaWZpYyBpbmZvLiovCi0gIE00T1NBX1VJbnQzMiAgICAgdGltZVNjYWxlOyAgICAgLyoqPCBUaGUgdGltZSBzY2FsZSBvZiB0aGUgc3RyZWFtLiBJdCBtZWFucyB0aGF0IGFsbCB0aW1pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiBvZiB0aGlzIHN0cmVhbSBhcmUgY29tcHV0ZWQgaW4gdGhpcyB0aW1lc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWUgdGltZVNjYWxlID0gODAwMCwgbWVhbnMgdGhlcmUgYXJlIDgwMDAgdGlja3MgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgc2Vjb25kKSovCi0gIE00T1NBX1RpbWUgICAgICAgZHVyYXRpb247ICAgICAgICAvKio8IFRoZSBzdHJlYW0gZHVyYXRpb24gb2YgdGhpcyBzdHJlYW0uIFRoZSB0aW1lIHVuaXQgaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBzY2FsZS4gVGhlIHZhbHVlIGNhbiBiZSBzZXQgdG8gTTRTWVNfVW5rbm93blRpbWUgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZHVyYXRpb24gaXMgbm90IGtub3duLiovCi0gIE00T1NBX0ludDMyICAgICAgYXZlcmFnZUJpdHJhdGU7ICAvKio8IFRoZSBhdmVyYWdlIGJpdHJhdGUgKGluIGJpdCBwZXIgc2Vjb25kKSBvZiB0aGlzIHN0cmVhbS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGF2ZXJhZ2UgYml0cmF0ZSBpcyBjb21wdXRlZCBvbiB0aGUgc3RyZWFtIGR1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSB2YWx1ZSBtZWFucyBlaXRoZXIgdGhlcmUgaXMgbm8gYXZlcmFnZSBiaXRyYXRlIG9yIG5vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2UgYml0cmF0ZSBpcyBwcm92aWRlZC4qLwotICBNNE9TQV9JbnQzMiAgICAgIG1heEJpdHJhdGU7ICAgICAgLyoqPCBUaGUgbWF4aW11bSBiaXRyYXRlIChpbiBiaXQgcGVyIHNlY29uZCkgb2YgdGhpcyBzdHJlYW0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXhpbXVtIGJpdHJhdGUgaXMgY29tcHV0ZWQgb24gYSBzbGlkaW5nIHdpbmRvdyBvZiAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZC4gLTEgdmFsdWUgbWVhbnMgZWl0aGVyIHRoZXJlIGlzIG5vIG1heC4gYml0cmF0ZSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBtYXguIGJpdHJhdGUgaXMgcHJvdmlkZWQuKi8KLX0gTTRTWVNfU3RyZWFtRGVzY3JpcHRpb247Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICBNNFNZU19rUHJldmlvdXNSQVAgICAgICA9IDB4MDEgLAotICAgTTRTWVNfa05leHRSQVAgICAgICAgICAgPSAweDAyICwKLSAgIE00U1lTX2tDbG9zZXN0UkFQICAgICAgID0gMHgwMyAsCi0gICBNNFNZU19rTm9SQVBwcmV2aW91cyAgICA9IDB4MTEgLAotICAgTTRTWVNfa05vUkFQbmV4dCAgICAgICAgPSAweDEyICwKLSAgIE00U1lTX2tOb1JBUGNsb3Nlc3QgICAgID0gMHgxMyAsCi0gICBNNFNZU19rQmVnaW5uaW5nICAgICAgICA9IDB4MjAKLX0gTTRTWVNfU2Vla0FjY2Vzc01vZGUgOwotCi0jZW5kaWYgLypNNFNZU19TVFJFQU1fSCovCi0KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFRPT0xfVmVyc2lvbkluZm8uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VE9PTF9WZXJzaW9uSW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDE2YjhkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VE9PTF9WZXJzaW9uSW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRUT09MX1ZlcnNpb25JbmZvLmgKLSAqIEBicmllZiAgZGVmaW5lcyBhIGNvbW1vbiB2ZXJzaW9uIGluZm9ybWF0aW9uIHN0cnVjdHVyZQotICogQG5vdGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000VE9PTF9WRVJTSU9OSU5GT19IX18KLSNkZWZpbmUgX19NNFRPT0xfVkVSU0lPTklORk9fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKioKLSAqIHN0cnVjdHVyZSAgICBNNF9WZXJzaW9uSW5mbwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdmVyc2lvbiBvZiBjb3JlIGNvbXBvbmVudAotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHR5cGljYWxseSB1c2VkIHRvIHJldHJpZXZlIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICAgICAgICAgICAgICAgIG9mIGEgY29tcG9uZW50IHZpYSBnZXRPcHRpb24gZnVuY3Rpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgX000X1ZlcnNpb25JbmZvCi17Ci0gICAgTTRPU0FfVUludDMyIG1fbWFqb3I7ICAgICAgICAvKm1ham9yIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgTTRPU0FfVUludDMyIG1fbWlub3I7ICAgICAgICAvKm1pbm9yIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgTTRPU0FfVUludDMyIG1fcmV2aXNpb247ICAgIC8qcmV2aXNpb24gdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50Ki8KLQotICAgIC8qIFN0cnVjdHVyZSBzaXplICovCi0gICAgTTRPU0FfVUludDMyIG1fc3RydWN0U2l6ZTsKLQotfSBNNF9WZXJzaW9uSW5mbzsKLQotCi0jZW5kaWYgLypfX000VE9PTF9WRVJTSU9OSU5GT19IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTBiZmNiNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZEX0VYVEVSTkFMX0lOVEVSRkFDRV9IX18KLSNkZWZpbmUgX19NNFZEX0VYVEVSTkFMX0lOVEVSRkFDRV9IX18KLQotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiAtLS0tLSBEU0kgYml0c3RyZWFtIHBhcnNlciAtLS0tLSAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB0byBjbGllbnRzIG9mIHRoZSBzaGVsbCB0byBhbGxvdyB0aGVtIHRvIGFuYWx5c2UgY2xpcHMKLSh1c2VmdWwgZm9yIHZpZGVvIGVkaXRpbmcpIHdpdGhvdXQgaGF2aW5nIHRvIGluc3RhbmNpYXRlIGEgZGVjb2Rlciwgd2hpY2ggY2FuIGJlIHVzZWZ1bCBwcmVjaXNlbHkKLWlmIEhXIGRlY29kZXJzIGFyZSBhIHBvc3NpYmlsaXR5LiAqLwotCi1NNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0koCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBWb2wsIE00T1NBX0ludDMyIGFWb2xTaXplLAotICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyogcERjaSwKLSAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9TaXplKiBwVmlkZW9TaXplKTsKLQotTTRPU0FfRVJSIGdldEFWQ1Byb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCogcERTSSwgTTRPU0FfSW50MzIgRFNJU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpOwotCi1NNE9TQV9FUlIgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCogcERTSSwgTTRPU0FfSW50MzIgRFNJU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpOwotCi1NNE9TQV9FUlIgZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDggcHJvZmlsZUFuZExldmVsLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfX000VkRfRVhURVJOQUxfSU5URVJGQUNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9Ub29scy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9Ub29scy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzY2EzNmFjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfVG9vbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWRF9UT09MU19IX18KLSNkZWZpbmUgX19NNFZEX1RPT0xTX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLS8qIC0tLS0tIGJpdHN0cmVhbSBwYXJzZXIgLS0tLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgc3RyZWFtX2J5dGU7Ci0gICAgTTRPU0FfVUludDMyIHN0cmVhbV9pbmRleDsKLSAgICBNNE9TQV9NZW1BZGRyOCBpbjsKLQotfSBNNFZTX0JpdHN0cmVhbV9jdHh0OwotCi1NNE9TQV9VSW50MzIgTTRWRF9Ub29sc19HZXRCaXRzRnJvbU1lbW9yeShNNFZTX0JpdHN0cmVhbV9jdHh0KiBwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG5iX2JpdHMpOwotTTRPU0FfRVJSIE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoTTRPU0FfVUludDMyIGJpdHNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyMzIgZGVzdF9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBvZmZzZXQsIE00T1NBX1VJbnQ4IG5iX2JpdHMpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFZEX1RPT0xTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRkxfdHJhbnNpdGlvbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRkxfdHJhbnNpdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3N2Y3NmNiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkZMX3RyYW5zaXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAvKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFRSQU5fdHJhbnNpdGlvbi5oCi0gKiBAYnJpZWYKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9fTTRWRkxfVFJBTlNJVElPTl9IX18KLSNkZWZpbmUgX19NNFZGTF9UUkFOU0lUSU9OX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUludDg7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUludDMyOwotCi10eXBlZGVmICAgIHN0cnVjdCBTX000VmlDb21JbWFnZVBsYW5lCi17Ci0gICAgVUludDMyICAgICAgICB1X3dpZHRoOyAgICAgICAgICAgIC8qIGFjdGl2ZSB3aWR0aCwgaW4gcGl4ZWxzICovCi0gICAgVUludDMyICAgICAgICB1X2hlaWdodDsgICAgICAgICAgICAvKiBhY3RpdmUgaGVpZ2h0LCBpbiBsaW5lcyAqLwotICAgIFVJbnQzMiAgICAgICAgdV90b3BsZWZ0OyAgICAgICAgICAgIC8qIGluZGV4IG9mIDFzdCBhY3RpdmUgcGl4ZWwgKi8KLSAgICBVSW50MzIgICAgICAgIHVfc3RyaWRlOyAgICAgICAgICAgIC8qIGxpbmUgc3RyaWRlLCBpbiBieXRlcyAqLwotICAgIFVJbnQ4ICAgICAgICAqcGFjX2RhdGE7ICAgICAgICAgICAgLyogYnVmZmVyIGFkZHJlc3MgKi8KLX0gICAgTTRWaUNvbUltYWdlUGxhbmU7Ci0KLXR5cGVkZWYgc3RydWN0IFNfTTRWRkxfbW9kaWZMdW1QYXJhbQotewotICAgIHVuc2lnbmVkIHNob3J0IGx1bV9mYWN0b3I7Ci0gICAgdW5zaWduZWQgc2hvcnQgY29weV9jaHJvbWE7Ci19IE00VkZMX01vZGlmTHVtUGFyYW07Ci0KLSNkZWZpbmUgICAgIE00VklGSV9PSyAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSAgICAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUICAgICA4Ci0jZGVmaW5lICAgICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSCAgICAgIDkKLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hQnlTdGVwKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRkxfTW9kaWZMdW1QYXJhbSAqbHVtX3BhcmFtLCB2b2lkICp1c2VyX2RhdGEpOwotCi11bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGx1bV9mYWN0b3IsIHZvaWQgKnVzZXJfZGF0YSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluMSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4yLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1VJbnQzMiBQcm9ncmVzcykKLSAqIEBicmllZiAgIEJsZW5kcyB0d28gWVVWIDQ6MjowIFBsYW5hciBpbWFnZXMuCi0gKiBAbm90ZSAgICBCbGVuZHMgWVVWNDIwIHBsYW5hciBpbWFnZXMsCi0gKiAgICAgICAgICBNYXAgdGhlIHZhbHVlIG9mIHByb2dyZXNzIGZyb20gKDAgLSAxMDAwKSB0byAoMCAtIDEwMjQpCi0gKiAgICAgICAgICBTZXQgdGhlIHJhbmdlIG9mIGJsZW5kaW5nZmFjdG9yLAotICogICAgICAgICAgICAgICAgICAxLiBmcm9tIDAgdG8gKFByb2dyZXNzIDw8IDEpICAgICAgICAgICAgO2ZvciBQcm9ncmVzcyA8PSA1MTIKLSAqICAgICAgICAgICAgICAgICAgMi4gZnJvbSAoKCBQcm9ncmVzcyAtIDUxMik8PCAxKSB0byAxMDI0IDtvdGhlcndpc2UKLSAqICAgICAgICAgIFNldCB0aGUgaW5jcmVtZW50IG9mIGJsZW5kaW5nZmFjdG9yIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGltYWdlIHJvdyBieSB0aGUgZmFjdG9yLAotICogICAgICAgICAgICAgICAgICA9ICAoUmFuZ2UtMSkgLyAoaW1hZ2Ugd2lkdGgtMSkgIDtmb3Igd2lkdGggPj0gcmFuZ2UKLSAqICAgICAgICAgICAgICAgICAgPSAgKFJhbmdlKSAvIChpbWFnZSB3aWR0aCkgICAgICA7b3RoZXJ3aXNlCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2goPSBpKSByb3cgb2Ygb3V0cHV0IFkgcGxhbmUgKHN0ZXBzIG9mIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoKD0gaikgY29sdW1uIG9mIG91dHB1dCBZIHBsYW5lIChzdGVwcyBvZiAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIG9uZSBVICYgViBzYW1wbGUgZnJvbSB0d28gaW5wdXQgWVVWNDoyOjAgaW1hZ2VzIGFuZAotICogICAgICAgICAgICAgICAgICBDb21wdXRlIGZvdXIgWSBzYW1wbGUgYW5kIG9uZSBVICYgViBzYW1wbGUgZm9yIG91dHB1dCBZVVY0OjI6MCBpbWFnZQotICogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIGZvbGxvd2luZywKLSAqICAgICAgICAgICAgICAgICAgT3V0KGksaikgPSBibGVuZGluZ2ZhY3RvcihpLGopICogSW4xKGksaikrIChsIC0gYmxlbmRpbmdmYWN0b3IoaSxqKSkgKiBJbjIoaSxqKQotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93LgotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pICBVc2VyIFNwZWNpZmljIFBhcmFtZXRlcgotICogQHBhcmFtICAgcFBsYW5lSW4xOiAoSU4pICBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMgbWFpbnRhaW5lZCBmb3IgWSwgVQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFYgcGxhbmVzLgotICogQHBhcmFtICAgcFBsYW5lSW4yOiAoSU4pICBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMgbWFpbnRhaW5lZCBmb3IgWSwgVQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFYgcGxhbmVzLgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMgbWFpbnRhaW5lZCBmb3IgWSwgVQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFYgcGxhbmVzLgotICogQHBhcmFtICAgUHJvZ3Jlc3M6ICAoSU4pICBQcm9ncmVzcyB2YWx1ZSAodmFyaWVzIGJldHdlZW4gMCBhbmQgMTAwMCkKLSAqIEByZXR1cm4gIE00VklGSV9PSzogTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBjaGFyIE00VklGSV9JbWFnZUJsZW5kaW5nb25ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwgTTRWaUNvbUltYWdlUGxhbmUgKnBQbGFuZUluMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZpQ29tSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LCBVSW50MzIgUHJvZ3Jlc3MpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLy8gX19NNFZGTF9UUkFOU0lUSU9OX0hfXwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0NsaXAuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9DbGlwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmMDc2MTYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0NsaXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRWSUZJX0NsaXAuaAotICogQGJyaWVmICAgICAgICBHbG9iYWwgVGFibGUgZGVmaW5pdGlvbgotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDbGlwcGluZyBhbmQgRGl2aXNpb24gdGFibGUgYWRkcmVzcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiAgICBfTTRWSUZJX0NMSVBfSF8KLSNkZWZpbmUgICAgX000VklGSV9DTElQX0hfCi0KLS8qIENsaXBwaW5nIG1hdHJpeCBmb3IgUkdCIHZhbHVlcyAqLwotRVhURVJOIENOU1QgTTRWSUZJX1VJbnQ4ICAgICpNNFZJRklfQ2xpcFRhYmxlX3plcm87Ci0vKiBEaXZpc2lvbiB0YWJsZSBmb3IgKDY1NTM1L3gpOyB4ID0gMCB0byA1MTIgKi8KLUVYVEVSTiBDTlNUIE00VklGSV9VSW50MTYgICAgKk00VklGSV9EaXZUYWJsZV96ZXJvOwotCi0jZW5kaWYgLyogX000VklGSV9DTElQX0hfICovCi0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9DbGlwLmggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0RlZmluZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9EZWZpbmVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0NTkxZTUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0RlZmluZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00VklGSV9EZWZpbmVzLmgKLSAqIEBicmllZiAgICAgICAgTWFjcm8gRGVmaW5pdGlvbgotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCB0aGUgbWFjcm8gdXNlZCBpbiB0aGUgZmlsdGVyIGxpYnJhcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX000VklGSV9ERUZJTkVTX0hfCi0jZGVmaW5lIF9NNFZJRklfREVGSU5FU19IXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIE1hY3JvcyB1c2VkIGZvciBjb2xvciB0cmFuc2Zvcm0gUkdCNTY1IHRvIFlVVgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBDU1RfUkdCXzE2X1NJWkUgMgotI2RlZmluZSBZMTYociwgZywgYikgQ0xJUCggICggKCAoODA1OTMgKiByKSsoNzc4NTUgKiBnKSsoMzA3MjggKiBiKSkgPj4gMTUpKQotI2RlZmluZSBVMTYociwgZywgYikgQ0xJUCgxMjgrICggKCAtKDQ1NDgzICogciktKDQzOTM2ICogZykrKDEzNDc3MSAqIGIpKSA+PiAxNSApKQotI2RlZmluZSBWMTYociwgZywgYikgQ0xJUCgxMjgrICggKCAoMTM0NzcxICogciktKDU1NTMyICogZyktKDIxOTE3ICogYikpID4+IDE1ICApKQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICBNYWNyb3MgdXNlZCBmb3IgY29sb3IgdHJhbnNmb3JtIFlVViB0byBSR0IKLSAqICAgIEIgPSAxLjE2NChZIC0gMTYpICAgICAgICAgICAgICAgICAgKyAyLjAxOChVIC0gMTI4KQotICogIEcgPSAxLjE2NChZIC0gMTYpIC0gMC44MTMoViAtIDEyOCkgLSAwLjM5MShVIC0gMTI4KQotICogIFIgPSAxLjE2NChZIC0gMTYpICsgMS41OTYoViAtIDEyOCkKLSAqICBBYm92ZSBDb252ZXJzaW9uIEZvcm11bGEgaXMgaW1wbGVtZW50ZWQgZm9yIGZpeGVkIHBvaW50IG9wZXJhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIENTVF9SR0JfMjRfU0laRSAzCi0KLSNpZmRlZiBfX1JHQl9WMV9fCi0jZGVmaW5lIERFTUFUUklYKFJ4LEd4LEJ4LFl4MzcsVXgsVngpIFwKLSAgICBSeCA9IENMSVAoKChZeDM3ICsgKFZ4ICogNTEpICsgMTYpID4+IDUpIC0gMjIzKTsgXAotICAgIEd4ID0gQ0xJUCgoKFl4MzcgLSAoKFV4KyhWeDw8MSkpICogMTMpICsxNikgPj4gNSkgKyAxMzUpOyBcCi0gICAgQnggPSBDTElQKCgoWXgzNyArIChVeCAqIDY1KSArIDE2KSA+PiA1KSAtIDI3NykKLSNlbHNlCi0jZGVmaW5lIERFTUFUUklYKFJ4LEd4LEJ4LFl4MjU2OCxVeCxWeCkgXAotICAgIFJ4ID0gQ0xJUCgoKFl4MjU2OCArICAgICAgICAgICAgICAgICAoVnggKiAweDMzNDMpICsgKE00VklGSV9JbnQzMikweGZmZTQwODAwKSA+PiAxMykpOyBcCi0gICAgR3ggPSBDTElQKCgoWXgyNTY4IC0gKFV4ICogMHgwYzkyKSAtIChWeCAqIDB4MWExZSkgKyAoTTRWSUZJX0ludDMyKTB4MDAxMTAxODApID4+IDEzKSk7IFwKLSAgICBCeCA9IENMSVAoKChZeDI1NjggKyAoVXggKiAweDQwY2YpICAgICAgICAgICAgICAgICAgICArIChNNFZJRklfSW50MzIpMHhmZmRkNDIwMCkgPj4gMTMpKTsKLSNlbmRpZiAvKiBfX1JHQl9WMV9fICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICBQYWNraW5nIGFuZCBVbnBhY2tpbmcgaXMgZGlmZmVyZW50IGZvciBsaXR0bGUgYW5kIGJpZyBlbmRpYW4KLSAqICByLCBnLCBiLCBSeCwgR3gsIEJ4IGFyZSA4IGJpdCBjb2xvciB2YWx1ZQotICogICAgYSwgZGF0YSBhcmUgMTYgYml0IHBpeGVsIHZhbHVlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKiBQYWNrIGNvbXB1dGF0aW9ucyBjb21tb24gZm9yIGxpdHRsZSBlbmRpYW4gYW5kIGJpZyBlbmRpYW4gbW9kZXMgKi8KLSNkZWZpbmUgICAgUEFDS19CR1IyNChyZ2JfcHRyLFJ4LEd4LEJ4KSB7cmdiX3B0clswXSA9IChNNFZJRklfVUludDgpQng7IHJnYl9wdHJbMV0gPVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KUd4OyByZ2JfcHRyWzJdID0gKE00VklGSV9VSW50OClSeDt9Ci0jZGVmaW5lICAgIFBBQ0tfUkdCMjQocmdiX3B0cixSeCxHeCxCeCkge3JnYl9wdHJbMF0gPSAoTTRWSUZJX1VJbnQ4KVJ4OyByZ2JfcHRyWzFdID1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OClHeDsgcmdiX3B0clsyXSA9IChNNFZJRklfVUludDgpQng7fQotCi0jaWZkZWYgQklHX0VORElBTgotI2RlZmluZSAgICBQQUNLX1JHQjU2NShhLCBSeCwgR3gsIEJ4KSAoKChSeCA+PiAzKSA8PCAoMTEgKyAoYSkpKVwKLSAgICAgICAgICAgICAgICAgfCAoKEd4ID4+IDIpIDw8ICg1ICsgKGEpKSkgfCAoKEJ4ID4+IDMpIDw8IChhKSkpCi0jZGVmaW5lICAgIFBBQ0tfQkdSNTY1KGEsIFJ4LCBHeCwgQngpICgoKEJ4ID4+IDMpIDw8ICgxMSArIChhKSkpXAotICAgICAgICAgICAgICAgICB8ICgoR3ggPj4gMikgPDwgKDUgKyAoYSkpKSB8ICgoUnggPj4gMykgPDwgKGEpKSkKLSNkZWZpbmUgR0VUX1JHQjU2NShyLCBnLCBiLCBkYXRhKSB7YiA9ICgoZGF0YSkgJiAzMSk7IGcgPVwKLSAgICAgICAgICAgICAgICAgICAgICgoZGF0YSA+PiA1KSAmIDYzKTsgciA9ICgoZGF0YSA+PiAxMSkgJiAzMSk7fQotI2RlZmluZSBHRVRfQkdSNTY1KGIsIGcsIHIsIGRhdGEpIFwKLSAgICByID0gKChkYXRhKSAmIDMxKTsgXAotICAgIGcgPSAoKGRhdGEgPj4gNSkgJiA2Myk7IFwKLSAgICBiID0gKChkYXRhID4+IDExKSAmIDMxICk7Ci0jZWxzZSAvKiBMSVRUTEUgZW5kaWFuOiAweDEyMzQ1Njc4IC0+IDc4IDU2IDM0IDEyICovCi0jZGVmaW5lICAgIFBBQ0tfUkdCNTY1KGEsIFJ4LCBHeCwgQngpICgoKEJ4ID4+IDMpIDw8ICg4ICsgKGEpKSkgXAotICAgICAgICAgICAgICAgICAgfCAoKChHeCA+PiAyKSYweDcpIDw8ICgxMyArIChhKSkpIHwgKChHeCA+PiA1KSA8PCAoYSkpIHwgKChSeCA+PiAzKSA8PCAoMyArIGEpKSkKLSNkZWZpbmUgICAgUEFDS19CR1I1NjUoYSwgUngsIEd4LCBCeCkgKCgoUnggPj4gMykgPDwgKDExICsgKGEpKSkgXAotICAgICAgICAgICAgICAgICAgfCAoKEd4ID4+IDIpIDw8ICg1ICsgKGEpKSkgfCAoKEJ4ID4+IDMpIDw8IChhKSkpCi0jZGVmaW5lIEdFVF9SR0I1NjUociwgZywgYiwgZGF0YSkgeyBiID0gKE00VklGSV9VSW50OCkoKChkYXRhKSAmIDB4MUYwMCkgPj4gOCk7IGcgPVwKLSAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KSgoKChkYXRhKSAmIDB4NykgPDwgMykgfCAoKChkYXRhKSAmIDB4RTAwMCkgPj4gMTMpKTsgciA9XAotICAgICAgICAgICAgIChNNFZJRklfVUludDgpKCgoZGF0YSkgJiAweEY4KSA+PiAzKTt9Ci0jZGVmaW5lIEdFVF9CR1I1NjUoYiwgZywgciwgZGF0YSkgXAotICAgIGIgPSAoKGRhdGEpICYgMzEpOyBcCi0gICAgZyA9ICgoZGF0YSA+PiA1KSAmIDYzKTsgXAotICAgIHIgPSAoKGRhdGEgPj4gMTEpICYgMzEgKTsKLSNlbmRpZiAvKiBCSUdfRU5ESUFOICovCi0KLQotI2RlZmluZSBDU1RfUkdCXzI0X1NJWkUgMwotI2RlZmluZSBZMjQocixnLGIpIENMSVAoKCAoICgxOTU5NSAqIHIpICsgKDM4NDcwICogZykgKyAoOTQzNyAqIGIpICkgPj4xNikpCi0jZGVmaW5lIFUyNChyLGcsYikgQ0xJUCgxMjggKyAoICggLSgxMTA1OSAqIHIpIC0gKDIxNzA5ICogZykgKyAoMzI3NjggKiBiKSkgPj4xNikpCi0jZGVmaW5lIFYyNChyLGcsYikgQ0xJUCgxMjggKyAoICggKDMyNzY4ICogcikgLSAoMjc0MjYgKiBnKSAtICg1MzI5ICogYikpICA+PjE2KSkKLSNkZWZpbmUgR0VUX1JHQjI0KHIsZyxiLHMsbykgciA9IHNbb107IGcgPSBzW28gKyAxXTsgYiA9IHNbbyArIDJdOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIE1hY3JvIGZvciBjbGlwcGluZyB1c2luZyB0aGUgY2xpcHBpbmcgbWF0cml4IGZvciBSR0IgdmFsdWVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKiogQ2xpcCBmdW5jdGlvbiBlbnN1cmVzIHZhbHVlcyB3aXRoIHJhbmdlIG9mIDAgYW5kIDI1NSAqLwotI2RlZmluZSAgICAgICAgQ0xJUCh4KSAgICAqKE00VklGSV9DbGlwVGFibGVfemVybyArICh4KSkKLSNkZWZpbmUgICAgICAgIENMSVBfT1ZGICAgICAgICA1MDAKLSNkZWZpbmUgICAgIENMSVBfTFVUX1NJWkUgICAgICgyNTYgKyAyICogQ0xJUF9PVkYpCi0vKiogRGl2aXNpb24gdGFibGUgZm9yIFJHQjU2NSB0byBITFMgY29udmVyc2lvbiAqLwotI2RlZmluZSAgICAgICAgRElWQ0xJUCh4KSAgICAqKE00VklGSV9EaXZUYWJsZV96ZXJvICsgKHgpKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIEVuZGlhbm5lc3MgKGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBMaXR0bGUgRW5kaWFuKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmICghZGVmaW5lZChMSVRUTEVfRU5ESUFOKSAmJiAhZGVmaW5lZChCSUdfRU5ESUFOKSkKLS8qKiBEZWZhdWx0IGVuZGlhbiBzZXR0aW5nICovCi0jZGVmaW5lIExJVFRMRV9FTkRJQU4KLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIE90aGVyIG1hY3JvcyBhbmQgZGVmaW5lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKiogWVVWIHBsYW5lIGluZGV4ICovCi0jZGVmaW5lIFBMQU5FUyAgICAzCi0jZGVmaW5lIFlQbGFuZSAgICAwCi0jZGVmaW5lIFVQbGFuZSAgICAxCi0jZGVmaW5lIFZQbGFuZSAgICAyCi0KLS8qKiBDaGVjayBmb3IgdmFsdWUgaXMgRVZFTiAqLwotI2lmbmRlZiBJU19FVkVOCi0jZGVmaW5lIElTX0VWRU4oYSkgICAgKCEoYSAmIDB4MDEpKQotI2VuZGlmCi0KLS8qIFVzZWQgZm9yIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uICovCi0jaWZuZGVmIE1BWF9TSE9SVAotI2RlZmluZSBNQVhfU0hPUlQgICAgMHgxMDAwMAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfTTRWSUZJX0RFRklORVNfSF8gKi8KLQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0RlZmluZXMuaCAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRmlsdGVyc0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0ZpbHRlcnNBUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2QyZmM5ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRmlsdGVyc0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRWSUZJX0ZpbHRlcnNBUEkuaAotICogQGJyaWVmICAgICAgICBFeHRlcm5hbCBBUEkgYW5kIERhdGEgZGVmaW5pdGlvbnMgZm9yIHRoZSB2aWRlbyBmaWx0ZXIgbGlicmFyeQotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGFuZCBkZWNsYXJlcyBkYXRhIGNvbW1vbiB0byB0aGUgdmlkZW8gZmlsdGVyIGxpYnJhcnk6Ci0gKiAgICAgICAgICAgICAgICAgICAgLSMgZGF0YSB0eXBlcwotICogICAgICAgICAgICAgICAgICAgIC0jIGVycm9yIGNvZGVzCi0gKiAgICAgICAgICAgICAgICAgICAgLSMgZXh0ZXJuYWwgQVBJJ3MKLSAqICAgICAgICAgICAgICAgICAgICAtIyBBUEkgbGV2ZWwgc3RydWN0dXJlIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX000VklGSV9GSUxURVJTQVBJX0hfCi0KLSNkZWZpbmUgX000VklGSV9GSUxURVJTQVBJX0hfCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1leHRlcm4gIkMiIHsKLQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSAgICAvKioKLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgRGF0YSB0eXBlcyBkZWZpbml0aW9uCi0gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKi8KLQotICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBNNFZJRklfVUludDg7Ci0gICAgdHlwZWRlZiBjaGFyIE00VklGSV9JbnQ4OwotICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgTTRWSUZJX1VJbnQxNjsKLSAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgTTRWSUZJX1VJbnQzMjsKLSAgICB0eXBlZGVmIHNob3J0IE00VklGSV9JbnQxNjsKLSAgICB0eXBlZGVmIGxvbmcgTTRWSUZJX0ludDMyOwotICAgIHR5cGVkZWYgZmxvYXQgTTRWSUZJX0Zsb2F0OwotICAgIHR5cGVkZWYgZG91YmxlIE00VklGSV9Eb3VibGU7Ci0gICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE00VklGSV9FcnJvckNvZGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgRXJyb3IgY29kZXMgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNFZJRklfT0sgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE00VklGSV9JTlZBTElEX1BBUkFNICAgICAgICAgICAgNwotI2RlZmluZSBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQgICAgICAgIDgKLSNkZWZpbmUgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEggICAgICAgIDkKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBPdGhlciBiYXNpYyBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBDTlNUICAgIGNvbnN0Ci0jZGVmaW5lIEVYVEVSTiAgICBleHRlcm4KLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgICAgMAotCi0jZW5kaWYKLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAgMAotI2RlZmluZSBUUlVFICAgICFGQUxTRQotCi0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWSUZJX0ltYWdlUGxhbmUKLSAqIEBicmllZiAgICAgICAgVGV4dHVyZSAoWVVWKSBwbGFuZXMgc3RydWN0dXJlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGV0YWlscyB0aGUgaW1hZ2UgcGxhbmVzIGZvciB0aGUgb3V0cHV0IHRleHR1cmVzOgotICogICAgICAgICAgICAgICAgc2l6ZXMgKGluIHBpeGVscykgYXJlIGx1bWEgcGxhbmUgc2l6ZXMsIHRoZSAzIHBvaW50ZXJzIHBvaW50Ci0gKiAgICAgICAgICAgICAgICB0byB0aGUgWSwgVSBhbmQgViBidWZmZXJzIHdoaWNoIHN0b3JlIGRhdGEgaW4gcGxhbmFyIGZvcm1hdC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIE00VklGSV9VSW50MzIgdV93aWR0aDsgICAvKio8IFdpZHRoIG9mIGx1bWEgaW4gcGl4ZWwgdW5pdCAqLwotICAgICAgICBNNFZJRklfVUludDMyIHVfaGVpZ2h0OyAgLyoqPCBIZWlnaHQgb2YgbHVtYSBpbiBwaXhlbCB1bml0ICovCi0gICAgICAgIE00VklGSV9VSW50MzIgdV90b3BsZWZ0OyAvKio8IFBvaW50ZXIgdG8gZmlyc3QgdGV4dHVyZSBhY3RpdmUgcGl4ZWwgKi8KLSAgICAgICAgTTRWSUZJX1VJbnQzMiB1X3N0cmlkZTsgIC8qKjwgU3RyaWRlIHZhbHVlICovCi0gICAgICAgIE00VklGSV9VSW50OCAqcGFjX2RhdGE7ICAvKio8IFBvaW50ZXIgdG8gdGhlIGRhdGEgKi8KLSAgICAgICAgfSBNNFZJRklfSW1hZ2VQbGFuZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWSUZJX0ZyYW1pbmdEYXRhCi0gKiBAYnJpZWYgICAgICAgIERhdGEgbmVjZXNzYXJ5IHRvIGFkZCBhbiBvdmVybGF5IG9uIGFuIGltYWdlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGV0YWlscyB0aGUgcG9zaXRpb24gYW5kIHRoZSBkYXRhIG9mIHRoZSBvdmVybGF5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQzMgotICAgICAgICAgICAgbV94UG9zU3RlcDsgLyoqPCBYIHBvc2l0aW9uaW5nIG9mIHRoZSBvdmVybGF5IHZzIG1haW4gcGljdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYIHBvc2l0aW9uaW5nIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIHZzIHRoZSBtYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgd2lkdGguCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV94UG9zU3RlcCBtdXN0IGJlIGV4cHJlc3NlZCBieSBzdGVwIG9mIDElIGFuZCBiZXR3ZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUwLys1MCUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCUgbWVhbnMgb3ZlcmxheSBpcyBjZW50ZXJlZCB2cyBtYWluIHBpY3R1cmUgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCBhYnNjaXNzYS4gKi8KLSAgICAgICAgTTRWSUZJX1VJbnQzMgotICAgICAgICAgICAgbV95UG9zU3RlcDsgLyoqPCBZIHBvc2l0aW9uaW5nIG9mIHRoZSBvdmVybGF5IHZzIG1haW4gcGljdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZIHBvc2l0aW9uaW5nIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIHZzIHRoZSBtYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgd2lkdGguCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV94UG9zU3RlcCBtdXN0IGJlIGV4cHJlc3NlZCBieSBzdGVwIG9mIDElIGFuZCBiZXR3ZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01MC8rNTAlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAlIG1lYW5zIG92ZXJsYXkgaXMgY2VudGVyZWQgdnMgbWFpbiBwaWN0dXJlIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFkgYWJzY2lzc2EuICovCi0KLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUKLSAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICBtX2ltYWdlUGxhbmU7IC8qKjwgUG9pbnRlciB0byB0aGUgZnJhbWluZyBpbWFnZSB3aXRoIGFscGhhIGNoYW5uZWwgKi8KLSAgICAgICAgfSBNNFZJRklfRnJhbWluZ0RhdGE7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9ITFNvZmZzZXQKLSAqIEBicmllZiAgICAgICAgSExTIG9mZnNldCBzdHJ1Y3R1cmUKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBoYXZlIHRoZSBodWUsIHNhdHVyYXRpb24gYW5kIGxpZ2h0bmVzcyB2YWx1ZQotICogICAgICAgICAgICAgICAgZm9yIHF1YWxpdHkgZW5oYW5jZW1lbnQuIFJhbmdlIG9mIHZhbHVlcyBuZWNjZXNzYXJpbHkgYmUKLSAqICAgICAgICAgICAgICAgIGh1ZSA9IC0zNjAgdG8gMzYwLCBzYXQgPSAwIHRvIDEwMCBhbmQgbGlnaHQgPSAwIHQwIDEwMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIE00VklGSV9JbnQxNiBodWU7ICAgLyoqPCBIdWUgb2Zmc2V0ICovCi0gICAgICAgIE00VklGSV9JbnQxNiBzYXQ7ICAgLyoqPCBTYXR1cmF0aW9uIG9mZnNldCAqLwotICAgICAgICBNNFZJRklfSW50MTYgbGlnaHQ7IC8qKjwgTGlnaHQgb2Zmc2V0ICovCi0gICAgICAgIH0gTTRWSUZJX0hMU29mZnNldDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWSUZJX1RyYW5mb3JtYXRpb24KLSAqIEBicmllZiAgICAgICAgSW1hZ2UgVHJhbmZvcm1hdGlvbiBTdHJ1Y3R1cmUKLSAqIEBub3RlICAgICAgICBJbWFnZSBUcmFuZm9ybWF0aW9uIFJlcXVlc3QKLSAqICAgICAgICAgICAgICAgIHJvdGF0aW9uIDogMSAtPiArOTBkZWcgUm90YXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAtPiAtOTBkZWcgUm90YXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtPiAgTm8gUm90YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfSW50MzIgaTMyX3JvdGF0aW9uOyAvKio8IFJvdGF0aW9uIEZsYWcgICAgICAgICovCi0gICAgICAgIH0gTTRWSUZJX1RyYW5mb3JtYXRpb247Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9wQ29udGV4dAotICogQGJyaWVmICAgICAgICBOZXcgU3RydWN0dXJlcwotICogQG5vdGUgICAgICAgIC0jIFN0cnVjdHVyZSBvZiBNNFZJRklfSExTb2Zmc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgTTRWSUZJX0hMU29mZnNldCBobHNPZmZzZXQ7IC8qKjwgSExTIG9mZnNldCBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgfSBNNFZJRklfcENvbnRleHQ7Ci0KLSAgICAvKgotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAqICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBBUEkgZnVuY3Rpb25zCi0gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKi8KLQotICAgIC8qKjwgRWZmZWN0IGZpbHRlcnMgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NlcGlhWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQ29udHJhc3RZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9OZWdhdGl2ZVlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0ZsaXBZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9NaXJyb3JZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MFJpZ2h0WVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUm90YXRlOTBMZWZ0WVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQ29sb3JSWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQ29sb3JHWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQ29sb3JCWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfRnJhbWluZ1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0ZyYW1pbmdZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SHVlSW5ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQ29sZFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1dhcm1ZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLS8qICAgICAgICAgICAgICAgIEFEUyBDb21waWxlciAgICAgICAgICAgICAgICAqLwotCi0vKiAgICAgICAgR2VuZXJpYyBBUk0gYXNzZW1ibHkgZnVuY3Rpb25zICAgICAgICAqLwotI2lmIGRlZmluZWQgQURTX0FSTQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBSR0I4ODh0b1JHQjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFJHQjU2NXRvUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwQWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCR1I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMEFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjIgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9VWVZZdG9ZVVY0MjBBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1QWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1QWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0QWRzQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRBZHNBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEFkc0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0QWRzQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpblJHQjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1QWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9SR0I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwQWRzQXJtCi0jZGVmaW5lIE00VklGSV9CR1I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwQWRzQXJtCi0jZGVmaW5lIE00VklGSV9VWVZZdG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfVVlWWXRvWVVWNDIwQWRzQXJtCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1QWRzQXJtCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b0JHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvQkdSNTY1QWRzQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEFkc0FybQotCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEFkc0FybQotCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9TZXRITFNpblJHQjU2NUFkc0FybQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9TZXRITFNpbkJHUjU2NUFkc0FybQotCi0vKiAgICAgICAgQVJNOUUgYXNzZW1ibHkgZnVuY3Rpb25zICAgICAgICAqLwotI2VsaWYgZGVmaW5lZCBBRFNfQVJNOUUKLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWODg4dG9ZVVY4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY1NjV0b1lVVjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUkdCNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjBBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQkdSNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjBBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjIgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9VWVZZdG9ZVVY0MjBBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEFkc0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRBZHNBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0QWRzQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEFkc0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpblJHQjU2NUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5CR1I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgWVVWNDIwdG9ZVVY0MjAgZnJvbSBRQ0lGIHRvIFFWR0EqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvWVVWNDIwUVZHQUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1JHQjU2NSBmcm9tIFFDSUYgdG8gUVZHQSovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1JHQjU2NSBmcm9tIFFDSUYgdG8gUVZHQSB3aXRoIHJvdGF0aW9uICs5MCovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1JHQjU2NSBmcm9tIFFDSUYgdG8gUVZHQSB3aXRoIHJvdGF0aW9uIC05MCovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotLyoqIFJlc2l6ZXMgWVVWNDIwIFBsYW5hciBJbWFnZSBhbmQgc3RvcmVzIGluIFlVVjQyMCBMaW5lYXIgZm9ybWF0IHdpdGgvd2l0aG91dCArb3ItOTAgcm90YXRpb24qLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFydG9ZVVY0MjBMaW5lYXJBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSNkZWZpbmUgTTRWSUZJX1JHQjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjBBZHNBcm05RQotI2RlZmluZSBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9VWVZZdG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfVVlWWXRvWVVWNDIwQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9SR0I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b0JHUjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9TZXRITFNpblJHQjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9TZXRITFNpbkJHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5CR1I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvWVVWNDIwUVZHQSAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0FBZHNBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQSAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FBZHNBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUiAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlJBZHNBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STCAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkxBZHNBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUGxhbmFydG9ZVVY0MjBMaW5lYXIgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIwTGluZWFyQWRzQXJtOUUKLS8qICAgICAgICAgICAgICAgIEdDQyBDb21waWxlciAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIEdlbmVyaWMgQVJNIGFzc2VtYmx5IGZ1bmN0aW9ucyAgICAgICAgKi8KLQotI2VsaWYgZGVmaW5lZCBHQ0NfQVJNCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjg4OHRvWVVWODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNTY1dG9ZVVY1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUkdCNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjBHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJHUjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjU2NXRvWVVWNDIwR2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRHY2NBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEdjY0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRHY2NBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEdjY0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIE1vZGlmeSBITFMgaW4gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpblJHQjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBNb2RpZnkgSExTIGluIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5CR1I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSNkZWZpbmUgTTRWSUZJX1JHQjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjBHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjBHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9SR0I1NjVHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9CR1I1NjVHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEdjY0FybQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9TZXRITFNpblJHQjU2NUdjY0FybQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9TZXRITFNpbkJHUjU2NUdjY0FybQotCi0vKiAgICAgICAgQVJNOUUgYXNzZW1ibHkgZnVuY3Rpb25zICAgICAgICAqLwotI2VsaWYgZGVmaW5lZCBHQ0NfQVJNOUUKLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWODg4dG9ZVVY4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY1NjV0b1lVVjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSR0I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMEdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCR1I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMEdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1R2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1R2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1R2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRHY2NBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0R2NjQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0R2NjQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEdjY0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpblJHQjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5CR1I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotI2RlZmluZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9CR1I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwR2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9SR0I1NjVHY2NBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b0JHUjU2NUdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5CR1I1NjVHY2NBcm05RQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9TZXRITFNpblJHQjU2NUdjY0FybTlFCi0KLS8qIFRJIENDUyBhc3NlbWJseSBmaWxlcyAqLwotI2VsaWYgZGVmaW5lZCBUSTQxMV9BUk05RQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCAoUGxhbmFyKSB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgKFBsYW5hcikgdG8gUmVzaXplZCBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCAoUGxhbmFyKSB0byBSZXNpemVkIFJHQjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwKFBsYW5hcikgdG8gUmVzaXplZCBhbmQgUm90YXRlZCAoLTkwKSBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAoUGxhbmFyKSB0byBSZXNpemVkIGFuZCBSb3RhdGVkICgrOTApIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMChQbGFuYXIpIHRvIFJlc2l6ZWQgWVVWNDIwKFBsYW5hcikgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0Eodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIFlVVjQyMChQbGFuYXIpIG9mIFFDSUYgdG8gUkdCNTY1IG9mIFFWR0EgcmVzb2x1dGlvbiAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotLyoqIFJlc2l6ZSBZVVY0MjAoUGxhbmFyKSBvZiBRQ0lGIHRvIFJHQjU2NSBvZiBRVkdBIHJlc29sdXRpb24gd2l0aCByb3RhdGlvbigtOTApICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0vKiogUmVzaXplIFlVVjQyMChQbGFuYXIpIG9mIFFDSUYgdG8gUkdCNTY1IG9mIFFWR0EgcmVzb2x1dGlvbiB3aXRoIHJvdGF0aW9uKCs5MCkgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlIodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9SR0I1NjVUaTQxMUFybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVUaTQxMUFybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRUaTQxMUFybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodFRpNDExQXJtOUUKLQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvWVVWNDIwUVZHQSAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvWVVWNDIwUVZHQVRpNDExQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0EgICAgICAgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FUaTQxMUFybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STFRpNDExQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlIgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSVGk0MTFBcm05RQotCi0vKiAgICAgICAgQU5TSSBDIEZ1bmN0aW9ucyAgICAgICAgKi8KLSNlbHNlCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjg4OHRvWVVWODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNTY1dG9ZVVY1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUkdCNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJSRzU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCUkc4ODggdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci0gICAgLyoqIFJHQjg4OCB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKTsKLQotICAgIC8qKiBZVVY0MjIgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9VWVZZdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjI0ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjI0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIFJHQjI0ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjI0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0KAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5CR1I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvWVVWNDIwIGZyb20gUUNJRiB0byBRVkdBKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0Eodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1JHQjU2NSBmcm9tIFFDSUYgdG8gUVZHQSovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0Egd2l0aCByb3RhdGlvbiArOTAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUih2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBIHdpdGggcm90YXRpb24gLTkwKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkwodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotLyoqIFJlc2l6ZXMgWVVWNDIwIFBsYW5hciBJbWFnZSBhbmQgc3RvcmVzIGluIFlVVjQyMCBMaW5lYXIgZm9ybWF0IHdpdGgvd2l0aG91dCArb3ItOTAgcm90YXRpb24qLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFydG9ZVVY0MjBMaW5lYXIodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0vKiogUmVzaXplcyBZVVY0MjAgUGxhbmFyIEltYWdlIGFuZCBzdG9yZXMgaW4gWVVWNDIyIEludGVybGVhdmVkIGZvcm1hdAotICAgICB3aXRoL3dpdGhvdXQgK29yLTkwIHJvdGF0aW9uKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIySW50ZXJsZWF2ZWQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotI2VuZGlmCi0KLSAgICAvKiogZGVmaW5pdGlvbiBvZiB0aGUgY29udmVydGVyIGZ1bmN0aW9uIHR5cGVzICovCi0KLSAgICB0eXBlZGVmIE00VklGSV9VSW50OCBNNFZJRklfUGxhbkNvbnZlcnRlckZ1bmN0aW9uVHlwZSh2b2lkCi0gICAgICAgICpwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIGluLCBNNFZJRklfSW1hZ2VQbGFuZSogb3V0KTsKLQotICAgIC8qKiBkZWZpbml0aW9uIG9mIHRoZSBwcmVwcm9jZXNzaW5nIGZ1bmN0aW9uIHR5cGVzICovCi0gICAgdHlwZWRlZiBNNFZJRklfVUludDggTTRWSUZJX1ByZXByb2Nlc3NGdW5jdGlvblR5cGUodm9pZAotICAgICAgICAqcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBpbiwgTTRWSUZJX0ltYWdlUGxhbmUqIG91dCk7Ci0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvWVVWNDIwKHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBQbGFuYXJUb1lVVjQyMFNlbWlwbGFuYXIodm9pZCAqdXNlcl9kYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NlbWlwbGFuYXJZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLX0KLQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfTTRWSUZJX0ZJTFRFUlNBUElfSF8gKi8KLQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0ZpbHRlcnNBUEkuaCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWUFBfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZQUF9BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTY1Y2EyMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZQUF9BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWUFBfQVBJLmgKLSAqIEBicmllZiAgICBWaWRlbyBwcmVwcm9jZXNzaW5nIEFQSSBwdWJsaWMgZnVuY3Rpb25zIHByb3RvdHlwZXMuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNFZQUF9BUElfSAotI2RlZmluZSBNNFZQUF9BUElfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIgICAgICAgICAgICAvKio8IEluY2x1ZGUgZm9yIGNvbW1vbiBPU0FMIHR5cGVzICovCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIgICAgICAgICAgICAvKio8IEluY2x1ZGUgZm9yIGNvbW1vbiBPU0FMIGVycm9ycyAqLwotCi0vKioKLSAqICAgIEluY2x1ZGUgVmlkZW8gZmlsdGVycyBpbnRlcmZhY2UgZGVmaW5pdGlvbiAoZm9yIHRoZSBNNFZJRklfSW1hZ2VQbGFuZSB0eXBlKSAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFB1YmxpYyB0eXBlIG9mIHRoZSBWaWRlbyBQcmVwcm9jZXNzaW5nIGV4ZWN1dGlvbiBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9Wb2lkKiAgICBNNFZQUF9Db250ZXh0OwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZQUF9rSVlVVjQyMD0wLCAgICAvKio8IFlVViA0OjI6MCBwbGFuYXIgKHN0YW5kYXJkIGlucHV0IGZvciBtcGVnLTQgdmlkZW8pICovCi0gICAgTTRWUFBfa0lZVVY0MjIsICAgICAgICAvKio8IFlVVjQyMiBwbGFuYXIgKi8KLSAgICBNNFZQUF9rSVlVWVYsICAgICAgICAvKio8IFlVVjQyMiBpbnRlcmxhY2VkLCBsdW1hIGZpcnN0ICovCi0gICAgTTRWUFBfa0lVWVZZLCAgICAgICAgLyoqPCBZVVY0MjIgaW50ZXJsYWNlZCwgY2hyb21hIGZpcnN0ICovCi0gICAgTTRWUFBfa0lKUEVHLCAgICAgICAgLyoqPCBKUEVHIGNvbXByZXNzZWQgZnJhbWVzICovCi0gICAgTTRWUFBfa0lSR0I0NDQsICAgICAgICAvKio8IFJHQiAxMiBiaXRzIDQ6NDo0ICovCi0gICAgTTRWUFBfa0lSR0I1NTUsICAgICAgICAvKio8IFJHQiAxNSBiaXRzIDU6NTo1ICovCi0gICAgTTRWUFBfa0lSR0I1NjUsICAgICAgICAvKio8IFJHQiAxNiBiaXRzIDU6Njo1ICovCi0gICAgTTRWUFBfa0lSR0IyNCwgICAgICAgIC8qKjwgUkdCIDI0IGJpdHMgODo4OjggKi8KLSAgICBNNFZQUF9rSVJHQjMyLCAgICAgICAgLyoqPCBSR0IgMzIgYml0cyAgKi8KLSAgICBNNFZQUF9rSUJHUjQ0NCwgICAgICAgIC8qKjwgQkdSIDEyIGJpdHMgNDo0OjQgKi8KLSAgICBNNFZQUF9rSUJHUjU1NSwgICAgICAgIC8qKjwgQkdSIDE1IGJpdHMgNTo1OjUgKi8KLSAgICBNNFZQUF9rSUJHUjU2NSwgICAgICAgIC8qKjwgQkdSIDE2IGJpdHMgNTo2OjUgKi8KLSAgICBNNFZQUF9rSUJHUjI0LCAgICAgICAgLyoqPCBCR1IgMjQgYml0cyA4Ojg6OCAqLwotICAgIE00VlBQX2tJQkdSMzIgICAgICAgIC8qKjwgQkdSIDMyIGJpdHMgICovCi19IE00VlBQX0lucHV0VmlkZW9Gb3JtYXQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUHJvdG90eXBlIG9mIHRoZSBtYWluIHZpZGVvIHByZXByb2Nlc3NpbmcgZnVuY3Rpb24KLSAqIEBub3RlICAgIFByZXByb2Nlc3Mgb25lIGZyYW1lCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIFZQUC4KLSAqIEBwYXJhbSAgICBwUGxhbmVJbjogICAgKElOT1VUKSAgICBJbnB1dCBJbWFnZQotICogQHBhcmFtICAgIHBQbGFuZU91dDogICAgKElOT1VUKSAgICBPdXRwdXQgSW1hZ2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRWUFBfYXBwbHlfZmN0KSAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWUFBfaW5pdFZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0KiBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG5ldyBleGVjdXRpb24gY29udGV4dCBmb3IgdGhlIFZpZGVvIFByZXByb2Nlc3NpbmcgY29tcG9uZW50LgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKE9VVCkgRXhlY3V0aW9uIGNvbnRleHQgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbi4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTlVMTCAoZGVidWcgb25seSkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlBQX2luaXRWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCogcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZQUF9hcHBseVZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotICogQGJyaWVmICAgIFByZXByb2Nlc3Mgb25lIGZyYW1lLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEBwYXJhbSAgICBwUGxhbmVJbjogICAgKElOT1VUKSAgICBJbnB1dCBJbWFnZQotICogQHBhcmFtICAgIHBQbGFuZU91dDogICAgKElOT1VUKSAgICBPdXRwdXQgSW1hZ2UKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcFBsYW5lSW4gb3IgcFBsYW5lT3V0IGlzIE5VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogVmlkZW8gUHJlcHJvY2Vzc2luZyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlBQX2FwcGx5VmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlBQX2NsZWFuVXBWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIG1ldGhvZCBmcmVlcyB0aGUgZXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBWaWRlbyBQcmVwcm9jZXNzaW5nIGNvbXBvbmVudC4KLSAqICAgICAgICAgICAgQW55IGZ1cnRoZXIgdXNhZ2Ugb2YgdGhlIGNvbnRleHQgd2lsbCBsZWFkIHRvIHVucHJlZGljdGFibGUgcmVzdWx0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTlVMTCAoZGVidWcgb25seSkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlBQX2NsZWFuVXBWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlBQX3NldFZpZGVvUHJlcHJvY2Vzc2luZ01vZGUoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWRVNfSW5wdXRWaWRlb0Zvcm1hdCBmb3JtYXQpCi0gKiBAYnJpZWYgICAgVGhpcyBtZXRob2QgYXBwbHkgdGhlIHZpZGVvIHByZXByb2Nlc3NpbmcgdG8gdGhlIGlucHV0IHBsYW5lLiBSZXN1bHQgaXMgcHV0IGludG8gdGhlCi0gKiAgICAgICAgICAgb3V0cHV0IHBsYW4uCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZm9ybWF0ICA6ICAgIChJTikgRm9ybWF0IG9mIGlucHV0IHBsYW5lIChyZ2IsIHl1diwgLi4uKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZQUF9zZXRWaWRlb1ByZXByb2Nlc3NpbmdNb2RlKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VlBQX0lucHV0VmlkZW9Gb3JtYXQgZm9ybWF0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgRGVmaW5pdGlvbiBvZiB0aGUgZXJyb3JzIHNwZWNpZmljIHRvIHRoaXMgbW9kdWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqPCBJbnB1dCBhbmQgb3V0cHV0IHBsYW5lcyBoYXZlIGluY29tcGF0aWJsZSBwcm9wZXJ0aWVzICovCi0jZGVmaW5lIE00VlBQX0VSUl9JTUNPTVBBVElCTEVfSU5fQU5EX09VVF9QTEFORVMgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgTTRQUkVQUk9DRVNTX1ZJREVPLCAweDAwMDAwMSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBNNFZQUF9BUElfSCAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFdSSVRFUl9jb21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000V1JJVEVSX2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYmI3Yjg2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000V1JJVEVSX2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRXUklURVJfY29tbW9uLmgKLSAqIEBicmllZiAgICBWRVMgd3JpdGVycyBzaGVsbCBpbnRlcmZhY2UuCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdHlwZXMgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBWRVMgdG8gYWJzdHJhY3Qgd3JpdGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNFdSSVRFUl9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRXUklURVJfQ09NTU9OX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIgICAvKiBmb3IgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiICAgLyogZm9yIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICovCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIgICAgIC8qIGZvciBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKCkgKi8KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIgICAgICAgLyogZm9yIE00V1JJVEVSX0NPTU1PTiAqLwotCi0jaW5jbHVkZSAiTTRTWVNfU3RyZWFtLmgiICAgICAgIC8qIGZvciBNNFNZU19TdHJlYW1JRCAqLwotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIgICAvKiBmb3IgTTRTWVNfQWNjZXNzVW5pdCAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1QNFcgRXJyb3JzICYgV2FybmluZ3MgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRXQVJfV1JJVEVSX1NUT1BfUkVRICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRXUklURVJfQ09NTU9OICwweDAwMDAwMSkKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgb3V0cHV0IGZpbGUgZm9ybWF0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00V1JJVEVSX2tVbmtub3duPS0xLAotICAgIE00V1JJVEVSX2szR1BQPTAsICAgICAgICAgICAgLyoqPCAzR1BQIGNvbXBsaWFudCBmaWxlICovCi0gICAgTTRXUklURVJfa0FWST0xLCAgICAgICAgICAgIC8qKjwgQVZJIGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rQU1SPTIsICAgICAgICAgICAgLyoqPCBBTVIgZmlsZSAqLwotICAgIE00V1JJVEVSX2tORVRXT1JLM0dQUD0zLCAgICAvKio8IDNHUFAgdmlhIFRDUCAqLwotICAgIE00V1JJVEVSX2tQQ009NCwgICAgICAgICAgICAvKio8IFBDTSBmaWxlICovCi0gICAgTTRXUklURVJfa0pQRUc9NSwgICAgICAgICAgICAvKio8IEpQRUcgRVhJRiB3cml0ZXIgKi8KLSAgICBNNFdSSVRFUl9rTVAzPTYsICAgICAgICAgICAgLyoqPCBNUDMgd3JpdGVyICovCi0KLSAgICBNNFdSSVRFUl9rVHlwZV9OQiAgLyogbnVtYmVyIG9mIHdyaXRlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi0KLX0gTTRXUklURVJfT3V0cHV0RmlsZVR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICBNNFdSSVRFUl9PcHRpb25JRAotICogQGJyaWVmICAgIFRoaXMgZW51bXMgZGVmaW5lcyBhbGwgYXZhbGFpYmxlIG9wdGlvbnMuIEFsbCB0aGUgcmV1dHVybmVkIHZhbHVlcyBhcmUgaW4KLSAqICAgICAgICAgICBNNE9TQV9VSW50MzIgdHlwZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00V1JJVEVSX2tNYXhBVVNpemUgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfUkVBRHxNNF9XUklURSwgTTRXUklURVJfQ09NTU9OLCAweDAxKSwKLSAgICBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUR8TTRfV1JJVEUsIE00V1JJVEVSX0NPTU1PTiwgMHgwMiksCi0gICAgTTRXUklURVJfa0ZpbGVTaXplICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfUkVBRCAgICAgICAgICAgICwgXAotICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDMpLCAgLyoqPCBGaWxlIHNpemUgaWYgdGhlIHByb2Nlc3Mgd2FzIGVuZGVkIHdoZW4gd2UgY2FsbCB0aGUgbWV0aG9kICovCi0gICAgTTRXUklURVJfa0ZpbGVTaXplQXVkaW9Fc3RpbWF0ZWQ9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwNCksICAgIC8qKjwgRmlsZSBzaXplIGlmIHRoZSBwcm9jZXNzIHdhcyBlbmRlZCB3aGVuIHdlIGNhbGwgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBlc3RpbWF0ZWQgc2l6ZSBmb3IgYXVkaW8gKi8KLSAgICBNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDUpLCAgICAvKio8IFN0cmluZyBlbWJlZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlKFNXIC0gVkVTKSAqLwotICAgIE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwNiksICAgIC8qKjwgVmVyc2lvbiBlbWJlZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlICovCi0gICAgTTRXUklURVJfa0ludGVncmF0aW9uVGFnICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA3KSwgICAgLyoqPCBTdHJpbmcgZW1iZWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAoY2hhcls2MF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGludGVncmF0aW9uIHB1cnBvc2UpICovCi0gICAgTTRXUklURVJfa01heEZpbGVTaXplICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLCBcCi0gICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwOCksICAgIC8qKjwgTWF4aW11bSBmaWxlIHNpemUgbGltaXRhdGlvbiAqLwotICAgIE00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwOSksICAgIC8qKjwgTWF4aW11bSBmaWxlIGR1cmF0aW9uIGxpbWl0YXRpb24gKi8KLSAgICBNNFdSSVRFUl9rU2V0RnR5cEJveCAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MEEpLCAgICAvKio8IFNldCAnZnR5cCcgYXRvbSAqLwotICAgIE00V1JJVEVSX2tNZXRhRGF0YSAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBCKSwgICAgLyoqPCBBZGRpdGlvbm5hbCBpbmZvcm1hdGlvbiB0byBzZXQgaW4gdGhlIGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rRFNJICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICwgXAotICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MEMpLCAgICAvKio8IFRvIHNldCBEU0kgb2YgdGhlIGZpbGUgKERlY29kZXIgc3BlY2lmYyBpbmZvKSAqLwotICAgIE00V1JJVEVSX2tKcGVnUmVzZXJ2ZUZQRGF0YSAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwRCksICAgIC8qKjwgUmVzZXJ2ZSBzb21lIHNwYWNlIGluIHRoZSBmaWxlIGZvciBKUEVHIGZhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIGRhdGEgKi8KLSAgICBNNFdSSVRFUl9rSnBlZ1NldEZQRGF0YSAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLCBcCi0gICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwRSksICAgIC8qKjwgV3JpdGUgRmFzdCBQcm9jZXNzaW5nIERhdGEgaW4gdGhlIGZpbGUqLwotICAgIC8qICsgQ1JMVjY3NzUgLUguMjY0IHRyaW1taW5nICovCi0gICAgTTRXUklURVJfa01VTF9QUFNfU1BTICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICwgTTRXUklURVJfQ09NTU9OLCAweDBGKQotICAgIC8qIC0gQ1JMVjY3NzUgLUguMjY0IHRyaW1taW5nICovCi19IE00V1JJVEVSX09wdGlvbklEOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00V1JJVEVSX0hlYWRlcgotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGJ1ZmZlciB3aGVyZSBhbiBoZWFkZXIgaXMgcHV0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgcEJ1ZjsgICAgICAgIC8qKjwgQnVmZmVyIGZvciB0aGUgaGVhZGVyICovCi0gICAgTTRPU0FfVUludDMyICAgIFNpemU7ICAgICAgICAvKio8IFNpemUgb2YgdGhlIGRhdGEgKi8KLX0gTTRXUklURVJfSGVhZGVyOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzcGVjaWZpYyB2aWRlbyBzdHJlYW0gaW5mb3MsIGV4dGVuc2lvbiB0bwotICogICAgICAgICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MzIgICAgaGVpZ2h0OyAgICAgICAgICAgICAgICAvKio8IEZyYW1lIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICB3aWR0aDsgICAgICAgICAgICAgICAgLyoqPCBGcmFtZSBXaWR0aCAqLwotICAgIE00T1NBX0RvdWJsZSAgICBmcHM7ICAgICAgICAgICAgICAgIC8qKjwgVGFyZ2V0dGVkIGZyYW1lcmF0ZSBvZiB0aGUgdmlkZW8gKi8KLSAgICBNNFdSSVRFUl9IZWFkZXIgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAvKio8IFNlcXVlbmNlIGhlYWRlciBvZiB0aGUgdmlkZW8gc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlciBzZXQgdG8gTlVMTCBpZiBubyBoZWFkZXIgcHJlc2VudCAqLwotfSBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzcGVjaWZpYyBhdWRpbyBzdHJlYW0gaW5mb3MsIGV4dGVuc2lvbiB0bwotICAgICAgICAgICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MzIgICAgbmJTYW1wbGVzUGVyU2VjOyAgICAvKio8IE51bWJlciBvZiBTYW1wbGVzIHBlciBzZWNvbmQgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgbmJCaXRzUGVyU2FtcGxlOyAgICAvKio8IE51bWJlciBvZiBCaXRzIGluIDEgc2FtcGxlICovCi0gICAgTTRPU0FfVUludDE2ICAgIG5iQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBNNFdSSVRFUl9IZWFkZXIgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAvKio8IERlY29kZXIgU3BlY2lmaWMgSW5mbyBvZiB0aGUgYXVkaW9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIgc2V0IHRvIE5VTEwgaWYgbm8gRFNJIHByZXNlbnQgKi8KLX0gTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00V1JJVEVSX09yaWVudGF0aW9uCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIHBvc3NpYmxlIG9yaWVudGF0aW9uIG9mIGEgZnJhbWUgYXMgZGVzY3JpYmVkCi0gKiAgICAgICAgICAgIGluIHRoZSBFWElGIHN0YW5kYXJkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00V1JJVEVSX09yaWVudGF0aW9uVW5rbm93biA9IDAsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25Ub3BMZWZ0LAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uVG9wUmlnaHQsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25Cb3R0b21SaWdodCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvbkJvdHRvbUxlZnQsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25MZWZ0VG9wLAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uUmlnaHRUb3AsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25SaWdodEJvdHRvbSwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvbkxlZnRCb3R0b20KLX1NNFdSSVRFUl9PcmllbnRhdGlvbiA7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00V1JJVEVSX01ldGFEYXRhCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbGwgdGhlIG1ldGEgZGF0YSB0byBzdG9yZSBpbiB0aGUgZW5jb2RlZCBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIFBob25lTWFudWZhY3R1cmVyIDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBQaG9uZU1vZGVsIDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBBcnRpc3QgOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIENvcHlyaWdodCA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgU29mdHdhcmUgOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIENyZWF0aW9uRGF0ZTsKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvbiAgICBPcmllbnRhdGlvbiA7Ci0KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBXaWR0aCA7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgSGVpZ2h0IDsKLQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIFRodW1ibmFpbFdpZHRoIDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBUaHVtYm5haWxIZWlnaHQgOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgVGh1bWJuYWlsUHJlc2VuY2UgOwotfU00V1JJVEVSX01ldGFEYXRhOwotCi0KLXR5cGVkZWYgdm9pZCogTTRXUklURVJfQ29udGV4dDsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX29wZW5Xcml0ZSkgICAgICAgIChNNFdSSVRFUl9Db250ZXh0KiBoQ29udGV4dCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvdXRwdXRGaWxlRGVzY3JpcHRvcixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZXJQb2ludGVyLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHRlbXBGaWxlRGVzY3JpcHRvciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRlclBvaW50ZXIpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX2FkZFN0cmVhbSkgICAgICAgIChNNFdSSVRFUl9Db250ZXh0ICBwQ29udGV4dCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKnN0cmVhbURlc2NyaXB0aW9uKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9zdGFydFdyaXRpbmcpICAgIChNNFdSSVRFUl9Db250ZXh0ICBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfY2xvc2VXcml0ZSkgICAgICAgIChNNFdSSVRFUl9Db250ZXh0ICBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfc2V0T3B0aW9uKSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQgIHBDb250ZXh0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9nZXRPcHRpb24pICAgICAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZQotICogQGJyaWVmICAgIERlZmluZXMgYWxsIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIGEgd3JpdGVyIHNoZWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UKLXsKLSAgICBNNFdSSVRFUl9vcGVuV3JpdGUqICAgICAgICAgICAgIHBGY3RPcGVuOwotICAgIE00V1JJVEVSX2FkZFN0cmVhbSogICAgICAgICAgICAgICAgcEZjdEFkZFN0cmVhbTsKLSAgICBNNFdSSVRFUl9zdGFydFdyaXRpbmcqICAgICAgICAgIHBGY3RTdGFydFdyaXRpbmc7Ci0gICAgTTRXUklURVJfY2xvc2VXcml0ZSogICAgICAgICAgICBwRmN0Q2xvc2VXcml0ZTsKLSAgICBNNFdSSVRFUl9zZXRPcHRpb24qICAgICAgICAgICAgICAgIHBGY3RTZXRPcHRpb247Ci0gICAgTTRXUklURVJfZ2V0T3B0aW9uKiAgICAgICAgICAgICAgICBwRmN0R2V0T3B0aW9uOwotfSBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2U7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSICBNNFdSSVRFUl9zdGFydEFVKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotdHlwZWRlZiBNNE9TQV9FUlIgIE00V1JJVEVSX3Byb2Nlc3NBVShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfRGF0YUludGVyZmFjZQotICogQGJyaWVmICAgIERlZmluZXMgYWxsIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgdG8gd3JpdGUgZGF0YSB3aXRoIGEgd3JpdGVyIHNoZWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNFdSSVRFUl9EYXRhSW50ZXJmYWNlCi17Ci0gICAgTTRXUklURVJfc3RhcnRBVSogICAgcFN0YXJ0QVU7Ci0gICAgTTRXUklURVJfcHJvY2Vzc0FVKiBwUHJvY2Vzc0FVOwotCi0gICAgTTRXUklURVJfQ29udGV4dCAgICBwV3JpdGVyQ29udGV4dDsKLQotfSBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000V1JJVEVSX0NPTU1PTl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9CaXRTdHJlYW1QYXJzZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X0JpdFN0cmVhbVBhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODc1NDU4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X0JpdFN0cmVhbVBhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00X0JpdFN0cmVhbVBhcnNlci5oCi0gKiBAYnJpZWYgIE1QRUctNCBGaWxlIEZvcm1hdCBiaXQgc3RyZWFtIHV0aWxpdHkKLSAqIEBub3RlICAgVGhpcyBmaWxlIGNvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgdG8gcGFyc2UgTVBFRyBzcGVjaWZpYwotICogICAgICAgICBkYXRhIHN0cnVjdHVyZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000X0JJVFNUUkVBTVBBUlNFUl9IX18KLSNkZWZpbmUgX19NNF9CSVRTVFJFQU1QQVJTRVJfSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKioKLSogTTRfQml0U3RyZWFtUGFyc2VyX0luaXQuCi0qCi0qIEFsbG9jYXRlcyB0aGUgY29udGV4dCBhbmQgaW5pdGlhbGl6ZXMgaW50ZXJuYWwgZGF0YQotKgotKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UgLSBBTExPQ0FURUQgQlkgVEhFCi0qICAgICAgICAgICAgICAgICAgICBGVU5DVElPTiAoTTRPU0FfTlVMTCBpZiBhbGxvY2F0aW9uIGZhaWxzKQotKiBAcGFyYW0gYml0U3RyZWFtICA6IEEgcG9pbnRlciB0byB0aGUgYml0c3RyZWFtIC0gbXVzdCBiZSAzMiBiaXRzIGFzIGFjY2VzcyBhcmUgMzIgYml0cwotKiBAcGFyYW0gc2l6ZSAgICAgICAgOiBUaGUgc2l6ZSBvZiB0aGUgYml0c3RyZWFtIGluIGJ5dGVzCi0qCi0qLwotdm9pZCBNNF9CaXRTdHJlYW1QYXJzZXJfSW5pdCh2b2lkKiogcENvbnRleHQsIHZvaWQqIHBCaXRTdHJlYW0sIE00T1NBX0ludDMyIHNpemUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBDbGVhbiB1cCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgIE00X0JpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXZvaWQgTTRfQml0U3RyZWFtUGFyc2VyX0NsZWFuVXAodm9pZCogcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBSZWFkIHRoZSBuZXh0IDxsZW5ndGg+IGJpdHMgaW4gdGhlIGJpdHN0cmVhbS4KLSAqIEBub3RlICAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCB1cGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpIE00X0JpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHBhcmFtICAgIGxlbmd0aCAgICAgICAgKElOKSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gZXh0cmFjdCBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqIEByZXR1cm4gICAgdGhlIHJlYWQgYml0cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1VJbnQzMiBNNF9CaXRTdHJlYW1QYXJzZXJfU2hvd0JpdHModm9pZCogcENvbnRleHQsIE00T1NBX0ludDMyIGxlbmd0aCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEluY3JlbWVudCB0aGUgYml0c3RyZWFtIHBvaW50ZXIgb2YgPGxlbmd0aD4gYml0cy4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4vT1VUKSBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBsZW5ndGggICAgICAgIChJTikgVGhlIG51bWJlciBvZiBiaXQgdG8gc2hpZnQgdGhlIGJpdHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXZvaWQgTTRfQml0U3RyZWFtUGFyc2VyX0ZsdXNoQml0cyh2b2lkKiBwQ29udGV4dCwgTTRPU0FfSW50MzIgbGVuZ3RoKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIHBvaW50ZWQgYnkgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICogSXQgZG9lcyBub3QgdXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIEBwYXJhbSBwQ29udGV4dCAgIDogQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGludGVybmFsbHkgdXNlZCBieSB0aGUgcGFja2FnZQotICogQHBhcmFtIGxlbmd0aCAgICAgICAgOiBUaGUgbnVtYmVyIG9mIGJpdCB0byBleHRyYWN0IGZyb20gdGhlIGJpdHN0cmVhbQotICoKLSAqIEByZXR1cm5zIHRoZSByZWFkIGJpdHMKLSovCi1NNE9TQV9VSW50MzIgTTRfQml0U3RyZWFtUGFyc2VyX0dldEJpdHModm9pZCogcENvbnRleHQsTTRPU0FfSW50MzIgYml0UG9zLCBNNE9TQV9JbnQzMiBsZW5ndGgpOwotCi0vKioKLSogTTRfQml0U3RyZWFtUGFyc2VyX1Jlc3RhcnQgcmVzZXRzIHRoZSBiaXRzdHJlYW0gaW5kZXhlcy4KLSoKLSogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlCi0qCi0qLwotdm9pZCBNNF9CaXRTdHJlYW1QYXJzZXJfUmVzdGFydCh2b2lkKiBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBwb2ludGVkIGJ5IHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGJpdHN0cmVhbQotICogQG5vdGUgICAgSXQgc2hvdWxkIGJlIHVzZWQgY2FyZWZ1bGx5IGFzIHRoZSBwb2ludGVyIGlzIGluIHRoZSBiaXRzdHJlYW0gaXRzZWxmCi0gKiAgICAgICAgICAgIGFuZCBubyBjb3B5IGlzIG1hZGUuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgIE00X0JpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotKi8KLU00T1NBX1VJbnQ4KiAgTTRfQml0U3RyZWFtUGFyc2VyX0dldEN1cnJlbnRiaXRTdHJlYW1Qb2ludGVyKHZvaWQqIHBDb250ZXh0KTsKLQotLyoqCi0qIE00X0JpdFN0cmVhbVBhcnNlcl9HZXRTaXplIGdldHMgdGhlIHNpemUgb2YgdGhlIGJpdHN0cmVhbSBpbiBieXRlcwotKgotKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSoKLSogQHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJpdHN0cmVhbSBpbiBieXRlcwotKi8KLU00T1NBX0ludDMyIE00X0JpdFN0cmVhbVBhcnNlcl9HZXRTaXplKHZvaWQqIHBDb250ZXh0KTsKLQotdm9pZCBNNF9NUEVHNEJpdFN0cmVhbVBhcnNlcl9Jbml0KHZvaWQqKiBwQ29udGV4dCwgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSk7Ci0KLS8qKgotKiBnZXRNcGVnTGVuZ3RoRnJvbUludGVnZXIgcmV0dXJucyBhIGRlY29kZWQgc2l6ZSB2YWx1ZSBmcm9tIGFuIGVuY29kZWQgb25lIChTREwpCi0qCi0qIEBwYXJhbSBwQ29udGV4dCAgIDogQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGludGVybmFsbHkgdXNlZCBieSB0aGUgcGFja2FnZQotKiBAcGFyYW0gdmFsIDogZW5jb2RlZCB2YWx1ZQotKgotKiBAcmV0dXJucyBzaXplIGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybQotKi8KLQotTTRPU0FfSW50MzIgTTRfTVBFRzRCaXRTdHJlYW1QYXJzZXJfR2V0TXBlZ0xlbmd0aEZyb21JbnRlZ2VyKHZvaWQqIHBDb250ZXh0LCBNNE9TQV9VSW50MzIgdmFsKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBEZWNvZGUgYW4gTVBFRzQgU3lzdGVtcyBkZXNjcmlwdG9yIHNpemUgZnJvbSBhbiBlbmNvZGVkIFNETCBzaXplIGRhdGEuCi0gKiBAbm90ZSAgICBUaGUgdmFsdWUgaXMgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBsb2NhdGlvbi4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4vT1VUKSAgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIFNpemUgaW4gYSBodW1hbiByZWFkYWJsZSBmb3JtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfSW50MzIgTTRfTVBFRzRCaXRTdHJlYW1QYXJzZXJfR2V0TXBlZ0xlbmd0aEZyb21TdHJlYW0odm9pZCogcENvbnRleHQpOwotCi0jZW5kaWYgLypfX000X0JJVFNUUkVBTVBBUlNFUl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9Db21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X0NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjBhN2RhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00X0NvbW1vbi5oCi0gKiBAYnJpZWYgIENvbW1vbiBkYXRhIHN0cnVjdHVyZSBiZXR3ZWVuIHNoZWxscwotICogQG5vdGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRfQ09NTU9OX0hfXwotI2RlZmluZSBfX000X0NPTU1PTl9IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIF9wYXJhbWV0ZXJTZXQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBhdmMKLSAqICAgICAgICAgICAgICAgZGVjb2RlciBzcGVjaWZpYyBpbmZvCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9wYXJhbWV0ZXJTZXQKLXsKLSAgICBNNE9TQV9VSW50MTYgbV9sZW5ndGg7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpdGVtcyovCi0gICAgTTRPU0FfVUludDgqIG1fcFBhcmFtZXRlclNldFVuaXQ7ICAgLyogQXJyYXkgb2YgaXRlbXMqLwotfSBQYXJhbWV0ZXJTZXQgOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBfYXZjU3BlY2lmaWNJbmZvCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiBzcGVjaWZpYyBpbmZvIGZvciB0aGUgYXZjIGRlY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbwotewotICAgIE00T1NBX1VJbnQ4ICAgICAgICBtX25hbFVuaXRMZW5ndGg7ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgTkFMVW5pdExlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gYSBBVkMgc2FtcGxlICovCi0gICAgTTRPU0FfVUludDggICAgICAgIG1fbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHM7ICAgLyogTnVtYmVyIG9mIHNlcXVlbmNlIHBhcmFtZXRlciBzZXRzKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgbV9udW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzOyAgICAvKiBOdW1iZXIgb2YgcGljdHVyZSBwYXJhbWV0ZXIgc2V0cyovCi0gICAgUGFyYW1ldGVyU2V0ICAgICptX3BTZXF1ZW5jZVBhcmFtZXRlclNldDsgICAgICAgIC8qIFNlcXVlbmNlIHBhcmFtZXRlciBzZXRzIGFycmF5Ki8KLSAgICBQYXJhbWV0ZXJTZXQgICAgKm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQ7ICAgICAgICAvKiBQaWN0dXJlIHBhcmFtZXRlciBzZXRzIGFycmF5Ki8KLX0gQXZjU3BlY2lmaWNJbmZvIDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfU3ludGhlc2lzQXVkaW9JbmZvCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHNwZWNpZmljIHBvaW50ZXJzIHVzZWQgZm9yIHN5bnRoZXNpcyBhdWRpbyBmb3JtYXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfc3ludGhlc2lzQXVkaW9JbmZvCi17Ci0gICAgTTRPU0FfVm9pZCogICAgICAgIG1fcElucHV0QnVmOwotICAgIE00T1NBX1ZvaWQqICAgICAgICBtX3BJbnB1dEluZm87Ci0gICAgTTRPU0FfVUludDE2ICAgIG1fdWlOYlN1YkZyYW1lUGVyU3RlcDsKLSAgICBNNE9TQV9VSW50MzIgICAgbV91aVVzZWRCeXRlczsKLX0gTTRfU3ludGhlc2lzQXVkaW9JbmZvOwotCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNF9BQUNEb3duc2FtcGxpbmdNb2RlCi0gKiBAYnJpZWYgICBUaGlzIGVudW0gc3RhdGVzIG1vZGVzIGZvciBEb3duIHNhbXBsaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgQUFDX2tEU19PRkYgICAgPSAwLCAgICAgICAgLyoqPCBObyBEb3duIHNhbXBsaW5nICovCi0gICAgQUFDX2tEU19CWV8yICAgPSAxLCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGUgPSBBQUMgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgc2FtcGxpbmcgcmF0ZSA9IGFhY19zYW1wX2ZyZXEvMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSA9IEhFX0FBQyBhbmQgaW5wdXQgaXMgQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgc2FtcGxpbmcgcmF0ZSA9IGFhY19zYW1wX2ZyZXEuKE5vIGRvd25zYW1waW5nKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGUgPSBIRV9BQUMgYW5kIGlucHV0IGlzIEhFX0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IHNhbXBsaW5nIHJhdGUgPSBhYWNfc2FtcF9mcmVxIChEb3duc2FtcGxpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJzIGluIFNCUiB0b29sKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcHJvZmlsZSA9IEhFX0FBQ192MiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCBTdXBwb3J0ZWQgKi8KLSAgICBBQUNfa0RTX0JZXzMgICA9IDIsICAgICAgICAvKio8IERvd24gc2FtcGxpbmcgYnkgMyAgLSBvbmx5IGZvciBBQUMgcHJvZmlsZSAqLwotICAgIEFBQ19rRFNfQllfNCAgID0gMywgICAgICAgIC8qKjwgRG93biBzYW1wbGluZyBieSA0ICAtIG9ubHkgZm9yIEFBQyBwcm9maWxlICovCi0gICAgQUFDX2tEU19CWV84ICAgPSA0ICAgICAgICAvKio8IERvd24gc2FtcGxpbmcgYnkgOCAgLSBvbmx5IGZvciBBQUMgcHJvZmlsZSAqLwotCi19IE00X0FBQ0Rvd25zYW1wbGluZ01vZGU7Ci0KLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00X0FBQ091dHB1dE1vZGUKLSAqIEBicmllZiAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBvdXRwdXQgbW9kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIEFBQ19rTW9ubyAgICAgID0gMCwgICAgLyoqPCBPdXRwdXQgaXMgTW9ubyAgKi8KLSAgICBBQUNfa1N0ZXJlbyAgICA9IDEgICAgIC8qKjwgT3V0cHV0IGlzIFN0ZXJlbyAqLwotfSBNNF9BQUNPdXRwdXRNb2RlOwotCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNF9BQUNEZWNQcm9maWxlCi0gKiBAYnJpZWYgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgQUFDIGRlY29kZXIgcHJvZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIEFBQ19rQUFDICAgICAgID0gMCwgICAgICAgIC8qKjwgQUFDIHByb2ZpbGUgKG9ubHkgQUFDIExDIG9iamVjdCBhcmUgc3VwcG9ydGVkKSAqLwotICAgIEFBQ19rSEVfQUFDICAgID0gMSwgICAgICAgIC8qKjwgSEUgQUFDIG9yIEFBQysgcHJvZmlsZSAoU0JSIGluIExQIE1vZGUpICAqLwotICAgIEFBQ19rSEVfQUFDX3YyID0gMiAgICAgICAgLyoqPCBIRSBBQUMgdjIgb3IgRW5oYW5jZWQgQUFDKyBwcm9maWxlIChTQlIgVG9vbCBpbiBIUSBNb2RlKSAqLwotfSBNNF9BQUNEZWNQcm9maWxlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X0FhY0RlY29kZXJDb25maWcKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBzcGVjaWZpYyBzZXR0aW5ncyBhY2NvcmRpbmcgdG8KLSAqICAgICAgICAgICAgICAgIHRoZSB1c2VyIHJlcXVpcmVtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRfQUFDRGVjUHJvZmlsZSAgICAgICAgbV9BQUNEZWNvZGVyUHJvZmlsZTsKLSAgICBNNF9BQUNEb3duc2FtcGxpbmdNb2RlICAgIG1fRG93blNhbXBsaW5nTW9kZTsKLSAgICBNNF9BQUNPdXRwdXRNb2RlICAgICAgICBtX091dHB1dE1vZGU7Ci0KLX0gTTRfQWFjRGVjb2RlckNvbmZpZzsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgdXNlcidzIGRhdGEgbmVlZGVkIHRvIGRlY29kZSB0aGUKLSAqICAgICAgICAgICAgQUFDcGx1cyBzdHJlYW0KLSAqIEBub3RlICAgIFRoZSBmaWVsZCBtX3BGaXJzdEFVIGlzIHVzZWQgaW4gY2FzZSBvZiBsb2NhbCBmaWxlcyAgICBhbmQKLSAqICAgICAgICAgICAgdGhlIGZpZWxkIG1fYklzU2JyRW5hYmxlZCBpcyB1c2VkIGluIHN0cmVhbWluZyBjYXNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE00T1NBX1ZvaWQqICAgICAgICAgICAgbV9wRmlyc3RBVTsgICAgICAgICAgICAgICAgLyoqPCBUaGUgZmlyc3QgQVUgZnJvbSB3aGVyZSBTQlIgZGF0YSBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZCAobG9jYWwgZmlsZSBjYXNlKSovCi0gIE00T1NBX0Jvb2wgICAgICAgICAgICBtX2JJc1NickVuYWJsZWQ7ICAgICAgICAvKio8IEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiB0aGUgc3RyZWFtIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDcGx1cyAoc3RyZWFtaW5nIGNhc2UpKi8KLSAgTTRfQWFjRGVjb2RlckNvbmZpZyogICAgbV9wQWFjRGVjb2RlclVzZXJDb25maWc7LyoqPCBEZWNvZGVyIHNwZWNpZmljIHVzZXIgc2V0dGluZyAqLwotCi19IE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGE7Ci0KLSNlbmRpZiAvKiBfX000X0NPTU1PTl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9VdGlscy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTFlMDgyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9VdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00X1V0aWxzLmgKLSAqIEBicmllZiAgICBVdGlsaXRpZXMKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHV0aWxpdHkgbWFjcm9zCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000X1VUSUxTX0hfXwotI2RlZmluZSBfX000X1VUSUxTX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qICAgIE00X01lZGlhVGltZSBkZWZpbml0aW9uCi0gICAgVGhpcyB0eXBlIGlzIHVzZWQgaW50ZXJuYWxseSBieSBzb21lIHNoZWxsIGNvbXBvbmVudHMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotdHlwZWRlZiBNNE9TQV9Eb3VibGUgICAgTTRfTWVkaWFUaW1lOwotCi0vKiAgICBHRVRfTUVNT1JZMzIgbWFjcm8gZGVmaW5pdGlvbgotICAgIFRoaXMgbWFjcm8gaXMgdXNlZCBieSB0aGUgM0dQIHJlYWRlciovCi0jaWZkZWYgX19CSUdfRU5ESUFOCi0jZGVmaW5lIEdFVF9NRU1PUlkzMih4KSAoeCkKLSNlbHNlCi0jZGVmaW5lIEdFVF9NRU1PUlkzMih4KSAoICgoKHgpJjB4ZmYpPDwyNCkgfCAoKCh4KSYweGZmMDApPDw4KSB8XAotICAgICAoKCh4KSYweGZmMDAwMCk+PjgpIHwgKCgoeCkmMHhmZjAwMDAwMCk+PjI0KSApCi0jZW5kaWYgLypfX0JJR19FTkRJQU4qLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNF9VVElMU19IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1ZpZGVvRWRpdGluZ0NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTdkMDNmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1ZpZGVvRWRpdGluZ0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNF9WaWRlb0VkaXRpbmdDb21tb24uaAotICogQGJyaWVmICAgIFZpZGVvIEVkaXRpbmcgKFZTUzNHUFAsIE1DUywgUFRPM0dQUCkgY29tbW9uIGRlZmluaXRpb25zCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfX000X1ZJREVPRURJVElOR0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNF9WSURFT0VESVRJTkdDT01NT05fSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiAgICBWZXJzaW9uICovCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IgICAgMwotI2RlZmluZSBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SICAgIDEKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTiAgICAwCi0KLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFIDB4N2ZmZmZmZmYKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTCAweDdmZmZmZmZmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgZmlsZSBmb3JtYXQgdHlwZSB0byBiZSB1c2VkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCAgICAgICAgPSAwLCAgICAgIC8qKjwgM0dQUCBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAmIG91dHB1dCAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDQgICAgICAgICA9IDEsICAgICAgLyoqPCBNUDQgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0ICAgICAgICAgICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUiAgICAgICAgID0gMiwgICAgICAvKio8IEFNUiAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgJiBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzICAgICAgICAgPSAzLCAgICAgIC8qKjwgTVAzICBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAgICAgICAgICAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ00gICAgICAgICA9IDQsICAgICAgLyoqPCBQQ00gUkFXIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0ICAgIFJDICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRyAgICAgICAgID0gNSwgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogSlBHIGZpbGUgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGlucHV0IEFORCBPVVRQVVQgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQk1QICAgICAgICAgPSA2LCAgICAgIC8qKjwgU1RJTEwgUElDVFVSRSBGRUFUVVJFOiBCTVAgZmlsZSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9HSUYgICAgICAgICA9IDcsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IEdJRiBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBvbmx5ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BORyAgICAgICAgID0gOCwgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogUE5HIGZpbGUgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGlucHV0IG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggICAgPSA5LCAgICAgIC8qKjwgU1RJTEwgUElDVFVSRSBGRUFUVVJFOiBBUkdCODg4OCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhIHR5cGUgOiBpbnB1dCBvbmx5ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000ViAgICAgICAgID0gMTAsICAgICAvKio8IE00ViAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgb25seSAgICAgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQgPSAyNTUgICAgIC8qKjwgVW5zdXBwb3J0ZWQgZmlsZSBtZWRpYSB0eXBlICAgICAgICAgICAqLwotfSBNNFZJREVPRURJVElOR19GaWxlVHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSB2aWRlbyBjb21wcmVzc2lvbiBmb3JtYXRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2tOb25lVmlkZW8gPSAwLCAvKio8IFZpZGVvIG5vdCBwcmVzZW50ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0gyNjMgPSAxLCAvKio8IEgyNjMgdmlkZW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rSDI2NCA9IDIsICAgIC8qKjwgSDI2NCB2aWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX2tNUEVHNCA9IDMsIC8qKjwgTVBFRy00IHZpZGVvICovCi0gICAgTTRWSURFT0VESVRJTkdfa051bGxWaWRlbyA9IDI1NCwgIC8qKjwgRG8gbm90IGNhcmUgdmlkZW8gdHlwZSwgdXNlIE5VTEwgZW5jb2RlciAqLwotICAgIE00VklERU9FRElUSU5HX2tVbnN1cHBvcnRlZFZpZGVvID0gMjU1ICAgIC8qKjwgVW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtIHR5cGUgKi8KLX0gTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIGF1ZGlvIGZvcm1hdC4KLSAqIEBub3RlICAgIEhFX0FBQywgSEVfQUFDX3YyIGFuZCBNUDMgY2FuIG5vdCBiZSB1c2VkIGZvciB0aGUgb3V0cHV0IGF1ZGlvIGZvcm1hdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAgICAgICAgICAgID0gMCwgICAgLyoqPCBBdWRpbyBub3QgcHJlc2VudCAqLwotICAgIE00VklERU9FRElUSU5HX2tBTVJfTkIgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBTVIgTmFycm93IEJhbmQgYXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rQUFDICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQUFDIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXMgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEFBQysgYXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rZUFBQ3BsdXMgICAgICAgICAgICAgPSA0LCAgICAvKio8IEVuaGFuY2VkIEFBQysgYXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rTVAzICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgTVAzIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa0VWUkMgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IEVWUkMgYXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rUENNICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgUENNIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa051bGxBdWRpbyAgICAgICAgICAgPSAyNTQsICAvKio8IERvIG5vdCBjYXJlIGF1ZGlvIHR5cGUsIHVzZSBOVUxMIGVuY29kZXIgKi8KLSAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbyAgICA9IDI1NSAgICAvKio8IFVuc3VwcG9ydGVkIGF1ZGlvIHN0cmVhbSB0eXBlICovCi19IE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWlsYWJsZSBvdXRwdXQgZnJhbWUgc2l6ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWSURFT0VESVRJTkdfa1NRQ0lGPTAsIC8qKjwgU1FDSUYgMTI4eDk2ICAqLwotICAgIE00VklERU9FRElUSU5HX2tRUVZHQSwgICAvKio8IFFRVkdBIDE2MHgxMjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rUUNJRiwgICAgLyoqPCBRQ0lGICAxNzZ4MTQ0ICovCi0gICAgTTRWSURFT0VESVRJTkdfa1FWR0EsICAgIC8qKjwgUVZHQSAgMzIweDI0MCAqLwotICAgIE00VklERU9FRElUSU5HX2tDSUYsICAgICAvKio8IENJRiAgIDM1MngyODggKi8KLSAgICBNNFZJREVPRURJVElOR19rVkdBLCAgICAgLyoqPCBWR0EgICA2NDB4NDgwICovCi0vKiArUFIgTFY1ODA3ICovCi0gICAgTTRWSURFT0VESVRJTkdfa1dWR0EsICAgIC8qKjwgV1ZHQSA4MDB4NDgwICovCi0gICAgTTRWSURFT0VESVRJTkdfa05UU0MsICAgIC8qKjwgTlRTQyA3MjB4NDgwICovCi0vKiAtUFIgTFY1ODA3ICovCi0KLS8qICtDUiBHb29nbGUgKi8KLSAgICBNNFZJREVPRURJVElOR19rNjQwXzM2MCwgIC8qKjwgNjQweDM2MCAqLwotICAgIE00VklERU9FRElUSU5HX2s4NTRfNDgwLCAgLyoqPCA4NTR4NDgwICovCi0gICAgTTRWSURFT0VESVRJTkdfazEyODBfNzIwLCAvKio8IDcyMHAgMTI4MHg3MjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTA4MF83MjAsIC8qKjwgNzIwcCAxMDgweDcyMCAqLwotICAgIE00VklERU9FRElUSU5HX2s5NjBfNzIwLCAgLyoqPCA3MjBwIDk2MHg3MjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwIC8qKjwxMDgwcCAxOTIweDEwODAqLwotLyogLUNSIEdvb2dsZSAqLwotCi19IE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9mcmFtZXJhdGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhaWxhYmxlIHZpZGVvIGZyYW1lcmF0ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWSURFT0VESVRJTkdfazVfRlBTID0gMCwKLSAgICBNNFZJREVPRURJVElOR19rN181X0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMTBfRlBTLAotICAgIE00VklERU9FRElUSU5HX2sxMl81X0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMTVfRlBTLAotICAgIE00VklERU9FRElUSU5HX2syMF9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazI1X0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMzBfRlBTCi19IE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgb3V0cHV0IGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jaWVzCi0gKiBAbm90ZSAgICA4IGtIeiBpcyB0aGUgb25seSBzdXBwb3J0ZWQgZnJlcXVlbmN5IGZvciBBTVItTkIgb3V0cHV0Ci0gKiBAbm90ZSAgICAxNiBrSHogaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGZyZXF1ZW5jeSBmb3IgQUFDIG91dHB1dAotICogQG5vdGUgICAgVGhlIHJlY29tbWVuZGVkIHByYWN0aWNlIGlzIHRvIHVzZSB0aGUgRGVmYXVsdCB2YWx1ZSB3aGVuIHNldHRpbmcgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00VklERU9FRElUSU5HX2tEZWZhdWx0X0FTRiAgICA9IDAsICAgIC8qKjwgRGVmYXVsdCBBdWRpbyBTYW1wbGluZyBGcmVxdWVuY3kgZm9yIHNlbGVjdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW8gb3V0cHV0IGZvcm1hdCAqLwotICAgIE00VklERU9FRElUSU5HX2s4MDAwX0FTRiAgICA9IDgwMDAsICAgIC8qKjwgTm90ZTogRGVmYXVsdCBhdWRpbyBTYW1wbGluZyBGcmVxdWVuY3kgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SLU5CIG91dHB1dCAqLwotICAgIE00VklERU9FRElUSU5HX2sxMTAyNV9BU0YgICAgPSAxMTAyNSwKLSAgICBNNFZJREVPRURJVElOR19rMTIwMDBfQVNGICAgID0gMTIwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazE2MDAwX0FTRiAgICA9IDE2MDAwLCAgICAvKio8IE5vdGU6IERlZmF1bHQgYXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBBQUMgb3V0cHV0ICovCi0gICAgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRiAgICA9IDIyMDUwLAotICAgIE00VklERU9FRElUSU5HX2syNDAwMF9BU0YgICAgPSAyNDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGICAgID0gMzIwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazQ0MTAwX0FTRiAgICA9IDQ0MTAwLAotICAgIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0YgICAgPSA0ODAwMAotCi19IE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19CaXRyYXRlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWlsYWJsZSBhdWRpbyBvciB2aWRlbyBiaXRyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZJREVPRURJVElOR19rVkFSSUFCTEVfS0JQUyA9IC0xLCAgICAgLyogbm8gcmVndWxhdGlvbiAqLwotICAgIE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlID0gMCwgICAvKiB1bmRlZmluZWQgKi8KLSAgICBNNFZJREVPRURJVElOR19rOF9LQlBTID0gODAwMCwKLSAgICBNNFZJREVPRURJVElOR19rOV8yX0tCUFMgPSA5MjAwLCAgICAgICAgLyogZXZyYyBvbmx5ICovCi0gICAgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUyA9IDEyMjAwLCAgICAgIC8qIGFtciBvbmx5ICovCi0gICAgTTRWSURFT0VESVRJTkdfazE2X0tCUFMgPSAxNjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMjRfS0JQUyA9IDI0MDAwLAotICAgIE00VklERU9FRElUSU5HX2szMl9LQlBTID0gMzIwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazQwX0tCUFMgPSA0MDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUyA9IDQ4MDAwLAotICAgIE00VklERU9FRElUSU5HX2s1Nl9LQlBTID0gNTYwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFMgPSA2NDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rODBfS0JQUyA9IDgwMDAwLAotICAgIE00VklERU9FRElUSU5HX2s5Nl9LQlBTID0gOTYwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazExMl9LQlBTID0gMTEyMDAwLAotICAgIE00VklERU9FRElUSU5HX2sxMjhfS0JQUyA9IDEyODAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTYwX0tCUFMgPSAxNjAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTID0gMTkyMDAwLAotICAgIE00VklERU9FRElUSU5HX2syMjRfS0JQUyA9IDIyNDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMjU2X0tCUFMgPSAyNTYwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazI4OF9LQlBTID0gMjg4MDAwLAotICAgIE00VklERU9FRElUSU5HX2szMjBfS0JQUyA9IDMyMDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMzg0X0tCUFMgPSAzODQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazUxMl9LQlBTID0gNTEyMDAwLAotICAgIE00VklERU9FRElUSU5HX2s4MDBfS0JQUyA9IDgwMDAwMCwKLS8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgIE00VklERU9FRElUSU5HX2syX01CUFMgPSAyMDAwMDAwLAotICAgIE00VklERU9FRElUSU5HX2s1X01CUFMgPSA1MDAwMDAwLAotICAgIE00VklERU9FRElUSU5HX2s4X01CUFMgPSA4MDAwMDAwLAotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi19IE00VklERU9FRElUSU5HX0JpdHJhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWSURFT0VESVRJTkdfRnR5cEJveAotICogQGJyaWVmICAgICAgICBJbmZvcm1hdGlvbiB0byBidWlsZCB0aGUgJ2Z0eXAnIGF0b20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00VklERU9FRElUSU5HX01BWF9DT01QQVRJQkxFX0JSQU5EUyAxMAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBBbGwgYnJhbmQgZmllbGRzIGFyZSBhY3R1YWxseSBjaGFyWzRdIHN0b3JlZCBpbiBiaWctZW5kaWFuIGludGVnZXIgZm9ybWF0ICovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgbWFqb3JfYnJhbmQ7ICAgICAgICAgICAvKiBnZW5lcmFsbHkgJzNncDQnICAgICAgICAgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbWlub3JfdmVyc2lvbjsgICAgICAgICAvKiBnZW5lcmFsbHkgJzAwMDAnIG9yICd4LnggJyAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbmJDb21wYXRpYmxlQnJhbmRzOyAgICAvKiBudW1iZXIgb2YgY29tcGF0aWJsZSBicmFuZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgY29tcGF0aWJsZV9icmFuZHNbTTRWSURFT0VESVRJTkdfTUFYX0NPTVBBVElCTEVfQlJBTkRTXTsgLyogYXJyYXkgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggY29tcGF0aWJsZSBicmFuZHMgKi8KLQotfSBNNFZJREVPRURJVElOR19GdHlwQm94OwotCi0vKiBTb21lIHVzZWZ1bCBicmFuZHMgKi8KLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfMDAwMCAgMHgwMDAwMDAwMAotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF8zRzJBICAweDMzNjczMjYxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzNHUDQgIDB4MzM2NzcwMzQKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0dQNSAgMHgzMzY3NzAzNQotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF8zR1A2ICAweDMzNjc3MDM2Ci0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX0FWQzEgIDB4NjE3NjYzMzEKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfRU1QICAgMHg2NTZENzAyMAotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9JU09NICAweDY5NzM2RjZECi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX01QNDEgIDB4NkQ3MDM0MzEKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfTVA0MiAgMHg2RDcwMzQzMgotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9WRkoxICAweDc2NjY2QTMxCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgdGhlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYW4gaW5wdXQgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIC8qKgotICAgICAqIENvbW1vbiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIGJBbmFseXNlZDsgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHRoZSBmaWxlIGhhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVlbiBhbHJlYWR5IGFuYWx5c2VkIG9yIG5vdCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25bM107ICAgICAgICAgIC8qKjwgVmVyc2lvbiBvZiB0aGUgbGlicmFyaWVzIHVzZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gdGhlIGNsaXAgYW5hbHlzaXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBEdXJhdGlvbjsgICAgICAvKio8IENsaXAgZHVyYXRpb24gKGluIG1zKSAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgIEZpbGVUeXBlOyAgICAgICAgICAgIC8qKjwgLjNncCwgLmFtciwgLm1wMyAqLwotICAgIE00VklERU9FRElUSU5HX0Z0eXBCb3ggICAgICAgICAgICAgIGZ0eXA7ICAgICAgICAgICAgICAgIC8qKjwgM2dwICdmdHlwJyBhdG9tLCBtYWpvcl9icmFuZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgaWYgbm90IHVzZWQgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgICAgICAgICAgVmlkZW9TdHJlYW1UeXBlOyAgICAgLyoqPCBGb3JtYXQgb2YgdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpQ2xpcFZpZGVvRHVyYXRpb247IC8qKjwgVmlkZW8gdHJhY2sgZHVyYXRpb24gKGluIG1zKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpVmlkZW9CaXRyYXRlOyAgICAgIC8qKjwgVmlkZW8gYXZlcmFnZSBiaXRyYXRlIChpbiBicHMpKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvTWF4QXVTaXplOyAgICAvKio8IE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpVmlkZW9XaWR0aDsgICAgICAgIC8qKjwgVmlkZW8gZnJhbWUgd2lkdGggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvSGVpZ2h0OyAgICAgICAvKio8IFZpZGVvIGZyYW1lIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpVmlkZW9UaW1lU2NhbGU7ICAgIC8qKjwgVmlkZW8gdGltZSBzY2FsZSAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgIGZBdmVyYWdlRnJhbWVSYXRlOyAgIC8qKjwgQXZlcmFnZSBmcmFtZSByYXRlIG9mIHRoZSB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICovCi0gICAgTTRPU0FfSW50MzIgdWlWaWRlb0xldmVsOyAgIC8qKjwgdmlkZW8gbGV2ZWwqLwotICAgIE00T1NBX0ludDMyIHVpVmlkZW9Qcm9maWxlOyAvKio8IHZpZGVvIHByb2ZpbGUgKi8KLQotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIGJNUEVHNGRhdGFQYXJ0aXRpb247IC8qKjwgTVBFRy00IHVzZXMgZGF0YSBwYXJ0aXRpb25pbmcgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiTVBFRzRydmxjOyAgICAgICAgICAvKio8IE1QRUctNCB1c2VzIFJWTEMgdG9vbCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIGJNUEVHNHJlc3luY2hNYXJrZXI7IC8qKjwgTVBFRy00IHN0cmVhbSB1c2VzIFJlc3luY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZXIgKi8KLQotICAgIC8qKgotICAgICAqIEF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQgICAgICAgICAgQXVkaW9TdHJlYW1UeXBlOyAgICAgLyoqPCBGb3JtYXQgb2YgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpQ2xpcEF1ZGlvRHVyYXRpb247IC8qKjwgQXVkaW8gdHJhY2sgZHVyYXRpb24gKGluIG1zKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpQXVkaW9CaXRyYXRlOyAgICAgIC8qKjwgQXVkaW8gYXZlcmFnZSBiaXRyYXRlIChpbiBicHMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlBdWRpb01heEF1U2l6ZTsgICAgLyoqPCBNYXhpbXVtIEFjY2VzcyBVbml0IHNpemUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpTmJDaGFubmVsczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPW1vbm8sIDI9c3RlcmVvKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpU2FtcGxpbmdGcmVxdWVuY3k7IC8qKjwgU2FtcGxpbmcgYXVkaW8gZnJlcXVlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg4MDAwIGZvciBhbXIsIDE2MDAwIG9yIG1vcmUgZm9yIGFhYykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUV4dGVuZGVkU2FtcGxpbmdGcmVxdWVuY3k7IC8qKjwgRXh0ZW5kZWQgZnJlcXVlbmN5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQyssIGVBQUMrIHN0cmVhbXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aURlY29kZWRQY21TaXplOyAgICAvKio8IFNpemUgb2YgdGhlIGRlY29kZWQgUENNIGRhdGEgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGVkaXRpbmcgY29tcGF0aWJpbGl0eSBjaGFydCAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiVmlkZW9Jc0VkaXRhYmxlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmlkZW8gc3RyZWFtIGNhbiBiZSBkZWNvZGVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS1lbmNvZGVkICovCi0gICAgTTRPU0FfQm9vbCAgICAgIGJBdWRpb0lzRWRpdGFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBdWRpbyBzdHJlYW0gY2FuIGJlIGRlY29kZWQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS1lbmNvZGVkICovCi0gICAgTTRPU0FfQm9vbCAgICAgIGJWaWRlb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwOyAgICAgICAgLyoqPCBWaWRlbyBwcm9wZXJ0aWVzIG1hdGNoIHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCBwcm9wZXJ0aWVzICovCi0gICAgTTRPU0FfQm9vbCAgICAgIGJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwOyAgICAgICAgLyoqPCBBdWRpbyBwcm9wZXJ0aWVzIG1hdGNoIHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgcHJvcGVydGllcyAqLwotCi0gICAgLyoqCi0gICAgICogU3RpbGwgUGljdHVyZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpU3RpbGxQaWNXaWR0aDsgICAgICAgIC8qKjwgSW1hZ2Ugd2lkdGggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVN0aWxsUGljSGVpZ2h0OyAgICAgICAvKio8IEltYWdlIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpQ2xpcEF1ZGlvVm9sdW1lUGVyY2VudGFnZTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0SW1hZ2VEYXRhOwotCi0gICAgTTRPU0FfSW50MzIgICAgIHZpZGVvUm90YXRpb25EZWdyZWVzOyAgICAgICAgLyoqPCBWaWRlbyByb3RhdGlvbiBkZWdyZWUgKi8KLQotfSBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllczsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSAgICB9Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRfVklERU9FRElUSU5HQ09NTU9OX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Nb25vVG8ySV8xNi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTW9ub1RvMklfMTYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzRiMWM4YS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Nb25vVG8ySV8xNi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX01PTk9UTzJJXzE2X0hfCi0jZGVmaW5lIF9NT05PVE8ySV8xNl9IXwotCi0KLXZvaWQgTW9ub1RvMklfMTYoICBjb25zdCBzaG9ydCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZW5kaWYgIC8qIF9NT05PVE8ySV8xNl9IXyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxYjYyZTEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19NQ1NfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX01DU19ICi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkVBREVSUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKi8KLQotLyogLS0tLS0gIEFNUiByZWFkZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgLmFtciBmaWxlcyAqLwotCi0vKiAtLS0tLSAzR1BQICByZWFkZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgLm1wNCwgLjNncCBmaWxlcyAqLwotCi0KLS8qIC0tLS0tIE1QMyByZWFkZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgLm1wMyBmaWxlcyAqLwotCi0vKiAtLS0tLSBSQVcgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfUENNICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5wY20gZmlsZXMgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBERUNPREVSUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0KLS8qIC0tLS0tICBBTVIgTkIgZGVjb2RlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfQU1STkIgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCBBTVIgTkIgc3RyZWFtcyAqLwotCi0vKiAtLS0tLSBBQUMgZGVjb2RlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfQUFDICAgICAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCBBQUMsIEFBQysgYW5kIGVBQUMrIHN0cmVhbXMgKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9WSURFQ19OVUxMCi0KLS8qIC0tLS0tIE1QNC9IMjYzIHZpZGVvIGRlY29kZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUCAgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgbXBlZzQgYW5kIEgyNjMgZGVjb2RlcnMgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0jZGVmaW5lIEdFVF9ERUNPREVSX0NPTkZJR19JTkZPCi0jZW5kaWYKLQotI2RlZmluZSBNNFZTU19TVVBQT1JUX1ZJREVPX0FWQyAgICAgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgSDI2NCBkZWNvZGVycyAqLwotCi0vKiAtLS0tLSBNUDMgZGVjb2RlciBzdXBwb3J0LS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9BVURFQ19NUDMgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IE1QMyBkZWNvZGVycyAqLwotCi0KLS8qIC0tLS0tIE5VTEwgZGVjb2RlciBzdXBwb3J0LS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9BVURFQ19OVUxMICAgICAgICAvKiogW2RlZmF1bHRdIFN1cHBvcnQgUENNIHJlYWRpbmcgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdSSVRFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKiovCi0KLS8qIC0tLS0tIDNncCB3cml0ZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUCAgICAgICAvKio8IFtkZWZhdWx0XSBzdXBwb3J0IGVuY2Fwc3VsYXRpbmcgaW4gM2dwIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2FtcixhYWN9IHgge21wZWc0LGgyNjN9ICovCi0KLQotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRU5DT0RFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotCi0vKiAtLS0tLSBtcGVnNCAmIGgyNjMgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gbXBlZzQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjYzIGZvcm1hdCB7eXV2LHJnYn0gKi8KLQotLyogLS0tLS0gaDI2NCBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLQotLyogLS0tLS0gYW1yIGVuY29kZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNvZGluZyBpbiBhbXIgMTIuMiBmb3JtYXQge2Ftcix3YXZ9ICovCi0KLS8qIC0tLS0tIGFhYyBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMgICAgICAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNvZGluZyBpbiBhYWMgZm9ybWF0IHthbXIsd2F2fSAqLwotCi0KLS8qIC0tLS0tIG1wMyBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUDMgICAgICAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNvZGluZyBpbiBtcDMgZm9ybWF0IHttcDN9ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZFQVRVUkVTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLQotLyogLS0tLS0gVlNTM0dQUCAmIHhWU1MgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUyAvKio8IFtkZWZhdWx0XSBpZiBkZWZpbmVkLCBpbXBsZW1lbnRhdGlvbiBpcyB4VlNTIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgVlNTM0dQUCAqLwotCi0vKiAtLS0tLSBTUFMgLS0tLS0gKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0KLS8vI2RlZmluZSBNNFNQU19HSUZfTk9UX1NVUFBPUlRFRCAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBHSUYgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfSlBFR19OT1RfU1VQUE9SVEVEIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgSlBFRyBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLS8vI2RlZmluZSBNNFNQU19QTkdfTk9UX1NVUFBPUlRFRCAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBQTkcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX1dCTVBfTk9UX1NVUFBPUlRFRCAgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgV0JNUCBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLSNkZWZpbmUgTTRTUFNfQkdSNTY1X0NPTE9SX09VVFBVVCAgLyoqPCBbb3B0aW9uXSBvdXRwdXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgaXMgQkdSNTY1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgPSBCR1IyNCkgKi8KLQotI2Vsc2UKLQotI2RlZmluZSBNNFNQU19HSUZfTk9UX1NVUFBPUlRFRCAgICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IEdJRiBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLS8vI2RlZmluZSBNNFNQU19KUEVHX05PVF9TVVBQT1JURUQgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBKUEVHIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotI2RlZmluZSBNNFNQU19QTkdfTk9UX1NVUFBPUlRFRCAgICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IFBORyBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLSNkZWZpbmUgTTRTUFNfV0JNUF9OT1RfU1VQUE9SVEVEICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBXQk1QIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotLy8jZGVmaW5lIE00U1BTX0JHUjU2NV9DT0xPUl9PVVRQVVQgLyoqPCBbb3B0aW9uXSBvdXRwdXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgaXMgQkdSNTY1Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ID0gQkdSMjQpICovCi0KLSNlbmRpZgotCi0jZGVmaW5lIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19NQ1NfSCAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9TU1JDLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9TU1JDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiMWNmY2YuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvU1NSQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgJW5hbWU6ICAgICAgICAgIFNTUkMuaCAlICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICAgIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJsb2NrcyBvZiB0aGUgU1JDIGFyZSBieSBkZWZhdWx0IGJsb2NrcyBvZiA0MCBtcy4gIFRoaXMgbWVhbnMgdGhhdAotICAgIHRoZSBmb2xsb3dpbmcgZGVmYXVsdCBibG9jayBzaXplcyBhcmUgdXNlZDoKLQotICAgICAgICAgIEZzICAgICBEZWZhdWx0IEJsb2NrIHNpemUKLSAgICAgICAgLS0tLS0gICAgICAgIC0tLS0tLS0tLS0KLSAgICAgICAgIDgwMDAgICAgICAgICAgIDMyMAotICAgICAgICAxMTAyNSAgICAgICAgICAgNDQxCi0gICAgICAgIDEyMDAwICAgICAgICAgICA0ODAKLSAgICAgICAgMTYwMDAgICAgICAgICAgIDY0MAotICAgICAgICAyMjA1MCAgICAgICAgICAgODgyCi0gICAgICAgIDI0MDAwICAgICAgICAgICA5NjAKLSAgICAgICAgMzIwMDAgICAgICAgICAgMTI4MAotICAgICAgICA0NDEwMCAgICAgICAgICAxNzY0Ci0gICAgICAgIDQ4MDAwICAgICAgICAgIDE5MjAKLQotICAgIEFuIEFQSSBpcyBwcm92aWRlZCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYmxvY2sgc2l6ZSBpbnRvIGFueSBtdWx0aXBsZSBvZiB0aGUgbWluaW1hbAotICAgIGJsb2NrIHNpemUuCi0KLSAgICBBbGwgdGhlIHNhbXBsaW5nIHJhdGVzIGFib3ZlIGFyZSBzdXBwb3J0ZWQgYXMgaW5wdXQgYW5kIGFzIG91dHB1dCBzYW1wbGluZyByYXRlCi0qLwotCi0jaWZuZGVmIF9fU1NSQ19IX18KLSNkZWZpbmUgX19TU1JDX0hfXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZNX1R5cGVzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBERUZJTklUSU9OUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgU1NSQ19JTlNUQU5DRV9TSVpFICAgICAgICAgIDU0OAotI2RlZmluZSBTU1JDX0lOU1RBTkNFX0FMSUdOTUVOVCAgICAgNAotI2RlZmluZSBTU1JDX1NDUkFUQ0hfQUxJR05NRU5UICAgICAgNAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgVFlQRSBERUZJTklUSU9OUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFN0YXR1cyByZXR1cm4gdmFsdWVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBTU1JDX09LICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLwotICAgIFNTUkNfSU5WQUxJRF9GUyAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgIC8qIFRoZSBpbnB1dCBvciB0aGUgb3V0cHV0IHNhbXBsaW5nIHJhdGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCAqLwotICAgIFNTUkNfSU5WQUxJRF9OUl9DSEFOTkVMUyAgICA9IDIsICAgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgbm90IGVxdWFsIHRvIG1vbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN0ZXJlbyAqLwotICAgIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgICAgICA9IDMsICAgICAgICAgICAgICAgIC8qIE9uZSBvZiB0aGUgaW5wdXQgcG9pbnRlcnMgaXMgTlVMTCAqLwotICAgIFNTUkNfV1JPTkdfTlJfU0FNUExFUyAgICAgICA9IDQsICAgICAgICAgICAgICAgIC8qIEludmFsaWQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KLSAgICBTU1JDX0FMTElOR01FTlRfRVJST1IgICAgICAgPSA1LCAgICAgICAgICAgICAgICAvKiBUaGUgaW5zdGFuY2UgbWVtb3J5IG9yIHRoZSBzY3JhdGNoIG1lbW9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgYWxsaWduZWQgKi8KLSAgICBTU1JDX0lOVkFMSURfTU9ERSAgICAgICAgICAgPSA2LCAgICAgICAgICAgICAgICAvKiBBIHdyb25nIHZhbHVlIGhhcyBiZWVuIHVzZWQgZm9yIHRoZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciAqLwotICAgIFNTUkNfSU5WQUxJRF9WQUxVRSAgICAgICAgICA9IDcsICAgICAgICAgICAgICAgIC8qIEFuIGludmFsaWQgKG91dCBvZiByYW5nZSkgdmFsdWUgaGFzIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3Igb25lIG9mIHRoZSBwYXJhbWV0ZXJzICovCi0gICAgTFZYWFhfUkVUVVJOU1RBVFVTX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gU1NSQ19SZXR1cm5TdGF0dXNfZW47Ci0KLS8qIEluc3RhbmNlIG1lbW9yeSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMzIgU3RvcmFnZSBbIFNTUkNfSU5TVEFOQ0VfU0laRS80IF07Ci19IFNTUkNfSW5zdGFuY2VfdDsKLQotLyogU2NyYXRjaCBtZW1vcnkgKi8KLXR5cGVkZWYgTFZNX0lOVDMyIFNTUkNfU2NyYXRjaF90OwotCi0vKiBOdWJlciBvZiBzYW1wbGVzIG1vZGUgKi8KLXR5cGVkZWYgZW51bQotewotICAgIFNTUkNfTlJfU0FNUExFU19ERUZBVUxUICAgICA9IDAsCi0gICAgU1NSQ19OUl9TQU1QTEVTX01JTiAgICAgICAgID0gMSwKLSAgICBTU1JDX05SX1NBTVBMRVNfRFVNTVkgICAgICAgPSBMVk1fTUFYRU5VTQotfSBTU1JDX05SX1NBTVBMRVNfTU9ERV9lbjsKLQotLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRnNfZW4gICAgICAgICAgIFNTUkNfRnNfSW47Ci0gICAgTFZNX0ZzX2VuICAgICAgICAgICBTU1JDX0ZzX091dDsKLSAgICBMVk1fRm9ybWF0X2VuICAgICAgIFNTUkNfTnJPZkNoYW5uZWxzOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnJTYW1wbGVzSW47Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBOclNhbXBsZXNPdXQ7Ci19IFNTUkNfUGFyYW1zX3Q7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIFBST1RPVFlQRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19HZXROclNhbXBsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIChvciBzYW1wbGUgcGFpcnMgZm9yIHN0ZXJlbykgdG8gYmUgICAgKi8KLS8qICB1c2VkIGFzIGlucHV0IGFuZCBhcyBvdXRwdXQgb2YgdGhlIFNTUkMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RlICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgdHdvIG1vZGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTUkNfTlJfU0FNUEVMU19ERUZBVUxULiAgSW4gdGhpcyBtb2RlLCB0aGUgZnVuY3Rpb24gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIGZvciA0MCBtcyBibG9ja3MgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1JDX05SX1NBTVBFTFNfTUlOIHdpbGwgcmV0dXJuIHRoZSBtaW5pbWFsIG51bWJlciAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHNhbXBsZXMgdGhhdCBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgY29udmVyc2lvbiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW8uICBFYWNoIGludGVnZXIgbXVsdGlwbGUgb2YgdGhpcyByYXRpbyB3aWxsICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhY2NlcHRlZCBieSB0aGUgU1NSQ19Jbml0IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfUGFyYW1zICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfRlMgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgaW5wdXQgb3Igb3V0cHV0IHNhbXBsaW5nIHJhdGVzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTIFdoZW4gdGhlIGNoYW5uZWwgZm9ybWF0IGlzIG5vdCBlcXVhbCB0byBMVk1fTU9OTyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMVk1fU1RFUkVPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgIFdoZW4gcFNTUkNfUGFyYW1zIGlzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX01PREUgICAgICAgV2hlbiBNb2RlIGlzIG5vdCBhIHZhbGlkIHNldHRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfR2V0TnJTYW1wbGVzKCBTU1JDX05SX1NBTVBMRVNfTU9ERV9lbiAgTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1JDX1BhcmFtc190KiAgICAgICAgICAgcFNTUkNfUGFyYW1zICk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBTU1JDX0dldFNjcmF0Y2hTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgc2NyYXRjaCBzaXplIGZvciBhIGdpdmVuIGNvbnZlcnNpb24gcmF0aW8gYW5kICAgICAgICAgICAqLwotLyogIGZvciBnaXZlbiBidWZmZXIgc2l6ZXMgYXQgdGhlIGlucHV0IGFuZCBhdCB0aGUgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1BhcmFtcyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNjcmF0Y2hTaXplICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgc2NyYXRjaCBzaXplLiAgVGhlIFNTUkNfR2V0U2NyYXRjaFNpemUgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3aWxsIGZpbGwgaW4gdGhlIGNvcnJlY3QgdmFsdWUgKGluIGJ5dGVzKS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX09LICAgICAgICAgICAgICAgICB3aGVuIHRoZSBmdW5jdGlvbiBjYWxsIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9GUyAgICAgICAgIFdoZW4gdGhlIHJlcXVlc3RlZCBpbnB1dCBvciBvdXRwdXQgc2FtcGxpbmcgcmF0ZXMgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfTlJfQ0hBTk5FTFMgV2hlbiB0aGUgY2hhbm5lbCBmb3JtYXQgaXMgbm90IGVxdWFsIHRvIExWTV9NT05PICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIExWTV9TVEVSRU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19OVUxMX1BPSU5URVIgICAgICAgV2hlbiBhbnkgb2YgdGhlIGlucHV0IHBvaW50ZXJzIGlzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgKi8KLS8qICBTU1JDX1dST05HX05SX1NBTVBMRVMgICBXaGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgaW5wdXQgb3Igb24gdGhlIG91dHB1dCAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbmNvcnJlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19HZXRTY3JhdGNoU2l6ZSggICBTU1JDX1BhcmFtc190KiAgICBwU1NSQ19QYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiogICAgICAgIHBTY3JhdGNoU2l6ZSApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFNTUkMgbW9kdWxlIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfSW5zdGFuY2UgICAgICAgICAgSW5zdGFuY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1NjcmF0Y2ggICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHNjcmF0Y2ggbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfUGFyYW1zICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5wdXRJblNjcmF0Y2gsICAgICAgICBwb2ludGVyIHRvIGEgbG9jYXRpb24gaW4gdGhlIHNjcmF0Y2ggbWVtb3J5IHRoYXQgY2FuIGJlICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gc3RvcmUgdGhlIGlucHV0IHNhbXBsZXMgKGUuZy4gdG8gc2F2ZSBtZW1vcnkpICAgICAgICovCi0vKiAgcE91dHB1dEluU2NyYXRjaCAgICAgICAgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIHRoZSBzY3JhdGNoIG1lbW9yeSB0aGF0IGNhbiBiZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHN0b3JlIHRoZSBvdXRwdXQgc2FtcGxlcyAoZS5nLiB0byBzYXZlIG1lbW9yeSkgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX09LICAgICAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9GUyAgICAgICAgIFdoZW4gdGhlIHJlcXVlc3RlZCBpbnB1dCBvciBvdXRwdXQgc2FtcGxpbmcgcmF0ZXMgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfTlJfQ0hBTk5FTFMgV2hlbiB0aGUgY2hhbm5lbCBmb3JtYXQgaXMgbm90IGVxdWFsIHRvIExWTV9NT05PICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIExWTV9TVEVSRU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19XUk9OR19OUl9TQU1QTEVTICAgV2hlbiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIHRoZSBvdXRwdXQgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW5jb3JyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgIFdoZW4gYW55IG9mIHRoZSBpbnB1dCBwb2ludGVycyBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICovCi0vKiAgU1NSQ19BTExJTkdNRU5UX0VSUk9SICAgV2hlbiB0aGUgaW5zdGFuY2UgbWVtb3J5IG9yIHRoZSBzY3JhdGNoIG1lbW9yeSBpcyBub3QgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICA0IGJ5dGVzIGFsbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiBUaGUgaW5pdCBmdW5jdGlvbiB3aWxsIGNsZWFyIHRoZSBpbnRlcm5hbCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19Jbml0KCBTU1JDX0luc3RhbmNlX3QqIHBTU1JDX0luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1JDX1NjcmF0Y2hfdCogIHBTU1JDX1NjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTUkNfUGFyYW1zX3QqICAgcFNTUkNfUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqKiAgICAgIHBwSW5wdXRJblNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNioqICAgICAgcHBPdXRwdXRJblNjcmF0Y2gpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19TZXRHYWlucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBzZXRzIGhlYWRyb29tIGdhaW4gYW5kIHRoZSBwb3N0IGdhaW4gb2YgdGhlIFNTUkMgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYkhlYWRyb29tR2FpbkVuYWJsZWQgICAgcGFyYW1ldGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBoZWFkcm9vbSBnYWluIG9mIHRoZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBTU1JDLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgTFZNX01PREVfT04uICBMVk1fTU9ERV9PRkYgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIGluIGNhc2UgaXQgY2FuIGJlIGd1YXJhbnRlZWQgdGhhdCB0aGUgaW5wdXQgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgaXMgYmVsb3cgLTZkQiBpbiBhbGwgY2FzZXMgKHRoZSBkZWZhdWx0IGhlYWRyb29tICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBpcyAtNiBkQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYk91dHB1dEdhaW5FbmFibGVkICAgICAgcGFyYW1ldGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBvdXRwdXQgZ2Fpbi4gIFRoZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIGlzIExWTV9NT0RFX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3V0cHV0R2FpbiAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBvdXRwdXQgZ2Fpbi4gIFRoZSBvdXRwdXQgZ2FpbiBpcyBhIGxpbmVhciAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluIHZhbHVlLiAweDdGRkYgaXMgZXF1YWwgdG8gKzYgZEIgYW5kIDB4MDAwMCBjb3JyZXNwb25kcyAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIC1pbmYgZEIuICBCeSBkZWZhdWx0LCBhIDNkQiBnYWluIGlzIGFwcGxpZWQsIHJlc3VsdGluZyAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYW4gb3ZlcmFsbCBnYWluIG9mIC0zZEIgKC02ZEIgaGVhZHJvb20gKyAzZEIgb3V0cHV0IGdhaW4pKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIHBTU1JDX0luc3RhbmNlIGlzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9NT0RFICAgICAgIFdyb25nIHZhbHVlIHVzZWQgZm9yIHRoZSBiSGVhZHJvb21HYWluRW5hYmxlZCBvciB0aGUgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYk91dHB1dEdhaW5FbmFibGVkIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfVkFMVUUgICAgICBXaGVuIE91dHB1dEdhaW4gaXMgb3V0IHRvIHRoZSByYW5nZSBbMDszMjc2N10gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiBUaGUgU1NSQ19TZXRHYWlucyBmdW5jdGlvbiBpcyBhbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgICAgICAqLwotLyogICAgIGluIHJhcmUgY2FzZXMuICBQcmVmZXJhYmx5LCB1c2UgdGhlIGRlZmF1bHQgc2V0dGluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1TU1JDX1JldHVyblN0YXR1c19lbiBTU1JDX1NldEdhaW5zKCBTU1JDX0luc3RhbmNlX3QqIHBTU1JDX0luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01vZGVfZW4gICAgICBiSGVhZHJvb21HYWluRW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Nb2RlX2VuICAgICAgYk91dHB1dEdhaW5FbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICBPdXRwdXRHYWluICk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBTU1JDX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgU1NSQyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19JbnN0YW5jZSAgICAgICAgICBJbnN0YW5jZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0F1ZGlvSW4gICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfQXVkaW9PdXQgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBTU1JDX09LICAgICAgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgICBXaGVuIG9uZSBvZiBwU1NSQ19JbnN0YW5jZSwgcFNTUkNfQXVkaW9JbiBvciBwU1NSQ19BdWRpb091dCAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19Qcm9jZXNzKCAgU1NSQ19JbnN0YW5jZV90KiBwU1NSQ19JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiogICAgICAgcFNTUkNfQXVkaW9JbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiogICAgICAgcFNTUkNfQXVkaW9PdXQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmIC8qIF9fU1NSQ19IX18gKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODQ5N2QzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBWSURFT0VESVRPUlJFU0FNUExFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SUkVTQU1QTEVSX0gKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLU00T1NBX0NvbnRleHQgTFZBdWRpb1Jlc2FtcGxlckNyZWF0ZShNNE9TQV9JbnQzMiBiaXREZXB0aCwgTTRPU0FfSW50MzIgaW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgc2FtcGxlUmF0ZSwgTTRPU0FfSW50MzIgcXVhbGl0eSk7Ci12b2lkIExWQXVkaW9zZXRTYW1wbGVSYXRlKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCxNNE9TQV9JbnQzMiBpblNhbXBsZVJhdGUpOwotdm9pZCBMVkF1ZGlvc2V0Vm9sdW1lKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCwgTTRPU0FfSW50MTYgbGVmdCwgTTRPU0FfSW50MTYgcmlnaHQpIDsKLXZvaWQgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoTTRPU0FfSW50MTYqIG91dCwgTTRPU0FfSW50MTYqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG91dEZyYW1lQ291bnQsIE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCk7Ci12b2lkIExWRGVzdHJveShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQpOwotCi12b2lkIE1vbm9UbzJJXzE2KCBjb25zdCBNNE9TQV9JbnQxNiAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2IG4pOwotCi12b2lkIEZyb20yaVRvTW9ub18xNiggY29uc3QgTTRPU0FfSW50MTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2IG4pOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLSNlbmRpZiAvKiBWSURFT0VESVRPUlJFU0FNUExFUl9IICovCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNEVYSUZDX0NvbW1vbkFQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNEVYSUZDX0NvbW1vbkFQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjNjMDJhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRFWElGQ19Db21tb25BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRFWElGQ19Db21tb25BUEkuaAotICogQGJyaWVmICAgIEVYSUYgY29tbW9uIGRhdGEgaGVhZGVyCi0gKiBAbm90ZSAgICBUaGUgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhbGxvdyByZWFkaW5nCi0gKiAgICAgICAgICAgIGFuZCB3cml0aW5nIEVYSUYgSlBFRyBpbWFnZXMgY29tcGxpYW50IHNwZWMgRVhJRiAyLjIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBfX000X0VYSUZfQ09NTU9OX0FQSV9IX18KLSNkZWZpbmUgX19NNF9FWElGX0NPTU1PTl9BUElfSF9fCi0KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLSNpbmNsdWRlICJNNENvbW1vbl90eXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogdHlwZSBNNEVYSUZDX0NvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX1ZvaWQqICAgIE00RVhJRkNfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFcnJvcnMgJiBXYXJuaW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2RlZmluZSBNNEVYSUZDX05PX0VSUiAgICAgICAgICAgICAgMHgwMDAwMDAwMCAgICAvKio8IGludmFsaWQgcGFyYW1ldGVyICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX1BBUkFNRVRFUiAgICAgICAweDAwMDAwMDAxICAgIC8qKjwgaW52YWxpZCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfQUxMT0MgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyoqPCBhbGxvY2F0aW9uIGVycm9yICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX0JBRF9DT05URVhUICAgICAweDAwMDAwMDAzICAgIC8qKjwgaW52YWxpZCBjb250ZXh0ICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX05PVF9DT01QTElBTlQgICAweDAwMDAwMDA0ICAgIC8qKjwgdGhlIGltYWdlIGluIGJ1ZmZlciBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUEVHIGNvbXBsaWFudCAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9OT19BUFBfRk9VTkQgICAgMHgwMDAwMDAwNSAgICAvKio8IHRoZSBKUEVHIGltYWdlIGRvZXMgbm90IGNvbnRhaW4gYW55IEFQUDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpZiAyLjIgY29tcGxpYW50ICovCi0jZGVmaW5lIE00RVhJRkNfV0FSX05PX1RIVU1CTkFJTCAgICAweDAwMDAwMDA2ICAgIC8qKjwgdGhlIEV4aWYgcGFydCBkb2VzIG5vdCBjb250YWluIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWwgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfQVBQX1RSVU5DQVRFRCAgIDB4MDAwMDAwMDcgICAgLyoqPCBUaGUgQVBQMSBzZWN0aW9uIGluIGlucHV0IGJ1ZmZlciBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgY29tcGxldGUgKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNEVYSUZDX0Jhc2ljVGFncwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIGJhc2ljIHRhZ3MgdmFsdWVzLgotICogQG5vdGUgICAgICAgIFRoaXMgRXhpZiByZWFkZXIgZm9jdXNlcyBvbiBhIHNldCBvZiAiRW50cnkgVGFncyIuCi0gKiAgICAgICAgICAgICAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZyAiRW50cnkgVmFsdWVzIiBvZiB0aGVzZSB0YWdzLgotICogICAgICAgICAgICAgICAgTTRFWElGQ19DaGFyKiBmaWVsZHMgb2Ygc3RydWN0dXJlIGFyZSBOdWxsIHRlcm1pbmF0ZWQgU3RyaW5ncy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0ludDMyICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgLyoqPCBpbWFnZSB3aWR0aCBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgaGVpZ2h0OyAgICAgICAgICAgICAgIC8qKjwgaW1hZ2UgaGVpZ2h0IGluIHBpeGVscyAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpjcmVhdGlvbkRhdGVUaW1lOyAgICAgLyoqPCBkYXRlIGFuZCB0aW1lIG9yaWdpbmFsIGltYWdlIHdhcyBnZW5lcmF0ZWQgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbGFzdENoYW5nZURhdGVUaW1lOyAgIC8qKjwgZmlsZSBjaGFuZ2UgZGF0ZSBhbmQgdGltZSAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpkZXNjcmlwdGlvbjsgICAgICAgICAgLyoqPCBpbWFnZSB0aXRsZSAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICptYWtlOyAgICAgICAgICAgICAgICAgLyoqPCBtYW51ZmFjdHVyZXIgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKm1vZGVsOyAgICAgICAgICAgICAgICAvKio8IG1vZGVsIG9mIGltYWdlIGlucHV0IGVxdWlwbWVudCAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpzb2Z0d2FyZTsgICAgICAgICAgICAgLyoqPCBzb2Z0d2FyZSB1c2VkICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmFydGlzdDsgICAgICAgICAgICAgICAvKio8IHBlcnNvbiB3aG8gY3JlYXRlZCB0aGUgaW1hZ2UgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqY29weXJpZ2h0OyAgICAgICAgICAgIC8qKjwgY29weXJpZ2h0IGhvbGRlciAqLwotICAgIE00Q09NTU9OX09yaWVudGF0aW9uIG9yaWVudGF0aW9uOyAgICAgICAgLyoqPCBvcmllbnRhdGlvbiBvZiBpbWFnZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICB0aHVtYm5haWxTaXplOyAgICAgICAgLyoqPCBzaXplIG9mIHRoZSB0aHVtYm5haWwgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgKnRodW1ibmFpbEltZzsgICAgICAgIC8qKjwgcG9pbnRlciB0byB0aGUgdGh1bWJuYWlsIGluIG1haW4gaW1hZ2UgYnVmZmVyKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbGF0aXR1ZGVSZWY7ICAgICAgICAgIC8qKjwgbGF0aXR1ZGUgcmVmZXJlbmNlICovCi0gICAgTTRDT01NT05fTG9jYXRpb24gbGF0aXR1ZGU7ICAgICAgICAgICAgICAvKio8IGxhdGl0dWRlICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmxvbmdpdHVkZVJlZjsgICAgICAgICAvKio8IGxvbmdpdHVkZSByZWZlcmVuY2UgKi8KLSAgICBNNENPTU1PTl9Mb2NhdGlvbiBsb25naXR1ZGU7ICAgICAgICAgICAgIC8qKjwgbG9uZ2l0dWRlICovCi0KLX0gTTRFWElGQ19CYXNpY1RhZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRFWElGQ19nZXRWZXJzaW9uICAgIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0gKiBAYnJpZWYgICAgZ2V0IHRoZSB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIGV4aWYgbGlicmFyeS4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSB2ZXJzaW9uIG51bWJlcnMgaW4gYSBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICAgcFZlcnNpb246ICAgIChPVVQpICAgICAgICB0aGUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdmVyc2lvbiBudW1iZXJzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVhJRkNfRVJSX1BBUkFNRVRFUjogICAgICAgIChEZWJ1ZyBvbmx5KSB0aGUgcGFyYW1ldGVyIGlzIE00RVhJRkNfTlVMTC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRFWElGQ19nZXRWZXJzaW9uIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pOwotCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMqLwotI2VuZGlmIC8qIF9fTTRfRVhJRl9DT01NT05fQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YWEyMGQyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfQVBJLmgKLSAqIEBicmllZiAgICBUaGUgUGljdHVyZXMgdG8gM0dQUCBDb252ZXJ0ZXIuCi0gKiBAbm90ZSAgICBNNFBUTzNHUFAgcHJvZHVjZXMgM0dQUCBjb21wbGlhbnQgYXVkaW8vdmlkZW8gIGZpbGVzCi0gKiAgICAgICAgICAgIGZyb20gYW4gQU1SIE5CIGF1ZGlvIGZpbGUgYW5kIHJhdyBwaWN0dXJlcyBpbnRvIGEgTVBFRy00L2gyNjMgM0dQUCBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNFBUTzNHUFBfQVBJX0hfXwotI2RlZmluZSBfX000UFRPM0dQUF9BUElfSF9fCi0KLS8qKgotICogICAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICAgIE9TQUwgdHlwZXMgZm9yIGZpbGUgYWNjZXNzICovCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLQotLyoqCi0gKiAgICBEZWZpbml0aW9uIG9mIE00X1ZlcnNpb25JbmZvICovCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLS8qKgotICogRGVmaW5pdGlvbnMgb2YgTTRWSUZJX0ltYWdlUGxhbmUgKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0vKioKLSAqIENvbW1vbiBkZWZpbml0aW9ucyBvZiB2aWRlbyBlZGl0aW5nIGNvbXBvbmVudHMgKi8KLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogICAgUHVibGljIHR5cGUgb2YgdGhlIE00UFRPM0dQUCBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00UFRPM0dQUF9Db250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRQVE8zR1BQX1JlcGxhY2VBdWRpb01vZGUKLSAqIEBicmllZiAgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHdheSB0aGUgYXVkaW8gaXMgbWFuYWdlZCBpZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHZpZGVvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Ob25lID0gMCwgIC8qKjwgQXVkaW8gdHJhY2sgaXMga2VwdCBzaG9ydGVyIHRoYW4gdGhlIHZpZGVvIHRyYWNrKi8KLSAgICBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfU2lsZW5jZSwgICAvKio8IElmIGF1ZGlvIGlzIHNob3J0ZXIsIHNpbGVuY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCovCi0gICAgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX0xvb3AgICAgICAgLyoqPCBJZiBhdWRpbyBpcyBzaG9ydGVyLCBsb29wIGJhY2sgdG8gdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgd2hvbGUgdHJhY2sgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi19IE00UFRPM0dQUF9BdWRpb1BhZGRpbmdNb2RlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00UFRPM0dQUF9PdXRwdXRGaWxlTWF4U2l6ZQotICogQGJyaWVmICAgIERlZmluZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgM0dQUCBmaWxlIHByb2R1Y2VkIGJ5IHRoZSBQVE8zR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UFRPM0dQUF9rNTBfS0IsICAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byA1MCBLYnl0ZXMgICovCi0gICAgTTRQVE8zR1BQX2s3NV9LQiwgICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDc1IEtieXRlcyAgKi8KLSAgICBNNFBUTzNHUFBfazEwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gMTAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rMTUwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byAxNTAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2syMDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDIwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazMwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gMzAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rNDAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byA0MDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2s1MDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDUwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfa1VOTElNSVRFRD0tMSAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIG5vdCBsaW1pdGVkICAgICAgICAgICAqLwotfSBNNFBUTzNHUFBfT3V0cHV0RmlsZU1heFNpemU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIChNNFBUTzNHUFBfUGljdHVyZUNhbGxiYWNrRmN0KSAoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LAotICogTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKTsKLSAqIEBicmllZiAgICBUaGUgaW50ZWdyYXRvciBtdXN0IGltcGxlbWVudCBhIGZ1bmN0aW9uIGZvbGxvd2luZyB0aGlzIHByb3RvdHlwZS4KLSAqICAgICAgICAgICAgSXRzIGdvYWwgaXMgdG8gZmVlZCB0aGUgUFRPM0dQUCB3aXRoIFlVVjQyMCBwaWN0dXJlcy4KLSAqCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIGdpdmVuIHRvIHRoZSBQVE8zR1BQIGluIHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcwotICogQHBhcmFtICAgIHBQaWN0dXJlRHVyYXRpb24oT1VUKSBEdXJhdGlvbiBvZiB0aGUgcmV0dXJuZWQgcGljdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU6IFRoZSByZXR1cm5lZCBpbWFnZSBpcyB0aGUgbGFzdCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbCAoYmVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UFRPM0dQUF9QaWN0dXJlQ2FsbGJhY2tGY3QpIChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RvdWJsZSogcFBpY3R1cmVEdXJhdGlvbik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRQVE8zR1BQX1BhcmFtcwotICogQGJyaWVmICAgIE00UFRPM0dQUCBwYXJhbWV0ZXJzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IE91dHB1dCB2aWRlbyBjb21wcmVzc2lvbiBmb3JtYXQsIEgyNjMgb3IgTVBFRzQgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgIE91dHB1dFZpZGVvRm9ybWF0OwotICAgIC8qKjwgT3V0cHV0IGZyYW1lIHNpemUgOiBTUUNJRiB0byBWR0EqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplICAgT3V0cHV0VmlkZW9GcmFtZVNpemU7Ci0gICAgLyoqPCBUYXJnZXRlZCBPdXRwdXQgYml0LXJhdGUsIHNlZSBlbnVtKi8KLSAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgICAgICAgIE91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAvKio8IE1heGltdW0gc2l6ZSBvZiB0aGUgb3V0cHV0IDNHUFAgZmlsZSwgc2VlIGVudW0gKi8KLSAgICBNNFBUTzNHUFBfT3V0cHV0RmlsZU1heFNpemUgICAgIE91dHB1dEZpbGVNYXhTaXplOwotICAgIC8qKjwgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IHRoZSBQVE8zR1BQIHRvIGdldCB0aGUgaW5wdXQgcGljdHVyZXMqLwotICAgIE00UFRPM0dQUF9QaWN0dXJlQ2FsbGJhY2tGY3QqICAgcFBpY3R1cmVDYWxsYmFja0ZjdDsKLSAgICAvKio8IENvbnRleHQgdG8gYmUgZ2l2ZW4gYXMgdGhpcmQgYXJndW1lbnQgb2YgdGhlIHBpY3R1cmUgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbCovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICBwUGljdHVyZUNhbGxiYWNrQ3R4dDsKLSAgICAvKio8IEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgYXVkaW8gdHJhY2sgZmlsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgcElucHV0QXVkaW9UcmFja0ZpbGU7Ci0gICAgLyoqPCBGb3JtYXQgb2YgdGhlIGF1ZGlvIGZpbGUgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgIEF1ZGlvRmlsZUZvcm1hdDsKLSAgICAvKio8IFR5cGUgb2YgcHJvY2Vzc2luZyB0byBhcHBseSB3aGVuIGF1ZGlvIGlzIHNob3J0ZXIgdGhhbiB2aWRlbyovCi0gICAgTTRQVE8zR1BQX0F1ZGlvUGFkZGluZ01vZGUgICAgICBBdWRpb1BhZGRpbmdNb2RlOwotICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBvdXRwdXQgM0dQUCBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICBwT3V0cHV0M2dwcEZpbGU7Ci0gICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byBzdG9yZSBtZXRhZGF0YSAoIm1vb3YuYmluIikgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlOwotICAgIC8qKjwgTnVtYmVyIG9mIGlucHV0IFlVViBmcmFtZXMgdG8gZW5jb2RlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBOYlZpZGVvRnJhbWVzOwotICAgIE00T1NBX0ludDMyICAgdmlkZW9Qcm9maWxlOwotICAgIE00T1NBX0ludDMyICAgdmlkZW9MZXZlbDsKLX0gTTRQVE8zR1BQX1BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICAgR2V0IHRoZSBNNFBUTzNHUFAgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0luaXQoTTRQVE8zR1BQX0NvbnRleHQqIHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgTTRQVE8zR1BQIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIE00UFRPM0dQUCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGUgY29udGV4dCBzdHJ1Y3R1cmUgY291bGQgbm90IGJlIGFsbG9jYXRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0luaXQoTTRQVE8zR1BQX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9PcGVuKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0LCBNNFBUTzNHUFBfUGFyYW1zKiBwUGFyYW1zKTsKLSAqIEBicmllZiAgICBTZXQgdGhlIE00UFRPM0dQUCBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBjcmVhdGVkIHlldC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUGFyYW1zICAgICAgICAgICAgICAgIChJTikgUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIFBUTzNHUFAuCi0gKiBAbm90ZSAgICBUaGUgcG9pbnRlZCBzdHJ1Y3R1cmUgY2FuIGJlIGRlLWFsbG9jYXRlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYmVjYXVzZQotICogICAgICAgICAgICBpdCBpcyBpbnRlcm5hbGx5IGNvcGllZCBieSB0aGUgUFRPM0dQUAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgVGhlIG91dHB1dCB2aWRlbyBmcmFtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdCAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCB2aWRlbyBiaXQtcmF0ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRQotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0ZJTEVfU0laRQotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX0FVRElPX1BBRERJTkcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBhdWRpbyBwYWRkaW5nIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9PcGVuKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0LCBNNFBUTzNHUFBfUGFyYW1zKiBwUGFyYW1zKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdHJhbmNvZGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HOiAgICBFbmNvZGluZyBjb21wbGV0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9TdGVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0Nsb3NlKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE00UFRPM0dQUCB0cmFuc2NvZGluZy4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIE00UFRPM0dQUC4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRQVE8zR1BQX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfRXJyb3JDb2Rlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfRXJyb3JDb2Rlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2JkNTRmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0Vycm9yQ29kZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX0Vycm9yQ29kZXMuaAotICogQGJyaWVmICAgIFBpY3R1cmUgdG8gM2dwcCBTZXJ2aWNlIGVycm9yIGRlZmluaXRpb25zLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTTRQVE8zR1BQX0Vycm9yQ29kZXNfSF9fCi0jZGVmaW5lIF9fTTRQVE8zR1BQX0Vycm9yQ29kZXNfSF9fCi0KLS8qKgotICogICAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICAgIE9TQUwgY29yZSBJRCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0KLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDAxICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFICAgICAgICBcCi0gICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwMiApCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgdmlkZW8gYml0LXJhdGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUgICAgICAgICAgIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDAzICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyAgICAgICAgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDQgKQotLyoqCi0gKiAgICBUaGUgZmlsZSBzaXplIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9JTlZBTElEX0ZJTEVfU0laRSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDA1ICkKLS8qKgotICogVGhlIGlucHV0IGF1ZGlvIGZpbGUgY29udGFpbnMgYSB0cmFjayBmb3JtYXQgbm90IGhhbmRsZWQgYnkgUFRPM0dQUCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkhBTkRMRURfQVVESU9fVFJBQ0tfSU5QVVRfRklMRSAgICAgICAgIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDA2ICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDA3ICkKLQotLyoqCi0gKiAgICBUaGUgQU1SIGRlY29kZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0FNUl9ERUNPREVSX0lOSVRfRVJST1IgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjAgKQotLyoqCi0gKiAgICBUaGUgQU1SIGRlY29kZXIgZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0FNUl9ERUNPREVfRVJST1IgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjEgKQotLyoqCi0gKiAgICBUaGUgQU1SIGRlY29kZXIgY2xlYW51cCBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfQU1SX0RFQ09ERVJfREVTVFJPWV9FUlJPUiAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMiApCi0KLS8qKgotICogICAgVGhlIHZpZGVvIGVuY29kZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1ZJREVPX0VOQ09ERVJfSU5JVF9FUlJPUiAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjMgKQotLyoqCi0gKiAgICBUaGUgdmlkZW8gZW5jb2RlciBkZWNvZGluZyBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVklERU9fRU5DT0RFX0VSUk9SICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyNCApCi0vKioKLSAqICAgIFRoZSB2aWRlbyBlbmNvZGVyIGNsZWFudXAgZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1ZJREVPX0VOQ09ERVJfREVTVFJPWV9FUlJPUiAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjUgKQotCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgZmlsZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9GSUxFX1NJWkUgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyNiApCi0KLS8qKgotICogICAgVGhlIEVuY29kaW5nIGlzIGNvbXBsZXRlZCAqLwotI2RlZmluZSBNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI3ICkKLQotLyoqCi0gKiAgICBUaGUgRW5jb2RpbmcgaXMgY29tcGxldGVkICovCi0jZGVmaW5lIE00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjggKQotCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgYXVkaW8gcGFkZGluZyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9BVURJT19QQURESU5HICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjkgKQotCi0vKioKLSAqIFRoZSB2aWRlbyBlbmNvZGVyIGVuY291bnRlcmVkIGFuIEFjY2VzIFVuaXQgZXJyb3I6IHZlcnkgcHJvYmFibHkgYSBmaWxlIHdyaXRlIGVycm9yICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUiAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMkEgKQotCi0jZW5kaWYgLyogX19NNFBUTzNHUFBfRXJyb3JDb2Rlc19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTJlNTY2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaAotICogQGJyaWVmICAgIFBpY3R1cmUgdG8gM2dwcCBTZXJ2aWNlIGludGVybmFsIGRlZmluaXRpb25zCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGVudW0gYW5kIHR5cGVzIG5vdCB2aXNpYmxlIHRvIHRoZSBleHRlcm5hbCB3b3JsZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0KLSNpZm5kZWYgX19NNFBUTzNHUFBfSU5URVJOQUxUWVBFU19IX18KLSNkZWZpbmUgX19NNFBUTzNHUFBfSU5URVJOQUxUWVBFU19IX18KLQotI2RlZmluZSBNNFBUTzNHUFBfVkVSU0lPTl9NQUpPUiAgICAgICAgMwotI2RlZmluZSBNNFBUTzNHUFBfVkVSU0lPTl9NSU5PUiAgICAgICAgMAotI2RlZmluZSBNNFBUTzNHUFBfVkVSU0lPTl9SRVZJU0lPTiAgICA2Ci0KLS8qKgotICogICAgTTRQVE8zR1BQIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0KLS8qKgotICogICAgSW50ZXJuYWxseSB1c2VkIG1vZHVsZXMgKi8KLQotI2luY2x1ZGUgIk00V1JJVEVSX2NvbW1vbi5oIiAgICAvKiBXcml0ZSAzR1BQIGZpbGUgICAgKi8KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIgICAgLyogUmVhZCBBTVIgZmlsZSAgICAqLwotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00UFRPM0dQUF9TdGF0ZXMKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBNNFBUTzNHUFAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UFRPM0dQUF9rU3RhdGVfQ1JFQVRFRCAgICAgICAgID0gMCwgICAgLyoqPCBNNFBUTzNHUFBfSW5pdCBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCAgICAgICAgICA9IDEsICAgIC8qKjwgTTRQVE8zR1BQX09wZW4gaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSAgICAgICAgICAgPSAyLCAgICAvKio8IFN0ZXAgY2FuIGJlIGNhbGxlZCAqLwotICAgIE00UFRPM0dQUF9rU3RhdGVfRklOSVNIRUQgICAgICAgID0gMywgICAgLyoqPCBUcmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgIE00UFRPM0dQUF9rU3RhdGVfQ0xPU0VEICAgICAgICAgID0gNCAgICAgLyoqPCBPdXRwdXQgZmlsZSBoYXMgYmVlbiBjcmVhdGVkICovCi19Ci1NNFBUTzNHUFBfU3RhdGVzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFBUTzNHUFBfU3RyZWFtU3RhdGUKLSAqIEBicmllZiAgICAgICAgU3RhdGUgb2YgYSBtZWRpYSBzdHJlYW0gZW5jb2RpbmcgKGF1ZGlvIG9yIHZpZGVvKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSAgPSAwLCAgICAvKio8IE5vIHN0cmVhbSBwcmVzZW50ICovCi0gICAgTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEICAgPSAxLCAgICAvKio8IFRoZSBzdHJlYW0gZW5jb2RpbmcgaXMgaW4gcHJvZ3Jlc3MgKi8KLSAgICBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEICA9IDIgICAgLyoqPCBUaGUgc3RyZWFtIGhhcyBmaW5pc2hlZCBlbmNvZGluZyAqLwotfQotTTRQVE8zR1BQX1N0cmVhbVN0YXRlOwotCi0vKgotICogRGVmaW5pdGlvbiBvZiBtYXggQVUgc2l6ZSAqLwotI2RlZmluZSBNNFBUTzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPICAgICAwLjhGICAgIC8qKjwgTWF4IEFVIHNpemUgd2lsbCBiZSAwLjggdGltZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0OjI6MCBmcmFtZSBzaXplICovCi0jZGVmaW5lIE00UFRPM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPICAgIDEuMkYgLyoqPCBNYXggY2h1bmsgc2l6ZSB3aWxsIGJlIDEuMiB0aW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00UFRPM0dQUF9BVURJT19NQVhfQVVfU0laRSAgICAgICAgICAgICAgMTAwMCAgICAvKio8IEFBQyBtYXggQVUgc2l6ZSBzZWVtcyB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm91dCA4NTAgYnl0ZXMgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX0FVRElPX01BWF9DSFVOS19TSVpFICAgICAgICAgICA1MDAwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIGFub255bW91cyBlbnVtCi0gKiBAYnJpZWYgICAgICAgIGVudW0gdG8ga2VlcCB0cmFjayBvZiB0aGUgZW5jb2RlciBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1lbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tOb0VuY29kZXIsCi0gICAgTTRQVE8zR1BQX2tFbmNvZGVyQ2xvc2VkLAotICAgIE00UFRPM0dQUF9rRW5jb2RlclN0b3BwZWQsCi0gICAgTTRQVE8zR1BQX2tFbmNvZGVyUnVubmluZwotfTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBNNFBUTzNHUFAgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgTTRQVE8zR1BQIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogICAgTTRQVE8zR1BQIG1haW4gdmFyaWFibGVzICovCi0gICAgTTRQVE8zR1BQX1N0YXRlcyAgICAgICAgICAgICBtX1N0YXRlOyAgICAgICAgICAgIC8qKjwgTTRQVE8zR1BQIGludGVybmFsIHN0YXRlICovCi0gICAgTTRQVE8zR1BQX1BhcmFtcyAgICAgICAgICAgICBtX1BhcmFtczsgICAgICAgICAgIC8qKjwgTTRQVE8zR1BQIHBhcmFtZXRlcnMsIHNldCBieSB0aGUgdXNlciAqLwotICAgIE00UFRPM0dQUF9TdHJlYW1TdGF0ZSAgICAgICAgbV9WaWRlb1N0YXRlOyAgICAgICAvKio8IFN0YXRlIG9mIHRoZSB2aWRlbyBlbmNvZGluZyAqLwotICAgIE00UFRPM0dQUF9TdHJlYW1TdGF0ZSAgICAgICAgbV9BdWRpb1N0YXRlOyAgICAgICAvKio8IFN0YXRlIG9mIHRoZSBhdWRpbyBlbmNvZGluZyAqLwotCi0gICAgLyoqCi0gICAgICogICAgT1NBTCBmaWxlIHJlYWQvd3JpdGUgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgcE9zYWxGaWxlUmVhZDsgICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgcE9zYWxGaWxlV3JpdGU7ICAgIC8qKjwgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0KLSAgICAvKioKLSAgICAgKiAgICBSZWFkZXIgc3R1ZmYgKi8KLSAgICBNNF9BY2Nlc3NVbml0KiAgICAgICAgICAgICAgICBtX3BSZWFkZXJBdWRpb0FVOyAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgICAgICBtX3BSZWFkZXJBdWRpb1N0cmVhbTsvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIGF1ZGlvIHN0cmVhbSAqLwotCi0gICAgLyoqCi0gICAgICogICAgV3JpdGVyIHN0dWZmICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1fV3JpdGVyVmlkZW9BVTsgICAgICAgLyoqPCBXcml0dGVuIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1fV3JpdGVyQXVkaW9BVTsgICAgICAgLyoqPCBXcml0dGVuIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRFTkNPREVSX0hlYWRlciogICAgICAgICAgIG1fcEVuY29kZXJIZWFkZXI7ICAgICAgLyoqPCBTZXF1ZW5jZSBoZWFkZXIgcmV0dXJuZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyIGF0IGVuY29kZXIgY3JlYXRlIChpZiBhbnkpICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgIG1fcFdyaXRlclZpZGVvU3RyZWFtOyAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiAgICBtX3BXcml0ZXJBdWRpb1N0cmVhbTsgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKiAgbV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvOyAgICAvKio8IFZpZGVvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MqICAgIG1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbzsgICAvKio8IEF1ZGlvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotCi0gICAgLyoqCi0gICAgICogICAgQ29udGV4dHMgb2YgdGhlIHVzZWQgbW9kdWxlcyAgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9SZWFkZXJDb250ZXh0OyAvKio8IENvbnRleHQgb2YgdGhlIGF1ZGlvIHJlYWRlciBtb2R1bGUqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3AzZ3BXcml0ZXJDb250ZXh0OyAgIC8qKjwgQ29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciBtb2R1bGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgbV9wTXA0RW5jb2RlckNvbnRleHQ7ICAvKio8IE1wNCBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgbV9lRW5jb2RlclN0YXRlOwotCi0gICAgLyoqCi0gICAgICogUmVhZGVyIEludGVyZmFjZXMgKi8KLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgIG1fcFJlYWRlckdsb2JJbnQ7ICAgIC8qKjwgUmVhZGVyIGNvbW1vbiBpbnRlcmZhY2UsIGdsb2JhbCBwYXJ0ICovCi0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgICBtX3BSZWFkZXJEYXRhSW50OyAgICAgLyoqPCBSZWFkZXIgY29tbW9uIGludGVyZmFjZSwgZGF0YSBwYXJ0ICovCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZXIgSW50ZXJmYWNlcyAqLwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICBtX3BXcml0ZXJHbG9iSW50OyAgICAgLyoqPCBXcml0ZXIgY29tbW9uIGludGVyZmFjZSwgZ2xvYmFsIHBhcnQgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgbV9wV3JpdGVyRGF0YUludDsgICAgIC8qKjwgV3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UsIGRhdGEgcGFydCAqLwotCi0gICAgLyoqCi0gICAgICogRW5jb2RlciBJbnRlcmZhY2VzICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogIG1fcEVuY29kZXJJbnQ7ICAgICAgICAgICAgICAgIC8qKjwgRW5jb2RlciBjb21tb24gaW50ZXJmYWNlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgIG1fcEVuY29kZXJFeHRlcm5hbEFQSTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgbV9wRW5jb2RlclVzZXJEYXRhOwotCi0gICAgLyoqCi0gICAgICogKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgICAgICBwU2F2ZWRQbGFuZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICB1aVNhdmVkRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgICBWaWRlbyByYXRlIGNvbnRyb2wgc3R1ZmYgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9kTGFzdFZpZGVvUmVndWxDdHM7IC8qKjwgTGFzdCB0aW1lIChDVFMpIHRoZSB2aWRlbyBiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRpb24gaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fbXRDdHM7ICAgICAgICAgLyoqPCBDdXJyZW50IHZpZGVvIGN0cyAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX210TmV4dEN0czsgICAgIC8qKjwgTmV4dCB2aWRlbyBDVFMgdG8gdHJhbnNjb2RlICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fbXRBdWRpb0N0czsgICAgLyoqPCBDdXJyZW50IGF1ZGlvIGN0cyAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX0F1ZGlvT2ZmU2V0OyAgIC8qKjwgQXVkaW8gT2Zmc2V0IHRvIGFkZCB0byB0aGUgY3RzIGluIGxvb3AgbW9kZSovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fUHJldkF1ZGlvQ3RzOyAgLyoqPCBQcmV2aW91cyBhdWRpbyBjdHMgZm9yIEFBQyBsb29waW5nICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fRGVsdGFBdWRpb0N0czsgLyoqPCBEZWx0YSBhdWRpbyBjdHMgZm9yIEFBQyBsb29waW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fQ3VycmVudEZpbGVTaXplOyAvKio8IEN1cnJlbnQgT3V0cHV0IGZpbGUgc2l6ZSAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9NYXhGaWxlU2l6ZTsgICAgIC8qKjwgTWF4IE91dHB1dCBmaWxlIHNpemUgICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1fSXNMYXN0UGljdHVyZTsgICAvKio8IEEgYm9vbGVhbiB0aGF0IHNpZ25hbHMgdG8gdGhlIGVuY29kZXIgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIGxhc3QgZnJhbWUgdG8gYmUgZW5jb2RlZCovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1fYkxhc3RJbnRlcm5hbENhbGxCYWNrOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtX05iQ3VycmVudEZyYW1lOyAgLyoqPCBJbmRleCBvZiB0aGUgY3VycmVudCBZVVYgZnJhbWUgZW5jb2RlZCAqLwotCi0gICAgLyoqCi0gICAgICogICAgQXVkaW8gcGFkZGluZyBtb2RlICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgbV9iQXVkaW9QYWRkaW5nU2lsZW5jZTsgIC8qKjwgQSBib29sZWFuIHRoYXQgc2lnbmFscyB0aGF0IGF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVUgd2lsbCBiZSBwYWRkZWQgYnkgc2lsZW5jZSAqLwotfSBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX2FwcGx5VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICAgQ2FsbCBhbiBleHRlcm5hbCBjYWxsYmFjayB0byBnZXQgdGhlIHBpY3R1cmUgdG8gZW5jb2RlCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgTTRQVE8zR1BQCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKSBDb250YWlucyB0aGUgaW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiAzIHBsYW5lcyB0aGF0IHdpbGwgY29udGFpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IFlVVjQyMCBpbWFnZSByZWFkIHdpdGggdGhlIG1fcFBpY3R1cmVDYWxsYmFja0ZjdAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfYXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000UFRPM0dQUF9JTlRFUk5BTFRZUEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYmI3MTQxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsODE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0FQSV9IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfQVBJX0hfXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9BUEkuaAotICogQGJyaWVmICAgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgM0dQUCBwdWJsaWMgQVBJLgotICogQG5vdGUgICAgVlNTIGFsbG93cyBlZGl0aW5nIDNHUFAgZmlsZXMuCi0gKiAgICAgICAgICBJdCBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBhbmQgZnVsbHkgc3luY2hyb25vdXMgQVBJLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICogIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgT1NBTCB0eXBlcyBmb3IgZmlsZSBhY2Nlc3MgKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0vKioKLSAqICBEZWZpbml0aW9uIG9mIE00X1ZlcnNpb25JbmZvICovCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLS8qKgotICogSW1hZ2UgcGxhbmVzIGRlZmluaXRpb24gKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0vKioKLSAqIENvbW1vbiBkZWZpbml0aW9ucyBvZiB2aWRlbyBlZGl0aW5nIGNvbXBvbmVudHMgKi8KLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIKLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00REFfVHlwZXMuaCIKLQotLyoqCi0gKiBFeHRlbmRlZCBBUEkgKHhWU1MpICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotI2luY2x1ZGUgIk00VlNTM0dQUF9FeHRlbmRlZF9BUEkuaCIKLSNlbmRpZgotCi0vLyNpbmNsdWRlICJNNFZEX0hXX0FQSS5oIgotLy8jaW5jbHVkZSAiTTRWRV9BUEkuaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIEVkaXRpb24gRmVhdHVyZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqICBQdWJsaWMgdHlwZSBvZiB0aGUgVlNTIGVkaXQgY29udGV4dCAqLwotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNFZTUzNHUFBfRWRpdENvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0eXBlcyBvZiB0aGUgVlNTM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lICAgICAgICAgICA9IDAsICAvKio8IE5vIHZpZGVvIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVGcm9tQmxhY2sgID0gOCwgIC8qKjwgSW50ZW5kZWQgZm9yIGJlZ2luIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrICAgID0gMTYsIC8qKjwgSW50ZW5kZWQgZm9yIGVuZCBlZmZlY3QgKi8KLSAgICBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCAgICAgICA9IDI1NiAvKio8IEV4dGVybmFsIGVmZmVjdCBmdW5jdGlvbiBpcyB1c2VkICovCi0gICAgLyogcmVzZXJ2ZWQgMjU2ICsgbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFeHRlcm5hbCBlZmZlY3QgbnVtYmVyIG4gKi8KLQotfSBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX0F1ZGlvRWZmZWN0VHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBhdWRpbyBlZmZlY3QgdHlwZXMgb2YgdGhlIFZTUzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfTm9uZSAgICA9IDAsCi0gICAgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZUluICA9IDgsIC8qKjwgSW50ZW5kZWQgZm9yIGJlZ2luIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX0ZhZGVPdXQgPSAxNiAvKio8IEludGVuZGVkIGZvciBlbmQgZWZmZWN0ICovCi0KLX0gTTRWU1MzR1BQX0F1ZGlvRWZmZWN0VHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9WaWRlb1RyYW5zaXRpb25UeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0aGF0IGNhbiBiZSBhcHBsaWVkIGR1cmluZyBhIHRyYW5zaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lICAgICAgPSAwLAotICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGUgPSAxLAotICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCAgPSAyNTYKLSAgICAvKiByZXNlcnZlZCAyNTYgKyBuICovICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEV4dGVybmFsIHRyYW5zaXRpb24gbnVtYmVyIG4gKi8KLQotfSBNNFZTUzNHUFBfVmlkZW9UcmFuc2l0aW9uVHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9BdWRpb1RyYW5zaXRpb25UeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGF1ZGlvIGVmZmVjdCB0aGF0IGNhbiBiZSBhcHBsaWVkIGR1cmluZyBhIHRyYW5zaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Ob25lID0gMCwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfQ3Jvc3NGYWRlCi0KLX0gTTRWU1MzR1BQX0F1ZGlvVHJhbnNpdGlvblR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gdGhlIGV4dGVybmFsIEVmZmVjdAotICogICAgICAgICAgYW5kIFRyYW5zaXRpb24gZnVuY3Rpb25zCi0gKiBAbm90ZSAgICBUaGUgdWlQcm9ncmVzcyB2YWx1ZSBzaG91bGQgYmUgZW5vdWdoIGZvciBtb3N0IGNhc2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBQcm9ncmVzcyBvZiB0aGUgRWZmZWN0IG9yIHRoZSBUcmFuc2l0aW9uLCBmcm9tIDAgdG8gMTAwMCAob25lIHRob3VzYW5kKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aVByb2dyZXNzOwotICAgIC8qKjwgSW5kZXggb2YgdGhlIGN1cnJlbnQgY2xpcCAoZmlyc3QgY2xpcCBpbiBjYXNlIG9mIGEgVHJhbnNpdGlvbiksIGZyb20gMCB0byBOICovCi0gICAgLy9NNE9TQV9VSW50OCAgICAgdWlDdXJyZW50Q2xpcDsKLSAgICAvKio8IEN1cnJlbnQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBpbiB0aGUgY3VycmVudCBjbGlwIHRpbWUtbGluZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aUNsaXBUaW1lOwotICAgIC8qKjwgQ3VycmVudCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIGluIHRoZSBvdXRwdXQgY2xpcCB0aW1lLWxpbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlPdXRwdXRUaW1lOwotICAgIE00T1NBX0Jvb2wgICAgICAgIGJJc0xhc3Q7Ci0KLX0gTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfY29kZWNUeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvZGVjIHR5cGVzIHVzZWQgdG8gY3JlYXRlIGludGVyZmFjZXMKLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZTUzNHUFAgc2VydmljZXMgdG8gaWRlbnRpZnkKLSAqICAgICAgICAgICAgIGEgY3VycmVudGx5IHN1cHBvcnRlZCBjb2RlYyBpbnRlcmZhY2UuIEVhY2ggY29kZWMgaXMKLSAqICAgICAgICAgICAgcmVnaXN0ZXJlZCB3aXRoIG9uZSBvZiB0aGlzIHR5cGUgYXNzb2NpYXRlZC4KLSAqICAgICAgICAgICAgV2hlbiBhIGNvZGVjIGluc3RhbmNlIGlzIG5lZWRlZCwgdGhpcyB0eXBlIGlzIHVzZWQgdG8KLSAqICAgICAgICAgICAgaWRlbnRpZnkgYW5kIHJldHJpZXZlIGl0cyBpbnRlcmZhY2UuCi0gKiAgICAgICAgICAgIFRoaXMgY2FuIGJlIGV4dGVuZGVkIGZvciBvdGhlciBjb2RlY3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qIFZpZGVvIERlY29kZXIgVHlwZXMgKi8KLSAgICBNNFZTUzNHUFBfa1ZpZGVvRGVjTVBFRzQgPSAwLAotICAgIE00VlNTM0dQUF9rVmlkZW9EZWNIMjY0LAotCi0gICAgLyogVmlkZW8gRW5jb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FbmNNUEVHNCwKLSAgICBNNFZTUzNHUFBfa1ZpZGVvRW5jSDI2MywKLSAgICBNNFZTUzNHUFBfa1ZpZGVvRW5jSDI2NCwKLQotICAgIC8qIEF1ZGlvIERlY29kZXIgVHlwZXMgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvRGVjQU1STkIsCi0gICAgTTRWU1MzR1BQX2tBdWRpb0RlY0FBQywKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRGVjTVAzLAotCi0gICAgLyogQXVkaW8gRW5jb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9FbmNBTVJOQiwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRW5jQUFDLAotCi0gICAgLyogbnVtYmVyIG9mIGNvZGVjcywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnksIGJlZm9yZSBpbnZsYWlkIHR5cGUgKi8KLSAgICBNNFZTUzNHUFBfa0NvZGVjVHlwZV9OQiwKLSAgICAvKiBpbnZhbGlkIGNvZGVjIHR5cGUgKi8KLSAgICBNNFZTUzNHUFBfa0NvZGVjVHlwZUludmFsaWQgPSAyNTUKLQotfSBNNFZTUzNHUFBfY29kZWNUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9lZGl0VmlkZW9FZmZlY3RGY3QKLSAqIEBicmllZiAgICAgICBCZWdpbiBhbmQgRW5kIHZpZGVvIGVmZmVjdCBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICBtdXN0IG1hdGNoIHRoaXMgcHJvdG90eXBlLgotICogQG5vdGUgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRoZSBvcmlnaW5hbCBpbWFnZSBvZiB0aGUgY2xpcC4KLSAqICAgICAgICAgICAgICBJdCBtdXN0IGFwcGx5IHRoZSB2aWRlbyBlZmZlY3QgdG8gYnVpbGQgdGhlIG91dHB1dCBpbWFnZS4KLSAqICAgICAgICAgICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIGVmZmVjdCBpcyBnaXZlbiwgb24gYSBzY2FsZSBmcm9tIDAgdG8gMTAwMC4KLSAqICAgICAgICAgICAgICBXaGVuIHRoZSBlZmZlY3QgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMKLSAqICAgICAgICAgICAgICBhbmQgYnVmZmVycyBhcmUgdmFsaWQgYW5kIG93bmVkIGJ5IHRoZSBWU1MgM0dQUC4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICBwSW5wdXRQbGFuZXMgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcE91dHB1dFBsYW5lcyAgICAgICAoSU4vT1VUKSBPdXRwdXQgKGZpbHRlcmVkKSBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhyZWUgdmFsaWQgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gdHJhbnNpdGlvbiBwcm9ncmVzcy4KLSAqIEBwYXJhbSAgIHVpRXh0ZXJuYWxFZmZlY3RJZCAgKElOKSBXaGljaCBlZmZlY3QgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgKGZvciBleHRlcm5hbCBlZmZlY3RzKQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00VlNTM0dQUF9lZGl0VmlkZW9FZmZlY3RGY3QpCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRXh0ZXJuYWxFZmZlY3RJZAotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZWRpdFZpZGVvVHJhbnNpdGlvbkZjdAotICogQGJyaWVmICAgICAgIEV4dGVybmFsIHRyYW5zaXRpb24gZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgbXVzdCBtYXRjaCB0aGlzIHByb3RvdHlwZS4KLSAqIEBub3RlICAgICAgICBUaGUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW1hZ2Ugb2YgdGhlIGZpcnN0IGNsaXAgYW5kCi0gKiAgICAgICAgICAgICAgdGhlIGltYWdlIG9mIHRoZSBzZWNvbmQgY2xpcC4gSXQgbXVzdCBidWlsZCB0aGUgb3V0cHV0IGltYWdlCi0gKiAgICAgICAgICAgICAgZnJvbSB0aGUgdHdvIGlucHV0IGltYWdlcy4KLSAqICAgICAgICAgICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIHRyYW5zaXRpb24gaXMgZ2l2ZW4sIG9uIGEgc2NhbGUgZnJvbSAwIHRvIDEwMDAuCi0gKiAgICAgICAgICAgICAgV2hlbiB0aGUgZXh0ZXJuYWwgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIGltYWdlIHBsYW5lCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlcyBhbmQgYnVmZmVycyBhcmUgdmFsaWQgYW5kIG93bmVkIGJ5IHRoZSBWU1MgM0dQUC4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICBwQ2xpcDFJbnB1dFBsYW5lcyAgIChJTikgRmlyc3QgaW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcENsaXAySW5wdXRQbGFuZXMgICAoSU4pIFNlY29uZCBpbnB1dCBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwT3V0cHV0UGxhbmVzICAgICAgIChJTi9PVVQpIE91dHB1dCAoZmlsdGVyZWQpIFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChJTikgU2V0IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbyBlZmZlY3QgcHJvZ3Jlc3MuCi0gKiBAcGFyYW0gICB1aUV4dGVybmFsVHJhbnNpdGlvbklkICAgIChJTikgV2hpY2ggdHJhbnNpdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9yIGV4dGVybmFsIHRyYW5zaXRpb25zKQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00VlNTM0dQUF9lZGl0VmlkZW9UcmFuc2l0aW9uRmN0KQotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBDbGlwMUlucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwQ2xpcDJJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUV4dGVybmFsVHJhbnNpdGlvbklkCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGF1ZGlvL3ZpZGVvIGVmZmVjdCBmb3IgdGhlIGVkaXRpb24uCi0gKiBAbm90ZSAgICBFZmZlY3Qgc3RhcnQgdGltZSBpcyByZWxhdGl2ZSB0byBvdXRwdXQgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgIHVpU3RhcnRUaW1lOyAgICAgICAgICAgLyoqPCBJbiBtcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgdWlEdXJhdGlvbjsgICAgICAgICAgICAvKio8IEluIG1zICovCi0gICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSAgICBWaWRlb0VmZmVjdFR5cGU7ICAgICAgIC8qKjwgTm9uZSwgRmFkZUluLCBGYWRlT3V0LCBldGMuICovCi0gICAgTTRWU1MzR1BQX2VkaXRWaWRlb0VmZmVjdEZjdCBFeHRWaWRlb0VmZmVjdEZjdDsgICAgIC8qKjwgRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICpwRXh0VmlkZW9FZmZlY3RGY3RDdHh0Oy8qKjwgQ29udGV4dCBnaXZlbiB0byB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNFZTUzNHUFBfQXVkaW9FZmZlY3RUeXBlICAgIEF1ZGlvRWZmZWN0VHlwZTsgICAgICAgLyoqPCBOb25lLCBGYWRlSW4sIEZhZGVPdXQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSAgICBNNHhWU1NfRWZmZWN0U2V0dGluZ3MgICAgICAgICB4VlNTOwotI2VuZGlmCi0KLX0gTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXIKLSAqIEBicmllZiAgICBUcmFuc2l0aW9uIGJlaGF2aW9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1NwZWVkVXAgPSAwLAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX0xpbmVhciwKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TcGVlZERvd24sCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU2xvd01pZGRsZSwKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9GYXN0TWlkZGxlCi19IE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgdHJhbnNpdGlvbiB0byBiZSBhcHBsaWVkIHdoZW4gYXNzZW1ibGluZyB0d28gY2xpcHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiwgaW4gbWlsbGlzZWNvbmRzIChzZXQgdG8gMCB0byBnZXQgbm8gdHJhbnNpdGlvbikgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICB1aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgIC8qKjwgVHlwZSBvZiB0aGUgdmlkZW8gdHJhbnNpdGlvbiAqLwotICAgIE00VlNTM0dQUF9WaWRlb1RyYW5zaXRpb25UeXBlICAgIFZpZGVvVHJhbnNpdGlvblR5cGU7Ci0KLSAgICAvKio8IEV4dGVybmFsIHRyYW5zaXRpb24gdmlkZW8gZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRWU1MzR1BQX2VkaXRWaWRlb1RyYW5zaXRpb25GY3QgRXh0VmlkZW9UcmFuc2l0aW9uRmN0OwotCi0gICAgLyoqPCBDb250ZXh0IG9mIHRoZSBleHRlcm5hbCB0cmFuc2l0aW9uIHZpZGVvIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAgKnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0OwotICAgIE00VlNTM0dQUF9BdWRpb1RyYW5zaXRpb25UeXBlICAgIEF1ZGlvVHJhbnNpdGlvblR5cGU7ICAgLyoqPCBUeXBlIG9mIHRoZSBhdWRpbyB0cmFuc2l0aW9uICovCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXIgICAgIFRyYW5zaXRpb25CZWhhdmlvdXI7ICAgIC8qKjxUcmFuc2l0aW9uIGJlaGF2aW91ciovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0gICAgTTR4VlNTX1RyYW5zaXRpb25TZXR0aW5ncyAgICAgICAgeFZTUzsKLSNlbmRpZgotCi19IE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGlucHV0IGNsaXAgZm9yIHRoZSBlZGl0aW9uLgotICogQG5vdGUgICAgSXQgYWxzbyBjb250YWlucyB0aGUgc2V0dGluZ3MgZm9yIHRoZSBjdXQgYW5kIGJlZ2luL2VuZCBlZmZlY3RzIGFwcGxpZWQgdG8gdGhlIGNsaXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICpwRmlsZTsgICAgICAgICAgICAvKio8IENsaXAgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICBGaWxlVHlwZTsgICAgICAgICAvKio8IC4zZ3AsIC5hbXIsIC5tcDMgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aFNpemU7ICAgICAgLyoqPCBDbGlwIHBhdGggc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkIGJlY2F1c2Ugb2YgVVRGMTYgY29udmVyc2lvbikqLwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICAgQ2xpcFByb3BlcnRpZXM7ICAgLyoqPCBDbGlwIGFuYWx5c2lzIHByZXZpb3VzbHkgY29tcHV0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5DdXRUaW1lOyAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRUaW1lOyAgICAgLyoqPCBFbmQgY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgYlRyYW5zY29kaW5nUmVxdWlyZWQ7Ci0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0gICAgTTR4VlNTX0NsaXBTZXR0aW5ncyAgICAgICAgICAgICB4VlNTOwotI2VuZGlmCi0KLX0gTTRWU1MzR1BQX0NsaXBTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVmaW5lIGEgY29tcGxldGUKLSAqICAgICAgICAgIGVkaXRpb24gb3BlcmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50IG9mIHRoZSBjbGlwIGxpc3QgcENsaXBMaXN0ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgdWlDbGlwTnVtYmVyOwotICAgIC8qKjwgVGhlIHByb3BlcnRpZXMgb2YgdGhpcyBjbGlwIHdpbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgY29tcGF0aWJpbGl0eSBjaGVja2luZyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgIHVpTWFzdGVyQ2xpcDsKLSAgICAvKio8IExpc3Qgb2YgdGhlIGlucHV0IGNsaXBzIHNldHRpbmdzLiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHVpQ2xpcE51bWJlcgotICAgICBjbGlwIHNldHRpbmdzIHBvaW50ZXJzICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgICAgKipwQ2xpcExpc3Q7Ci0gICAgLyoqPCBMaXN0IG9mIHRoZSB0cmFuc2l0aW9uIHNldHRpbmdzLiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHVpQ2xpcE51bWJlci0xCi0gICAgIHRyYW5zaXRpb24gc2V0dGluZ3MgcG9pbnRlcnMgKi8KLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICAgICAqKnBUcmFuc2l0aW9uTGlzdDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgICAgICAgICAqRWZmZWN0czsgICAgICAgICAvKio8IExpc3Qgb2YgZWZmZWN0cyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgIG5iRWZmZWN0czsgICAgIC8qKjwgTnVtYmVyIG9mIGVmZmVjdHMgaW4gdGhlIGFib3ZlIGxpc3QgKi8KLSAgICAvKio8IEZyYW1lIHJhdGUgYXQgd2hpY2ggdGhlIG1vZGlmaWVkIHZpZGVvIHNlY3Rpb25zIHdpbGwgYmUgZW5jb2RlZCAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgIHZpZGVvRnJhbWVSYXRlOwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwT3V0cHV0RmlsZTsgICAgICAvKio8IE91dHB1dCAzR1BQIGNsaXAgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgdWlPdXRwdXRQYXRoU2l6ZTsgICAgLyoqPCBPdXRwdXQgZmlsZSBwYXRoIHNpemUqLwotICAgIC8qKjwgVGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgbWV0YWRhdGEgKCJtb292LmJpbiIpICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnBUZW1wb3JhcnlGaWxlOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotICAgIE00eFZTU19FZGl0U2V0dGluZ3MgICAgICAgICAgICAgIHhWU1M7Ci0jZW5kaWYKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgUFRWb2xMZXZlbDsKLX0gTTRWU1MzR1BQX0VkaXRTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIGEgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIDNHUFAgZWRpdGluZwotICogQG5vdGUgICAgSXQgYWxzbyBmaWxscyBhIENsaXBBbmFseXNpcyBzdHJ1Y3R1cmUsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIHR3bwotICogICAgICAgICAgY2xpcHMgYXJlIGNvbXBhdGlibGUKLSAqIEBwYXJhbSAgIHBDbGlwICAgICAgICAgICAgICAgKElOKSBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGlucHV0IDNHUFAvTVAzIGNsaXAgZmlsZS4KLSAqIEBwYXJhbSAgIHBDbGlwUHJvcGVydGllcyAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHBhcmFtICAgRmlsZVR5cGUgICAgICAgICAgICAoSU4pIFR5cGUgb2YgdGhlIGlucHV0IGZpbGUgKC4zZ3AsIC5hbXIsIC5tcDMpCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfSDI2M19QUk9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQwotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKE00T1NBX1ZvaWQgKnBDbGlwLCBNNFZJREVPRURJVElOR19GaWxlVHlwZSBGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICAqcENsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgY2hlY2tpbmcgaWYgdHdvIGNsaXBzIGFyZSBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlcgotICogICAgICAgICAgZm9yIFZTUyAzR1BQIGVkaXRpbmcgYXNzZW1ibHkgZmVhdHVyZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcDFQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIGZpcnN0IGNsaXAKLSAqIEBwYXJhbSAgIHBDbGlwMlByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfUExBVEZPUk0KLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRlJBTUVfU0laRQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkcKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICAqcENsaXAxUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICpwQ2xpcDJQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRJbml0KCkKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgVlNTIDNHUFAgZWRpdCBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIDNHUFAgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0SW5pdCgKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQqIHBDb250ZXh0LAotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0ICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBTaXplIG9mIHRoZSBjbGlwIHBhdGggKG5lZWRlZCBmb3IgVVRGMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlLCBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzIChkZXByZWNhdGVkKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc09yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiQ29weUVmZmVjdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0T3BlbigpCi0gKiBAYnJpZWYgICBTZXQgdGhlIFZTUyAzR1BQIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMsIGFuZCBzZXQgdGhlIHNldHRpbmdzLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgIHBTZXR0aW5ncyAgICAgICAgICAgKElOKSBFZGl0IHNldHRpbmdzCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdE9wZW4oTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LCBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFN0ZXAoKQotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBlZGl0aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGVkaXRpbmcgb3BlcmF0aW9uCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgICAgIFZTUyAzR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTpFZGl0aW9uIGlzIGRvbmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdGVwKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICogQGJyaWVmICAgRmluaXNoIHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgVlNTIDNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbG9zZShNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsZWFuVXAoKQotICogQGJyaWVmICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIEF1ZGlvIE1peGluZyBGZWF0dXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioKLSAqICBQdWJsaWMgdHlwZSBvZiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2V0dGluZ3Mgb2YgdGhlIGF1ZGlvIG1peGluZyBvcGVyYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9yaWdpbmFsQ2xpcEZpbGU7ICAgICAgLyoqPCBJbnB1dCAzR1BQIGNsaXAgZmlsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkZWRBdWRpb1RyYWNrRmlsZTsgICAvKio8IE5ldyBhdWRpbyB0cmFjayAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgICAgICBBZGRlZEF1ZGlvRmlsZVR5cGU7ICAgICAvKio8IEZpbGUgRm9ybWF0IG9mIHRoZSBuZXcgYXVkaW8gZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUFkZEN0czsgICAgICAgICAgICAgICAvKio8IFRpbWUsIGluIG1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgd2hpY2ggdGhlIGFkZGVkIGF1ZGlvIHRyYWNrIGlzIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQWRkVm9sdW1lOyAgICAgICAgICAgIC8qKjwgVm9sdW1lLCBpbiBwZXJjZW50YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGFkZGVkIGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5Mb29wOyAgICAgICAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHRpbWUgb2YgdGhlIGxvb3AgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlFbmRMb29wOyAgICAgICAgICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBvZiB0aGUgbG9vcCAoMCBtZWFucyBubyBsb29wKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVtb3ZlT3JpZ2luYWw7ICAgICAgLyoqPCBJZiB0cnVlLCB0aGUgb3JpZ2luYWwgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dENsaXBGaWxlOyAgICAgIC8qKjwgT3V0cHV0IDNHUFAgY2xpcCBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlOyAgICAgICAvKio8IFRlbXBvcmFyeSBmaWxlIHRvIHN0b3JlIG1ldGFkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibW9vdi5iaW4iKSAqLwotICAgIC8qKjwgVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBvcHRpb25uYWwuIFRoZXkgYXJlIGp1c3QgdXNlZCBpbiBjYXNlIG9mIE1QMyByZXBsYWNlbWVudC4gKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICAgb3V0cHV0QVNGOyAgICAgICAgIC8qKjwgT3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICBvdXRwdXRBdWRpb0Zvcm1hdDsgLyoqPCBPdXRwdXQgYXVkaW8gY29kZWMoQUFDL0FNUikqLwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgICAgICAgICBvdXRwdXRBdWRpb0JpdHJhdGU7IC8qKjwgT3V0cHV0IGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TkJDaGFubmVsczsgLyoqPCBPdXRwdXQgYXVkaW8gbmIgb2YgY2hhbm5lbHMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYl9EdWNraW5nTmVlZGVlZDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQVFZvbExldmVsOwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfbG93Vm9sdW1lOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTG9vcDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOdW1DaGFubmVsczsKLX0gTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCogcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyogcFNldHRpbmdzKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIHZhbGlkIGF1ZGlvIG1peGluZyBzZXR0aW5ncwotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCgKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyogcFNldHRpbmdzLAotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0ICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoKQotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpbyBtaXhpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgICAgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZmluYWxpemF0aW9uIG9wZXJhdGlvbgotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgICAgICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOiBBdWRpbyBtaXhpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93IGNhbGwgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKQotICogQGJyaWVmICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBDb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIEV4dHJhY3QgUGljdHVyZSBGZWF0dXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioKLSAqICBQdWJsaWMgdHlwZSBvZiB0aGUgVlNTIGV4dHJhY3QgcGljdHVyZSBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNldHRpbmdzIG9mIHRoZSBleHRyYWN0IHBpY3R1cmUgYXVkaW8gb3BlcmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0Q2xpcEZpbGU7ICAvKio8IElucHV0IDNHUFAgY2xpcCBmaWxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgaUV4dHJhY3Rpb25UaW1lOyAvKio8IGZyYW1lIHRpbWUgKGluIG1zKSB0byBiZSBleHRyYWN0ZWQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0WXV2UGljOyAgIC8qKjwgT3V0cHV0IFlVViBwaWN0dXJlIG5hbWUgKi8KLX0gTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU2V0dGluZ3M7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUluaXQoKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgZXh0cmFjdCBwaWN0dXJlIG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgZXh0cmFjdCBwaWN0dXJlIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcFdpZHRoICAgICAgICAgICAgICAgIChPVVQpIHZpZGVvIHN0cmVhbSB3aWR0aAotICogQHBhcmFtICAgIHBIZWlnaHQgICAgICAgICAgICAgICAgKE9VVCkgdmlkZW8gc3RyZWFtIGhlaWdodAotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQMTogICAgVGhlIGlucHV0IGNsaXAgaXMgZW1wdHkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUluaXQoCi0gICAgICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTZXR0aW5ncyogcFNldHRpbmdzLAotICAgICAgICBNNE9TQV9VSW50MzIgKnBXaWR0aCwKLSAgICAgICAgTTRPU0FfVUludDMyICpwSGVpZ2h0LAotICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVTdGVwKCkKLSAqIEBicmllZiAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgcGljdHVyZSBleHRyYWN0aW9uLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgKElOKSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEBwYXJhbSAgIHBEZWNQbGFuZXMgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUGxhbmUgaW4gd2ljaCB0aGUgZXh0cmFjdGVkIHBpY3R1cmUgaXMgY29waWVkCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgICAgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwaWN0dXJlIGV4dHJhY3Rpb24KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIFZTU19XQVJfRU5EX09GX0VYVFJBQ1RfUElDVFVSRTogUGljdHVyZSBleHRyYWN0aW9uICBpcyBvdmVyLCB1c2VyIHNob3VsZCBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZVN0ZXAoTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwRGVjUGxhbmVzLCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlQ2xlYW5VcCgpCi0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIHBpY3R1cmUgZXh0cmFjdGlvbi4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIGV4dHJhY3QgcGljdHVyZSBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIENvbW1vbiBmZWF0dXJlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfR2V0VmVyc2lvbigpCi0gKiBAYnJpZWYgICBHZXQgdGhlIFZTUyB2ZXJzaW9uLgotICogQG5vdGUgICAgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotCi0KLSNpZmRlZiBXSU4zMgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZSgpCi0gKiBAYnJpZWYgICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZXJyb3IgY29kZQotICogQG5vdGUgICAgVGhlIGlucHV0IHN0cmluZyBtdXN0IGJlIGFscmVhZHkgYWxsb2NhdGVkIChhbmQgbG9uZyBlbm91Z2ghKQotICogQHBhcmFtICAgZXJyICAgICAgICAgICAgIChJTikgRXJyb3IgY29kZSB0byBnZXQgdGhlIGRlc2NyaXB0aW9uIGZyb20KLSAqIEBwYXJhbSAgIHNNZXNzYWdlICAgICAgICAoSU4vT1VUKSBBbGxvY2F0ZWQgc3RyaW5nIGluIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiB3aWxsIGJlIGNvcGllZAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgIElucHV0IGVycm9yIGlzIGZyb20gdGhlIFZTUzNHUFAgbW9kdWxlCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6SW5wdXQgZXJyb3IgaXMgbm90IGZyb20gdGhlIFZTUzNHUFAgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKE00T1NBX0VSUiBlcnIsIE00T1NBX0NoYXIqIHNNZXNzYWdlKTsKLSNlbmRpZiAvKio8IFdJTjMyICovCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXJyb3JDb2Rlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzUwMGRhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0Vycm9yQ29kZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0Vycm9yQ29kZXMuaAotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZXJyb3IgZGVmaW5pdGlvbnMuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfRXJyb3JDb2Rlc19IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfRXJyb3JDb2Rlc19IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCBjb3JlIElEIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFdhcm5pbmcgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqICAgIEVuZCBvZiBlZGl0aW9uLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNFZTUzNHUFBfZWRpdENsb3NlKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAwMSkKLQotLyoqCi0gKiAgICBFbmQgb2YgYXVkaW8gbWl4aW5nLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAxMCkKLQotLyoqCi0gKiAgICBFbmQgb2YgZXh0cmFjdCBwaWN0dXJlLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfRVhUUkFDVF9QSUNUVVJFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAyMCkKLS8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDMwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXJyb3IgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogSW52YWxpZCBmaWxlIHR5cGUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRSAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDEpCi0vKioKLSAqIEludmFsaWQgZWZmZWN0IGtpbmQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDIpCi0vKioKLSAqIEludmFsaWQgZWZmZWN0IHR5cGUgZm9yIHZpZGVvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDAzKQotLyoqCi0gKiBJbnZhbGlkIGVmZmVjdCB0eXBlIGZvciBhdWRpbyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEUgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwNCkKLS8qKgotICogSW52YWxpZCB0cmFuc2l0aW9uIHR5cGUgZm9yIHZpZGVvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA1KQotLyoqCi0gKiBJbnZhbGlkIHRyYW5zaXRpb24gdHlwZSBmb3IgYXVkaW8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX1RSQU5TSVRJT05fVFlQRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDYpCi0vKioKLSAqIEludmFsaWQgdmlkZW8gZW5jb2RpbmcgZnJhbWUgcmF0ZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA3KQotIC8qKgotICogRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uIGlzIHVzZWQgd2l0aG91dCBiZWluZyBzZXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDgpCi0vKioKLSAqIEV4dGVybmFsIHRyYW5zaXRpb24gZnVuY3Rpb24gaXMgdXNlZCB3aXRob3V0IGJlaW5nIHNldCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTCAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwOSkKLQotLyoqCi0gKiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgdGhhbiB0aGUgY2xpcCBkdXJhdGlvbiAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTiAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxMCkKLS8qKgotICogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIG9yIGVxdWFsIHRoYW4gZW5kIGN1dCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9FTkRfQ1VUICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxMSkKLS8qKgotICogVHdvIGNvbnNlY3V0aXZlIHRyYW5zaXRpb25zIGFyZSBvdmVybGFwcGluZyBvbiBvbmUgY2xpcCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX09WRVJMQVBQSU5HX1RSQU5TSVRJT05TICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxMikKLQotLyoqCi0gKiBBbiBpbnB1dCAzR1BQIGZpbGUgaXMgaW52YWxpZC9jb3JydXB0ZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRSAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTYpCi0vKioKLSAqIEEgZmlsZSBjb250YWlucyBhbiB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTcpCi0vKioKLSAqIEEgZmlsZSBjb250YWlucyBhbiB1bnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTgpCi0KLS8qKgotICogQSBmaWxlIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBWU1MgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTkpCi0gLyoqCi0gKiAgICBBbiBpbnB1dCBjbGlwIGhhcyBhbiB1bmV4cGVjdGVkbHkgbGFyZ2UgVmlkZW8gQVUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMUEpCi0vKioKLSAqICAgIEFuIGlucHV0IGNsaXAgaGFzIGFuIHVuZXhwZWN0ZWRseSBsYXJnZSBBdWRpbyBBVSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxQikKLS8qKgotICogICAgQW4gaW5wdXQgY2xpcCBoYXMgYSBjb3JydXB0ZWQgQXVkaW8gQU1SIEFVICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMUMpCi0vKioKLSAqIFRoZSB2aWRlbyBlbmNvZGVyIGVuY291bnRlcmVkIGFuIEFjY2VzIFVuaXQgZXJyb3I6IHZlcnkgcHJvYmFibHkgYSBmaWxlIHdyaXRlIGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMUQpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVycm9ycyByZXR1cm5lZCBieSBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFVuc3VwcG9ydGVkIHZpZGVvIGZvcm1hdCBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFUIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjApCi0vKioKLSAqIFVuc3VwcG9ydGVkIEgyNjMgcHJvZmlsZSBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfSDI2M19QUk9GSUxFIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjEpCi0vKioKLSAqIFVuc3VwcG9ydGVkIE1QRUctNCBwcm9maWxlIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjIpCi0vKioKLSAqIFVuc3VwcG9ydGVkIE1QRUctNCBSVkxDIHRvb2wgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEMgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDIzKQotLyoqCi0gKiBVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDI0KQotIC8qKgotICogRmlsZSBjb250YWlucyBubyBzdXBwb3J0ZWQgc3RyZWFtICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAyNSkKLS8qKgotICogRmlsZSBjb250YWlucyBubyB2aWRlbyBzdHJlYW0gb3IgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMjYpCi0vKioKLSAqIFVuc3VwcG9ydGVkIHZpZGVvIHByb2ZpbGUgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX1BST0ZJTEUgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyNykKLQotLyoqCi0gKiBVbnN1cHBvcnRlZCB2aWRlbyBwcm9maWxlIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19MRVZFTCBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDI4KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXJyb3JzIHJldHVybmVkIGJ5IE00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eSgpICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogQXQgbGVhc3Qgb25lIG9mIHRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBhbm90aGVyIHZlcnNpb24gb2YgdGhlIFZTUyAzR1BQICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04gICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDMwKQotLyoqCi0gKiBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIHZpZGVvIGZvcm1hdCAoSDI2MyBvciBNUEVHNCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMzEpCi0vKioKLSAqICAgIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgZnJhbWUgc2l6ZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GUkFNRV9TSVpFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzMikKLS8qKgotICogICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBNUEVHLTQgdGltZSBzY2FsZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19USU1FX1NDQUxFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzMykKLS8qKgotICogICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSB1c2Ugb2YgTVBFRy00IGRhdGEgcGFydGl0aW9uaW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAzNCkKLS8qKgotICogICAgTVAzIGNsaXBzIGNhbid0IGJlIGFzc2VtYmxlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzNSkKLS8qKgotICogIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgYXVkaW8gc3RyZWFtIHR5cGUgKGV4OiBBTVIgIT0gQUFDKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TVFJFQU1fVFlQRSAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAzNikKLS8qKgotICogIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgYXVkaW8gbnVtYmVyIG9mIGNoYW5uZWxzIChleDogc3RlcmVvICE9IG1vbm8pICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX05CX09GX0NIQU5ORUxTICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDM3KQotLyoqCi0gKiAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBzYW1wbGluZyBmcmVxdWVuY3kgKGV4OiA0NDEwMEh6ICE9IDE2MDAwSHopICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMzgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBBdWRpbyBtaXhpbmcgZXJyb3IgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFRoZSBpbnB1dCAzR1BQIGZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgc3VwcG9ydGVkIGF1ZGlvIG9yIHZpZGVvIHRyYWNrICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDUwKQotLyoqCi0gKiBUaGUgVm9sdW1lIG9mIHRoZSBhZGRlZCBhdWRpbyB0cmFjayAoQWRkVm9sdW1lKSBtdXN0IGJlIHN0cmljdGx5IHN1cGVyaW9yIHRoYW4gemVybyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTyAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDA1MSkKLS8qKgotICogVGhlIHRpbWUgYXQgd2hpY2ggdGhlIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIChBZGRDdHMpIGNhbid0IGJlIHN1cGVyaW9yIHRoYW4gdGhlCi0gICBpbnB1dCB2aWRlbyB0cmFjayBkdXJhdGlvbiAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTiAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1MikKLS8qKgotICogVGhlIGF1ZGlvIHRyYWNrIGZpbGUgZm9ybWF0IHNldHRpbmcgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVU5ERUZJTkVEX0FVRElPX1RSQUNLX0ZJTEVfRk9STUFUICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDUzKQotLyoqCi0gKiBUaGUgYWRkZWQgYXVkaW8gdHJhY2sgc3RyZWFtIGhhcyBhbiB1bnN1cHBvcnRlZCBmb3JtYXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU0gICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDU0KQotLyoqCi0gKiBUaGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgZG9lc24ndCBzdXBwb3J0IEVWUkMsIE1QMyBhdWRpbyB0cmFja3MgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BVURJT19NSVhJTkdfVU5TVVBQT1JURUQgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDU1KQotLyoqCi0gKiBBbiBhZGRlZCBhdWRpbyB0cmFjayBsaW1pdCB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzOiB1aUFkZEN0cyBtdXN0IGJlIDAKLSAgIGFuZCBiUmVtb3ZlT3JpZ2luYWwgbXVzdCBiZSBNNE9TQV9UUlVFICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRkVBVFVSRV9VTlNVUFBPUlRFRF9XSVRIX0FVRElPX1RSQUNLICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTYpCi0vKioKLSAqIElucHV0IGF1ZGlvIHRyYWNrIGlzIG5vdCBBTVItTkIgbm9yIEFBQyBzbyBpdCBjYW4ndCBiZSBtaXhlZCB3aXRoIG91dHB1dCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRCAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDU3KQotLyoqCi0gKiBJbnB1dCBjbGlwIG11c3QgYmUgYSAzZ3BwIGZpbGUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1OCkKLS8qKgotICogQmVnaW4gbG9vcCB0aW1lIGlzIGhpZ2hlciB0aGFuIGVuZCBsb29wIHRpbWUgb3IgaGlnaGVyIHRoYW4gYWRkZWQgY2xpcCBkdXJhdGlvbiAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUCAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDU5KQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBBdWRpbyBtaXhpbmcgYW5kIGV4dHJhY3QgcGljdHVyZSBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBIMjYzIFByb2ZpbGUgMyBsZXZlbCAxMCBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDYwKQotLyoqCi0gKiBGaWxlIGNvbnRhaW5zIG5vIHZpZGVvIHN0cmVhbSBvciBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNjEpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEludGVybmFsIGVycm9yIGFuZCB3YXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEludGVybmFsIHN0YXRlIGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEUgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMDApCi0vKioKLSAqIEx1bWluYW5jZSBmaWx0ZXIgZWZmZWN0IGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1IgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMDQpCi0vKioKLSAqIFRyYW5zaXRpb24gZmlsdGVyIGVmZmVjdCBlcnJvciAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1RSQU5TSVRJT05fRklMVEVSX0VSUk9SICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTA2KQotLyoqCi0gKiBUaGUgYXVkaW8gZGVjb2RlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDExMCkKLS8qKgotICogVGhlIGRlY29kZXIgcHJvZHVjZWQgYW4gdW5hdHRlbmRlZCBhbW91bnQgb2YgUENNICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFRF9QQ01fU0laRV9JU1NVRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMTUpCi0vKioKLSAqIE91dHB1dCBmaWxlIG11c3QgYmUgM0dQUCBvciBNUDMgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9PVVRQVVRfRklMRV9UWVBFX0VSUk9SICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDExNykKLS8qKgotICogQ2FuIG5vdCBmaW5kIGEgdmFsaWQgdmlkZW8gZnJhbWUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTE4KQotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfRXJyb3JDb2Rlc19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FeHRlbmRlZF9BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTY2OGI2Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FeHRlbmRlZF9BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000VlNTM0dQUF9FWFRFTkRFRF9BUElfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0VYVEVOREVEX0FQSV9IX18KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgKLSAqIEBicmllZiAgICBBUEkgb2YgeFZTUwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotI2Vycm9yICIqKiogdGhlIGZsYWcgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUyBzaG91bGQgYmUgYWN0aXZhdGVkIGluIENvbXBpbGVyU3dpdGNoZXNcCi0gICAgICAgICAgICAgZm9yIFZpZGVvU3R1ZGlvICoqKiIKLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfZ2V0VGV4dFJnYkJ1ZmZlckZjdAotICogQGJyaWVmICAgICAgICBFeHRlcm5hbCB0ZXh0IHRvIFJHQiBidWZmZXIgZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgICBtdXN0IG1hdGNoIHRoaXMgcHJvdG90eXBlLgotICogQG5vdGUgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRoZSByZW5kZXJpbmdEYXRhLCB0aGUgdGV4dCBidWZmZXIgYW5kCi0gKiAgICAgICAgICAgICAgICBpdHMgc2l6ZS4gSXQgbXVzdCBidWlsZCB0aGUgb3V0cHV0IFJHQiBpbWFnZSBwbGFuZSBjb250YWluaW5nIHRoZSB0ZXh0LgotICoKLSAqIEBwYXJhbSAgIHBSZW5kZXJpbmdEYXRhICAgIChJTikgVGhlIGRhdGEgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gTTR4VlNTX0VmZmVjdFNldHRpbmdzCi0gKiBAcGFyYW0gICAgcFRleHRCdWZmZXIgICAgICAgIChJTikgVGV4dCBidWZmZXIgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gTTR4VlNTX0VmZmVjdFNldHRpbmdzCi0gKiBAcGFyYW0gICAgdGV4dEJ1ZmZlclNpemUgICAgKElOKSBUZXh0IGJ1ZmZlciBzaXplIGdpdmVuIGJ5IHRoZSB1c2VyIGluIE00eFZTU19FZmZlY3RTZXR0aW5ncwotICogQHBhcmFtICAgIHBPdXRwdXRQbGFuZSAgICAoSU4vT1VUKSBPdXRwdXQgUkdCNTY1IGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNHhWU1NfZ2V0VGV4dFJnYkJ1ZmZlckZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICpwUmVuZGVyaW5nRGF0YSwKLSAgICBNNE9TQV9Wb2lkICpwVGV4dEJ1ZmZlciwKLSAgICBNNE9TQV9VSW50MzIgdGV4dEJ1ZmZlclNpemUsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKipwT3V0cHV0UGxhbmUKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19CR01TZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYWRkIEJhY2tncm91bmQgbXVzaWMgdG8gM2dwIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAqcEZpbGU7ICAgICAgICAgLyoqPCBJbnB1dCBmaWxlIHBhdGggKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgRmlsZVR5cGU7ICAgICAgIC8qKjwgLjNncCwgLmFtciwgLm1wMyAgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBZGRDdHM7ICAgICAgIC8qKjwgVGltZSwgaW4gbWlsbGlzZWNvbmRzLCBhdCB3aGljaCB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYWNrIGlzIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpQWRkVm9sdW1lOyAgICAgLyoqPCBWb2x1bWUsIGluIHBlcmNlbnRhZ2UsIG9mIHRoZSBhZGRlZCBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUJlZ2luTG9vcDsgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZSBzdGFydCB0aW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsb29wICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpRW5kTG9vcDsgICAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIGVuZCB0aW1lIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wICgwIG1lYW5zIG5vIGxvb3ApICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJfRHVja2luZ05lZWRlZWQ7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIEluRHVja2luZ190aHJlc2hvbGQ7ICAvKio8IFRocmVzaG9sZCB2YWx1ZSBhdCB3aGljaCBiYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpYyBzaGFsbCBkdWNrICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgIGxvd1ZvbHVtZTsgICAgICAgLyoqPCBsb3dlciB0aGUgYmFja2dyb3VuZCB0cmFjayB0byB0aGlzIGZhY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpbmNyZWFzZSB0aGUgcHJpbWFyeSB0cmFjayB0byBpbnZlcnNlIG9mIHRoaXMgZmFjdG9yICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJMb29wOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aU51bUNoYW5uZWxzOwotfSBNNHhWU1NfQkdNU2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0eXBlcyBvZiB0aGUgVlNTM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rUkdCODg4ICAgICAgICAgICA9IDAsICAvKio8IFJHQjg4OCBkYXRhIHR5cGUgKi8KLSAgICBNNFZTUzNHUFBfa1JHQjU2NSAgICAgICAgICAgPSAxICAvKio8IFJHQjU2NSBkYXRhIHR5cGUgKi8KLQotfSBNNFZTUzNHUFBfUkdCVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNHhWU1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gYXVkaW8vdmlkZW8gZWZmZWN0IGZvciB0aGUgZWRpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgSW4gcGVyY2VudCBvZiB0aGUgY3V0IGNsaXAgZHVyYXRpb24gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVN0YXJ0UGVyY2VudDsKLSAgICAvKio8IEluIHBlcmNlbnQgb2YgdGhlICgoY2xpcCBkdXJhdGlvbikgLSAoZWZmZWN0IHN0YXJ0dGltZSkpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlEdXJhdGlvblBlcmNlbnQ7Ci0gICAgLyoqPCBGcmFtaW5nIGZpbGUgcGF0aCAoR0lGL1BORyBmaWxlKSwgdXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSBmcmFtaW5nICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgKnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgLyoqPCBGcmFtaW5nIFJHQjU2NSBidWZmZXIsICB1c2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAqcEZyYW1pbmdCdWZmZXI7Ci0gICAgLyoqPFJHQiBCdWZmZXIgdHlwZSx1c2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNFZTUzNHUFBfUkdCVHlwZSAgICAgICAgICByZ2JUeXBlOwotICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFggY29vcmRpbmF0ZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUgd2hlcmUgdGhlIGFkZGVkIGZyYW1lIHdpbGwgYmUgZGlzcGxheWVkLgotICAgICBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgfHwgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB0b3BsZWZ0X3g7Ci0gICAgLyoqPCBUaGUgdG9wLWxlZnQgWSBjb29yZGluYXRlIGluIHRoZSBvdXRwdXQgcGljdHVyZSB3aGVyZSB0aGUgYWRkZWQgZnJhbWUgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyB8fCBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHRvcGxlZnRfeTsKLSAgICAvKio8IERvZXMgZnJhbWluZyBpbWFnZSBpcyByZXNpemVkIHRvIG91dHB1dCB2aWRlbyBzaXplLgotICAgICBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICBiUmVzaXplOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIGZyYW1pbmdTY2FsZWRTaXplOwotLyoqPCBTaXplIHRvIHdoaWNoIHRoZSB0aGUgZnJhbWluZyBmaWxlIG5lZWRzIHRvIGJlIHJlc2l6ZWQgKi8KLSAgICAvKio8IFRleHQgYnVmZmVyLiBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwVGV4dEJ1ZmZlcjsKLSAgICAvKio8IFRleHQgYnVmZmVyIHNpemUuIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHRleHRCdWZmZXJTaXplOwotICAgIC8qKjwgUG9pbnRlciBjb250YWluaW5nIHNwZWNpZmljIGRhdGEgdXNlZCBieSB0aGUgZm9udCBlbmdpbmUgKHNpemUsIGNvbG9yLi4uKSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBSZW5kZXJpbmdEYXRhOwotICAgIC8qKjwgVGV4dCBwbGFuZSB3aWR0aC4gVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlUZXh0QnVmZmVyV2lkdGg7Ci0gICAgLyoqPCBUZXh0IHBsYW5lIGhlaWdodC4gVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlUZXh0QnVmZmVySGVpZ2h0OwotICAgIC8qKjwgUHJvY2Vzc2luZyByYXRlIG9mIHRoZSBlZmZlY3QgYWRkZWQgd2hlbiB1c2luZyB0aGUgRmlmdGllcyBlZmZlY3QgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUZpZnRpZXNPdXRGcmFtZVJhdGU7Ci0gICAgLyoqPCBSR0IxNiBpbnB1dCBjb2xvciBvZiB0aGUgZWZmZWN0IGFkZGVkIHdoZW4gdXNpbmcgdGhlIHJnYjE2IGNvbG9yIGVmZmVjdCAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgIHVpUmdiMTZJbnB1dENvbG9yOwotCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nU3RhcnQ7ICAgICAgIC8qU3RhcnQgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nTWlkZGxlOyAgICAgIC8qTWlkZGxlIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ0VuZDsgICAgICAgICAvKkVuZCBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lOyAgLypEdXJhdGlvbiwgaW4gcGVyY2VudGFnZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0IGR1cmF0aW9uLCBvZiB0aGUgRmFkZUluIHBoYXNlKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZTsgICAvKkR1cmF0aW9uLCBpbiBwZXJjZW50YWdlIG9mIGVmZmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLCBvZiB0aGUgRmFkZU91dCBwaGFzZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHdpZHRoOyAgIC8qd2lkdGggb2YgdGhlIEFSR0I4ODg4IGNsaXAgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIG9ubHkgaWYgdmlkZW8gZWZmZWN0IGlzIGZyYW1taW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIGhlaWdodDsgLypoZWlnaHQgb2YgdGhlIEFSR0I4ODg4IGNsaXAgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIG9ubHkgaWYgdmlkZW8gZWZmZWN0IGlzIGZyYW1taW5nICovCi19IE00eFZTU19FZmZlY3RTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGFscGhhIG1hZ2ljIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgcEFscGhhRmlsZVBhdGg7ICAgICAgICAvKio8IEFscGhhIGZpbGUgcGF0aCAoSlBHIGZpbGUpICAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50OyAgICAvKio8IEJsZW5kaW5nIFBlcmNlbnRhZ2UgYmV0d2VlbiAwIGFuZCAxMDAgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgIGlzcmV2ZXJzZTsgICAgICAgICAgICAvKio8IGRpcmVjdCBlZmZlY3Qgb3IgcmV2ZXJzZSAqLwotICAgIC8qVG8gc3VwcG9ydCBBUkdCODg4OCA6IGdldCB0aGUgd2lkdGggYW5kIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHdpZHRoOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGhlaWdodDsKLX0gTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0RpcmVjdGlvbgotICogQGJyaWVmICAgIERlZmluZXMgZGlyZWN0aW9ucyBmb3IgdGhlIHNsaWRlIHRyYW5zaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9SaWdodE91dExlZnRJbiwKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0xlZnRPdXRSaWdodEluLAotICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fVG9wT3V0Qm90dG9tSW4sCi0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9Cb3R0b21PdXRUb3BJbgotfSBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0RpcmVjdGlvbjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNsaWRlIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9EaXJlY3Rpb24gZGlyZWN0aW9uOyAvKiBkaXJlY3Rpb24gb2YgdGhlIHNsaWRlICovCi19IE00eFZTU19TbGlkZVRyYW5zaXRpb25TZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNHhWU1NfVHJhbnNpdGlvblNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFkZGl0aW9uYWwgdHJhbnNpdGlvbiBzZXR0aW5ncyBzcGVjaWZpYyB0bwotICogICAgICAgICAgICB4VlNTLCB3aGljaCBhcmUgYXBwZW5kZWQgdG8gdGhlIFZTUzNHUFAgdHJhbnNpdGlvbiBzZXR0aW5ncwotICogICAgICAgICAgICBzdHJ1Y3R1cmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBBbnl0aGluZyB4VlNTLXNwZWNpZmljLCBidXQgY29tbW9uIHRvIGFsbCB0cmFuc2l0aW9ucywgd291bGQgZ28gaGVyZSwKLSAgICBiZWZvcmUgdGhlIHVuaW9uLiAqLwotICAgIHVuaW9uIHsKLSAgICAgICAgLyoqPCBBbHBoYU1hZ2ljIHNldHRpbmdzLCB1c2VkIG9ubHkgaWYgVmlkZW9UcmFuc2l0aW9uVHlwZSA9PQotICAgICAgICAgICAgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWMgKi8KLSAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncyAgICAgICAgKnBBbHBoYU1hZ2ljU2V0dGluZ3M7Ci0gICAgICAgIC8qIG9ubHkgaW4gY2FzZSBvZiBzbGlkZSB0cmFuc2l0aW9uLiAqLwotICAgICAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgICAgKnBTbGlkZVRyYW5zaXRpb25TZXR0aW5nczsKLSAgICB9IHRyYW5zaXRpb25TcGVjaWZpYzsKLX0gTTR4VlNTX1RyYW5zaXRpb25TZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZwotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIGRpZmZlcmVudCBtZWRpYSByZW5kZXJpbmcgdXNpbmcgZXhpZiBvcmllbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rUmVzaXppbmcgPSAwLCAgICAgICAgLypUaGUgcGljdHVyZSBpcyByZXNpemVkLCB0aGUgYXNwZWN0IHJhdGlvIGNhbiBiZSBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIG9yaWdpbmFsIG9uZS4gQWxsIG9mIHRoZSBwaWN0dXJlIGlzIHJlbmRlcmVkKi8KLSAgICBNNHhWU1Nfa0Nyb3BwaW5nLCAgICAgICAgICAgIC8qVGhlIHBpY3R1cmUgaXMgY3JvcHBlZCwgdGhlIGFzcGVjdCByYXRpbyBpcyB0aGUgc2FtZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG9uZS4gVGhlIHBpY3R1cmUgaXMgbm90IHJlbmRlcmVkIGVudGlyZWx5Ki8KLSAgICBNNHhWU1Nfa0JsYWNrQm9yZGVycyAgICAgICAgLypCbGFjayBib3JkZXJzIGFyZSByZW5kZXJlZCBpbiBvcmRlciB0byBrZWVwIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0IHJhdGlvLiBBbGwgdGhlIHBpY3R1cmUgaXMgcmVuZGVyZWQqLwotCi19IE00eFZTU19NZWRpYVJlbmRlcmluZzsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00eFZTU19DbGlwU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gaW5wdXQgY2xpcCBmb3IgdGhlIGVkaXRpb24uCi0gKiBAbm90ZSAgICBJdCBhbHNvIGNvbnRhaW5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGN1dCBhbmQgYmVnaW4vZW5kIGVmZmVjdHMgYXBwbGllZCB0byB0aGUgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkN1dFBlcmNlbnQ7ICAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIHBlcmNlbnQgb2YgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIChvbmx5IGZvciAzR1BQIGNsaXAgISkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0UGVyY2VudDsgICAgLyoqPCBFbmQgY3V0IHRpbWUsIGluIHBlcmNlbnQgb2YgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIChvbmx5IGZvciAzR1BQIGNsaXAgISkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpRHVyYXRpb247ICAgICAgICAgICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgY2xpcCwgaWYgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAwLCBoYXMgcHJpb3JpdHkgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUVuZEN1dFRpbWUgb3IgdWlFbmRDdXRQZXJjZW50ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFuWm9vbTsgICAgICAgICAgICAvKio8IFJDOiBCb29sZWFuIHVzZWQgdG8ga25vdyBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuIGFuZCB6b29tIG1vZGUgaXMgZW5hYmxlZCAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhhOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGE7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWE7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21YYjsgICAgICAgICAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhiOyAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFliOyAgICAvKio8IFJDICovCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7ICAgICAgICAvKio8IEZCIG9ubHkgdXNlZCB3aXRoIEpQRUc6IHRvIGNyb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZSwgb3IgcmVuZGVyIGJsYWNrIGJvcmRlcnMqLwotCi19IE00eFZTU19DbGlwU2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTR4VlNTX0VkaXRTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZWZpbmUgYSBjb21wbGV0ZQotICogICAgICAgICAgZWRpdGlvbiBvcGVyYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgT3V0cHV0IHZpZGVvIHNpemUgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICAgICAgICAgICBvdXRwdXRWaWRlb1NpemU7Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gZm9ybWF0IChNUEVHNCAvIEgyNjMpICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgLyoqPCBPdXRwdXQgYXVkaW8gZm9ybWF0IChBQUMsIEFNUk5CIC4uLikgKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCAgICAgICAgICAgICAgICBvdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICAvKio8IE91dHB1dCBhdWRpbyBzYW1wbGluZyBmcmVxICg4MDAwSHosLi4uKSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICAgIG91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgIC8qKjwgTWF4aW11bSBvdXRwdXQgZmlsZSBzaXplIGluIEJZVEVTIChpZiBzZXQgdG8gMCwgbm8gbGltaXQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlU2l6ZTsKLSAgICAvKio8IElzIG91dHB1dCBhdWRpbyBtdXN0IGJlIE1vbm8gPyBWYWxpZCBvbmx5IGZvciBBQUMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXVkaW9Nb25vOwotICAgIC8qKjwgT3V0cHV0IHZpZGVvIGJpdHJhdGUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAvKio8IE91dHB1dCBhdWRpbyBiaXRyYXRlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgLyoqPCBCYWNrZ3JvdW5kIG11c2ljIHRyYWNrIHNldHRpbmdzICovCi0gICAgTTR4VlNTX0JHTVNldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgKnBCR010cmFjazsKLSAgICAvKio8IEZ1bmN0aW9uIHBvaW50ZXIgb24gdGV4dCByZW5kZXJpbmcgZW5naW5lLCBpZiBub3QgdXNlZCwgbXVzdCBiZSBzZXQgdG8gTlVMTCAhISAqLwotICAgIE00eFZTU19nZXRUZXh0UmdiQnVmZmVyRmN0ICAgICAgICAgICAgICAgIHBUZXh0UmVuZGVyaW5nRmN0OwotICAgIC8qKiBvdXRwdXQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwqLwotICAgIE00T1NBX0ludDMyICAgb3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIE00T1NBX0ludDMyICAgb3V0cHV0VmlkZW9MZXZlbDsKLQotfSBNNHhWU1NfRWRpdFNldHRpbmdzOwotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfRVhURU5ERURfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjY2OWZlYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0lOVEVSTkFMQ09ORklHX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9JTlRFUk5BTENPTkZJR19IX18KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaAotICogQGJyaWVmICAgIFRoaXMgZmlsZSBjb250YWlucyBzb21lIG1hZ2ljYWwgYW5kIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFZpZGVvRWRpdGlvbiBjb25maWcgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfTUlOSU1BTF9UUkFOU0lUSU9OX0RVUkFUSU9OICAgICAgICAgICAgMTAwICAgIC8qKjwgMTAwIG1pbGxpc2Vjb25kcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfTkJfQVVfUFJFRkVUQ0ggICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAvKio8IHByZWZlY3QgNCBBVXMgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX05PX1NUU1NfSlVNUF9QT0lOVCAgICAgICAgICAgICAgICAgICAgNDAwMDAgLyoqPCBJZiAzZ3AgZmlsZSBkb2VzIG5vdCBjb250YWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gU1RTUyB0YWJsZSAobm8gcmFwIGZyYW1lcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVtcCBiYWNrd2FyZCA0MCBzIG1heGltdW0gKi8KLQotLyoqKioqKioqKioqKioqKioqLwotLyogV3JpdGVyIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQgICAgICAgICAgICAgICAgMgotCi0vKio8IE1heCBBVSBzaXplIHdpbGwgYmUgMC44IHRpbWVzIHRoZSBZVVY0OjI6MCBmcmFtZSBzaXplICovCi0jZGVmaW5lIE00VlNTM0dQUF9WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8gICAgICAgICAgICAwLjlGCi0vKio8IE1heCBjaHVuayBzaXplIHdpbGwgYmUgMS4yIHRpbWVzIHRoZSBtYXggQVUgc2l6ZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfVklERU9fQVVfU0laRV9UT19DSFVOQ0tfU0laRV9SQVRJTyAgICAxLjJGCi0KLS8qKiBSRUFEIENBUkVGVUxMWSBJTiBDQVNFIE9GIFJFUE9SVEVEIFJVTk5JTkcgVFJPVUJMRVMKLVRoZSBtYXggQVUgc2l6ZSBpcyB1c2VkIHRvIHByZS1zZXQgbWF4IHNpemUgb2YgQVUgdGhhdCBjYW4gYmUgd3JpdHRlbiBpbiB0aGUgM0dQIHdyaXRlcgotRm9yIGF1ZGlvIHN0YW5kYXJkIHdpdGggdmFyaWFibGUgQVUgc2l6ZSwgdGhlcmUgY291bGQgYmUgc29tZSBlbmNvZGluZyBzZXR0aW5ncyBsZWFkaW5nIHRvIEFVIHNpemUKLWV4Y2VlZGluZyB0aGlzIGxpbWl0LgotRm9yIEFBQyBzdHJlYW1zIGZvciBpbnN0YW5jZSB0aGUgYXZlcmFnZSBBVSBzaXplIGlzIGdpdmVuIGJ5OgotYXYgQVUgc2l6ZSA9IChhdiBiaXRyYXRlICogMTAyNCkvKHNhbXBsaW5nIGZyZXEpCi1JZiBWU1MgcmV0dXJucyB0aGUgbWVzc2FnZToKLT4+IEVSUk9SOiBhdWRpbyBBVSBzaXplIChYWFhYKSB0byBjb3B5IGxhcmdlciB0aGFuIGFsbG9jYXRlZCBvbmUgKFlZWVkpID0+IGFib3J0Ci0+PiBQTEVBU0UgQ09OVEFDVCBTVVBQT1JUIFRPIEVYVEVORCBNQVggQVUgU0laRSBJTiBUSEUgUFJPRFVDVCBMSUJSQVJZCi1FcnJvciBpcyBtb3N0IGxpa2VseSB0byBoYXBwZW4gd2hlbiBtaXhpbmcgd2l0aCBhdWRpbyBmdWxsIHJlcGxhY2VtZW50Ci0gKi8KLS8qKjwgQUFDIG1heCBBVSBzaXplIC0gUkVBRCBFWFBMQU5BVElPTiBBQk9WRSAqLwotI2RlZmluZSBNNFZTUzNHUFBfQVVESU9fTUFYX0FVX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4Ci0vKio8IHNldCB0byB4NCBtYXggQVUgc2l6ZSBwZXIgY2h1bmsgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0FVRElPX01BWF9DSFVOQ0tfU0laRSAgICAgICAgICAgICAgICAgICAgODE5MgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEgyNjMgLyBNUEVHNCBjb25maWcgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSAgICBNNFZTUzNHUFBfRURJVF9IMjYzX01PRFVMT19USU1FICAgICAgICAgICAgMjU1Ci0KLSNpZmRlZiBCSUdfRU5ESUFOCi0vKio8IDB4YjMgMDEgMDAgMDAgTGl0dGxlIGVuZGlhbiAvIGIwMCAwMCAwMCAwMSBiMyBiaWcgZW5kaWFuKi8KLSNkZWZpbmUgICAgTTRWU1MzR1BQX0VESVRfR09WX0hFQURFUiAgICAgICAgICAgIDB4MDAwMDAxYjMKLSNlbHNlCi0vKio8IDB4YjMgMDEgMDAgMDAgTGl0dGxlIGVuZGlhbiAvIGIwMCAwMCAwMCAwMSBiMyBiaWcgZW5kaWFuKi8KLSNkZWZpbmUgICAgTTRWU1MzR1BQX0VESVRfR09WX0hFQURFUiAgICAgICAgICAgIDB4YjMwMTAwMDAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKiovCi0vKiBBTVIgY29uZmlnICovCi0vKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX1dSSVRURU5fQU1SX1RSQUNLX1RJTUVfU0NBTEUgICAgICAgICAgICA4MDAwCi0jZGVmaW5lIE00VlNTM0dQUF9BTVJfREVDT0RFRF9QQ01fU0FNUExFX05VTUJFUiAgICAgICAgICAgIDE2MCAgICAgICAgLyoqPCAyMG1zIGF0IDgwMDBoeiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIweDg9MTYwIHNhbXBsZXMgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9ERUZBVUxUX0JJVFJBVEUgICAgICAgICAgICAgICAgICAgMTIyMDAgICAvKio8IDEyLjIga2JwcyAqLwotCi0vKioqKioqKioqKioqKiovCi0vKiBFVlJDIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURSAgICAgICAgICAgICAgICAgIDkyMDAgICAvKio8IDkuMiBrYnBzICovCi0KLS8qKioqKioqKioqKioqKi8KLS8qIE1QMyBjb25maWcgKi8KLS8qKioqKioqKioqKioqKi8KLQotLyoqIE1hY3JvIHRvIG1ha2UgYSBqdW1wIG9uIHRoZSBNUDMgdHJhY2sgb24gc2V2ZXJhbCBzdGVwcwotICAgIFRvIGF2b2lkIHRvIGJsb2NrIHRoZSBzeXN0ZW0gd2l0aCBhbiBsb25nIE1QMyBqdW1wLCB0aGlzIHByb2Nlc3MKLSAgICBpcyBkaXZpZGVkIG9uIHNldmVyYWwgc3RlcHMuCi0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX01QM19KVU1QRURfQVVfTlVNQkVSX01BWCAxMDAKLQotLyoqIE1hY3JvIHRvIGRlZmluZSB0aGUgbnVtYmVyIG9mIHJlYWQgQVUgdG8gYW5hbHlzZSB0aGUgYml0cmF0ZQotICAgIFNvIHRoZSBwcm9jZXNzIHdpbGwgcmVhZCB0aGUgZmlyc3QgbiBBVSBvZiB0aGUgTVAzIHN0cmVhbSB0byBnZXQKLSAgICB0aGUgYXZlcmFnZSBiaXRyYXRlLiBuIGlzIGRlZmluZWQgYnkgdGhpcyBkZWZpbmUuCi0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX01QM19BVV9OVU1CRVJfTUFYIDUwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBkZWZpbmUgQU1SIHNpbGVuY2UgZnJhbWVzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFICAgICAxMwotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OIDE2MAotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4W000VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV0gPQotewotICAgIDB4MDQsIDB4RkYsIDB4MTgsIDB4QzcsIDB4RjAsIDB4MEQsIDB4MDQsIDB4MzMsCi0gICAgMHhGRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLSNlbHNlCi1leHRlcm4gY29uc3QgTTRPU0FfVUludDggXAotICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4W000VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV07Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVmaW5lIEFBQyBzaWxlbmNlIGZyYW1lcyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkUgICAgICA0Ci0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkVdID0KLXsKLSAgICAweDAwLCAweEM4LCAweDIwLCAweDA3Ci19OwotI2Vsc2UKLWV4dGVybiBjb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT1tNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFXTsKLSNlbmRpZgotCi0jZGVmaW5lIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRSAgICAgICAgNgotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRV0gPQotewotICAgIDB4MjEsIDB4MTAsIDB4MDMsIDB4MjAsIDB4NTQsIDB4MUMKLX07Ci0jZWxzZQotZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXTsKLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfSU5URVJOQUxDT05GSUdfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlODU1ODgyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgKLSAqIEBicmllZiAgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGZ1bmN0aW9uIHByb3RvdHlwZXMgbm90IHZpc2libGUgdG8gdGhlIGV4dGVybmFsIHdvcmxkLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBfX000VlNTM0dQUF9JTlRFUk5BTEZVTkNUSU9OU19IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfSU5URVJOQUxGVU5DVElPTlNfSF9fCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqICAgIFZTUyBwdWJsaWMgQVBJIGFuZCB0eXBlcyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLQotLyoqCi0gKiAgICBWU1MgcHJpdmF0ZSB0eXBlcyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0KLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIiAvKio8IGZvciBNNF9BY2Nlc3NVbml0IGRlZmluaXRpb24gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBBbGwgZXJyb3JzIGFyZSBmYXRhbCBpbiB0aGUgVlNTICovCi0jZGVmaW5lIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpIGlmKE00Tk9fRVJST1IhPWVycikgcmV0dXJuIGVycjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8oKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIHZpZGVvIHByb2Nlc3NpbmcKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8oTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBhdWRpbyBwcm9jZXNzaW5nIGZvciB0aGUgTVAzIGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcCgpCi0gKiBAYnJpZWYgICAgT3BlbiBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKmhDbGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBEZXN0cm95IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAbm90ZQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpCi0gKiBAYnJpZWYgICAgRG8gd2hhdCB0byBkbyB3aGVuIHRoZSBlbmQgb2YgYSBjbGlwIHZpZGVvIHRyYWNrIGlzIHJlYWNoZWQKLSAqIEBub3RlICAgIElmIHRoZXJlIGlzIGF1ZGlvIG9uIHRoZSBjdXJyZW50IGNsaXAsIHByb2Nlc3MgaXQsIGVsc2Ugc3dpdGNoIHRvIHRoZSBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKQotICogQGJyaWVmICAgIERvIHdoYXQgdG8gZG8gd2hlbiB0aGUgZW5kIG9mIGEgY2xpcCBhdWRpbyB0cmFjayBpcyByZWFjaGVkCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpCi0gKiBAYnJpZWYgICAgQ2hlY2sgaWYgdGhlIGNsaXAgaXMgY29tcGF0aWJsZSB3aXRoIFZTUyBlZGl0aW5nCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ2xpcFByb3BlcnRpZXMgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZyhNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcENsaXBQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuKCkKLSAqIEBicmllZiAgICBPcGVuIGEgY2xpcC4gQ3JlYXRlcyBhIGNsaXAgY29udGV4dC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBoQ2xpcEN0eHQgICAgICAgICAgICAoT1VUKSBSZXR1cm4gdGhlIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBFZGl0IHNldHRpbmdzIG9mIHRoaXMgY2xpcC4gVGhlIG1vZHVsZSB3aWxsIGtlZXAgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHRvIHRoaXMgcG9pbnRlcgotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICAgYlNraXBBdWRpb1RyYWNrICAgICAgICAoSU4pIElmIHRydWUsIGRvIG5vdCBvcGVuIHRoZSBhdWRpbwotICogQHBhcmFtICAgIGJGYXN0T3Blbk1vZGUgICAgICAgIChJTikgSWYgdHJ1ZSwgdXNlIHRoZSBmYXN0IG1vZGUgb2YgdGhlIDNncHAgcmVhZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9ubHkgdGhlIGZpcnN0IEFVIGlzIHJlYWQpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcEluaXQgKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKmhDbGlwQ3R4dCwKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdAotKTsKLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwT3BlbiAoCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywKLSAgICBNNE9TQV9Cb29sIGJTa2lwQXVkaW9UcmFjaywKLSAgICBNNE9TQV9Cb29sIGJGYXN0T3Blbk1vZGUsCi0gICAgTTRPU0FfQm9vbCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjaygpCi0gKiBAYnJpZWYgICAgRGVsZXRlIHRoZSBhdWRpbyB0cmFjay4gQ2xpcCB3aWxsIGJlIGxpa2UgaWYgaXQgaGFkIG5vIGF1ZGlvIHRyYWNrCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayhNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3VycmVudFRpbWUoKQotICogQGJyaWVmICAgIEp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBhbmQgZGVjb2RlIHVwIHRvIHRoZSBjdXJyZW50IHZpZGVvIHRpbWUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgaUN0cyAgICAgICAgKElOKSBUYXJnZXQgQ1RTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LCBNNE9TQV9JbnQzMiBpQ3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKQotICogQGJyaWVmICAgIFJlYWQgb25lIEFVIGZyYW1lIGluIHRoZSBjbGlwCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoKQotICogQGJyaWVmICAgIERlY29kZSB0aGUgY3VycmVudCBBVURJTyBmcmFtZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKQotICogQGJyaWVmICAgIEp1bXAgaW4gdGhlIGF1ZGlvIHRyYWNrIG9mIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwSnVtcEN0cyAgICAgICAgICAgIChJTi9PVVQpIGluOnRhcmdldCBDVFMsIG91dDogcmVhY2hlZCBDVFMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LCBNNE9TQV9JbnQzMiAqcEp1bXBDdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCkKLSAqIEBicmllZiAgICBDbG9zZSBhIGNsaXAuIERlc3Ryb3kgdGhlIGNvbnRleHQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0SnVtcE1QMygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YganVtcGluZyBwcm9jZXNzaW5nIGZvciB0aGUgTVAzIGNsaXAuCi0gKiBAbm90ZSAgICBPbiBvbmUgc3RlcCwgdGhlIGp1bXAgb2Ygc2V2ZXJhbCBBVSBpcyBkb25lCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0SnVtcE1QMyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgZmlsZSBmb3JtYXQgd3JpdGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgICAgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvciBwV3RyRGF0YUludGVyZmFjZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KSwgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJXcml0ZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiBwV3RyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXdHJEYXRhSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJFbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyB2aWRlbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgICB0aGUgZW5jb2RlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIGF1ZGlvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgICB0aGUgZW5jb2RlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZTogICAgICAgICAgICAgICAgKElOKSBUaGUgbWVkaWEgdHlwZS4KLSAqIEBwYXJhbSAgICBwRW5jR2xvYmFsSW50ZXJmYWNlOiAgICAoT1VUKSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgZnVuY3Rpb25zLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhVHlwZSBtZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBEZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpLCBvciB0aGUgZGVjb2RlciB0eXBlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciBhdWRpbyBkZWNvZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWx5IGJ5IHRoZSBWU1MgdG8gcmVnaXN0ZXIgYXVkaW8gZGVjb2RlcnMsCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgICAgIChJTikgQXVkaW8gZGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBBdWRpbyBkZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwsIG9yIHRoZSBkZWNvZGVyIHR5cGUgaXMgaW52YWxpZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgcmVhZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGRlY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9FbmNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgcmVhZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcygpCi0gKiBAYnJpZWYgICAgQ2xlYXIgZW5jb2RlcnMsIGRlY29kZXJzLCByZWFkZXIgYW5kIHdyaXRlcnMgaW50ZXJmYWNlcyB0YWJsZXMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgVGhlIGNvbnRleHQgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX1N1YnNjcmliZU1lZGlhQW5kQ29kZWMoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSByZWFkZXIsIGRlY29kZXJzLCB3cml0ZXJzIGFuZCBlbmNvZGVycwotICogICAgICAgICAgaW4gdGhlIFZTUy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0FNUk5CKCkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEFNUiBOYXJyb3ctQmFuZCBmcmFtZSBjb250YWluZWQgaW4gdGhlIGdpdmVuIGJ1ZmZlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBBdWRpb0ZyYW1lICAgKElOKSBBTVJOQiBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQihNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQygpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBFVlJDIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogICAgIDAgMSAyIDMKLSAqICAgICstKy0rLSstKwotICogICAgfGZyIHR5cGV8ICAgICAgICAgICAgICBSRkMgMzU1OAotICogICAgKy0rLSstKy0rCi0gKgotICogRnJhbWUgVHlwZTogNCBiaXRzCi0gKiAgICBUaGUgZnJhbWUgdHlwZSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29kZWMgZGF0YQotICogICAgZnJhbWUgaW4gdGhlIFJUUCBwYWNrZXQuCi0gKgotICogRm9yIEVWUkMgYW5kIFNNViBjb2RlY3MsIHRoZSBmcmFtZSB0eXBlIHZhbHVlcyBhbmQgc2l6ZSBvZiB0aGUKLSAqIGFzc29jaWF0ZWQgY29kZWMgZGF0YSBmcmFtZSBhcmUgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBiZWxvdzoKLSAqCi0gKiBWYWx1ZSAgIFJhdGUgICAgICBUb3RhbCBjb2RlYyBkYXRhIGZyYW1lIHNpemUgKGluIG9jdGV0cykKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogICAwICAgICBCbGFuayAgICAgIDAgICAgKDAgYml0KQotICogICAxICAgICAxLzggICAgICAgIDIgICAgKDE2IGJpdHMpCi0gKiAgIDIgICAgIDEvNCAgICAgICAgNSAgICAoNDAgYml0czsgbm90IHZhbGlkIGZvciBFVlJDKQotICogICAzICAgICAxLzIgICAgICAgMTAgICAgKDgwIGJpdHMpCi0gKiAgIDQgICAgIDEgICAgICAgICAyMiAgICAoMTcxIGJpdHM7IDUgcGFkZGVkIGF0IGVuZCB3aXRoIHplcm9zKQotICogICA1ICAgICBFcmFzdXJlICAgIDAgICAgKFNIT1VMRCBOT1QgYmUgdHJhbnNtaXR0ZWQgYnkgc2VuZGVyKQotICoKLSAqIEBwYXJhbSAgIHBDcEF1ZGlvRnJhbWUgICAoSU4pIEVWUkMgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQyhNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCkKLSAqIEBicmllZiAgICBHZXQgdmlkZW8gYW5kIGF1ZGlvIHByb3BlcnRpZXMgZnJvbSB0aGUgY2xpcCBzdHJlYW1zCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGZhdGFsIGVycm9ycyBvbmx5IChlcnJvcnMgdGhhdCBzaG91bGQgbm90IGhhcHBlbiBpbiB0aGUKLSAqICAgICAgICAgICAgIGZpbmFsIGludGVncmF0ZWQgcHJvZHVjdCkuCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcyhNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXBQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgUmVzZXQgdGhlIGF1ZGlvIGVuY29kZXIgKENyZWF0ZSBpdCBpZiBuZWVkZWQpCi0gKiBAbm90ZQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUF1ZGlvQml0cmF0ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyBhbmQgcHJlcGFyZSB0aGUgb3V0cHV0IE1QMyBmaWxlCi0gKiBAbm90ZSAgICBDcmVhdGVzIHRoZSB3cml0ZXIsIENyZWF0ZXMgdGhlIG91dHB1dCBmaWxlLCBBZGRzIHRoZSBzdHJlYW1zLCBSZWFkaWVzIHRoZQotICogICAgICAgICAgICB3cml0aW5nIHByb2Nlc3MKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDX1NoZWxsQVBJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcE9zYUZpbGVXcml0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwT3NhRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1heE91dHB1dEZpbGVTaXplKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSgpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgY2hlY2tpbmcgaWYgdHdvIGNsaXBzIGFyZSBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlciBmb3IKLSAqICAgICAgICAgICAgIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIENvbnRleHQgb2YgdGhlIGF1ZGlvIG1peGVyCi0gKiBAcGFyYW0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgZmlyc3QgY2xpcAotICogQHBhcmFtICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIHNlY29uZCBjbGlwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eShNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcElucHV0Q2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEFkZGVkQ2xpcFByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCkKLSAqIEBicmllZiAgICBEZWxldGUgdGhlIGF1ZGlvIHRyYWNrLiBDbGlwIHdpbGwgYmUgbGlrZSBpZiBpdCBoYWQgbm8gYXVkaW8gdHJhY2sKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTdGFydEFVKCkKLSAqIEBicmllZiAgICBTdGFydEFVIHdyaXRlci1saWtlIGludGVyZmFjZSB1c2VkIGZvciB0aGUgVlNTIDNHUFAgb25seQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogKElOKSBJdCBpcyB0aGUgVlNTIDNHUFAgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHN0cmVhbUlEOiAoSU4pIElkIG9mIHRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIEFjY2VzcyBVbml0IGlzIHJlbGF0ZWQuCi0gKiBAcGFyYW0gICAgcEFVOiAgICAgIChJTi9PVVQpIEFjY2VzcyBVbml0IHRvIGJlIHByZXBhcmVkLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgTTRWU1MzR1BQX2ludFN0YXJ0QVUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFByb2Nlc3NBVSgpCi0gKiBAYnJpZWYgICAgUHJvY2Vzc0FVIHdyaXRlci1saWtlIGludGVyZmFjZSB1c2VkIGZvciB0aGUgVlNTIDNHUFAgb25seQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogKElOKSBJdCBpcyB0aGUgVlNTIDNHUFAgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHN0cmVhbUlEOiAoSU4pIElkIG9mIHRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIEFjY2VzcyBVbml0IGlzIHJlbGF0ZWQuCi0gKiBAcGFyYW0gICAgcEFVOiAgICAgIChJTi9PVVQpIEFjY2VzcyBVbml0IHRvIGJlIHdyaXR0ZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFZQUCgpCi0gKiBAYnJpZWYgICAgV2UgaW1wbGVtZW50IG91ciBvd24gVmlkZW9QcmVQcm9jZXNzaW5nIGZ1bmN0aW9uCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgVlNTIDNHUFAgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHBQbGFuZUluICAgIChJTikKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiAzIHBsYW5lcyB0aGF0IHdpbGwgY29udGFpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9JTlRFUk5BTEZVTkNUSU9OU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzkwMGYwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oCi0gKiBAYnJpZWYgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBlbnVtIGFuZCB0eXBlcyBub3QgdmlzaWJsZSB0byB0aGUgZXh0ZXJuYWwgd29ybGQuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0lOVEVSTkFMVFlQRVNfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0lOVEVSTkFMVFlQRVNfSF9fCi0KLSNkZWZpbmUgTTRWU1NfVkVSU0lPTl9NQUpPUiAgICAgICAgMwotI2RlZmluZSBNNFZTU19WRVJTSU9OX01JTk9SICAgICAgICAyCi0jZGVmaW5lIE00VlNTX1ZFUlNJT05fUkVWSVNJT04gICAgNQotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0vKioKLSAqICAgIFZTUyBwdWJsaWMgQVBJIGFuZCB0eXBlcyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLQotLyoqCi0gKiAgICBJbnRlcm5hbGx5IHVzZWQgbW9kdWxlcyAqLwotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIiAgICAgICAgLyoqPCBSZWFkZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00V1JJVEVSX2NvbW1vbi5oIiAgICAgICAgLyoqPCBXcml0ZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIgICAgICAgIC8qKjwgRGVjb2RlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIiAgICAgICAgLyoqPCBFbmNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIiAgICAgICAgLyoqPCBJbWFnZSBwbGFuZXMgZGVmaW5pdGlvbiAqLwotI2luY2x1ZGUgIk00UkVBREVSXzNncENvbS5oIiAgICAgICAgLyoqPCBSZWFkIDNHUFAgZmlsZSAgICAgKi8KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIiAgICAgICAgICAgIC8qKjwgRGVjb2RlciBhdWRpbyAgICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgiICAvKio8IEVuY29kZSBhdWRpbyAgICAqLwotCi0KLSNpbmNsdWRlICJTU1JDLmgiICAgICAgICAgICAgICAgICAgICAvKio8IFNTUkMgICAgICAgICAgICAgKi8KLSNpbmNsdWRlICJGcm9tMmlUb01vbm9fMTYuaCIgICAgICAgIC8qKjwgU3RlcmVvIHRvIE1vbm8gICAgICovCi0jaW5jbHVkZSAiTW9ub1RvMklfMTYuaCIgICAgICAgICAgICAvKio8IE1vbm8gdG8gU3RlcmVvICAgICAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgV0lORE9XX1NJWkUgMTAKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U3RhdGUKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NSRUFURUQgICAgPSAwLCAgICAvKio8IE00VlNTM0dQUF9lZGl0SW5pdCBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9WSURFTyAgICAgICAgPSAxLCAgICAvKio8IFByb2Nlc3NpbmcgdmlkZW8gdHJhY2sgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9BVURJTyAgICAgICAgPSAyLCAgICAvKio8IFByb2Nlc3NpbmcgYXVkaW8gdHJhY2sgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9NUDMgICAgICAgID0gMywgICAgLyoqPCBQcm9jZXNzaW5nIE1QMyBhdWRpbyB0cmFjayAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX01QM19KVU1QICAgPSA0LCAgICAgICAgLyoqPCBQcm9jZXNzaW5nIGEganVtcCBpbiBhIE1QMyBhdWRpbyB0cmFjayAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX0ZJTklTSEVEICAgID0gNSwgICAgLyoqPCBQcm9jZXNzaW5nIGRvbmUsIFZTUyAzR1BQIGNhbiBiZSBjbG9zZWQgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQgICAgICAgID0gNiAgICAgICAgLyoqPCBPdXRwdXQgZmlsZSBoYXMgYmVlbiBjbG9zZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZTUyAzR1BQIGNhbiBiZSBkZXN0cm95ZWQgKi8KLX0KLU00VlNTM0dQUF9FZGl0U3RhdGU7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIC8qKjwgRG9pbmcgUmVhZC9Xcml0ZSBvcGVyYXRpb24uIFRoaXMgb3BlcmF0aW9uIHdpbGwgaGF2ZSBubyBwcm9jZXNzaW5nCi0gICAgICogb24gaW5wdXQgZnJhbWVzLiBPbmx5IHRpbWUgc3RhbXAgbWFuaXB1bGF0aW9ucyBpbiBvdXRwdXQgZmlsZS4gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgICAgPSAxMCwKLSAgICAvKio8IERlY29kZSBlbmNvZGUgdG8gY3JlYXRlIGFuIEkgZnJhbWUuIFRoaXMgaXMgZG9uZSBmb3IgYSBzaW5nbGUgZnJhbWUKLSAgICAgKiB0byBjcmVhdGUgYSBuZXcgcmVmZXJlbmNlIGZyYW1lLiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUICAgICA9IDExLAotICAgIC8qKjwgRG9pbmcgUmVhZC0+RGVjb2RlLT5GaWx0ZXItPkVuY29kZS0+V3JpdGUgb3BlcmF0aW9uIG9uIHRoZSBpbnB1dCBmaWxlCi0gICAgICogdG8gY3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREUgPSAxMiwKLSAgICAvKio8IEFwcGxpZWQgd2hlbiBUcmFuc2l0aW9uIGlzIGFjdGl2ZSBhbmQgYmxlbmRpbmcgb2YgdHdvIHZpZGVvcyBpcwotICAgICAqIHJlcXVpcmVkLiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTiAgICA9IDEzLAotICAgIC8qKjwgU3BlY2lhbCBSZWFkL1dyaXRlIG1vZGUgdXNlZCBhZnRlciBCRUdJTl9DVVQgc3RhdGUuIFRoZSBmcmFtZQotICAgICAqIGlzIGFscmVhZHkgY29kZWQgYXMgSSBmcmFtZSBpbiBCRUdJTl9DVVQgc3RhdGU7IHNvIHNraXAgaXQuICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQgICAgID0gMTQKLX0KLU00VlNTM0dQUF9FZGl0VmlkZW9TdGF0ZTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9SRUFEX1dSSVRFICAgID0gMjAsICAgIC8qKjwgRG9pbmcgUmVhZC9Xcml0ZSBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vIGRlY29kaW5nL2VuY29kaW5nKSAqLwotICAgIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERSA9IDIxLCAgICAvKio8IERvaW5nIFJlYWQtRGVjb2RlL0ZpbHRlci8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZS1Xcml0ZSBvcGVyYXRpb24gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1RSQU5TSVRJT04gICAgPSAyMiAgICAvKio8IFRyYW5zaXRpb247IGJsZW5kaW5nIG9mIHR3byBhdWRpbyAqLwotfQotTTRWU1MzR1BQX0VkaXRBdWRpb1N0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU3RhdHVzCi0gKiBAYnJpZWYgICAgICAgIFN0YXR1cyBvZiB0aGUgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCAgICAgICAgICAgID0gMCwgICAgLyoqPCBUaGUgY2xpcCBpcyBjdXJyZW50bHkgcmVhZHkgZm9yIHJlYWRpbmcgKi8KLSAgICBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFICAgICAgICA9IDEsICAgIC8qKjwgVGhlIGNsaXAgaXMgY3VycmVudGx5IHJlYWR5IGZvciBkZWNvZGluZyAqLwotICAgIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gICAgPSAyICAgICAgICAvKio8IFRoZSBjbGlwIGlzIGN1cnJlbnRseSBpbiBzcGxpdHRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVXBUbygpIHByb2Nlc3NpbmcgKi8KLX0KLU00VlNTM0dQUF9DbGlwU3RhdHVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ3VycmVudEVmZmVjdAotICogQGJyaWVmICAgICAgICBDdXJyZW50IGVmZmVjdCBhcHBsaWVkIHRvIHRoZSBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQ2xpcEN1cnJlbnRFZmZlY3RfTk9ORSAgICA9IDAsICAgIC8qKjwgTm9uZSAqLwotICAgIE00VlNTM0dQUF9rQ2xpcEN1cnJlbnRFZmZlY3RfQkVHSU4gICAgPSAxLCAgICAvKio8IEJlZ2luIGVmZmVjdCBjdXJyZW50bHkgYXBwbGllZCAqLwotICAgIE00VlNTM0dQUF9rQ2xpcEN1cnJlbnRFZmZlY3RfRU5EICAgID0gMiAgICAgICAgLyoqPCBFbmQgZWZmZWN0IGN1cnJlbnRseSBhcHBsaWVkICovCi19Ci1NNFZTUzNHUFBfQ2xpcEN1cnJlbnRFZmZlY3Q7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU3RhdGUKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfVklERU8gPSAwLCAgICAgICAgICAgIC8qKjwgVmlkZW8gaXMgYmVpbmcgcHJvY2Vzc2VkICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX0ZJUlNUX1NFR01FTlQsICAvKio8IEF1ZGlvIGlzIGJlaW5nIHByb2Nlc3NlZCAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVCwgLyoqPCBBdWRpbyBpcyBiZWluZyBwcm9jZXNzZWQgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVCwgIC8qKjwgQXVkaW8gaXMgYmVpbmcgcHJvY2Vzc2VkICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0ZJTklTSEVEICAgICAgICAgICAgICAvKio8IFByb2Nlc3NpbmcgZmluaXNoZWQsIHVzZXIgbXVzdCBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCovCi19Ci1NNFZTUzNHUFBfQXVkaW9NaXhpbmdTdGF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTdGF0ZQotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIFZTUyBwaWN0dXJlIGV4dHJhY3Rpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tFeHRyYWN0UGljdHVyZVN0YXRlX09QRU5FRCAgID0gMCwgIC8qKjwgVmlkZW8gY2xpcCBpcyBvcGVuZWQgYW5kIHJlYWR5IHRvIGJlIHJlYWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgdGhlIFJBUCBiZWZvcmUgdGhlIHBpY3R1cmUgdG8gZXh0cmFjdCAqLwotICAgIE00VlNTM0dQUF9rRXh0cmFjdFBpY3R1cmVTdGF0ZV9QUk9DRVNTICAgID0gMSwgIC8qKjwgVmlkZW8gaXMgZGVjb2RlZCBmcm9tIHRoZSBwcmV2aW91cyBSQVAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHBpY3R1cmUgdG8gZXh0cmFjdCAqLwotICAgIE00VlNTM0dQUF9rRXh0cmFjdFBpY3R1cmVTdGF0ZV9FWFRSQUNURUQ9IDIgICAvKio8IFZpZGVvIEFVIGhhcyBiZWVuICBkZWNvZGVkLCB1c2VyIG11c3Qgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlQ2xlYW5VcCAqLwotfQotTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU3RhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICAgIENvZGVjcyByZWdpc3RyYXRpb24gc2FtZSBhcyBpbiBWUFMgYW5kIFZFUywgc28gbGVzcyBtYXBwaW5nCi0gKiAgICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG93YXJkIFZTUyBhcGkgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICAgcEdsb2JhbEZjdHM7ICAgIC8qKjwgb3BlbiwgY2xvc2UsIHNldG9wdGlvbixldGMuLi4gZnVuY3Rpb25zICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgICAgIHBEYXRhRmN0czsgICAgICAgIC8qKjwgZGF0YSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCi19IE00VlNTM0dQUF9Xcml0ZXJJbnRlcmZhY2U7Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCBBQUNfREVDX1NUUkVBTV9QUk9QUwotICogQGJyaWVmIEFBQyBTdHJlYW0gcHJvcGVydGllcwotICogQE5vdGUgYU5vQ2hhbiBhbmQgYVNhbXBGcmVxIGFyZSB1c2VkIGZvciBwYXJzaW5nIGV2ZW4gdGhlIHVzZXIgcGFyYW1ldGVycwotICogICAgICAgIGFyZSBkaWZmZXJlbnQuICBVc2VyIHBhcmFtZXRlcnMgd2lsbCBiZSBpbnB1dCBmb3IgdGhlIG91dHB1dCBiZWhhdmlvdXIKLSAqICAgICAgICBvZiB0aGUgZGVjb2RlciB3aGVyZWFzIGZvciBwYXJzaW5nIGJpdHN0cmVhbSBwcm9wZXJ0aWVzIGFyZSB1c2VkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00T1NBX0ludDMyIGFBdWRpb09iamVjdFR5cGU7ICAgICAvKio8IEF1ZGlvIG9iamVjdCB0eXBlIG9mIHRoZSBzdHJlYW0gLSBpbiBmYWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0eXBlIGZvdW5kIGluIHRoZSBBY2Nlc3MgVW5pdCBwYXJzZWQgKi8KLSAgTTRPU0FfSW50MzIgYU51bUNoYW47ICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIGNoYW5uZWxzICg9MShtb25vKSBvciA9MihzdGVyZW8pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBpbmRpY2F0ZWQgYnkgaW5wdXQgYml0c3RyZWFtKi8KLSAgTTRPU0FfSW50MzIgYVNhbXBGcmVxOyAgICAgICAgICAgIC8qKjwgc2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6ICovCi0gIE00T1NBX0ludDMyIGFFeHRlbnNpb25TYW1wRnJlcTsgICAvKio8IGV4dGVuZGVkIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBIeiwgPSAwIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGV4dGVuZGVkIGZyZXF1ZW5jeSAqLwotICBNNE9TQV9JbnQzMiBhU0JSUHJlc2VudDsgICAgICAgICAgLyoqPCBwcmVzZW5jZT0xL2Fic2VuY2U9MCBvZiBTQlIgKi8KLSAgTTRPU0FfSW50MzIgYVBTUHJlc2VudDsgICAgICAgICAgIC8qKjwgcHJlc2VuY2U9MS9hYnNlbmNlPTAgb2YgUFMgKi8KLSAgTTRPU0FfSW50MzIgYU1heFBDTVNhbXBsZXNQZXJDaDsgIC8qKjwgbWF4IG51bWJlciBvZiBQQ00gc2FtcGxlcyBwZXIgY2hhbm5lbCAqLwotfSBBQUNfREVDX1NUUkVBTV9QUk9QUzsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQKLSAqIEBicmllZiAgICAgICAgRmlsZXN5c3RlbSBhbmQgY29kZWMgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHBvaW50ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qKgotICAgICAgKiBNZWRpYSBhbmQgQ29kZWMgcmVnaXN0cmF0aW9uICovCi0gICAgLyoqPCBUYWJsZSBvZiBNNFZFU19Xcml0ZXJJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIFdyaXRlcnMgbGlzdCAqLwotICAgIE00VlNTM0dQUF9Xcml0ZXJJbnRlcmZhY2UgICAgV3JpdGVySW50ZXJmYWNlW000V1JJVEVSX2tUeXBlX05CXTsKLSAgICAvKio8IG9wZW4sIGNsb3NlLCBzZXRvcHRpb24sZXRjLi4uIGZ1bmN0aW9ucyBvZiB0aGUgdXNlZCB3cml0ZXIqLwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICAgcFdyaXRlckdsb2JhbEZjdHM7Ci0gICAgLyoqPCBkYXRhIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgb2YgdGhlIHVzZWQgd3JpdGVyICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgICAgIHBXcml0ZXJEYXRhRmN0czsKLQotICAgIC8qKjwgVGFibGUgb2YgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgZW5jb2RlcnMgbGlzdCAqLwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICAgIHBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgLyoqPCBGdW5jdGlvbnMgb2YgdGhlIHVzZWQgZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzOwotCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YTsKLQotICAgIC8qKjwgVGFibGUgb2YgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiAgICBwQXVkaW9FbmNvZGVySW50ZXJmYWNlW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIC8qKjwgVGFibGUgb2YgaW50ZXJuYWwvZXh0ZXJuYWwgZmxhZ3MgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyRmxhZ1tNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICAvKio8IEZ1bmN0aW9ucyBvZiB0aGUgdXNlZCBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0czsKLQotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICBtX3BSZWFkZXJHbG9iYWxJdFRhYmxlW000UkVBREVSX2tNZWRpYVR5cGVfTkJdOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICBtX3BSZWFkZXJEYXRhSXRUYWJsZVtNNFJFQURFUl9rTWVkaWFUeXBlX05CXTsKLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgbV9wUmVhZGVyOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICBtX3BSZWFkZXJEYXRhSXQ7Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgIG1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzOwotCi0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiAgIG1fcFZpZGVvRGVjb2RlcjsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgbV9wVmlkZW9EZWNvZGVySXRUYWJsZVtNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQl07Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgIG1fdWlOYlJlZ2lzdGVyZWRWaWRlb0RlYzsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlX05CXTsKLSNlbmRpZgotCi0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2RlcjsKLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVySXRUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICAvKio8IHN0b3JlIGluZGljZXMgb2YgZXh0ZXJuYWwgZGVjb2RlcnMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbTTRBRF9rVHlwZV9OQl07Ci0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwQ3VycmVudEF1ZGlvRW5jb2RlclVzZXJEYXRhOwotCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbTTRBRF9rVHlwZV9OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgIC8qIGJvb2xlYW4gdG8gdGVsbCB3aGV0aGVyIHJlZ2lzdGVyZWQgZXh0ZXJuYWwgT01YIGNvZGVjcyBzaG91bGQgYmUgZnJlZWQgZHVyaW5nIGNsZWFudXAKLSAgICAgb3IgbmV3IGNvZGVjIHJlZ2lzdHJhdGlvbiovCi0gICAgTTRPU0FfQm9vbCAgICBiQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2U7Ci0jZW5kaWYKLQotCi19IE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb25zIHJlbGF0ZWQgdG8gb25lIDNHUFAgY2xpcCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBjb250ZXh0IHJlbGF0ZWQgdG8gb25lIGNsaXAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqICAgICAgICBwU2V0dGluZ3M7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBjbGlwIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IHBvc3Nlc3NlZCkgKi8KLQotICAgIE00VlNTM0dQUF9DbGlwU3RhdHVzICAgICAgICBWc3RhdHVzOyAgICAgICAgICAgIC8qKjwgVmlkZW8gc3RhdHVzIG9mIHRoZSBjbGlwIHJlYWRpbmcgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFN0YXR1cyAgICAgICAgQXN0YXR1czsgICAgICAgICAgICAvKio8IEF1ZGlvIHN0YXR1cyBvZiB0aGUgY2xpcCByZWFkaW5nICovCi0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaVZvZmZzZXQ7ICAgICAgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBPZmZzZXQgYmV0d2VlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgYW5kIHRoZSBvdXRwdXQgdmlkZW8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVnaW4gY3V0IHRha2VuIGludG8gYWNjb3VudCkgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaUFvZmZzZXQ7ICAgICAgICAgICAvKio8IFtUaW1lc2NhbGVdIE9mZnNldCBiZXR3ZWVuIHRoZSBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIG91dHB1dCBhdWRpbyBzdHJlYW0gKGJlZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXQgdGFrZW4gaW50byBhY2NvdW50KSAqLwotCi0gICAgLyoqCi0gICAgICogM0dQUCByZWFkZXIgU3R1ZmYgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dDsgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIDNHUFAgcmVhZGVyIG1vZHVsZSAqLwotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogICAgICAgIHBWaWRlb1N0cmVhbTsgICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgdmlkZW8gc3RyZWFtICovCi0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgICAgICAgcEF1ZGlvU3RyZWFtOyAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICAgICAgIFZpZGVvQVU7ICAgICAgICAgICAgLyoqPCBSZWFkIHZpZGVvIGFjY2VzcyB1bml0ICh3ZSBkbyBub3QgdXNlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYWxsb2NhdGUgbGF0ZXIsIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc3Qgb2YgdGhlIHRpbWUgd2Ugd2lsbCBuZWVkIGl0KSAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgICAgICAgQXVkaW9BVTsgICAgICAgICAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKHdlIGRvIG5vdCB1c2UgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBhbGxvY2F0ZSBsYXRlciwgYmVjYXVzZSBtb3N0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdGltZSB3ZSB3aWxsIG5lZWQgaXQpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYlZpZGVvQXVBdmFpbGFibGU7ICAgIC8qKjwgVGVsbCBpZiBhIHZpZGVvIEFVIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzbHkgcmVhZCkgKi8KLSAgICAvKio8IEJvb2xlYW4gb25seSB1c2VkIHRvIGZpeCB0aGUgQlpaIGJ1Zy4uLiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJGaXJzdEF1V3JpdHRlbjsKLQotICAgIC8qKgotICAgICAqIFZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgIHBWaURlY0N0eHQ7ICAgICAgICAgICAgLyoqPCBWaWRlbyBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgaVZpZGVvRGVjQ3RzOyAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIEZvciB2aWRlbyBkZWNvZGVVcFRvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdHVhbCByZWFjaGVkIGN0cyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpVmlkZW9SZW5kZXJDdHM7ICAgIC8qKjwgW01pbGxpc2Vjb25kc10gRm9yIHZpZGVvIHJlbmRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3R1YWwgcmVhY2hlZCBjdHMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBpc1JlbmRlckR1cDsgICAgICAgIC8qKjwgVG8gaGFuZGxlIGR1cGxpY2F0ZSBmcmFtZSByZW5kZXJpbmcgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG9mIGV4dGVybmFsIGRlY29kaW5nICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqICAgICAgICAgICAgbGFzdERlY29kZWRQbGFuZTsgICAgLyoqPCBMYXN0IGRlY29kZWQgcGxhbmUgKi8KLQotICAgIC8qKgotICAgICAqIE1QRUc0IHRpbWUgaW5mbyBzdHVmZiBhdCBjbGlwIGxldmVsICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICBiTXBlZzRHb3ZTdGF0ZTsgICAgICAgICAgICAvKio8IE5hbWVseSwgdXBkYXRlIG9yIGluaXRpYWxpemF0aW9uICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICB1aU1wZWc0UHJldkdvdlZhbHVlR2V0OyAgICAvKio8IFByZXZpb3VzIEdvdiB2YWx1ZSByZWFkIChpbiBzZWNvbmQpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICB1aU1wZWc0UHJldkdvdlZhbHVlU2V0OyAgICAvKio8IFByZXZpb3VzIEdvdiB2YWx1ZSB3cml0ZSAoaW4gc2Vjb25kKSAqLwotCi0gICAgLyoqCi0gICAgICogVGltZS1saW5lIHN0dWZmICovCi0gICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ1RTIGF0IHdoaWNoIHRoZSB2aWRlbyBjbGlwIGFjdHVhbGx5IHN0YXJ0cyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpQWN0dWFsVmlkZW9CZWdpbkN1dDsKLSAgICAvKio8IFtNaWxsaXNlY29uZHNdIENUUyBhdCB3aGljaCB0aGUgYXVkaW8gY2xpcCBhY3R1YWxseSBzdGFydHMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaUFjdHVhbEF1ZGlvQmVnaW5DdXQ7Ci0gICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBUaW1lIGF0IHdoaWNoIHRoZSBjbGlwIG11c3QgZW5kICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlFbmRUaW1lOwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gZGVjb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgcEF1ZGlvRGVjQ3R4dDsgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgQU1SIGRlY29kZXIgKi8KLSAgICBNNEFEX0J1ZmZlciAgICAgICAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJJbjsgICAgLyoqPCBJbnB1dCBzdHJ1Y3R1cmUgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgTTRBRF9CdWZmZXIgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVyT3V0OyAgICAvKio8IEJ1ZmZlciBmb3IgdGhlIGRlY29kZWQgUENNIGRhdGEgKi8KLSAgICBBQUNfREVDX1NUUkVBTV9QUk9QUyAgICAgICAgQWFjUHJvcGVydGllczsgICAgICAvKio8IFN0cnVjdHVyZSBmb3IgbmV3IGFwaSB0byBnZXQgQUFDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzICovCi0KLSAgICAvKioKLSAgICAgKiBBdWRpbyBBVSB0byBGcmFtZSBzcGxpdCBzdHVmZiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkF1ZGlvRnJhbWVBdmFpbGFibGU7ICAvKio8IFRydWUgaWYgYW4gYXVkaW8gZnJhbWUgaXMgYXZhaWxhYmxlICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICBwQXVkaW9GcmFtZVB0cjsgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgQXVkaW8gZnJhbWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIHVpQXVkaW9GcmFtZVNpemU7ICAgICAgICAvKio8IFNpemUgb2YgdGhlIGF1ZGlvIGZyYW1lIGF2YWlsYWJsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgaUF1ZGlvRnJhbWVDdHM7ICAgICAgIC8qKjwgW1RpbWVzY2FsZV0gQ1RTIG9mIHRoZSBhdWRpbyBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlICovCi0KLSAgICAvKioKLSAgICAgKiBTaWxlbmNlIGZyYW1lIHN0dWZmICovCi0gICAgIC8qKjwgU2l6ZSB0byByZXNlcnZlIHRvIHN0b3JlIGEgcGNtIGZ1bGwgb2YgemVyb3MgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2lsZW5jZVBjbVNpemU7Ci0gICAgLyoqPCBQb2ludGVyIHRvIHNpbGVuY2UgZnJhbWUgZGF0YSBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICAgICAgcFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgLyoqPCBTaXplIG9mIHNpbGVuY2UgZnJhbWUgZGF0YSBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTaWxlbmNlRnJhbWVTaXplOwotICAgIC8qKjwgW1RpbWVzY2FsZV0gRHVyYXRpb24gb2Ygc2lsZW5jZSBmcmFtZSBkYXRhIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcCBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBpU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIHNjYWxlX2F1ZGlvOyAgICAgICAgICAgIC8qKjwgZnJlcXVlbmN5IC8gMTAwMC4wICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2VzIG9mIHRoZSB1c2VkIG1vZHVsZXMgKi8KLSAgICAgLyoqPCBGaWxlc3lzdGVtIGFuZCBzaGVsbCByZWFkZXIsIGRlY29kZXIgZnVuY3Rpb25zICovCi0gICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0IFNoZWxsQVBJOwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAqcFBsYW5lWXV2OyAgLyogWVVWNDIwIGltYWdlIHBsYW5lLCBjb252ZXJ0ZWQgZnJvbSBBUkdCODg4ICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqICAgICAgICAgIG1fcFByZVJlc2l6ZUZyYW1lOyAgLyogVGhlIGRlY29kZWQgaW1hZ2UgYmVmb3JlIHJlc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBvbmx5IGlmIHJlc2l6ZSBuZWVkZWQpKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgKnBQbGFuZVl1dldpdGhFZmZlY3Q7IC8qIFlVVjQyMCBpbWFnZSBwbGFuZSwgd2l0aCBjb2xvciBlZmZlY3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkdldFl1dkRhdGFGcm9tRGVjb2RlcjsgIC8qIEJvb2xlYW4gdXNlZCB0byBnZXQgWVVWIGRhdGEgZnJvbSBkdW1teSB2aWRlbyBkZWNvZGVyIG9ubHkgZm9yIGZpcnN0IHRpbWUgKi8KLX0gTTRWU1MzR1BQX0NsaXBDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIGFub255bW91cyBlbnVtCi0gKiBAYnJpZWYgICAgICAgIGVudW0gdG8ga2VlcCB0cmFjayBvZiB0aGUgZW5jb2RlciBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLWVudW0KLXsKLSAgICBNNFZTUzNHUFBfa05vRW5jb2RlciwKLSAgICBNNFZTUzNHUFBfa0VuY29kZXJDbG9zZWQsCi0gICAgTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZCwKLSAgICBNNFZTUzNHUFBfa0VuY29kZXJSdW5uaW5nCi19OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZTUzNHUFBfQXVkaW9WaWRlb0NvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYXVkaW8gdmlkZW8gY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgYXVkaW8vdmlkZW8sIGVuY29kaW5nL3dyaXRpbmcgb3BlcmF0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqIFRpbWluZyBTdHVmZiAqLwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBEdXJhdGlvbiBvZiB0aGUgb3V0cHV0IGZpbGUsIHVzZWQgZm9yIHByb2dyZXNzIGNvbXB1dGF0aW9uICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIGRJbnB1dFZpZEN0czsKLSAgICAvKio8IFtNaWxsaXNlY29uZHNdIEN1cnJlbnQgQ1RTIG9mIHRoZSB2aWRlbyBvdXRwdXQgc3RyZWFtICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIGRPdXRwdXRWaWRDdHM7Ci0vKio8IFtNaWxsaXNlY29uZHNdIEN1cnJlbnQgQ1RTIG9mIHRoZSBhdWRpbyBvdXRwdXQgc3RyZWFtICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIGRBVG87Ci0gICAgIC8qKjwgW01pbGxpc2Vjb25kc10gRHVyYXRpb24gb2YgdGhlIG91dHB1dCBmaWxlLCB1c2VkIGZvciBwcm9ncmVzcyBjb21wdXRhdGlvbiAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpT3V0cHV0RHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgVmlkZW8gU3RyZWFtIFN0dWZmICovCi0gICAgTTRTWVNfU3RyZWFtVHlwZSAgICAgICAgICAgIFZpZGVvU3RyZWFtVHlwZTsgICAgICAgIC8qKjwgT3V0cHV0IHZpZGVvIGNvZGVjICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIG91dHB1dFZpZGVvUHJvZmlsZTsgIC8qKjwgT3V0cHV0IHZpZGVvIHByb2ZpbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9MZXZlbDsgICAvKio8IE91dHB1dCB2aWRlbyBsZXZlbCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZTsgICAgIC8qKjwgQXZlcmFnZSB2aWRlbyBiaXRyYXRlIG9mIHRoZSBvdXRwdXQgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkIGZyb20gaW5wdXQgYml0cmF0ZXMsIGR1cmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9ucyBhbmQgY3V0cyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvV2lkdGg7ICAgICAgICAgICAgLyoqPCBPdXRwdXQgaW1hZ2Ugd2lkdGggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb0hlaWdodDsgICAgICAgICAgICAvKio8IE91dHB1dCBpbWFnZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb1RpbWVTY2FsZTsgICAgICAgIC8qKjwgVGltZSBzY2FsZSB0byB1c2UgZm9yIHRoZSBlbmNvZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHRyYW5zaXRpb24gKGlmIE1QRUctNCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBiVmlkZW9EYXRhUGFydGl0aW9uaW5nOyAgICAvKio8IERhdGEgcGFydGl0aW9uaW5nIHRvIHVzZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nIG9mIHRoZSB0cmFuc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBNUEVHLTQpICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgICAgcFZpZGVvT3V0cHV0RHNpOyAgICAgICAgLyoqPCBEZWNvZGVyIFNwZWNpZmljIEluZm8gb2YgdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHLTQgdHJhY2sgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgdWlWaWRlb091dHB1dERzaVNpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgRGVjb2RlciBTcGVjaWZpYyBJbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG91dHB1dCBNUEVHLTQgdHJhY2sgKi8KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgQXVkaW8gU3RyZWFtIFN0dWZmICovCi0gICAgTTRTWVNfU3RyZWFtVHlwZSAgICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZTsgICAgICAgIC8qKjwgVHlwZSBvZiB0aGUgb3V0cHV0IGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHM7ICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gKDE9bW9ubywgMj1zdGVyZW8pICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpQXVkaW9CaXRyYXRlOyAgICAgICAgIC8qKjwgQXVkaW8gYXZlcmFnZSBiaXRyYXRlIChpbiBicHMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2FtcGxpbmdGcmVxdWVuY3k7ICAgIC8qKjwgU2FtcGxpbmcgYXVkaW8gZnJlcXVlbmN5ICg4MDAwIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtciwgMTYwMDAgb3IgbW9yZSBmb3IgYWFjKSAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICAgIHBBdWRpb091dHB1dERzaTsgICAgICAgIC8qKjwgRGVjb2RlciBTcGVjaWZpYyBJbmZvIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICB1aUF1ZGlvT3V0cHV0RHNpU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgb3V0cHV0IGF1ZGlvIHRyYWNrICovCi0KLSAgICAvKioKLSAgICAgKiBBdWRpbyBFbmNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNDdHh0OyAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvICBwQXVkaW9FbmNEU0k7ICAgICAgIC8qKjwgRGVjb2RlciBzcGVjaWZpYyBpbmZvIGJ1aWx0IGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMgICAgICAgICAgIEF1ZGlvRW5jUGFyYW1zOyAgICAgLyoqPCBDb25maWcgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLQotICAgIC8qKgotICAgICAqIFNpbGVuY2UgZnJhbWUgc3R1ZmYgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTaWxlbmNlUGNtU2l6ZTsgICAgICAgLyoqPCBTaXplIHRvIHJlc2VydmUgdG8gc3RvcmUgYSBwY20gZnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHplcm9zIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfVUludDgqICAgICAgICAgICAgICAgIHBTaWxlbmNlRnJhbWVEYXRhOyAgICAgIC8qKjwgUG9pbnRlciB0byBzaWxlbmNlIGZyYW1lIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNpbGVuY2VGcmFtZVNpemU7ICAgICAvKio8IFNpemUgb2Ygc2lsZW5jZSBmcmFtZSBkYXRhIGNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG1hc3RlciBjbGlwIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIGlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgIC8qKjwgW1RpbWVzY2FsZV0gRHVyYXRpb24gb2Ygc2lsZW5jZSBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgICAgICBzY2FsZV9hdWRpbzsgICAgICAgICAgICAvKio8IGZyZXF1ZW5jeSAvIDEwMDAuMCAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gRW5jb2RlciBzdHVmZiAqLwotICAgIE00RU5DT0RFUl9Db250ZXh0ICAgICAgICAgICAgcEVuY0NvbnRleHQ7ICAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBlbmNvZGVyICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAgICAgICAgT3VyV3JpdGVyRGF0YUludGVyZmFjZTsgICAgLyoqPCBPdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIgaW50ZXJmYWNlLCB0byBnaXZlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmNvZGVyIHNoZWxsICovCi0gICAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgICAgICAgIHBEdW1teUF1QnVmZmVyOyAgICAgICAgICAgIC8qKjwgQnVmZmVyIGdpdmVuIHRvIHRoZSBlbmNvZGVyIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IHRvIHdyaXRlIEFVcyB3ZSBkb24ndCB3YW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBvdXRwdXQgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaU1wZWc0R292T2Zmc2V0OyAgICAgICAgLyoqPCBDbGlwIEdPViBvZmZzZXQgaW4gbXMgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBhbmQgc3lzdGVtIHRpbWUgKi8KLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgICAgIFZwcEVycm9yOyAgICAgICAgICAgICAgICAvKio8IEVycm9yIGZvciBWUFAgYXJlIG1hc2tlZCBieSBWaWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2Rlciwgc28gd2UgbXVzdCByZW1lbWJlciBpdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBlbmNvZGVyU3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXIgc3R1ZmYgKi8KLSAgICBNNFdSSVRFUl9Db250ZXh0ICAgICAgICAgICAgcDNncFdyaXRlckNvbnRleHQ7ICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIDNHUFAgd3JpdGVyIG1vZHVsZSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICAgICAgICBXcml0ZXJWaWRlb1N0cmVhbTsgICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICAgICAgIFdyaXRlckF1ZGlvU3RyZWFtOyAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zICAgIFdyaXRlclZpZGVvU3RyZWFtSW5mbzsgICAgLyoqPCBWaWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zICAgIFdyaXRlckF1ZGlvU3RyZWFtSW5mbzsgICAgLyoqPCBBdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBXcml0ZXJWaWRlb0FVOyAgICAgICAgICAgIC8qKjwgV3JpdHRlbiB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBXcml0ZXJBdWRpb0FVOyAgICAgICAgICAgIC8qKjwgV3JpdHRlbiBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvTWF4QXVTaXplOyAgICAgICAgLyoqPCBNYXggQVUgc2l6ZSBzZXQgdG8gdGhlIHdyaXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgdmlkZW8gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBdWRpb01heEF1U2l6ZTsgICAgICAgIC8qKjwgTWF4IEFVIHNpemUgc2V0IHRvIHRoZSB3cml0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGF1ZGlvICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZTsgLyoqPCBBdmVyYWdlIHZpZGVvIGJpdHJhdGUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlLCBjb21wdXRlZCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGJpdHJhdGVzLCBkdXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zIGFuZCBjdXRzICovCi0KLX0gTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBlZGl0IFZTUyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBWU1MgZWRpdCBvcGVyYXRpb25zIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiBWU1MgM0dQUCBtYWluIHZhcmlhYmxlcyAqLwotICAgIE00VlNTM0dQUF9FZGl0U3RhdGUgICAgICAgICBTdGF0ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVlNTIGludGVybmFsIHN0YXRlICovCi0gICAgTTRWU1MzR1BQX0VkaXRWaWRlb1N0YXRlICAgIFZzdGF0ZTsKLSAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvU3RhdGUgICAgQXN0YXRlOwotCi0gICAgLyoqCi0gICAgICogVXNlciBTZXR0aW5ncyAoY29waWVkLCB0aHVzIG93bmVkIGJ5IFZTUzNHUFApICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBOdW1iZXI7ICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50IG9mIHRoZSBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgcENsaXBMaXN0LiAqLwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgICAgICAgICAgICpwQ2xpcExpc3Q7ICAgICAgICAgICAgLyoqPCBMaXN0IG9mIHRoZSBpbnB1dCBjbGlwcyBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkgb2YgdWlDbGlwTnVtYmVyIGNsaXAgc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICAgKnBUcmFuc2l0aW9uTGlzdDsgICAgLyoqPCBMaXN0IG9mIHRoZSB0cmFuc2l0aW9uIHNldHRpbmdzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5IG9mIHVpQ2xpcE51bWJlci0xIHRyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgICAgICAgKnBFZmZlY3RzTGlzdDsgICAgICAgIC8qKjwgTGlzdCBvZiB0aGUgZWZmZWN0cyBzZXR0aW5ncy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheSBvZiBuYkVmZmVjdHMgUkMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgKnBBY3RpdmVFZmZlY3RzTGlzdDsgICAgLyoqPCBMaXN0IG9mIHRoZSBhY3RpdmUgZWZmZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLiBBcnJheSBvZiBuYkVmZmVjdHMgUkMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIG5iRWZmZWN0czsgICAgICAgICAgICAvKio8IE51bWJlcnMgb2YgZWZmZWN0cyBSQyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgbmJBY3RpdmVFZmZlY3RzOyAgICAvKio8IE51bWJlcnMgb2YgYWN0aXZlIGVmZmVjdHMgUkMgKi8KLQotICAgIC8qKgotICAgICAqIElucHV0IFN0dWZmICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwOyAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgY3VycmVudCBjbGlwIDEgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IGNsaXAgbGlzdCAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgICAgICBwQzE7ICAgICAgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgY3VycmVudCBjbGlwIDEgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqICAgICAgICAgICAgcEMyOyAgICAgICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGN1cnJlbnQgY2xpcCAyICovCi0KLSAgICAvKioKLSAgICAgKiBEZWNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIGRPdXRwdXRGcmFtZUR1cmF0aW9uOyAgICAvKio8IFtNaWxsaXNlY29uZHNdIGRpcmVjdGx5IHJlbGF0ZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGZyYW1lIHJhdGUgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIHl1djFbM107ICAgICAgICAgICAgLyoqPCBGaXJzdCB0ZW1wb3JhcnkgWVVWNDIwIGltYWdlIHBsYW5lICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICB5dXYyWzNdOyAgICAgICAgICAgIC8qKjwgU2Vjb25kIHRlbXBvcmFyeSBZVVY0MjAgaW1hZ2UgcGxhbmUgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIHl1djNbM107ICAgICAgICAgICAgLyoqPCBUaGlyZCB0ZW1wb3JhcnkgWVVWNDIwIGltYWdlIHBsYW5lIFJDICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICB5dXY0WzNdOyAgICAgICAgICAgIC8qKjwgRm91cnRoIHRlbXBvcmFyeSBZVVY0MjAgaW1hZ2UgcGxhbmUgUkMgKi8KLQotICAgIC8qKgotICAgICAqIEVmZmVjdCBzdHVmZiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJDbGlwMUF0QmVnaW5DdXQ7ICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIFRoZSBjbGlwMSBpcyBhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyBiZWdpbiBjdXQgKi8KLSAgICBNNE9TQV9JbnQ4ICAgICAgICAgICAgICAgICAgICBpQ2xpcDFBY3RpdmVFZmZlY3Q7ICAgICAgICAvKio8IFRoZSBpbmRleCBvZiB0aGUgYWN0aXZlIGVmZmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBDbGlwMSAoPDAgbWVhbnMgbm9uZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZWQgZm9yIHZpZGVvIGFuZCBhdWRpbyBidXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzaW11bHRhbmVvdXNseSkgKi8KLSAgICBNNE9TQV9JbnQ4ICAgICAgICAgICAgICAgICAgICBpQ2xpcDJBY3RpdmVFZmZlY3Q7ICAgICAgICAvKio8IFRoZSBpbmRleCBvZiB0aGUgYWN0aXZlIGVmZmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBDbGlwMiAoPDAgbWVhbnMgbm9uZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZWQgZm9yIHZpZGVvIGFuZCBhdWRpbyBidXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHNpbXVsdGFuZW91c2x5KSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJUcmFuc2l0aW9uRWZmZWN0OyAgICAgICAgLyoqPCBUcnVlIGlmIHRoZSB0cmFuc2l0aW9uIGVmZmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGFwcGxpZWQgYXQgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSAqLwotCi0gICAgLyoqCi0gICAgICogRW5jb2RpbmcgYW5kIFdyaXRpbmcgb3BlcmF0aW9ucyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgYlN1cHBvcnRTaWxlbmNlOyAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB0aGUgb3V0cHV0IHN0cmVhbSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHNpbGVuY2UgKGV2ZW4gaWYgbm90IGVkaXRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSBBQUMrLCBidXQgbm90IEVWUkMpICovCi0gICAgTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAgICBld2M7ICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gYW5kIHZpZGVvIGVuY29kZS93cml0ZSBzdHVmZiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBiSXNNTVM7ICAgICAgICAgICAgICAgIC8qKjwgQm9vbGVhbiB1c2VkIHRvIGtub3cgaWYgd2UgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBhIGZpbGUgd2l0aCBhbiBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIGNvbnN0cmFpbnQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpTU1TVmlkZW9CaXRyYXRlOyAgICAvKio8IElmIGluIE1NUyBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRlZCB2aWRlbyBiaXRyYXRlICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZXJhdGUgICAgTU1TdmlkZW9GcmFtZXJhdGU7ICAgIC8qKjwgSWYgaW4gTU1TIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkIHZpZGVvIGZyYW1lcmF0ZSAqLwotCi0gICAgLyoqCi0gICAgICogRmlsZXN5c3RlbSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwT3NhRmlsZVJlYWRQdHI7ICAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgIHBPc2FGaWxlV3JpdFB0cjsgICAgIC8qKjwgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2VzIG9mIHRoZSB1c2VkIG1vZHVsZXMgKi8KLSAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgICAgICAgICBTaGVsbEFQSTsgICAgICAgICAgIC8qKjwgRmlsZXN5c3RlbSBhbmQgc2hlbGwgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICBiSXNzZWNvbmRDbGlwOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAqcEFjdGl2ZUVmZmVjdHNMaXN0MTsgIC8qKjwgTGlzdCBvZiB0aGUgYWN0aXZlIGVmZmVjdHMgc2V0dGluZ3MuIEFycmF5IG9mIG5iRWZmZWN0cyBSQyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICBuYkFjdGl2ZUVmZmVjdHMxOyAgLyoqPCBOdW1iZXJzIG9mIGFjdGl2ZSBlZmZlY3RzIFJDICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIG1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQ7ICAvKio8IEZsYWcgdG8gaW5kaWNhdGUgdGhhdCBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBlZmZlY3QgaXMgYWN0aXZlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgIGlJbk91dFRpbWVPZmZzZXQ7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIGJFbmNvZGVUaWxsRW9GOwotICAgIE00eFZTU19FZGl0U2V0dGluZ3MgICAgICB4VlNTOwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICBtX2Fpcl9jb250ZXh0OwotCi0gICAgTTRPU0FfQm9vbCBiQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0OyAvKio8IE92ZXJsYXkgZmxhZyBmb3IgY2xpcDEgKi8KLSAgICBNNE9TQV9Cb29sIGJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3Q7IC8qKjwgT3ZlcmxheSBmbGFnIGZvciBjbGlwMiwgdXNlZCBpbiB0cmFuc2l0aW9uICovCi19IE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBhdWRpbyBtaXhpbmcgVlNTIDNHUFAgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbnMgdG8gc3RvcmUKLSAqICAgICAgICAgICAgICAgIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiAgICBWU1MgbWFpbiB2YXJpYWJsZXMgKi8KLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTdGF0ZSBTdGF0ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBzdGF0ZSAqLwotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgY29weSBvZiB0aGUgaW5wdXQgc2V0dGluZ3MgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICBpQWRkQ3RzOyAgICAgICAgICAgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBUaW1lLCBpbiBtaWxsaXNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgd2hpY2ggdGhlIGFkZGVkIGF1ZGlvIHRyYWNrIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlCZWdpbkxvb3A7ICAgICAgICAgICAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCB0aW1lIG9mIHRoZSBsb29wICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlFbmRMb29wOyAgICAgICAgICAgICAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBvZiB0aGUgbG9vcCAoMCBtZWFucyBubyBsb29wKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgIGJSZW1vdmVPcmlnaW5hbDsgICAgICAgICAgICAvKio8IElmIHRydWUsIHRoZSBvcmlnaW5hbCBhdWRpbyB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgKi8KLQotICAgIC8qKgotICAgICAqIElucHV0IGF1ZGlvL3ZpZGVvIGZpbGUgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICAgICAgICBJbnB1dENsaXBTZXR0aW5nczsgICAgICAgIC8qKjwgU3RydWN0dXJlIGludGVybmFsbHkgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UgdGhlIGlucHV0IDNHUFAgc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqICAgICAgICBwSW5wdXRDbGlwQ3R4dDsgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgaW5wdXQgM0dQUCBjbGlwICovCi0KLSAgICAvKioKLSAgICAgKiBBZGRlZCBhdWRpbyBmaWxlIHN0dWZmICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgQWRkZWRDbGlwU2V0dGluZ3M7ICAgICAgICAvKio8IFN0cnVjdHVyZSBpbnRlcm5hbGx5IHVzZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlIHRoZSBhZGRlZCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgIHBBZGRlZENsaXBDdHh0OyAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBhZGRlZCAzR1BQIGNsaXAgKi8KLQotICAgIC8qKgotICAgICAqIEF1ZGlvIHN0dWZmICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgIGZPcmlnRmFjdG9yOyAgICAgICAgICAgIC8qKjwgRmFjdG9yIHRvIGFwcGx5IHRvIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYWNrIGZvciB0aGUgbWl4aW5nICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgIGZBZGRlZEZhY3RvcjsgICAgICAgICAgICAvKio8IEZhY3RvciB0byBhcHBseSB0byB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgZm9yIHRoZSBtaXhpbmcgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYlN1cHBvcnRTaWxlbmNlOyAgICAgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgdGhlIG91dHB1dCBzdHJlYW0gY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBzaWxlbmNlIChldmVuIGlmIG5vdCBlZGl0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUgQUFDKywgYnV0IG5vdCBFVlJDKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiSGFzQXVkaW87ICAgICAgICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGRlbGV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkF1ZGlvTWl4aW5nSXNOZWVkZWQ7ICAvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGRvIG1peGluZyAqLwotCi0gICAgLyoqCi0gICAgICogRW5jb2RpbmcgYW5kIFdyaXRpbmcgb3BlcmF0aW9ucyAqLwotICAgIE00VlNTM0dQUF9FbmNvZGVXcml0ZUNvbnRleHQgICAgZXdjOyAgICAgICAgICAgICAgICAvKio8IEF1ZGlvIGFuZCB2aWRlbyBlbmNvZGUvd3JpdGUgc3R1ZmYgKi8KLQotICAgIC8qKgotICAgICAqIEZpbGVzeXN0ZW0gZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgcE9zYUZpbGVSZWFkUHRyOyAgICAgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICBwT3NhRmlsZVdyaXRQdHI7ICAgICAvKio8IE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2VzIG9mIHRoZSB1c2VkIG1vZHVsZXMgKi8KLSAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgU2hlbGxBUEk7ICAgICAgICAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGFuZCBzaGVsbCByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgZnVuY3Rpb25zICovCi0KLSAgICAvKioKLSAgICAgKiBTYW1wbGUgUmF0ZSBDb252ZXJ0b3IgKFNTUkMpIHN0dWZmIChuZWVkZWQgaW4gY2FzZSBvZiBtaXhpbmcgd2l0aCAhPSBBU0YvbmIgb2YgY2hhbm5lbHMpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJfU1NSQ25lZWRlZDsgICAgICAgIC8qKjwgSWYgdHJ1ZSwgU1NSQyBpcyBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghPSBBU0Ygb3IgbmIgb2YgY2hhbm5lbHMpICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgIENoYW5uZWxDb252ZXJzaW9uOyAgICAvKio8IDE9Q29udmVyc2lvbiBmcm9tIE1vbm8gdG8gU3RlcmVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMj1TdGVyZW8gdG8gTW9ubywgMD1ubyBjb252ZXJzaW9uICovCi0gICAgU1NSQ19JbnN0YW5jZV90ICAgICAgICAgICAgIFNzcmNJbnN0YW5jZTsgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgU3NyYyAqLwotICAgIFNTUkNfU2NyYXRjaF90KiAgICAgICAgICAgICBTc3JjU2NyYXRjaDsgICAgICAgIC8qKjwgV29ya2luZyBtZW1vcnkgb2YgdGhlIFNzcmMgKi8KLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgaVNzcmNOYlNhbXBsSW47ICAgIC8qKjwgTnVtYmVyIG9mIHNhbXBsZSB0aGUgU3NyYyBuZWVkcyBhcyBpbnB1dCAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICBpU3NyY05iU2FtcGxPdXQ7ICAgIC8qKjwgTnVtYmVyIG9mIHNhbXBsZSB0aGUgU3NyYyBvdXRwdXRzICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgIHBTc3JjQnVmZmVySW47ICAgICAgICAvKio8IElucHV0IG9mIHRoZSBTU1JDICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgIHBTc3JjQnVmZmVyT3V0OyAgICAgICAgLyoqPCBPdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFBvc0luU3NyY0J1ZmZlckluOyAgICAvKio8IFBvc2l0aW9uIGludG8gdGhlIFNTUkMgaW4gYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgIHBQb3NJblNzcmNCdWZmZXJPdXQ7LyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBTU1JDIG91dCBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFRlbXBCdWZmZXI7ICAgICAgICAvKio8IFRlbXBvcmFyeSBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFBvc0luVGVtcEJ1ZmZlcjsgICAgLyoqPCBQb3NpdGlvbiBpbiB0ZW1wb3JhcnkgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1pbmltdW1CdWZmZXJJbjsgICAgLyoqPCBNaW5pbXVtIGFtb3VudCBvZiBkZWNvZGVkIGRhdGEgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBieSBTU1JDIGFuZCBjaGFubmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydG9yICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJfRHVja2luZ05lZWRlZWQ7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIEluRHVja2luZ190aHJlc2hvbGQ7ICAvKio8IFRocmVzaG9sZCB2YWx1ZSBhdCB3aGljaCBiYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljIHNoYWxsIGR1Y2sgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgSW5EdWNraW5nX2xvd1ZvbHVtZTsgIC8qKjwgbG93ZXIgdGhlIGJhY2tncm91bmQgdHJhY2sgdG8gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciBhbmQgaW5jcmVhc2UgdGhlIHByaW1hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayB0byBpbnZlcnNlIG9mIHRoaXMgZmFjdG9yICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgIGxvd1ZvbHVtZTsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgYXVkaW9Wb2x1bWVBcnJheVtXSU5ET1dfU0laRV07IC8vIHN0b3JlIHBlYWsgYXVkaW8gdm9sLiBsZXZlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGR1cmF0aW9uIGZvciBXSU5ET1dfU0laRQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBhdWRWb2xBcnJJbmRleDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgZHVja2luZ0ZhY3RvciA7ICAgICAvKio8IG11bHRpcGx5IGJ5IHRoaXMgZmFjdG9yIHRvIGJyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFERSBJTi9GQURFIE9VVCBlZmZlY3QgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgZkJUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgIGZQVFZvbExldmVsOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiRG9EdWNraW5nOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiTG9vcDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYk5vTG9vcGluZzsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICBwTFZBdWRpb1Jlc2FtcGxlcjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYmp1bXBmbGFnOwotCi19IE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFeHRyYWN0UGljdHVyZUNvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZXh0cmFjdCBwaWN0dXJlIFZTUyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBWU1MgcGljdHVyZSBleHRyYWN0aW9ucyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogICAgVlNTIG1haW4gdmFyaWFibGVzICovCi0gICAgTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU3RhdGUgU3RhdGU7ICAgICAgICAgICAgICAgIC8qKjwgVlNTIGV4dHJhY3QgcGljdHVyZWludGVybmFsIHN0YXRlICovCi0KLSAgICAvKioKLSAgICAgKiBJbnB1dCBmaWxlcyAqLwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgICAgICAgIENsaXBTZXR0aW5nczsgICAgICAgICAgICAvKio8IFN0cnVjdHVyZSBpbnRlcm5hbGx5IHVzZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UgdGhlIGlucHV0IDNGUFAgc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqICAgICAgICBwSW5wdXRDbGlwQ3R4dDsgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgaW5wdXQgM0dQUCBjbGlwICovCi0KLSAgICAvKioKLSAgICAgKiBTZXR0aW5ncyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpRXh0cmFjdEN0czsgICAgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIEN0cyBvZiB0aGUgQVUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBleHRyYWN0ZWQgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIHN0dWZmICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICBkZWNQbGFuZXNbM107ICAgICAgICAgICAgLyoqPCBEZWNvZGVkIFlVVjQyMCBwaWN0dXJlIHBsYW5lICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9XaWR0aDsgICAgICAgICAgICAvKio8IERlY29kZWQgaW1hZ2Ugd2lkdGggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb0hlaWdodDsgICAgICAgICAgICAvKio8IERlY29kZWQgaW1hZ2UgaGVpZ2h0ICovCi0KLSAgICAvKgotICAgICAqIERlY29kZXIgaW5mbyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgIGlEZWNDdHM7ICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBEZWNvZGVkIEFVIEN0cyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgIGJKdW1wRmxhZzsgICAgIC8qKjwgMSBpZiBhIGp1bXAgaGFzIGJlZW4gbWFkZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgIGlEZWx0YVRpbWU7ICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBUaW1lIGJldHdlZW4gcHJldmlvdXMgUkFQIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHRvIGV4dHJhY3QgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICBpR2FwOyAgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gVGltZSBiZXR3ZWVuIGp1bXAgQVUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGlvbiB0aW1lICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlTdGVwOyAgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIFByb2dyZXNzIGJhciB0aW1lIGluY3JlbWVudCAqLwotCi0gICAgLyoqCi0gICAgICogRmlsZXN5c3RlbSBmdW5jdGlvbnMgKi8KLSAgICAgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwT3NhRmlsZVJlYWRQdHI7Ci0gICAgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLCB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgIHBPc2FGaWxlV3JpdFB0cjsKLQotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJDbGlwT3BlbmVkOwotfSBNNFZTUzNHUFBfSW50ZXJuYWxFeHRyYWN0UGljdHVyZUNvbnRleHQ7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0lOVEVSTkFMVFlQRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTR4VlNTX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjZTEwMmYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFhWU1NfQVBJX0hfXwotI2RlZmluZSBfX000WFZTU19BUElfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX0FQSS5oCi0gKiBAYnJpZWYgICAgQVBJIG9mIFZpZGVvIFN0dWRpbyAyLjEKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLQotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgiCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotLyogRXJyb3JzIGNvZGVzICovCi0KLS8qKgotICogRW5kIG9mIGFuYWx5emluZyA9PiB0aGUgdXNlciBjYW4gY2FsbCBNNHhWU1NfUHJldmlld1N0YXJ0IG9yIE00eFZTU19TYXZlU3RhcnQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORSAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWUywgMHgwMDAxKQotCi0vKioKLSAqIEVuZCBvZiBwcmV2aWV3IGdlbmVyYXRpbmcgPT4gdGhlIHVzZXIgY2FuIGxhdW5jaCB2cHMgdG8gc2VlIHByZXZpZXcuIE9uY2UgcHJldmlldyBpcyBvdmVyLAotICAgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19QcmV2aWV3U3RvcCgpIHRvIGJlIGFibGUgdG8gc2F2ZSBlZGl0ZWQgZmlsZSwgb3IgdG8gY2FsbCBhbm90aGVyCi0gICBNNHhWU1NfU2VuZENvbW1hbmQoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX1BSRVZJRVdfUkVBRFkgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDIpCi0KLS8qKgotICogRW5kIG9mIHNhdmVkIGZpbGUgZ2VuZXJhdGlvbiA9PiB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1NhdmVTdG9wKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORSAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWUywgMHgwMDAzKQotCi0vKioKLSAqIFRyYW5zY29kaW5nIGlzIG5lY2Vzc2FyeSB0byBnbyBmdXJ0aGVyIC0+IGlmIHRoZSB1c2VyIGRvZXMgbm90IHdhbnQgdG8gY29udGludWUsCi0gIGhlIG11c3QgY2FsbCBNNHhWU1Nfc2VuZENvbW1hbmQoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX1RSQU5TQ09ESU5HX05FQ0VTU0FSWSAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDQpCi0KLS8qKgotICogSW4gY2FzZSBvZiBNTVMsIHRoZSBvdXRwdXQgZmlsZSBzaXplIHdvbid0IGJlIHJlYWNoZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWUywgMHgwMDA1KQotCi0vKioKLSAqIEpQRyBpbnB1dCBmaWxlIGRpbWVuc2lvbnMgYXJlIHRvbyBoaWdoICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSlBHX1RPT19CSUcgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlMsIDB4MDAwMSkKLQotLyoqCi0gKiBVVEYgQ29udmVyc2lvbiwgd2FybmluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgdGVtcG9yYXJ5IGNvbnZlcnRlZCBidWZmZXIqLwotI2RlZmluZSBNNHhWU1NXQVJfQlVGRkVSX09VVF9UT09fU01BTEwgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDYpCi0KLS8qKgotICogU1dJS0FSIDpFcnJvciB3aGFuIE5PX01PUkVfU1BBQ0UqLwotI2RlZmluZSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRSAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTLCAweDAwMDcpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTR4VlNTX1ZpZGVvRWZmZWN0VHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSB2aWRlbyBlZmZlY3QgdHlwZXMgb2YgdGhlIHhWU1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlID0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwrMSwgLyogMjU3ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI1OCAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNTkgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjYwICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2MSAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjIgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9UZXh0LCAvKiBUZXh0IG92ZXJsYXkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjYzICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbUluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2NCAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21PdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjUgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMjY2ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjI2NyAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoyNjgqLwotfSBNNHhWU1NfVmlkZW9FZmZlY3RUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00eFZTU19WaWRlb1RyYW5zaXRpb25UeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0aGF0IGNhbiBiZSBhcHBsaWVkIGR1cmluZyBhIHRyYW5zaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsID0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsLCAvKjI1NiovCi0gICAgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWMsCi0gICAgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX1NsaWRlVHJhbnNpdGlvbiwKLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRmFkZUJsYWNrCi0KLX0gTTR4VlNTX1ZpZGVvVHJhbnNpdGlvblR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19QcmV2aWV3U2V0dGluZ3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZSBWUFMgZm9yIHByZXZpZXcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwM2dwUHJldmlld0ZpbGU7Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBQQ01GaWxlOwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICAgb3V0UENNX0FTRjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXVkaW9Nb25vOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAqRWZmZWN0czsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJFZmZlY3RzOwotCi19IE00eFZTU19QcmV2aWV3U2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU190b1VURjhGY3QKLSAqIEBicmllZiAgICAgICAgVGhpcyBwcm90b3R5cGUgZGVmaW5lcyB0aGUgZnVuY3Rpb24gaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICAgIHRvIGNvbnZlcnQgYSBzdHJpbmcgZW5jb2RlZCBpbiBhbnkgZm9ybWF0IHRvIGFuIFVURjggc3RyaW5nLgotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICBJTiAgICAgICAgICAgIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdHJpbmcgdG8gY29udmVydCB0byBVVEY4Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgSU4gICAgICAgICAgICBCdWZmZXIgY29udGFpbmluZyB0aGUgVVRGOCBjb252ZXJ0ZWQgc3RyaW5nCi0gKiBAcGFyYW0gICAgYnVmZmVyT3V0U2l6ZSAgICBJTi9PVVQgICAgSU46ICAgICBTaXplIG9mIHRoZSBnaXZlbiBvdXRwdXQgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00eFZTU190b1VURjhGY3QpCi0oCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICpwQnVmZmVySW4sCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAqcEJ1ZmZlck91dCwKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICpidWZmZXJPdXRTaXplCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19mcm9tVVRGOEZjdAotICogQGJyaWVmICAgICAgICBUaGlzIHByb3RvdHlwZSBkZWZpbmVzIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgICAgdG8gY29udmVydCBhbiBVVEY4IHN0cmluZyB0byBhIHN0cmluZyBlbmNvZGVkIGluIGFueSBmb3JtYXQuCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgICBwQnVmZmVySW4gICAgICAgIElOICAgICAgICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVURjggc3RyaW5nIHRvIGNvbnZlcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBkZXNpcmVkIGZvcm1hdC4KLSAqIEBwYXJhbSAgICBwQnVmZmVyT3V0ICAgICAgICBJTiAgICAgICAgICAgIEJ1ZmZlciBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQgc3RyaW5nCi0gKiBAcGFyYW0gICAgYnVmZmVyT3V0U2l6ZSAgICBJTi9PVVQgICAgSU46ICAgICBTaXplIG9mIHRoZSBnaXZlbiBvdXRwdXQgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00eFZTU19mcm9tVVRGOEZjdCkKLSgKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICpwQnVmZmVySW4sCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICpwQnVmZmVyT3V0LAotICAgIE00T1NBX1VJbnQzMiAgICAgICAgKmJ1ZmZlck91dFNpemUKLSk7Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19Jbml0UGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBwYXJhbWV0ZXJzIGZvciB4VlNTLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgICAgICBwRmlsZVJlYWRQdHI7Ci0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgICBwRmlsZVdyaXRlUHRyOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQYXRoOwotICAgIC8qRnVuY3Rpb24gcG9pbnRlciBvbiBhbiBleHRlcm5hbCB0ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KLSAgICBNNHhWU1NfdG9VVEY4RmN0ICAgICAgICAgICAgICAgIHBDb252VG9VVEY4RmN0OwotICAgIC8qRnVuY3Rpb24gcG9pbnRlciBvbiBhbiBleHRlcm5hbCB0ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KLSAgICBNNHhWU1NfZnJvbVVURjhGY3QgICAgICAgICAgICAgICAgcENvbnZGcm9tVVRGOEZjdDsKLQotCi0KLX0gTTR4VlNTX0luaXRQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19Jbml0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHhWU1MKLSAqIEBub3RlICAgICAgICBJbml0aWFsaXplcyB0aGUgeFZTUyBlZGl0IG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBhcmFtcyAgICAgICAgICAgICAgICAoSU4pIFBhcmFtZXRlcnMgbWFuZGF0b3J5IGZvciB4VlNTCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19Jbml0KE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNHhWU1NfSW5pdFBhcmFtcyogcGFyYW1zKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1JlZHVjZVRyYW5zY29kZQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGdpdmVuIGVkaXRpbmcgc3RydWN0dXJlIGluIG9yZGVyIHRvCi0gKiAgICAgICAgICAgICAgICBtaW5pbWl6ZSB0aGUgdHJhbnNjb2RpbmcgdGltZS4KLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBhbmFseXNlcyB0aGlzIHN0cnVjdHVyZSwgYW5kIGlmIG5lZWRlZCwgY2hhbmdlcyB0aGUKLSAqICAgICAgICAgICAgICAgIG91dHB1dCBwYXJhbWV0ZXJzIChWaWRlbyBjb2RlYywgdmlkZW8gc2l6ZSwgYXVkaW8gY29kZWMsCi0gKiAgICAgICAgICAgICAgICBhdWRpbyBuYiBvZiBjaGFubmVscykgdG8gbWluaW1pemUgdGhlIHRyYW5zY29kaW5nIHRpbWUuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIEVkaXRpb24gc2V0dGluZ3MgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19TZW5kQ29tbWFuZAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGdpdmVzIHRvIHRoZSB4VlNTIGFuIGVkaXRpbmcgc3RydWN0dXJlCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgYW5hbHlzZXMgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBwcmVwYXJlIGVkaXRpb24KLSAqICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTR4VlNTX0luaXQsIGFmdGVyCi0gKiAgICAgICAgICAgICAgICBNNHhWU1NfQ2xvc2VDb21tYW5kLCBvciBhZnRlciBNNHhWU1NfUHJldmlld1N0b3AuCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgICAgIChJTikgRWRpdGlvbiBzZXR0aW5ncyAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19TZW5kQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfUHJldmlld1N0YXJ0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcHJlcGFyZSB0aGUgcHJldmlldwotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGNyZWF0ZSAzR1AgcHJldmlldyBmaWxlIGFuZCBmaWxsIHBQcmV2aWV3U2V0dGluZ3Mgd2l0aAotICogICAgICAgICAgICAgICAgcHJldmlldyBwYXJhbWV0ZXJzLgotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORQotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUHJldmlld1NldHRpbmdzICAgIChJTikgUHJldmlldyBzZXR0aW5ncyAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19QcmV2aWV3U3RhcnQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTR4VlNTX1ByZXZpZXdTZXR0aW5ncyogcFByZXZpZXdTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19QcmV2aWV3U3RvcAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHVuYWxsb2NhdGUgcHJldmlldyByZXNzb3VyY2VzIGFuZCBjaGFuZ2UgeFZTUwotICogICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGUgdG8gYWxsb3cgc2F2aW5nIG9yIHJlc2VuZCBhbiBlZGl0aW5nIGNvbW1hbmQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX1BSRVZJRVdfUkVBRFkKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfUHJldmlld1N0b3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19TYXZlU3RhcnQKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlIHRoZSBzYXZlCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgY3JlYXRlIDNHUCBlZGl0ZWQgZmluYWwgZmlsZQotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORQotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRmlsZVBhdGggICAgICAgICAgICAoSU4pIElmIHRoZSB1c2VyIHdhbnRzIHRvIHByb3ZpZGUgYSBkaWZmZXJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZmlsZW5hbWUsIGVsc2UgY2FuIGJlIE5VTEwgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0YXJ0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1NhdmVTdG9wCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gdW5hbGxvY2F0ZSBzYXZlIHJlc3NvdXJjZXMgYW5kIGNoYW5nZSB4VlNTCi0gKiAgICAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0ZS4KLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1NhdmVTdG9wKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfU3RlcAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGRpZmZlcmVudHMgdGFza3MsIGRlcGVuZGluZyBvZiB4VlNTCi0gKiAgICAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0ZS4KLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uOgotICogICAgICAgICAgICAgICAgICAgIC0gYW5hbHlzZXMgZWRpdGluZyBzdHJ1Y3R1cmUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TZW5kQ29tbWFuZAotICogICAgICAgICAgICAgICAgICAgIC0gZ2VuZXJhdGVzIHByZXZpZXcgZmlsZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1ByZXZpZXdTdGFydAotICogICAgICAgICAgICAgICAgICAgIC0gZ2VuZXJhdGVzIGZpbmFsIGVkaXRlZCBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfU2F2ZVN0YXJ0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiBmcm9tIDAgdG8gMTAwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IsIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCBhZ2FpbgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfUFJFVklFV19SRUFEWTogICAgUHJldmlldyBmaWxlIGlzIGdlbmVyYXRlZAotICogQHJldHVybiAgICBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FOiAgICAgICAgRmluYWwgZWRpdGVkIGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkU6ICAgIEFuYWx5c2UgaXMgZG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfU3RlcChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0Nsb3NlQ29tbWFuZAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgY3VycmVudCBlZGl0aW5nIHByb2ZpbGUsIHVuYWxsb2NhdGUKLSAqICAgICAgICAgICAgICAgIHJlc3NvdXJjZXMgYW5kIGNoYW5nZSB4VlNTIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIGNhbiBjYWxsIGEgbmV3IE00eFZTU19TZW5kQ29tbWFuZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19DbG9zZUNvbW1hbmQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19DbGVhblVwCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBhbGwgeFZTUyByZXNzb3VyY2VzCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBNNHhWU1NfQ2xvc2VDb21tYW5kLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19DbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBWaWRlbyBTdHVkaW8gMi4xCi0gKgotICogQHBhcmFtICAgIHBWZXJzaW9uICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB2ZXJzaW9uIGluZm8gc3RydWN0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZSAgICBUaGUgcHJvdG90eXBlIG9mIHRoaXMgZWZmZWN0IGZ1bmN0aW9uIGlzIGV4cG9zZWQgYmVjYXVzZSBpdCBuZWVkcyB0bwotICogICAgICAgICAgICBjYWxsZWQgYnkgdGhlIFZQUyBkdXJpbmcgdGhlIHByZXZpZXcKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZAotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFkZCBhIGZpeGVkIG9yIGFuaW1hdGVkIGltYWdlIG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlICAgIFRoZSBwcm90b3R5cGUgb2YgdGhpcyBlZmZlY3QgZnVuY3Rpb24gaXMgZXhwb3NlZCBiZWNhdXNlIGl0IG5lZWRzIHRvCi0gKiAgICAgICAgICAgIGNhbGxlZCBieSB0aGUgVlBTIGR1cmluZyB0aGUgcHJldmlldwotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZwotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBtYWtlIGEgdmlkZW8gbG9vayBhcyBpZiBpdCB3YXMgdGFrZW4gaW4gdGhlIGZpZnRpZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhICAgICAgIChJTikgQ29udGV4dAotICogQHBhcmFtICAgIHBQbGFuZUluICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwRmlmdGllc0RhdGEsIHBQbGFuZU91dCBvciBwUHJvZ3Jlc3MgYXJlIE5VTEwgKERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcwotKAotICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbShNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZSAgICBUaGUgcHJvdG90eXBlIG9mIHRoaXMgZWZmZWN0IGZ1bmN0aW9uIGlzIGV4cG9zZWQgYmVjYXVzZSBpdCBuZWVkcyB0bwotICogICAgICAgICAgICBjYWxsZWQgYnkgdGhlIFZQUyBkdXJpbmcgdGhlIHByZXZpZXcKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCB6b29tIHRvIGFwcGx5IChJbi9PdXQpCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbQotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEFsbG93cyBmaWxsaW5nIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICoKLSAqIEBub3RlICAgIFdBUk5JTkc6IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbIF0gd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlICAgICAgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIHBGaWxlICAgICAgICAgICAgICAgKElOKSBDbGlwIGZpbGUgbmFtZQotICogQHBhcmFtICAgZmlsZVBhdGhTaXplICAgICAgICAoSU4pIFNpemUgb2YgdGhlIGNsaXAgcGF0aCAobmVlZGVkIGZvciB0aGUgVVRGMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywgTTRPU0FfVm9pZCogcEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplLCBNNE9TQV9VSW50OCBuYkVmZmVjdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3NPcmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIENsaXBTZXR0aW5nIHN0cnVjdHVyZSAocEZpbGUsIEVmZmVjdHMpLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRNQ1NDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIG1jc0NvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgTUNTIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBhbmFseXppbmcgc3RhdGUKLSAqICAgICAgICAgICAgICAgIG9yIGJleW9uZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBtY3NDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgbWNzIGNvbnRleHQgdG8gcmV0dXJuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19nZXRNQ1NDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIG1jc0NvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCogbWNzQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBWU1MzR1BQIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBHZW5lcmF0aW5nCi0gKiAgICAgICAgICAgICAgICBwcmV2aWV3IG9yIGJleW9uZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICB2c3MzZ3BwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciB0byBwb2ludGVyIG9mIHZzczNncHAgY29udGV4dCB0byByZXR1cm4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIHZzczNncHBDb250ZXh0KTsKLQotLy8gR2V0IHN1cHBvcnRlZCB2aWRlbyBkZWNvZGVycyBhbmQgY2FwYWJpbGl0aWVzLgotTTRPU0FfRVJSIE00eFZTU19nZXRWaWRlb0RlY29kZXJDYXBhYmlsaXRpZXMoTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMgKipkZWNvZGVycyk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotI2VuZGlmIC8qIF9fTTRYVlNTX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfSW50ZXJuYWwuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTR4VlNTX0ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyOTY1NzIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000WFZTU19JTlRFUk5BTF9IX18KLSNkZWZpbmUgX19NNFhWU1NfSU5URVJOQUxfSF9fCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX0ludGVybmFsLmgKLSAqIEBicmllZiAgICBJbnRlcm5hbCBvZiBWaWRlbyBBdXRob3JpbmcuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2luY2x1ZGUgIk00TUNTX0FQSS5oIgotI2luY2x1ZGUgIk00TUNTX0Vycm9yQ29kZXMuaCIKLQotI2luY2x1ZGUgIk00UFRPM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFBUTzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0jaW5jbHVkZSAiTTRBSVJfQVBJLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBNNF94VlNTX01BSk9SICAgICAgICAxCi0jZGVmaW5lIE00X3hWU1NfTUlOT1IgICAgICAgIDUKLSNkZWZpbmUgTTRfeFZTU19SRVZJU0lPTiAgICA1Ci0KLS8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBkZXNjcmliZSB0aGUgbWF4IGRpbWVuc2lvbnMgb2YgYW4gaW5wdXQgSlBHICovCi0jZGVmaW5lIE00WFZTU19NWF9KUEdfTkJfT0ZfUElYRUxTICAgIDM5MjYwMTYKLQotLypTaXplIG9mIHRoZSBVVEYgdGVtcG9yYXJ5IGNvbnZlcnNpb24gYnVmZmVyIGtlZXAgaW4gdGhlIFZBIGludGVybmFsIGNvbnRleHQgYW5kCi1hbGxvY2F0ZSBhdCB0aGUgaW5pdGlhbGl6YXRpb24qLwotI2RlZmluZSBVVEZfQ09OVkVSU0lPTl9CVUZGRVJfU0laRSAgICAgICAgICAgIDIwNDgKLQotLyogTWF4IHBhdGggbGVuZ3RoIHNpemUgKi8KLSNkZWZpbmUgIE00WFZTU19NQVhfUEFUSF9MRU4gMjU2Ci0KLS8qKiBEZXRlcm1pbmUgYWJzb2x1dGUgdmFsdWUgb2YgYS4gKi8KLSNkZWZpbmUgTTR4VlNTX0FCUyhhKSAgICAgICAgICAgICAgICggKCAoYSkgPCAoMCkgKSA/ICgtKGEpKSA6IChhKSApCi0KLS8qKiBZLFUsViB2YWx1ZXMgaW4gY2FzZSBvZiBibGFjayBib3JkZXJzIHJlbmRlcmluZyAqLwotI2RlZmluZSBZX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDAwCi0jZGVmaW5lIFVfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLSNkZWZpbmUgVl9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfRWZmZWN0c0FscGhhQmxlbmRpbmcKLSAqIEBicmllZiAgICBJbnRlcm5hbCBlZmZlY3RzIGFscGhhIGJsZW5kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBpbnRlcm5hbCBpbmZvcm1hdGlvbnMgdG8gY3JlYXRlIGFuIGFscGhhCi0gKiAgICAgICAgICAgIGJsZW5kaW5nIGZvciB0aGUgZWZmZWN0cyB0ZXh0IGFuZCBmcmFtaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgbV9mYWRlSW5UaW1lOyAgICAgICAgLypTdGFydCBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgbV9mYWRlT3V0VGltZTsgICAgICAgIC8qTWlkZGxlIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX2VuZDsgICAgICAgICAgICAvKkVuZCBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgbV9taWRkbGU7ICAgIC8qRHVyYXRpb24sIGluIHBlcmNlbnRhZ2Ugb2YgZWZmZWN0IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBGYWRlSW4gcGhhc2UqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX3N0YXJ0OyAgICAvKkR1cmF0aW9uLCBpbiBwZXJjZW50YWdlIG9mIGVmZmVjdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBGYWRlT3V0IHBoYXNlKi8KLQotfSBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUSElTIFNUUlVDVFVSRSBNVVNUIE5PVCBCRSBNT0RJRklFRAotICogc3RydWN0ICAgIE00eFZTU19GcmFtaW5nU3RydWN0Ci0gKiBAYnJpZWYgICAgSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHhWU1MgZm9yIGZyYW1pbmcgZWZmZWN0LCBhbmQgYnkgVlBTIGZvciBwcmV2aWV3aW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqRnJhbWluZ1JnYjsgICAgICAgICAgICAgICAgLyoqPCBkZWNvZGVkIEJHUjU2NSBwbGFuZSAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICpGcmFtaW5nWXV2OyAgICAgICAgICAgICAgICAvKio8IGNvbnZlcnRlZCBZVVY0MjAgcGxhbmFyIHBsYW5lICovCi0gICAgTTRPU0FfSW50MzIgZHVyYXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZnJhbWUgKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0NsaXBUaW1lOyAgICAgICAgICAgICAgICAvKio8IFByZXZpb3VzIGNsaXAgdGltZSwgdXNlZCBieSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciBmb3IgU0FWSU5HICovCi0gICAgTTRPU0FfSW50MzIgcHJldmlld09mZnNldENsaXBUaW1lOyAgICAgICAgICAgIC8qKjwgUHJldmlvdXMgY2xpcCB0aW1lLCB1c2VkIGJ5IGZyYW1pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIGZvciBQUkVWSUVXICovCi0gICAgTTRPU0FfSW50MzIgcHJldmlld0NsaXBUaW1lOyAgICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgY2xpcCB0aW1lLCB1c2VkIGJ5IGZyYW1pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIGZvciBQUkVWSUVXICovCi0gICAgTTRPU0FfVm9pZCogcEN1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IE00eFZTU19GcmFtaW5nU3RydWN0IHVzZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmcgZmlsdGVyICovCi0gICAgTTRPU0FfVm9pZCogcE5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTmV4dCBNNHhWU1NfRnJhbWluZ1N0cnVjdCwgaWYgbm8gbW9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50IG9uIGN1cnJlbnQgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKi8KLSAgICBNNE9TQV9VSW50MzIgdG9wbGVmdF94OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFggY29vcmRpbmF0ZSBpbiB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIG9mIHRoZSBmaXJzdCBkZWNvZGVkIHBpeGVsICovCi0gICAgTTRPU0FfVUludDMyIHRvcGxlZnRfeTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSB0b3AtbGVmdCBZIGNvb3JkaW5hdGUgaW4gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBvZiB0aGUgZmlyc3QgZGVjb2RlZCBwaXhlbCAqLwotICAgIE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKiBhbHBoYUJsZW5kaW5nU3RydWN0OyAvKiBBbHBoYSBibGVuZGluZyBTdHJ1Y3QgKi8KLS8qVG8gc3VwcG9ydCBBUkdCODg4OCA6IGdldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBjYXNlIG9mIGZpbGUgQVJHQjg4OCB1c2VkIGluIGZyYW1pbmcKLSBhcyB2aWRlbyBlZmZlY3QgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgd2lkdGg7ICAgLyp3aWR0aCBvZiB0aGUgQVJHQjg4ODggY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Vc2VkIG9ubHkgaWYgdmlkZW8gZWZmZWN0IGlzIGZyYW1taW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIGhlaWdodDsgLypoZWlnaHQgb2YgdGhlIEFSR0I4ODg4IGNsaXAgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLQotfSBNNHhWU1NfRnJhbWluZ1N0cnVjdDsKLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRISVMgU1RSVUNUVVJFIE1VU1QgTk9UIEJFIE1PRElGSUVECi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gKiBAYnJpZWYgICAgSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHhWU1MgZm9yIGZyYW1pbmcgZWZmZWN0LCB3aGVuIHRoZSBmbGFnCi0gICAgICAgICAgICAgICAgREVDT0RFX0dJRl9PTl9TQVZJTkcgaXMgYWN0aXZhdGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogICAgICAgICAgICBhRnJhbWluZ0N0eDsgICAgICAgIC8qKjxGcmFtaW5nIHN0cnVjdCBmb3IgdGhlIGRlY29kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCBmcmFtZSBvZiB0aGUgZ2lmKi8KLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogICAgICAgICAgICBhRnJhbWluZ0N0eF9sYXN0OyAgICAvKio8RnJhbWluZyBzdHJ1Y3QgZm9yIHRoZSBkZWNvZGluZyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcmV2aW91cyBmcmFtZSBvZiB0aGUgZ2lmKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICAgICAgcEZpbGVSZWFkUHRyOyAgICAvKio8IFBvaW50ZXIgb24gT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgICBwRmlsZVdyaXRlUHRyOyAgICAgLyoqPCBQb2ludGVyIG9uIE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBTUFNDb250ZXh0OyAgICAgICAgLyoqPFNQUyBjb250ZXh0IGZvciB0aGUgR0lGIGRlY29kaW5nKi8KLSAgICAvL000U1BTX1N0cmVhbSAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW07ICAgICAgICAvKio8R0lGIGlucHV0IHN0cmVhbSBidWZmZXIgcG9pbnRlciovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwRWZmZWN0RmlsZVBhdGg7ICAgIC8qKjxmaWxlIHBhdGggb2YgdGhlIGdpZiovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgICAgb3V0cHV0VmlkZW9TaXplOyAgICAvKio8IE91dHB1dCB2aWRlbyBzaXplIFJDICovCi0gICAgLy9NNFNQU19EaXNwb3NhbE1vZGUgICAgICAgICAgICAgICAgZGlzcG9zYWw7ICAgICAgICAgICAgLyoqPHByZXZpb3VzIGZyYW1lIEdJRiBkaXNwb3NhbCovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBiX2FuaW1hdGVkOyAgICAgICAgICAgIC8qKjxJcyB0aGUgR0lGIGFuaW1hdGVkPyovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGJFZmZlY3RSZXNpemU7ICAgICAgICAvKio8SXMgdGhlIGdpZiByZXNpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdG9wbGVmdF94OyAgICAgICAgICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFggY29vcmRpbmF0ZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBpY3R1cmUgb2YgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgcGl4ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHRvcGxlZnRfeTsgICAgICAgICAgICAvKio8IFRoZSB0b3AtbGVmdCBZIGNvb3JkaW5hdGUgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwaWN0dXJlIG9mIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkIHBpeGVsICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgLyoqPEdJRiB3aWR0aCwgZmlsbCBkdXJpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gd2l0aCB0aGUgU1BTKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAgLyoqPEdJRiBoZWlnaHQsIGZpbGwgZHVyaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiB3aXRoIHRoZSBTUFMqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgZWZmZWN0RHVyYXRpb247ICAgICAgICAvKio8RWZmZWN0IGR1cmF0aW9uKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdFN0YXJ0VGltZTsgICAgLyoqPEVmZmVjdCBzdGFydCB0aW1lKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGNsaXBUaW1lOyAgICAgICAgICAgIC8qKjxjdXJyZW50IG91dHB1dCBjbGlwIHRpbWUgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZnJhbWUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgbGFzdF9jbGlwVGltZTsgICAgICAgIC8qKjxwcmV2aW91cyBvdXRwdXQgY2xpcCB0aW1lIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBmcmFtZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0U3RlcER1cmF0aW9uOyAgICAvKio8VGltZSBpbnRlcnZhbCBiZXR3ZWVuIHRoZSBwcmV2aW91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGFuZCB0aGUgY3VycmVudCBmcmFtZSovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGJfSXNGaWxlR2lmOyAgICAgICAgLyoqPElzIHRoZSBmcmFtaW5nIHVzaW5nIGEgZ2lmIGZpbGUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgbGFzdF93aWR0aDsgICAgICAgICAgICAvKio8TGFzdCBmcmFtZSB3aWR0aCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X2hlaWdodDsgICAgICAgIC8qKjxMYXN0IGZyYW1lIGhlaWdodCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X3RvcGxlZnRfeDsgICAgICAgIC8qKjxMYXN0IGZyYW1lIHggdG9wbGVmdCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X3RvcGxlZnRfeTsgICAgICAgIC8qKjxMYXN0IGZyYW1lIHkgdG9wbGVmdCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2dpZl90aW1lOyAgICAvKio8IEN1cnJlbnQgdGltZSBvcyB0aGUgR0lGIGluIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHRpbWUgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb25SYXRpbzsgICAgLyoqPCBGcmFtZSBkdXJhdGlvbiByYXRpbyAqLwotICAgIE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKiAgICBhbHBoYUJsZW5kaW5nU3RydWN0Oy8qQWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSNpZmRlZiBERUJVR19HSUYKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIHVpRGVidWdfZmlsZUNvdW50ZXI7LyoqPGZvciBkZWJ1ZyBwdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCB0aGUgZnJhbWUgb2YgdGhlIGdpZiovCi0jZW5kaWYgLypERUJVR19HSUYqLwotfU00eFZTU19GcmFtaW5nQ29udGV4dDsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgeFZTUyBwYXJhbWV0ZXIgZm9yIFB0bzNHUFAgbW9kdWxlCi0gKiBAbm90ZSAgICBUaGlzIHN0cnVjdHVyZSBpcyBmaWxsZWQgYnkgTTR4VlNTX3NlbmRDb21tYW5kIGZ1bmN0aW9uLAotICogQG5vdGUgICAgYW5kIGlzIHVzZWQgZHVyaW5nIE00eFZTU19TdGVwIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgUHRvM0dQUCBtb2R1bGUKLSAqIEBub3RlICAgIEFsbCB0aGUgSlBHIGZpbGVzIHRvIHRyYW5zZm9ybSB0byAzR1AgYXJlIGNoYWluZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwRmlsZUluOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVPdXQ7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwRmlsZVRlbXA7ICAgICAgICAgICAgLyoqPCB0ZW1wb3JhcnkgZmlsZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB3cml0aW5nLCBOVUxMIGlzIGNzdG1lbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIgbm90IHVzZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgSW5wdXRGaWxlVHlwZTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgaXNDcmVhdGVkOyAgICAgICAgICAgIC8qKjwgVGhpcyBib29sZWFuIGlzIHVzZWQgdG8ga25vdyBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IGZpbGUgaXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIG9yIG5vdCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBpc1Bhblpvb207ICAgICAgICAgICAgLyoqPCBSQzogQm9vbGVhbiB1c2VkIHRvIGtub3cgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuIGFuZCB6b29tIG1vZGUgaXMgZW5hYmxlZCAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhhOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGE7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWE7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21YYjsgICAgICAgICAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhiOyAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFliOyAgICAvKio8IFJDICovCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7ICAgICAgICAvKio8IEZCOiB0byByZW5kZXIgb3Igbm90IHBpY3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3QgcmF0aW8gKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZSAgICBmcmFtZXJhdGU7ICAgICAgICAgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBOZXh0OyAgICAgICAgICAgICAgICAvKio8IEFkZHJlc3Mgb2YgbmV4dCBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCAqLwotICAgIC8qVG8gc3VwcG9ydCBBUkdCODg4ODp3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgd2lkdGg7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgIGhlaWdodDsKLQotfSBNNHhWU1NfUHRvM0dQUF9wYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19maWZ0aWVzU3RydWN0Ci0gKiBAYnJpZWYgICAgSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHhWU1MgZm9yIGZpZnRpZXMgZWZmZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgZmlmdGllc0VmZmVjdER1cmF0aW9uOyAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBzYW1lIGVmZmVjdCBpbiBhIHZpZGVvICovCi0gICAgTTRPU0FfSW50MzIgcHJldmlvdXNDbGlwVGltZTsgICAgICAgICAgLyoqPCBQcmV2aW91cyBjbGlwIHRpbWUsIHVzZWQgYnkgZnJhbWluZyBmaWx0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBTQVZJTkcgKi8KLSAgICBNNE9TQV9VSW50MzIgc2hpZnRSYW5kb21WYWx1ZTsgICAgICAgICAgICAgICAgLyoqPCBWZXJ0aWNhbCBzaGlmdCBvZiB0aGUgaW1hZ2UgKi8KLSAgICAgIE00T1NBX1VJbnQzMiBzdHJpcGVSYW5kb21WYWx1ZTsgICAgICAgICAgICAgICAgLyoqPCBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBzdHJpcGUgKi8KLQotfSBNNHhWU1NfRmlmdGllc1N0cnVjdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0NvbG9yUkdCMTYKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgUkdCMTYgY29sb3IgZWZmZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNHhWU1NfVmlkZW9FZmZlY3RUeXBlIGNvbG9yRWZmZWN0VHlwZTsgICAgLypDb2xvciB0eXBlIG9mIGVmZmVjdCovCi0gICAgTTRPU0FfVUludDE2ICAgIHJnYjE2Q29sb3JEYXRhOyAgICAgICAgICAgIC8qUkdCMTYgY29sb3Igb25seSBmb3IgdGhlIFJHQjE2IGNvbG9yIGVmZmVjdCovCi19IE00eFZTU19Db2xvclN0cnVjdDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dAotICogQGJyaWVmICAgIFRoZSBDYWxsYmFjayBDb250ZXh0IHBhcmFtZXRlcnMgZm9yIFB0bzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIG1fRmlsZUluOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fTmJJbWFnZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX0ltYWdlQ291bnRlcjsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtX3RpbWVEdXJhdGlvbjsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICBtX3BGaWxlUmVhZFB0cjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgIG1fcERlY29kZWRQbGFuZTsgLyogVXNlZCBmb3IgUGFuIGFuZCBab29tIG9ubHkgKi8KLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqICAgIG1fcFB0bzNHUFBwYXJhbXM7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgIG1fYWlyX2NvbnRleHQ7Ci0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nICAgIG1fbWVkaWFSZW5kZXJpbmc7Ci0KLX0gTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTR4VlNTX1N0YXRlCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgU3RhdGUgb2YgdGhlIHhWU1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgPSAwLAotICAgIE00eFZTU19rU3RhdGVBbmFseXppbmcsCi0gICAgTTR4VlNTX2tTdGF0ZU9wZW5lZCwKLSAgICAvL000eFZTU19rU3RhdGVHZW5lcmF0aW5nUHJldmlldywKLSAgICAvL000eFZTU19rU3RhdGVQcmV2aWV3LAotICAgIE00eFZTU19rU3RhdGVTYXZpbmcsCi0gICAgTTR4VlNTX2tTdGF0ZVNhdmVkCi0KLX0gTTR4VlNTX1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19lZGl0TWljcm9TdGF0ZQotICogQGJyaWVmICAgIEludGVybmFsIE1pY3JvIHN0YXRlIG9mIHRoZSB4VlNTIGZvciBwcmV2aWV3aW5nL3NhdmluZyBzdGF0ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa01pY3JvU3RhdGVFZGl0aW5nID0gMCwKLSAgICBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZwotCi19IE00eFZTU19lZGl0TWljcm9TdGF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNHhWU1NfZWRpdE1pY3JvU3RhdGUKLSAqIEBicmllZiAgICBJbnRlcm5hbCBNaWNybyBzdGF0ZSBvZiB0aGUgeFZTUyBmb3IgYW5hbHl6aW5nIHN0YXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5c2VQdG8zR1BQID0gMCwKLSAgICBNNHhWU1Nfa01pY3JvU3RhdGVDb252ZXJ0UHRvM0dQUCwKLSAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTLAotICAgIE00eFZTU19rTWljcm9TdGF0ZVRyYW5zY29kZU1DUwotCi19IE00eFZTU19hbmFseXNlTWljcm9TdGF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfTUNTX3BhcmFtcwotICogQGJyaWVmICAgIEludGVybmFsIHhWU1MgcGFyYW1ldGVyIGZvciBNQ1MgbW9kdWxlCi0gKiBAbm90ZSAgICBUaGlzIHN0cnVjdHVyZSBpcyBmaWxsZWQgYnkgTTR4VlNTX3NlbmRDb21tYW5kIGZ1bmN0aW9uLAotICogQG5vdGUgICAgYW5kIGlzIHVzZWQgZHVyaW5nIE00eFZTU19TdGVwIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgTUNTIG1vZHVsZQotICogQG5vdGUgICAgQWxsIHRoZSBpbnB1dCBmaWxlcyB0byB0cmFuc2NvZGUgYXJlIGNoYWluZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlSW47Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlT3V0OwotICAgIC8qKjwgdGVtcG9yYXJ5IGZpbGUgdXNlZCBmb3IgbWV0YWRhdGEgd3JpdGluZywgTlVMTCBpcyBjc3RtZW0gd3JpdGVyIG5vdCB1c2VkICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlVGVtcDsKLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICAgICAgICAgSW5wdXRGaWxlVHlwZTsKLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICAgICAgICAgT3V0cHV0RmlsZVR5cGU7Ci0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgICAgICAgICAgICAgICAgT3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgICAgICAgICAgICBPdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZSAgICAgICAgICAgIE91dHB1dFZpZGVvRnJhbWVSYXRlOwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICAgIE91dHB1dEF1ZGlvRm9ybWF0OwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICAgT3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXVkaW9Nb25vOwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgICAgICAgICAgIE91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgICAgICAgICAgICAgICAgICBPdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCR007Ci0gICAgLyoqPCBUaGlzIGJvb2xlYW4gaXMgdXNlZCB0byBrbm93IGlmIHRoZSBvdXRwdXQgZmlsZSBpcyBhbHJlYWR5IGNyZWF0ZWQgb3Igbm90ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDcmVhdGVkOwotICAgIC8qKjwgQWRkcmVzcyBvZiBuZXh0IE00eFZTU19NQ1NfcGFyYW1zKiBlbGVtZW50ICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OwotCi0gICAgLypGQjogdHJhbnNjb2RpbmcgcGVyIHBhcnRzKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW5DdXRUaW1lOyAgICAvKio8IEJlZ2lubmluZyBjdXQgdGltZSBpbiBpbnB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgIEVuZEN1dFRpbWU7ICAgICAgLyoqPCBFbmQgY3V0IHRpbWUgaW4gaW5wdXQgZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1RpbWVzY2FsZTsgICAgLypPdXRwdXQgdGltZXNjYWxlKi8KLQotICAgIE00TUNTX01lZGlhUmVuZGVyaW5nICAgICAgICAgICAgICAgICBNZWRpYVJlbmRlcmluZzsgICAvKio8IEZCOiB0byBjcm9wLCByZXNpemUsIG9yIHJlbmRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrIGJvcmRlcnMqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb2NsaXBudW1iZXI7Ci0gICAgTTRPU0FfVUludDMyICBvdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfVUludDMyICBvdXRwdXRWaWRlb0xldmVsOwotfSBNNHhWU1NfTUNTX3BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGFscGhhIG1hZ2ljIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgKnBQbGFuZTsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgIGJsZW5kaW5ndGhyZXNob2xkOyAgICAvKio8IEJsZW5kaW5nIFJhbmdlICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgIGlzcmV2ZXJzZTsgICAgICAgICAgICAvKio8IGRpcmVjdCBlZmZlY3Qgb3IgcmV2ZXJzZSAqLwotCi19IE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgaW50ZXJuYWwgc2xpZGUgdHJhbnNpdGlvbiBzZXR0aW5ncwotICogQG5vdGUgICAgVGhpcyB0eXBlIGhhcHBlbnMgdG8gbWF0Y2ggdGhlIGV4dGVybmFsIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqICAgICAgICAgICAgc3RydWN0dXJlIChpLmUuIHRoZSBvbmUgd2hpY2ggaXMgZ2l2ZW4gYnkgdGhlIGFwcGxpY2F0aW9uKSwgYnV0IGFyZQotICogICAgICAgICAgICBjb25jZXB0dWFsbHkgZGlmZmVyZW50IHR5cGVzLCBzbyB0aGF0IGlmIChvciByYXRoZXIgd2hlbikgc29tZSBkYXkKLSAqICAgICAgICAgICAgdHJhbnNsYXRpb24gbmVlZHMgdG8gb2NjdXIgd2hlbiBsb2FkaW5nIHRoZSBzZXR0aW5ncyBmcm9tIHRoZSBhcHAsCi0gKiAgICAgICAgICAgIHRoaXMgc2VwYXJhdGUgdHlwZSB3aWxsIGFscmVhZHkgYmUgcmVhZHkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi10eXBlZGVmIE00eFZTU19TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19pbnRlcm5hbEpwZWdDaHVua01vZGUKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjaHVuayBjYWxsYmFjayB0byBkZWNvZGUKLSAqICAgICAgICAgICAgYSBKUEVHIGJ5IGNodW5rIG1vZGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfVVRGQ29udmVyc2lvbkNvbnRleHQKLSAqIEBicmllZiAgICBJbnRlcm5hbCBVVEYgY29udmVyc2lvbiBjb250ZXh0Ci0gKiBAbm90ZSAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgVVRGIGNvbnZlcnNpb24gaW5mb3JtYXRpb25zCi0gKiAgICAgICAgICAgIG5lZWRlZCBieSB0aGUgeFZTUyB0byBtYW5hZ2UgdGhlIGRpZmZlcmVudCBmb3JtYXRzIChVVEY4LzE2L0FTQ0lJKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLypGdW5jdGlvbiBwb2ludGVyIG9uIGFuIGV4dGVybmFsIHRleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotICAgIE00eFZTU190b1VURjhGY3QgICAgICAgICAgICAgICAgcENvbnZUb1VURjhGY3Q7Ci0gICAgLypGdW5jdGlvbiBwb2ludGVyIG9uIGFuIGV4dGVybmFsIHRleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotICAgIE00eFZTU19mcm9tVVRGOEZjdCAgICAgICAgICAgICAgICBwQ29udkZyb21VVEY4RmN0OwotICAgIC8qVGVtcG9yYXJ5IGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgZWFjaCBjb252ZXJzaW9uKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAvKlNpemUgb2YgdGhlIHByZXZpb3VzIGJ1ZmZlciwgdGhlIHNpemUgaXMgcHJlZGVybWluYXRlZCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBtX1RlbXBPdXRDb252ZXJzaW9uU2l6ZTsKLX0gTTR4VlNTX1VURkNvbnZlcnNpb25Db250ZXh0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0NvbnRleHQKLSAqIEBicmllZiAgICBJbnRlcm5hbCBjb250ZXh0IG9mIHRoZSB4VlNTCi0gKiBAbm90ZSAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgaW50ZXJuYWwgaW5mb3JtYXRpb25zIG5lZWRlZCBieSB0aGUgeFZTUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAvKio8IFBvaW50ZXIgb24gT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgICAgIHBGaWxlUmVhZFB0cjsKLSAgICAvKio8IFBvaW50ZXIgb24gT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICAgICAgcEZpbGVXcml0ZVB0cjsKLSAgICAvKio8IExvY2FsIGNvcHkgb2YgdmlkZW8gZWRpdG9yIHNldHRpbmdzICovCi0gICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogICAgICAgICAgICBwU2V0dGluZ3M7Ci0gICAgLyoqPCBDdXJyZW50IFNldHRpbmdzIG9mIHZpZGVvIGVkaXRvciB0byB1c2UgaW4gc3RlcCBmdW5jdGlvbnMgZm9yIHByZXZpZXcvc2F2ZSAqLwotICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqICAgICAgICAgICAgcEN1cnJlbnRFZGl0U2V0dGluZ3M7Ci0gICAgLyoqPCBDdXJyZW50IGNvbnRleHQgb2YgdmlkZW8gZWRpdG9yIHRvIHVzZSBpbiBzdGVwIGZ1bmN0aW9ucyBmb3IgcHJldmlldy9zYXZlICovCi0gICAgTTRWU1MzR1BQX0VkaXRDb250ZXh0ICAgICAgICAgICAgcEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICAvKio8IFRoaXMgaXMgdG8ga25vdyBpZiBhIHByZXZpb3VzIE00eFZTU19zZW5kQ29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDbGlwTnVtYmVyOwotICAgIC8qKjwgQXVkaW8gbWl4aW5nIHNldHRpbmdzLCBuZWVkZWQgdG8gZnJlZSBpdCBpbiBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlIGZ1bmN0aW9uKi8KLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyogICAgcEF1ZGlvTWl4U2V0dGluZ3M7Ci0gICAgLyoqPCBBdWRpbyBtaXhpbmcgY29udGV4dCAqLwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgICAgcEF1ZGlvTWl4Q29udGV4dDsKLSAgICAvKio8IEZpbGUgcGF0aCBmb3IgUENNIG91dHB1dCBmaWxlOiB1c2VkIGZvciBwcmV2aWV3LCBnaXZlbiB0byB1c2VyICovCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwY21QcmV2aWV3RmlsZTsKLSAgICAvKio8IER1cGxpY2F0aW9uIG9mIG91dHB1dCBmaWxlIHBvaW50ZXIsIHRvIGJlIGFibGUgdG8gdXNlIGF1ZGlvIG1peGluZyAqLwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dEZpbGU7Ci0gICAgLyoqPCBEdXBsaWNhdGlvbiBvZiB0ZW1wb3JhcnkgZmlsZSBwb2ludGVyLCB0byBiZSBhYmxlIHRvIHVzZSBhdWRpbyBtaXhpbmcgKi8KLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlOwotICAgIC8qKjwgTWljcm8gc3RhdGUgZm9yIFNhdmluZy9QcmV2aWV3aW5nIHN0YXRlICovCi0gICAgTTR4VlNTX2VkaXRNaWNyb1N0YXRlICAgICAgICAgICAgZWRpdGluZ1N0ZXA7Ci0gICAgLyoqPCBNaWNybyBzdGF0ZSBmb3IgQW5hbHl6aW5nIHN0YXRlICovCi0gICAgTTR4VlNTX2FuYWx5c2VNaWNyb1N0YXRlICAgICAgICBhbmFseXNlU3RlcDsKLSAgICAvKio8IE5iIG9mIHN0ZXAgZm9yIGFuYWx5c2lzIG9yIHNhdmUvcHJldmlldy4gVXNlZCB0byBjb21wdXRlIHByb2dyZXNzaW9uCi0gICAgICAgICBvZiBhbmFseXNpcyBvciBzYXZlL3ByZXZpZXcgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIG5iU3RlcFRvdGFsOwotICAgIC8qKjwgQ3VycmVudCBzdGVwIG51bWJlciBmb3IgYW5hbHlzaXMgb3Igc2F2ZS9wcmV2aWV3ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlcDsKLSAgICAvKio8IFRvIGJlIGFibGUgdG8gZnJlZSBwRWZmZWN0cyBkdXJpbmcgcHJldmlldyBjbG9zZSAqLwotICAgIE00eFZTU19QcmV2aWV3U2V0dGluZ3MqICAgICAgICAgICAgcFByZXZpZXdTZXR0aW5nczsKLSAgICAvKio8IFRlbXBvcmFyeSBmaWxlIHBhdGg6IGFsbCB0ZW1wb3JhcnkgZmlsZXMgYXJlIGNyZWF0ZWQgaGVyZSAqLwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQYXRoOwotICAgIC8qKjwgQ3VycmVudCBzdGF0ZSBvZiB4VlNTICovCi0gICAgTTR4VlNTX1N0YXRlICAgICAgICAgICAgICAgICAgICBtX3N0YXRlOwotICAgIC8qKjwgTGlzdCBvZiBzdGlsbCBwaWN0dXJlcyBpbnB1dCB0byBjb252ZXJ0IHRvIDNHUCB3aXRoIHBhcmFtZXRlcnMgKi8KLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqICAgICAgICAgICAgcFBUbzNHUFBwYXJhbXNMaXN0OwotICAgIC8qKjwgQ3VycmVudCBlbGVtZW50IG9mIHRoZSBhYm92ZSBjaGFpbmVkIGxpc3QgYmVlaW5nIHByb2Nlc3NkIGJ5IHRoZSBQdG8zR1BQICovCi0gICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zKiAgICAgICAgICAgIHBQVG8zR1BQY3VycmVudFBhcmFtczsKLSAgICAvKio8IEN1cnJlbnQgUHRvM0dQUCBjb250ZXh0LCBuZWVkZWQgdG8gY2FsbCBQdG8zR1BQX3N0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICBNNFBUTzNHUFBfQ29udGV4dCAgICAgICAgICAgICAgICBwTTRQVE8zR1BQX0N0eHQ7Ci0gICAgLyoqPCBQb2ludGVyIG9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBvZiB0aGUgUHRvM0dQUCBtb2R1bGUgKi8KLSAgICBNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCogICAgICAgIHBDYWxsQmFja0N0eHQ7Ci0gICAgLyoqPCBMaXN0IG9mIGZpbGVzIHRvIHRyYW5zY29kZSB3aXRoIHBhcmFtZXRlcnMgKi8KLSAgICBNNHhWU1NfTUNTX3BhcmFtcyogICAgICAgICAgICAgICAgcE1DU3BhcmFtc0xpc3Q7Ci0gICAgLyoqPCBDdXJyZW50IGVsZW1lbnQgb2YgdGhlIGFib3ZlIGNoYWluZWQgbGlzdCBiZWVpbmcgcHJvY2Vzc2QgYnkgdGhlIE1DUyAqLwotICAgIE00eFZTU19NQ1NfcGFyYW1zKiAgICAgICAgICAgICAgICBwTUNTY3VycmVudFBhcmFtczsKLSAgICAvKio8IEN1cnJlbnQgTUNTIGNvbnRleHQsIG5lZWRlZCB0byBjYWxsIE1DU19zdGVwIGZ1bmN0aW9uIGluIE00eFZTU19zdGVwIGZ1bmN0aW9uKi8KLSAgICBNNE1DU19Db250ZXh0ICAgICAgICAgICAgICAgICAgICBwTUNTX0N0eHQ7Ci0gICAgLyoqPCBJbmRleCB0byBoYXZlIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZW5hbWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHRlbXBGaWxlSW5kZXg7Ci0gICAgLyoqPCBJbiBjYXNlIG9mIE1NUyB1c2UgY2FzZSwgdGFyZ2V0ZWQgYml0cmF0ZSB0byByZWFjaCBvdXRwdXQgZmlsZSBzaXplICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGU7Ci0gICAgLyoqPCBJZiB0aGUgc2VuZENvbW1hbmQgZmN0IGlzIGNhbGxlZCB0d2ljZSBvciBtb3JlLCB0aGUgZmlyc3QgY29tcHV0ZWQgdGltZXNjYWxlCi0gICAgICAgIHJlY29yZGVkIGhlcmUgbXVzdCBiZSByZXVzZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkVGltZXNjYWxlOwotCi0gICAgLypVVEYgQ29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNHhWU1NfVVRGQ29udmVyc2lvbkNvbnRleHQgICAgVVRGQ29udmVyc2lvbkNvbnRleHQ7ICAgIC8qVVRGIGNvbnZlcnNpb24gY29udGV4dCBzdHJ1Y3R1cmUqLwotCi19IE00eFZTU19Db250ZXh0OwotCi0vKioKLSAqIEludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcm90YXRpb25EZWdyZWUpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlSlBHKE00T1NBX1ZvaWQqIHBGaWxlSW4sIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSoqIHBJbWFnZVBsYW5lcyk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiogcEltYWdlUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCxNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVBbmRSZXNpemVKUEcoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMpOwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCk7Ci0KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUdJRihNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUdJRl9Jbml0aWFsaXphdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUdJRl9DbGVhbmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotI2Vsc2UKLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUYoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCk7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0KE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0VmlkZW9SZXNvbHV0aW9uKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEZyZWVQcmV2aWV3KE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19mcmVlU2V0dGluZ3MoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzKTsKLQotTTRPU0FfRVJSIE00eFZTU19mcmVlQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ2hhciogcEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpOwotCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWMoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKTsKLQotTTRPU0FfRVJSIE00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uKE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSxNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBUYXJnZXRlZFRpbWVTY2FsZSk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBCdWZmZXJPdXQsIE00T1NBX1VJbnQzMiogY29udmVydGVkU2l6ZSk7Ci0KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBCdWZmZXJPdXQsIE00T1NBX1VJbnQzMiogY29udmVydGVkU2l6ZSk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLSNlbmRpZiAvKiBfX000WFZTU19JTlRFUk5BTF9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTg5ODdlMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1DU19BUEkuaAotICogQGJyaWVmICAgTWVkaWEgQ29udmVyc2lvbiBTZXJ2aWNlIHB1YmxpYyBBUEkuCi0gKiBAbm90ZSAgICBNQ1MgYWxsb3dzIHRyYW5zY29kaW5nIGEgM2dwL21wNCBmaWxlIGludG8gYSBuZXcgM2dwL21wNCBmaWxlIGNoYW5naW5nIHRoZQotICogICAgICAgICAgdmlkZW8gYW5kIGF1ZGlvIGVuY29kaW5nIHNldHRpbmdzLgotICogICAgICAgICAgSXQgaXMgYSBzdHJhaWdodGZvcndhcmQgYW5kIGZ1bGx5IHN5bmNocm9ub3VzIEFQSS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTTRNQ1NfQVBJX0hfXwotI2RlZmluZSBfX000TUNTX0FQSV9IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCB0eXBlcyBmb3IgZmlsZSBhY2Nlc3MgKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0vKioKLSAqICAgIERlZmluaXRpb24gb2YgTTRfVmVyc2lvbkluZm8gKi8KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotLyoqCi0gKiBDb21tb24gZGVmaW5pdGlvbnMgb2YgdmlkZW8gZWRpdGluZyBjb21wb25lbnRzICovCi0jaW5jbHVkZSAiTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgiCi0KLS8qKgotICogVG8gZW5hYmxlIGV4dGVybmFsIGF1ZGlvIGNvZGVjcyByZWdpc3RlcmluZyovCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIKLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqICAgIFB1YmxpYyB0eXBlIG9mIHRoZSBNQ1MgY29udGV4dCAqLwotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNE1DU19Db250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRNQ1NfTWVkaWFSZW5kZXJpbmcKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyBkaWZmZXJlbnQgbWVkaWEgcmVuZGVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tSZXNpemluZyA9IDAsICAgIC8qKjwgVGhlIG1lZGlhIGlzIHJlc2l6ZWQsIHRoZSBhc3BlY3QgcmF0aW8gY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgb25lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIG9mIHRoZSBtZWRpYSBpcyByZW5kZXJlZCAqLwotICAgIE00TUNTX2tDcm9wcGluZywgICAgICAgIC8qKjwgVGhlIG1lZGlhIGlzIGNyb3BwZWQsIHRoZSBhc3BlY3QgcmF0aW8gaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lIGFzIHRoZSBvcmlnaW5hbCBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWVkaWEgaXMgbm90IHJlbmRlcmVkIGVudGlyZWx5ICovCi0gICAgTTRNQ1Nfa0JsYWNrQm9yZGVycyAgICAgLyoqPCBCbGFjayBib3JkZXJzIGFyZSByZW5kZXJlZCBpbiBvcmRlciB0byBrZWVwIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgYXNwZWN0IHJhdGlvLiBBbGwgdGhlIG1lZGlhIGlzIHJlbmRlcmVkICovCi19IE00TUNTX01lZGlhUmVuZGVyaW5nOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gdGhlIGV4dGVybmFsIEVmZmVjdCBmdW5jdGlvbnMKLSAqIEBub3RlICAgIFRoZSB1aVByb2dyZXNzIHZhbHVlIHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3QgY2FzZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgdWlQcm9ncmVzczsgICAgIC8qKjwgUHJvZ3Jlc3Mgb2YgdGhlIEVmZmVjdCBmcm9tIDAgdG8gMTAwMCAob25lIHRob3VzYW5kKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aUNsaXBUaW1lOyAgICAgLyoqPCBDdXJyZW50IHRpbWUsIGluIG1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IGNsaXAgdGltZS1saW5lICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpT3V0cHV0VGltZTsgICAvKio8IEN1cnJlbnQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dHB1dCBjbGlwIHRpbWUtbGluZSAqLwotCi19IE00TUNTX0V4dGVybmFsUHJvZ3Jlc3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNE1DU19BdWRpb0VmZmVjdFR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgYXVkaW8gZWZmZWN0IHR5cGVzIG9mIHRoZSBNQ1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lICAgID0gMCwKLSAgICBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0ZhZGVJbiAgPSA4LCAvKio8IEludGVuZGVkIGZvciBiZWdpbiBlZmZlY3QgKi8KLSAgICBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0ZhZGVPdXQgPSAxNiwgLyoqPCBJbnRlbmRlZCBmb3IgZW5kIGVmZmVjdCAqLwotICAgIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRXh0ZXJuYWwgPSAyNTYKLQotfSBNNE1DU19BdWRpb0VmZmVjdFR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0Ci0gKiBAYnJpZWYgICAgICAgQXVkaW8gZWZmZWN0IGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgIG11c3QgbWF0Y2ggdGhpcyBwcm90b3R5cGUuCi0gKiBAbm90ZSAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGggdGhlIG9yaWdpbmFsIFBDTSBkYXRhIGJ1ZmZlciBhbmQgaXRzIHNpemUuCi0gKiAgICAgICAgICAgICAgQXVkaW8gZWZmZWN0IGhhdmUgdG8gYmUgYXBwbGllZCBvbiBpdC4KLSAqICAgICAgICAgICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIGVmZmVjdCBpcyBnaXZlbiwgb24gYSBzY2FsZSBmcm9tIDAgdG8gMTAwMC4KLSAqICAgICAgICAgICAgICBXaGVuIHRoZSBlZmZlY3QgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIGJ1ZmZlcnMgYXJlIHZhbGlkIGFuZAotICogICAgICAgICAgICAgIG93bmVkIGJ5IHRoZSBNQ1MuCi0gKgotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dCAgICAoSU4pIFRoZSBmdW5jdGlvbiBjb250ZXh0LCBwcmV2aW91c2x5IHNldCBieSB0aGUgaW50ZWdyYXRvcgotICogQHBhcmFtICAgcFBDTWRhdGEgICAgICAgICAgICAoSU4vT1VUKSB2YWxpZCBQQ00gZGF0YSBidWZmZXIKLSAqIEBwYXJhbSAgIHVpUENNc2l6ZSAgICAgICAgICAgKElOL09VVCkgUENNIGRhdGEgYnVmZmVyIGNvcnJlc3BvbmRpbmcgc2l6ZQotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXVkaW8gZWZmZWN0IHByb2dyZXNzLgotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgIE00TUNTX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcwotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00TUNTX0VmZmVjdFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGF1ZGlvIGVmZmVjdCBmb3IgdGhlIGVkaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICB1aVN0YXJ0VGltZTsgICAgICAgICAgICAgIC8qKjwgSW4gbXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgIHVpRHVyYXRpb247ICAgICAgICAgICAgICAgLyoqPCBJbiBtcyAqLwotICAgIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdCAgICAgRXh0QXVkaW9FZmZlY3RGY3Q7ICAgICAgICAvKio8IEV4dGVybmFsIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgKnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQ7ICAvKio8IENvbnRleHQgZ2l2ZW4gdG8gdGhlIGV4dGVybmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRNQ1NfQXVkaW9FZmZlY3RUeXBlICAgICAgICBBdWRpb0VmZmVjdFR5cGU7ICAgICAgICAgLyoqPCBOb25lLCBGYWRlSW4sIEZhZGVPdXQgKi8KLQotfSBNNE1DU19FZmZlY3RTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNE1DU19PdXRwdXRQYXJhbXMKLSAqIEBicmllZiAgICBNQ1MgT3V0cHV0IHBhcmFtZXRlcnMKLSAqIEBub3RlICAgICBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCBmb3Igc3RpbGwgcGljdHVyZSBpbnB1dHMgOgotICogICAgICAgICAgICAgLSBPdXRwdXRGaWxlVHlwZSAobXVzdCBiZSBzZXQgdG8gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRykKLSAqICAgICAgICAgICAgIC0gYkRpc2NhcmRFeGlmIG11c3QgYmUgc2V0IHRvIE00T1NBX1RSVUUgb3IgTTRPU0FfRkFMU0UKLSAqICAgICAgICAgICAgIC0gYkFkanVzdE9yaWVudGF0aW9uIG11c3QgYmUgc2V0IHRvIE00T1NBX1RSVUUgb3IgTTRPU0FfRkFMU0UKLSAqICAgICAgICAgICAgIC0gKE1lZGlhUmVuZGVyaW5nIGlzIG5vdCBoYW5kbGVkIDogb3V0cHV0IGltYWdlIHJlc29sdXRpb24gaXMgYWx3YXlzCi0gICAgICAgICAgICAgICAgIHNldCBhY2NvcmRpbmcgdG8gQmVzdEZpdCBjcml0ZXJpYSkKLSAqICAgICAgICAgICAgYkRpc2NhcmRFeGlmIGFuZCBiQWRqdXN0T3JpZW50YXRpb24gYXJlIHN0aWxsIHBpY3R1cmUgb25seSBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBGb3JtYXQgb2YgdGhlIG91dHB1dCBmaWxlICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICAgICAgIE91dHB1dEZpbGVUeXBlOwotICAgIC8qKjwgT3V0cHV0IHZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdCwgc2VlIGVudW0gKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgICAgICAgICAgT3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgLyoqPCBPdXRwdXQgZnJhbWUgc2l6ZSA6IFFRVkdBLCBRQ0lGIG9yIFNRQ0lGICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgICAgICAgICAgIE91dHB1dFZpZGVvRnJhbWVTaXplOwotICAgIC8qKjwgVGFyZ2V0ZWQgT3V0cHV0IGZyYW1lcmF0ZSwgc2VlIGVudW0gKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZSAgICAgICAgICAgT3V0cHV0VmlkZW9GcmFtZVJhdGU7Ci0gICAgLyoqPCBGb3JtYXQgb2YgdGhlIGF1ZGlvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCAgICAgICAgICAgICAgT3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgLyoqPCBTYW1wbGluZyBmcmVxdWVuY3kgb2YgdGhlIGF1ZGlvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICAgT3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAvKio8IFNldCB0byBNNE9TQV9UUlVFIGlmIHRoZSBvdXRwdXQgYXVkaW8gaXMgbW9ubyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXVkaW9Nb25vOwotICAgIC8qKjwgT3V0cHV0IFBDTSBmaWxlIGlmIG5vdCBOVUxMICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwT3V0cHV0UENNZmlsZTsKLSAgICAvKio8IFRvIGNyb3AsIHJlc2l6ZSwgb3IgcmVuZGVyIGJsYWNrIGJvcmRlcnMqLwotICAgIE00TUNTX01lZGlhUmVuZGVyaW5nICAgICAgICAgICAgICAgICAgICBNZWRpYVJlbmRlcmluZzsKLSAgICAvKio8IExpc3Qgb2YgZWZmZWN0cyAqLwotICAgIE00TUNTX0VmZmVjdFNldHRpbmdzICAgICAgICAgICAgICAgICAgICAqcEVmZmVjdHM7Ci0gICAgLyoqPCBOdW1iZXIgb2YgZWZmZWN0cyBpbiB0aGUgYWJvdmUgbGlzdCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYkVmZmVjdHM7Ci0KLSAgICAvKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi0gICAgLyoqPCBUUlVFOiBFdmVuIGlmIHRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIGFuIEVYSUYgc2VjdGlvbiwKLSAgICB0aGUgb3V0cHV0IGZpbGUgd29uJ3QgY29udGFpbiBhbnkgRVhJRiBzZWN0aW9uLiovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEaXNjYXJkRXhpZiA7Ci0KLSAgICAvKio8ID1UUlVFIDogcGljdHVyZSBtdXN0IGJlIHJvdGF0ZWQgaWYgRXhpZiB0YWdzIGhvbGQgYSByb3RhdGlvbiBpbmZvCi0gICAgKGFuZCByb3RhdGlvbiBpbmZvIGlzIHNldCB0byAwKSovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBZGp1c3RPcmllbnRhdGlvbiA7Ci0gICAgLyotLS0gU1RJTEwgUElDVFVSRSAtLS0qLwotICAgIE00T1NBX0ludDMyIG91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBNNE9TQV9JbnQzMiBvdXRwdXRWaWRlb0xldmVsOwotfSBNNE1DU19PdXRwdXRQYXJhbXM7Ci0KLS8qLS0tIFNUSUxMIFBJQ1RVUkUgLS0tKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgIE00TUNTX1NQT3V0cHV0UmVzb2x1dGlvbgotICogQGJyaWVmICAgIFN0aWxsIHBpY3R1cmUgc3BlY2lmaWMgOiBNQ1Mgb3V0cHV0IHRhcmdldGVkIGZpbGUgcmVzb2x1dGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rUmVzU2FtZUFzSW5wdXQgICAgICAgPSAweDAwLCAvKndpZHRoIHggaGVpZ2h0Ki8KLSAgICBNNE1DU19rUmVzUVZHQSAgICAgICAgICAgICAgPSAweDAxLCAvKjMyMHgyNDAqLwotICAgIE00TUNTX2tSZXNWR0EgICAgICAgICAgICAgICA9IDB4MDIsIC8qNjQweDQ4MCovCi0gICAgTTRNQ1Nfa1Jlc1dRVkdBICAgICAgICAgICAgID0gMHgwMywgLyo0MDB4MjQwKi8KLSAgICBNNE1DU19rUmVzV1ZHQSAgICAgICAgICAgICAgPSAweDA0LCAvKjgwMHg0ODAqLwotICAgIE00TUNTX2tSZXNYR0EgICAgICAgICAgICAgICA9IDB4MDUsIC8qMTAyNHg3NjgqLwotICAgIE00TUNTX2tSZXNDdXN0b20gICAgICAgICAgICA9IDB4RkYgIC8qU2l6ZSBpcyBzZXQgdmlhIFN0aWxsUGljdHVyZUN1c3RvbVdpZHRoL0hlaWdodCovCi19IE00TUNTX1NQT3V0cHV0UmVzb2x1dGlvbiA7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgTTRNQ1NfU1BTdHJhdGVneQotICogQGJyaWVmICAgIFN0aWxsIHBpY3R1cmUgc3BlY2lmaWMgOiBNQ1Mgc3RyYXRlZ3kgdG8gY29uZmlndXJlIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tGaWxlU2l6ZU9ubHlGaXhlZCAgICAgICAgICAgID0gMHgwMCwgLypTdGlsbFBpY3R1cmVSZXNvbHV0aW9uIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpdHlGYWN0b3IgYXJlIGlnbm9yZWQqLwotICAgIE00TUNTX2tGaWxlU2l6ZUFuZFJlc0ZpeGVkICAgICAgICAgID0gMHgwMSwgLypRdWFsaXR5RmFjdG9yIGlzIGlnbm9yZWQqLwotICAgIE00TUNTX2tRdWFsaXR5QW5kUmVzRml4ZWQgICAgICAgICAgID0gMHgwMiAgLypPdXRwdXRGaWxlU2l6ZSBpcyBpZ25vcmVkKi8KLX0gTTRNQ1NfU1BTdHJhdGVneSA7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgTTRNQ1NfU1BDcm9wCi0gKiBAYnJpZWYgICAgU3RpbGwgcGljdHVyZSBzcGVjaWZpYyA6IGluZGljYXRlIHdoZXRoZXIgY3JvcHBpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2hhbmdpbmcgdGhlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa05vQ3JvcCAgICAgICAgICAgICAgICA9IDB4MDAsIC8qTm8gQ3JvcHBpbmcgaXMgcGVyZm9ybWVkKi8KLSAgICBNNE1DU19rQ3JvcEJlZm9yZVJlc2l6ZSAgICAgID0gMHgwMSAgLypJbnB1dCBpbWFnZSBpcyBjcm9wcGVkIChiZWZvcmUgY2hhbmdpbmcgcmVzb2x1dGlvbikqLwotfSBNNE1DU19TUENyb3AgOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00TUNTX0VuY29kaW5nUGFyYW1zCi0gKiBAYnJpZWYgICAgTUNTIGZpbGUgc2l6ZSwgYml0cmF0ZSBhbmQgY3V0IHBhcmFtZXRlcnMKLSAqIEBub3RlICAgICBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCBmb3Igc3RpbGwgcGljdHVyZSBpbnB1dHMgOgotICogICAgICAgICAgICAgLSBPdXRwdXRGaWxlU2l6ZQotICogICAgICAgICAgICAgLSBTdGlsbFBpY3R1cmVSZXNvbHV0aW9uCi0gKiAgICAgICAgICAgICAtIFF1YWxpdHlGYWN0b3IKLSAqICAgICAgICAgICAgIC0gU3RpbGxQaWN0dXJlU3RyYXRlZ3kKLSAqICAgICAgICAgICAgIC0gU3RpbGxQaWN0dXJlQ3VzdG9tV2lkdGgvSGVpZ2h0IChpZiBTdGlsbFBpY3R1cmVSZXNvbHV0aW9uPT1NNE1DU19rUmVzQ3VzdG9tKQotICogICAgICAgICAgICBTdGlsbCBwaWN0dXJlIG9ubHkgcGFyYW1ldGVycyA6IFN0aWxsUGljdHVyZVJlc29sdXRpb24sIFF1YWxpdHlGYWN0b3IsCi0gKiAgICAgICAgICAgIFN0aWxsUGljdHVyZVN0cmF0ZWd5IGFuZCBTdGlsbFBpY3R1cmVDdXN0b21XaWR0aC9IZWlnaHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgIE91dHB1dFZpZGVvQml0cmF0ZTsgICAgIC8qKjwgVGFyZ2V0ZWQgdmlkZW8gYml0cmF0ZSAqLwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgT3V0cHV0QXVkaW9CaXRyYXRlOyAgICAgLyoqPCBUYXJnZXRlZCBhdWRpbyBiaXRyYXRlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICBCZWdpbkN1dFRpbWU7ICAgICAgICAgICAvKio8IEJlZ2lubmluZyBjdXQgdGltZSBpbiBpbnB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICBFbmRDdXRUaW1lOyAgICAgICAgICAgICAvKio8IEVuZCBjdXQgdGltZSBpbiBpbnB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICBPdXRwdXRGaWxlU2l6ZTsgICAgICAgICAvKio8IEV4cGVjdGVkIHJlc3VsdGluZyBmaWxlIHNpemUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIE91dHB1dFZpZGVvVGltZXNjYWxlOyAgIC8qKjwgT3B0aW9uYWwgcGFyYW1ldGVyIHVzZWQgdG8gZml4IGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXNjYWxlIGR1cmluZyB0cmFuc2NvZGluZyAqLwotCi0gICAgLyotLS0gU1RJTEwgUElDVFVSRSAtLS0qLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgUXVhbGl0eUZhY3RvciA7ICAgICAgICAgLyoqPCA9LTEgKHVuZGVmaW5lZCkgb3IgMChsb3dlc3QpLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKGJlc3QpIDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5IGluZGljYXRpb24gZm9yIHRoZSBKUEVHIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSAoaWYgPS0xIHRoZSBNQ1Mgd2lsbCBzZXQgcXVhbGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSkqLwotICAgIE00TUNTX1NQU3RyYXRlZ3kgICAgICAgICAgICBTdGlsbFBpY3R1cmVTdHJhdGVneSA7IC8qKjwgRGVmaW5lcyB3aGljaCBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCBieSBNQ1MqLwotICAgIE00TUNTX1NQT3V0cHV0UmVzb2x1dGlvbiAgICBTdGlsbFBpY3R1cmVSZXNvbHV0aW9uOy8qKjwgRGVzaXJlZCBvdXRwdXQgcmVzb2x1dGlvbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc3RpbGwgcGljdHVyZSBmaWxlICovCi0gICAgLyoqPCAob25seSBpZiBSZXNvbHV0aW9uPT1NNE1DU19rUmVzQ3VzdG9tKSA6IEN1c3RvbSBvdXRwdXQgaW1hZ2Ugd2lkdGggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3VzdG9tV2lkdGg7Ci0gICAgLyoqPCAob25seSBpZiBSZXNvbHV0aW9uPT1NNE1DU19rUmVzQ3VzdG9tKSA6IEN1c3RvbSBvdXRwdXQgaW1hZ2UgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUN1c3RvbUhlaWdodDsKLSAgICAvKio8IEluZGljYXRlIHdoZXRoZXIgQ3JvcCBzaG91bGQgYmUgcGVyZm9ybWVkICovCi0gICAgTTRNQ1NfU1BDcm9wICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3A7Ci0gICAgLyoqPCAob25seSBpZiBjcm9wcGluZykgWCBjb29yZGluYXRlIG9mIHRvcGxlZnQgY29ybmVyIG9mIHRoZSBjcm9wIHdpbmRvdyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDcm9wX1g7Ci0gICAgLyoqPCAob25seSBpZiBjcm9wcGluZykgWSBjb29yZGluYXRlIG9mIHRvcGxlZnQgY29ybmVyIG9mIHRoZSBjcm9wIHdpbmRvdyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDcm9wX1k7Ci0gICAgLyoqPCAob25seSBpZiBjcm9wcGluZykgV2lkdGggb2YgdGhlIGNyb3Agd2luZG93IChpbiBwaXhlbHMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3BfVzsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBIZWlnaHQgb2YgdGhlIGNyb3Agd2luZG93IChpbiBwaXhlbHMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3BfSDsKLSAgICAvKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi19IE00TUNTX0VuY29kaW5nUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19nZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotICogQGJyaWVmICAgIEdldCB0aGUgTUNTIHZlcnNpb24uCi0gKiBAbm90ZSBDYW4gYmUgY2FsbGVkIGFueXRpbWUuIERvIG5vdCBuZWVkIGFueSBjb250ZXh0LgotICogQHBhcmFtICAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwVmVyc2lvbkluZm8gaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2luaXQoTTRNQ1NfQ29udGV4dCogcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QpOwotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBNQ1MgKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgTUNTIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19pbml0KE00TUNTX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX29wZW4oTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwgTTRPU0FfVm9pZCogcEZpbGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aU1heE1ldGFkYXRhU2l6ZSk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgaXMgbm90IGNyZWF0ZWQgeWV0LgotICogICAgICAgICAgSW4gY2FzZSBvZiBzdGlsbCBwaWN0dXJlLCBmb3VyIElucHV0RmlsZVR5cGUgYXJlIHBvc3NpYmxlCi0gKiAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRy9CTVAvR0lGL1BORwotICogICAgICAgICAgSWYgb25lIG9mIHRoZW0gaXMgc2V0LCB0aGUgT3V0cHV0RmlsZVR5cGUgU0hBTEwgYmUgc2V0IHRvIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcEZpbGVJbiAgICAgICAgICAgICAoSU4pIElucHV0IGZpbGUgdG8gdHJhbnNjb2RlIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVJMLCBwaXBlLi4uKSBkZXBlbmRzIG9uIHRoZSBPU0FMIGltcGxlbWVudGF0aW9uKS4KLSAqIEBwYXJhbSAgIG1lZGlhVHlwZSAgICAgICAgICAgKElOKSBDb250YWluZXIgdHlwZSAoLjNncCwuYW1yLCAuLi4pIG9mIGlucHV0IGZpbGUuCi0gKiBAcGFyYW0gICBwRmlsZU91dCAgICAgICAgICAgIChJTikgT3V0cHV0IGZpbGUgdG8gY3JlYXRlICAoVGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBwVGVtcEZpbGUgICAgICAgICAgIChJTikgVGVtcG9yYXJ5IGZpbGUgZm9yIHRoZSBjb25zdGFudCBtZW1vcnkgd3JpdGVyIHRvIHN0b3JlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhICgibW9vdi5iaW4iKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiAgIFRoZSBpbnB1dCBmaWxlIGhhcyBub3QgYmVlbiBmb3VuZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTogICBUaGUgaW5wdXQgZmlsZSBpcyBub3QgYSB2YWxpZCBmaWxlLCBvciBpcyBjb3JydXB0ZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU06ICBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBubwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYXVkaW8gb3IgdmlkZW8gc3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19vcGVuKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBJbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3N0ZXAoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIHRyYW5jb2RpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKSBvZiB0aGUgdHJhbnNjb2RpbmcKLSAqIEBub3RlICAgIHBQcm9ncmVzcyBtdXN0IGJlIGEgdmFsaWQgYWRkcmVzcy4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgT25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORTogVHJhbnNjb2RpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93IGNhbGwgTTRNQ1NfY2xvc2UoKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOiBUaGUgYXVkaW8gY29udmVyc2lvbiAoQUFDIHRvIEFNUi1OQiwgTVAzKSBmYWlsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k6IFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIGFuIEFBQyBhdWRpbyB0cmFjawotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gaW52YWxpZCBzYW1wbGluZyBmcmVxdWVuY3kKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvdWxkIG5ldmVyIGhhcHBlbikKLSAqIEByZXR1cm4gIE00TUNTX1dBUl9QSUNUVVJFX0FVVE9fUkVTSVpFOiBQaWN0dXJlIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXNpemVkIHRvIGZpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHJlcXVpcmVtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3RlcChNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcGF1c2UoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBQYXVzZSB0aGUgdHJhbnNjb2RpbmcgaS5lLiByZWxlYXNlIHRoZSAoZXh0ZXJuYWwgaGFyZHdhcmUpIHZpZGVvIGRlY29kZXIuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWQgaWYgbm8gaGFyZHdhcmUgYWNjZWxlcmF0b3JzIGFyZSB1c2VkLgotICogICAgICAgICAgSW4gdGhhdCBjYXNlLCBwYXVzaW5nIHRoZSBNQ1MgaXMgc2ltcGx5IGFjaGlldmVkIGJ5IHRlbXBvcmFyaWx5IHN1c3BlbmRpbmcKLSAqICAgICAgICAgIHRoZSBNNE1DU19zdGVwIGZ1bmN0aW9uIGNhbGxzLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19wYXVzZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcmVzdW1lKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUmVzdW1lIHRoZSB0cmFuc2NvZGluZyBhZnRlciBhIHBhdXNlIChzZWUgTTRNQ1NfcGF1c2UpLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGlmIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9ycyBhcmUgdXNlZC4KLSAqICAgICAgICAgIEluIHRoYXQgY2FzZSwgcmVzdW1pbmcgdGhlIE1DUyBpcyBzaW1wbHkgYWNoaWV2ZWQgYnkgY2FsbGluZwotICogICAgICAgICAgdGhlIE00TUNTX3N0ZXAgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3Jlc3VtZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2xvc2UoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgRmluaXNoIHRoZSBNQ1MgdHJhbnNjb2RpbmcuCi0gKiBAbm90ZSBUaGUgb3V0cHV0IDNHUFAgZmlsZSBpcyByZWFkeSB0byBiZSBwbGF5ZWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19jbG9zZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTUNTLgotICogQG5vdGUgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2NsZWFuVXAoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2Fib3J0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTUNTIHRyYW5zY29kaW5nIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTUNTCi0gKiAgICAgICAgICB3aGF0ZXZlciB0aGUgc3RhdGUgaXMuCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Fib3J0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKiBwRmlsZVByb3BlcnRpZXMpOwotICogQGJyaWVmICAgUmV0cmlldmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvcGVydGllcyAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gYW4gYWxsb2NhdGVkIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSB3aGljaCBpcyBmaWxsZWQgd2l0aCB0aGUgaW5wdXQgc3RyZWFtIHByb3BlcnRpZXMuCi0gKiBAbm90ZSAgICBUaGUgc3RydWN0dXJlIHBQcm9wZXJ0aWVzIG11c3QgYmUgYWxsb2NhdGVkIGFuZCBmdXJ0aGVyIGRlLWFsbG9jYXRlZAotICAgICAgICAgICAgYnkgdGhlIGFwcGxpY2F0aW9uLiBUaGUgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIG9wZW5lZCBzdGF0ZS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBGaWxlUHJvcGVydGllcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3NldE91dHB1dFBhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19PdXRwdXRQYXJhbXMqIHBQYXJhbXMpOwotICogQGJyaWVmICAgU2V0IHRoZSBNQ1MgdmlkZW8gb3V0cHV0IHBhcmFtZXRlcnMuCi0gKiBAbm90ZSAgICBNdXN0IGJlIGNhbGxlZCBhZnRlciBNNE1DU19vcGVuLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgTTRNQ1Nfc3RlcC4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFBhcmFtcyAgICAgICAgICAgICAoSU4vT1VUKSBUcmFuc2NvZGluZyBwYXJhbWV0ZXJzCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgOiBPdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjMgOiBPdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICAgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1JBVEUgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHJhdGUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCA6IFVuZGVmaW5lZCBvdXRwdXQgYXVkaW8gZm9ybWF0IHBhcmFtZXRlcgotICogQHJldHVybiAgTTRNQ1NfRVJSX0RVUkFUSU9OX0lTX05VTEwgOiBTcGVjaWZpZWQgb3V0cHV0IHBhcmFtZXRlcnMgZGVmaW5lIGEgbnVsbCBkdXJhdGlvbiBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChubyBhdWRpbyBhbmQgdmlkZW8pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zZXRPdXRwdXRQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfT3V0cHV0UGFyYW1zKiBwUGFyYW1zKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcykKLSAqIEBicmllZiAgIFNldCB0aGUgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydCgpLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBSYXRlcyAgICAgICAgICAgICAoSU4pIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDogQXVkaW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gOTYga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzogQXVkaW8gYml0cmF0ZSBpcyB0b28gbG93ICgxNiBrYnBzIG1pbiBmb3IgYWFjLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIuMiBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgY2xpcCBkdXJhdGlvbgotICogQHJldHVybiAgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVDogRW5kIGN1dCB0aW1lIGlzIHNtYWxsZXIgdGhhbiBiZWdpbiBjdXQgdGltZQotICogQHJldHVybiAgTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTDogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSB3aG9sZSBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGF0IGdpdmVuIGJpdHJhdGVzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19ISUdIOiBWaWRlbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA4MDAga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzogVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgR2V0IHRoZSBleHRlbmRlZCB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIENvdWxkIGJlIGNhbGxlZCBhZnRlciBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUmF0ZXMgICAgICAgICAgICAgKE9VVCkgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBFbmNvZGluZyBzZXR0aW5ncyB3b3VsZCBwcm9kdWNlIGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgZHVyYXRpb24gY2xpcCA9IGVuY29kaW5nIGlzIGltcG9zc2libGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g6IEF1ZGlvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDk2IGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c6IEF1ZGlvIGJpdHJhdGUgaXMgdG9vIGxvdyAoMTYga2JwcyBtaW4gZm9yIGFhYywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLjIgZm9yIGFtciwgOCBmb3IgbXAzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDogQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT046IEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgY2xpcCBkdXJhdGlvbgotICogQHJldHVybiAgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVDogRW5kIGN1dCB0aW1lIGlzIHNtYWxsZXIgdGhhbiBiZWdpbiBjdXQgdGltZQotICogQHJldHVybiAgTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTDogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSB3aG9sZSBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGF0IGdpdmVuIGJpdHJhdGVzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19ISUdIOiBWaWRlbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA4MDAga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzogIFZpZGVvIGJpdHJhdGUgdG9vIGxvdwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRNQ1NfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19FcnJvckNvZGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19FcnJvckNvZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwNDJkYmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfRXJyb3JDb2Rlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX0FQSS5oCi0gKiBAYnJpZWYgIE1DUyBlcnJvciBjb2RlcyBkZWZpbml0aW9ucyAoTWVkaWEgQ29tcHJlc3NvciBTZXJ2aWNlKQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLSNpZm5kZWYgX19NNE1DU19FcnJvckNvZGVzX0hfXwotI2RlZmluZSBfX000TUNTX0Vycm9yQ29kZXNfSF9fCi0KLS8qKgotICogICAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICAgIE9TQUwgY29yZSBJRCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBXYXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRW5kIG9mIHByb2Nlc3NpbmcsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00TUNTX2Nsb3NlKCkgKi8KLSNkZWZpbmUgTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00TUNTLCAweDEpCi0vKiBNZWRpYXR5cGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgTUNTICovCi0jZGVmaW5lIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00TUNTLCAweDIpCi0vKiBJbmRpY2F0ZSB0aGF0IHBpY3R1cmUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQgdG8gZml0IGludG8gdGhlIHJlcXVpcmVkCi0gICBwYXJhbWV0ZXJzIChmaWxlIHNpemUpICovCi0jZGVmaW5lIE00TUNTX1dBUl9QSUNUVVJFX0FVVE9fUkVTSVpFICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00TUNTLCAweDMpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFcnJvciBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiAtLS0tLSBPUEVOIEVSUk9SUyAtLS0tLSAqLwotCi0vKiBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBubyBzdXBwb3J0ZWQgc3RyZWFtIChtYXkgYmUgYSBjb3JydXB0ZWQgZmlsZSkgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MDEpCi0vKiBUaGUgaW5wdXQgZmlsZSBpcyBpbnZhbGlkL2NvcnJ1cHRlZCAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwMikKLS8qIFRoZSBpbnB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfVklERU9fRlJBTUVfU0laRSAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MDMpCi0vKiBUaGUgaW5wdXQgdmlkZW8gZnJhbWUgc2l6ZSBpcyBub24gbXVsdGlwbGUgb2YgMTYgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOUFVUX1ZJREVPX1NJWkVfTk9OX1gxNiAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MDQpCi0KLQotLyogLS0tLS0gU0VUIE9VVFBVVCBQQVJBTVMgRVJST1JTIC0tLS0tICovCi0KLS8qIFRoZSBvdXRwdXQgdmlkZW8gZm9ybWF0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTApCi0vKiBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxMSkKLS8qIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgcmF0ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1JBVEUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDEyKQotLyogVGhlIG91dHB1dCBhdWRpbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxMykKLS8qIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZyAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxNCkKLS8qIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgcmF0ZSBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICAgKEl0IGNhbid0IGhhcHBlbiBpbiBjdXJyZW50IHZlcnNpb24gb2YgTUNTISkgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfUkFURV9GT1JfSDI2MyAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTUpCi0vKiBBIG51bGwgY2xpcCBkdXJhdGlvbiBhcyBiZWVuIGNvbXB1dGVkLCB3aGljaCBpcyB1bnZhbGlkIChzaG91bGQgbmV2ZXIgaGFwcGVuISkgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0RVUkFUSU9OX0lTX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTYpCi0vKiBUaGUgLm1wNCBjb250YWluZXIgY2Fubm90IGhhbmRsZSBoMjYzIGNvZGVjICovCi0jZGVmaW5lIE00TUNTX0VSUl9IMjYzX0ZPUkJJRERFTl9JTl9NUDRfRklMRSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDE3KQotCi0KLS8qIC0tLS0tIFBSRVBBUkUgREVDT0RFUlMgRVJST1JTIC0tLS0tICovCi0KLS8qIEgyNjMgUHJvZmlsZSAob3RoZXIgdGhhbiAwKSBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDIwKQotLyogVGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gQUFDIGF1ZGlvIHRyYWNrIHdpdGggYW4gaW52YWxpZCBzYW1wbGluZyBmcmVxdWVuY3kKLSAgIChzaG91bGQgbmV2ZXIgaGFwcGVuKSAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgyMSkKLS8qIFRoZSBhdWRpbyBjb252ZXJzaW9uIChBQUMgdG8gQU1SLU5CLCBvciBNUDMpIGZhaWxlZCAqLwotI2RlZmluZSBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgyMikKLQotCi0vKiAtLS0tLSBTRVQgRU5DT0RJTkcgUEFSQU1TIEVSUk9SUyAtLS0tLSAqLwotCi0vKiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgdGhhbiB0aGUgaW5wdXQgY2xpcCBkdXJhdGlvbiAqLwotI2RlZmluZSBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzMCkKLS8qIEJlZ2luIGN1dCBhbmQgRW5kIGN1dCBhcmUgZXF1YWxzICovCi0jZGVmaW5lIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDMxKQotLyogRW5kIGN1dCB0aW1lIGlzIHNtYWxsZXIgdGhhbiBiZWdpbiBjdXQgdGltZSAqLwotI2RlZmluZSBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzMikKLS8qIE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgd2hvbGUgb3V0cHV0IGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTCAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzMpCi0vKiBWaWRlbyBiaXRyYXRlIGlzIHRvbyBsb3cgKGF2b2lkIHVnbHkgdmlkZW8pICovCi0jZGVmaW5lIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVyAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDM0KQotLyogQXVkaW8gYml0cmF0ZSBpcyB0b28gbG93ICgxNiBrYnBzIG1pbiBmb3IgYWFjLCAxMi4yIGZvciBhbXIsIDggZm9yIG1wMykgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzUpCi0vKiBWaWRlbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA4MDAga2JwcykgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fSElHSCAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzYpCi0vKiBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKSAqLwotI2RlZmluZSBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzNykKLQotLyogLS0tLS0gT1RIRVJTIEVSUk9SUyAtLS0tLSAqLwotI2RlZmluZSBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEwgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHg1MCkKLSNkZWZpbmUgTTRNQ1NfRVJSX05PTU9SRV9TUEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE1DUywgMHg1MSkKLSNkZWZpbmUgTTRNQ1NfRVJSX0ZJTEVfRFJNX1BST1RFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE1DUywgMHg1MikKLSNlbmRpZiAvKiBfX000TUNTX0Vycm9yQ29kZXNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsQ29uZmlnLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbENvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmFmMWU2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsQ29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE1DU19BUEkuaAotICogQGJyaWVmICBNQ1MgaW50ZXJuYWwgY29uc3RhbnQgdmFsdWVzIHNldHRpbmdzCi0gKiBAbm90ZSAgIFRoaXMgaGVhZGVyIGZpbGUgaXMgbm90IHB1YmxpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotI2lmbmRlZiBfX000TUNTX0lOVEVSTkFMQ09ORklHX0hfXwotI2RlZmluZSBfX000TUNTX0lOVEVSTkFMQ09ORklHX0hfXwotCi0KLS8qKgotICogRGVmaW5pdGlvbiBvZiBtYXggQVUgc2l6ZSAqLwotI2RlZmluZSBNNE1DU19BVURJT19NQVhfQ0hVTktfU0laRSAgICAgICAgNzE2OCAvKio8IGFkZCBtcDMgZW5jb2RlciBhbmQgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCBiaXRyYXRlIGlzIG5vdyAzMjBrYnBzIGluc3RlYWQgb2YgMTI4a2JwcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoaXMgdmFsdWUgaGFzIHRvIGJlIGluY3JlYXNlZCBhY2NvcmRpbmdseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKChzaXplb2YoTTRPU0FfVUludDgpKm1heF9jaGFubmVsX251bWJlcikrMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRha2UgYSBtYXJnaW4oYWZ0ZXIgdGVzdHMsIDIgd2FzIG5vdCBlbm91Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSpNQVhfUENNX0dSQU5VTEFSSVRZX1NBTVBMRVMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQmVmb3JlOiA0MDAwKi8vKio8IE1hZ2ljYWwgKi8KLQotLyoqCi0gKiBWaWRlbyBtYXggQVUgYW5kIGZyYWdtZW50IHNpemUgKi8KLSNkZWZpbmUgTTRNQ1NfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPICAgMC44IC8qKjwgTWFnaWNhbC4gVXNlZCB0byBkZWZpbmUgdGhlIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00TUNTX1ZJREVPX0NIVU5LX0FVX1NJWkVfUkFUSU8gICAgIDEuMiAvKio8IE1hZ2ljYWwuIFVzZWQgdG8gZGVmaW5lIHRoZSBtYXggY2h1bmsgc2l6ZSAqLwotCi0vKioKLSAqIFZhcmlvdXMgTWFnaWNhbHMgKi8KLSNkZWZpbmUgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCAgICAgICAgMQotI2RlZmluZSBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lEICAgICAgICAyCi0KLS8qKgotICogR3JhbnVsYXJpdHkgZm9yIGF1ZGlvIGVuY29kZXIgKi8KLSAvKio8IG1pbmltdW0gbnVtYmVyIG9mIHNhbXBsZXMgdG8gcGFzcyBpbiBBTVIgZW5jb2RpbmcgY2FzZSAqLwotI2RlZmluZSBNNE1DU19QQ01fQU1SX0dSQU5VTEFSSVRZX1NBTVBMRVMgMTYwCi0vKio8IG1pbmltdW0gbnVtYmVyIG9mIHNhbXBsZXMgdG8gcGFzcyBpbiBBQUMgZW5jb2RpbmcgY2FzZSAqLwotI2RlZmluZSBNNE1DU19QQ01fQUFDX0dSQU5VTEFSSVRZX1NBTVBMRVMgMTAyNAotLyoqPCBtaW5pbXVtIG51bWJlciBvZiBzYW1wbGVzIHRvIHBhc3MgaW4gTVAzIGVuY29kaW5nIGNhc2UgKi8KLSNkZWZpbmUgTTRNQ1NfUENNX01QM19HUkFOVUxBUklUWV9TQU1QTEVTIDU3NgotCi0jZGVmaW5lIE00TUNTX0FVRElPX01BWF9BVV9TSVpFICAgICAgICAgICAxMDI0ICAvKio8IGFkZCBtcDMgZW5jb2RlciBhbmQgd3JpdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIG5vdCB1c2VkIGFueW1vcmUsIG5vdyB0aGUgbWF4IEFVCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIGlzIGNvbXB1dGVkIGR5bmFtaWNhbGx5IGFjY29yZGluZyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBjaGFubmVscyx0aGUgbWF4IFBDTSBncmFudWxhcml0eSBzYW1wbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhIG1hcmdpbi4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCZWZvcmU6IDEwMjQqLy8qKjwgTWFnaWNhbCAqLwotLyoqCi0gKiBXcml0ZXIgZmlsZSBhbmQgbW9vdiBzaXplIGVzdGltYXRpb24gKi8KLSNkZWZpbmUgTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPICAgIDEuMDQgIC8qKjwgbWFnaWNhbCBtb292IHNpemUgaXMgbGVzcyB0aGFuIDQlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGZpbGUgc2l6ZSBpbiBhdmVyYWdlICovCi0KLS8qKgotICogSWYgM2dwIGZpbGUgZG9lcyBub3QgY29udGFpbiBhbiBTVFNTIHRhYmxlIChubyByYXAgZnJhbWVzKSwKLSAgIGp1bXAgYmFja3dhcmQgdG8gYSBzcGVjaWZpZWQgbGltaXQgKi8KLSNkZWZpbmUgTTRNQ1NfTk9fU1RTU19KVU1QX1BPSU5UICAgICAgICAgIDQwMDAwIC8qKjwgNDAgcyAqLwotCi0jZW5kaWYgLyogX19NNE1DU19JTlRFUk5BTENPTkZJR19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsRnVuY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxYzY3OWUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TUNTX0ludGVybmFsRnVuY3Rpb25zLmgKLSAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBpbnRlcm5hbAotICogICAgICAgICAgdG8gdGhlIE1DUy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX000TUNTX0lOVEVSTkFMRlVOQ1RJT05TX0hfXwotI2RlZmluZSBfX000TUNTX0lOVEVSTkFMRlVOQ1RJT05TX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJNNFZQUF9BUEkuaCIKLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoIE00VlBQX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgIERvIHRoZSB2aWRlbyByZW5kZXJpbmcgYW5kIHRoZSByZXNpemUgKGlmIG5lZWRlZCkKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgcENvbnRleHQgICAgKElOKSAgICAgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBNQ1MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgIHBQbGFuZUluICAgIChJTikgICAgIENvbnRhaW5zIHRoZSBpbWFnZQotICogQHBhcmFtICAgcFBsYW5lT3V0ICAgKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiAzIHBsYW5lcyB0aGF0IHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gdGhlIG91dHB1dCBZVVY0MjAgaW1hZ2UKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgRVJSX01DU19WSURFT19ERUNPREVfRVJST1I6IHRoZSB2aWRlbyBkZWNvZGluZyBmYWlsZWQKLSAqIEByZXR1cm4gIEVSUl9NQ1NfUkVTSVpFX0VSUk9SOiAgICAgICB0aGUgcmVzaXppbmcgZmFpbGVkCi0gKiBAcmV0dXJuICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2ludEFwcGx5VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19TdWJzY3JpYmVNZWRpYUFuZENvZGVjKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSByZWFkZXIsIGRlY29kZXJzLCB3cml0ZXJzIGFuZCBlbmNvZGVycwotICogICAgICAgICAgIGluIHRoZSBNQ1MuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQ2xlYXIgZW5jb2RlcnMsIGRlY29kZXJzLCByZWFkZXIgYW5kIHdyaXRlcnMgaW50ZXJmYWNlcyB0YWJsZXMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgVGhlIGNvbnRleHQgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJXcml0ZXIoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIE1lZGlhVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSAqcFd0ckdsb2JhbEludGVyZmFjZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgKnBXdHJEYXRhSW50ZXJmYWNlKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgZmlsZSBmb3JtYXQgd3JpdGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICAgIGNvbnRleHQgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIHBDb250ZXh0LHBXdHJHbG9iYWxJbnRlcmZhY2Ugb3IgcFd0ckRhdGFJbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJXcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiBwV3RyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFd0ckRhdGFJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyRW5jb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0IG1lZGlhVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgdmlkZW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsCi0gKiAgICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KSwgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciggIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBtZWRpYVR5cGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIGF1ZGlvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgICAgY29udGV4dCB0aGUgZW5jb2RlciBjb250ZXh0LgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgKElOKSAgIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgKElOKSAgIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgcEVuY0dsb2JhbEludGVyZmFjZTogICAgKE9VVCkgIFRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBSZWdpc3RlciByZWFkZXIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhVHlwZSBtZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmRyRGF0YUludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBSZWdpc3RlciB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgIGRlY29kZXJUeXBlICAgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIERlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KSxvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciB0eXBlIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJlZ2lzdGVyIGF1ZGlvIGRlY29kZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbHkgYnkgdGhlIE1DUyB0byByZWdpc3RlciBDb3JlIGF1ZGlvIGRlY29kZXJzLAotICogQHBhcmFtICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgICAgIEF1ZGlvIGRlY29kZXIgdHlwZQotICogQHBhcmFtICAgcERlY29kZXJJbnRlcmZhY2UgIChJTikgICAgIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIGRlY29kZXIgdHlwZSBpcyBpbnZhbGlkKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsV3JpdGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBVbnJlZ2lzdGVyIHRoZSBlbmNvZGVycwotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbEVuY29kZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFVucmVnaXN0ZXIgcmVhZGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBVbnJlZ2lzdGVyIHRoZSBkZWNvZGVycwotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFNldCBjdXJyZW50IHdyaXRlcgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgIG1lZGlhVHlwZSAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50V3JpdGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgU2V0IGEgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRSZWFkZXIoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRGVjb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzKE00TUNTX0ludGVybmFsQ29udGV4dCogcENvbnRleHQpCi0gKiBAYnJpZWYgICAgQ2hlY2sgaWYgYW4gZWZmZWN0IGhhcyB0byBiZSBhcHBsaWVkIGN1cnJlbnRseQotICogQG5vdGUgICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgc3RlcEVuY29kaW5nIGZ1bmN0aW9uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSAgIE1DUyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19pbnRDaGVja0F1ZGlvRWZmZWN0cyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IEZhZGVJbiB0byBwUENNZGF0YQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgIChJTikgICAgIEVmZmVjdCBwcm9ncmVzcwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbiggIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IEZhZGVJbiB0byBwUENNZGF0YQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgIChJTikgICAgIEVmZmVjdCBwcm9ncmVzcwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQoIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRNQ1NfSU5URVJOQUxGVU5DVElPTlNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWU0ZjIzNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbFR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX0FQSS5oCi0gKiBAYnJpZWYgIE1DUyBpbnRlcm5hbCB0eXBlcyBhbmQgc3RydWN0dXJlcyBkZWZpbml0aW9ucwotICogQG5vdGUgICBUaGlzIGhlYWRlciBmaWxlIGlzIG5vdCBwdWJsaWMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLSNpZm5kZWYgX19NNE1DU19JTlRFUk5BTFRZUEVTX0hfXwotI2RlZmluZSBfX000TUNTX0lOVEVSTkFMVFlQRVNfSF9fCi0KLS8qKgotICogICAgTUNTIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRNQ1NfQVBJLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0vKiogRGV0ZXJtaW5lIGFic29sdXRlIHZhbHVlIG9mIGEuICovCi0jZGVmaW5lIE00TUNTX0FCUyhhKSAgICAgICAgICAgICAgICggKCAoYSkgPCAoMCkgKSA/ICgtKGEpKSA6IChhKSApCi0KLQotI2RlZmluZSBZX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDAwCi0jZGVmaW5lIFVfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLSNkZWZpbmUgVl9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotCi0KLS8qKgotICogICAgSW50ZXJuYWxseSB1c2VkIG1vZHVsZXMgKi8KLSNpbmNsdWRlICJNNFJFQURFUl8zZ3BDb20uaCIgICAgICAgIC8qKjwgUmVhZCAzR1BQIGZpbGUgICAgICovCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIiAgICAgICAvKio8IERlY29kZSB2aWRlbyAgICAgICAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiICAgICAgLyoqPCBWaWRlbyByZXNpemUgICAgICAgKi8KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIiAgICAgICAgICAgIC8qKjwgRGVjb2RlciBhdWRpbyAgICAgICovCi0jaW5jbHVkZSAiU1NSQy5oIiAgICAgICAgICAgICAgICAgICAvKio8IFNTUkMgICAgICAgICAgICAgICAqLwotI2luY2x1ZGUgIkZyb20yaVRvTW9ub18xNi5oIiAgICAgICAgLyoqPCBTdGVyZW8gdG8gTW9ubyAgICAgKi8KLSNpbmNsdWRlICJNb25vVG8ySV8xNi5oIiAgICAgICAgICAgIC8qKjwgTW9ubyB0byBTdGVyZW8gICAgICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgiICAvKio8IEVuY29kZSBhdWRpbyAgICAgICAqLwotI2luY2x1ZGUgIk00V1JJVEVSX2NvbW1vbi5oIiAgICAgICAgLyoqPCBXcml0ZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotLyoqCi0gKiAgSW5zdGVhZCBvZiBpbmNsdWRpbmcgQUFDIGNvcmUgcHJvcGVydGllcywgaXQgaXMgYmV0dGVyIHRvIHJlZGVmaW5lIHRoZSBuZWVkZWQgdHlwZQotICogIEFBQ19ERUNfU1RSRUFNX1BST1BTCi0gKiAgSW4gY2FzZSBvZiBleHRlcm5hbCBBQUMgZGVjb2RlciwgaXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8gcHV0IHRoaXMgdHlwZSBhcyBwdWJsaWMKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCBBQUNfREVDX1NUUkVBTV9QUk9QUwotICogQGJyaWVmIEFBQyBTdHJlYW0gcHJvcGVydGllcwotICogQE5vdGUgYU5vQ2hhbiBhbmQgYVNhbXBGcmVxIGFyZSB1c2VkIGZvciBwYXJzaW5nIGV2ZW4gdGhlIHVzZXIgcGFyYW1ldGVycwotICogICAgICAgIGFyZSBkaWZmZXJlbnQuICBVc2VyIHBhcmFtZXRlcnMgd2lsbCBiZSBpbnB1dCBmb3IgdGhlIG91dHB1dCBiZWhhdmlvdXIKLSAqICAgICAgICBvZiB0aGUgZGVjb2RlciB3aGVyZWFzIGZvciBwYXJzaW5nIGJpdHN0cmVhbSBwcm9wZXJ0aWVzIGFyZSB1c2VkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00T1NBX0ludDMyIGFBdWRpb09iamVjdFR5cGU7ICAgICAvKio8IEF1ZGlvIG9iamVjdCB0eXBlIG9mIHRoZSBzdHJlYW0gLSBpbiBmYWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0eXBlIGZvdW5kIGluIHRoZSBBY2Nlc3MgVW5pdCBwYXJzZWQgKi8KLSAgTTRPU0FfSW50MzIgYU51bUNoYW47ICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIGNoYW5uZWxzICg9MShtb25vKSBvciA9MihzdGVyZW8pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBpbmRpY2F0ZWQgYnkgaW5wdXQgYml0c3RyZWFtKi8KLSAgTTRPU0FfSW50MzIgYVNhbXBGcmVxOyAgICAgICAgICAgIC8qKjwgc2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6ICovCi0gIE00T1NBX0ludDMyIGFFeHRlbnNpb25TYW1wRnJlcTsgICAvKio8IGV4dGVuZGVkIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBIeiwgPSAwIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGV4dGVuZGVkIGZyZXF1ZW5jeSAqLwotICBNNE9TQV9JbnQzMiBhU0JSUHJlc2VudDsgICAgICAgICAgLyoqPCBwcmVzZW5jZT0xL2Fic2VuY2U9MCBvZiBTQlIgKi8KLSAgTTRPU0FfSW50MzIgYVBTUHJlc2VudDsgICAgICAgICAgIC8qKjwgcHJlc2VuY2U9MS9hYnNlbmNlPTAgb2YgUFMgKi8KLSAgTTRPU0FfSW50MzIgYU1heFBDTVNhbXBsZXNQZXJDaDsgIC8qKjwgbWF4IG51bWJlciBvZiBQQ00gc2FtcGxlcyBwZXIgY2hhbm5lbCAqLwotfSBBQUNfREVDX1NUUkVBTV9QUk9QUzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICAgIENvZGVjcyByZWdpc3RyYXRpb24gc2FtZSBhcyBpbiBWUFMgYW5kIFZFUywgc28gbGVzcyBtYXBwaW5nCi0gKiAgICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG93YXJkIE1DUyBhcGkgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBHbG9iYWxGY3RzOyAgICAvKio8IG9wZW4sIGNsb3NlLCBzZXRvcHRpb24sZXRjLi4uIGZ1bmN0aW9ucyAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgIHBEYXRhRmN0czsgICAgICAgIC8qKjwgZGF0YSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCi19IE00TUNTX1dyaXRlckludGVyZmFjZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRNQ1NfU3RhdGVzCi0gKiBAYnJpZWYgICAgICAgIE1haW4gc3RhdGUgbWFjaGluZSBvZiB0aGUgTUNTLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rU3RhdGVfQ1JFQVRFRCwgICAgICAgICAgIC8qKjwgTTRNQ1NfaW5pdCBoYXMgYmVlbiBjYWxsZWQgICAgICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfT1BFTkVELCAgICAgICAgICAgIC8qKjwgTTRNQ1Nfb3BlbiBoYXMgYmVlbiBjYWxsZWQgICAgICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfU0VULCAgICAgICAgICAgICAgIC8qKjwgQWxsIG1hbmRhdG9yeSBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBzZXQgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfUkVBRFksICAgICAgICAgICAgIC8qKjwgQWxsIG9wdGlvbm5hbCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBzZXQgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVAsICAgIC8qKjwgTXVzdCBqdW1wIHRvIHRoZSBJZnJhbWUgYmVmb3JlIHRoZSBiZWdpbiBjdXQgKi8KLSAgICBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0RFQ09ERSwgIC8qKjwgTXVzdCBkZWNvZGUgdXAgdG8gdGhlIGJlZ2luIGN1dCAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORywgICAgICAgIC8qKjwgU3RlcCBjYW4gYmUgY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfUEFVU0VELCAgICAgICAgICAgIC8qKjwgUGF1c2VkLCBSZXN1bWUgY2FuIGJlIGNhbGxlZCAgICAgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0YXRlX0ZJTklTSEVELCAgICAgICAgICAvKio8IFRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICAgICAgICAgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0YXRlX0NMT1NFRCAgICAgICAgICAgICAvKio8IE91dHB1dCBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQgICAgICAgICAgICAqLwotfSBNNE1DU19TdGF0ZXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00TUNTX1N0cmVhbVN0YXRlCi0gKiBAYnJpZWYgICAgICAgIFN0YXRlIG9mIGEgbWVkaWEgc3RyZWFtIGVuY29kaW5nIChhdWRpbyBvciB2aWRlbykuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSAgPSAwLCAgICAvKio8IE5vIHN0cmVhbSBwcmVzZW50ICAgICAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEICAgPSAxLCAgICAvKio8IFRoZSBzdHJlYW0gZW5jb2RpbmcgaXMgaW4gcHJvZ3Jlc3MgKi8KLSAgICBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQgID0gMiAgICAvKio8IFRoZSBzdHJlYW0gaGFzIGZpbmlzaGVkIGVuY29kaW5nICAgICovCi19IE00TUNTX1N0cmVhbVN0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIGFub255bW91cyBlbnVtCi0gKiBAYnJpZWYgICAgICAgIGVudW0gdG8ga2VlcCB0cmFjayBvZiB0aGUgZW5jb2RlciBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1lbnVtCi17Ci0gICAgTTRNQ1Nfa05vRW5jb2RlciwKLSAgICBNNE1DU19rRW5jb2RlckNsb3NlZCwKLSAgICBNNE1DU19rRW5jb2RlclN0b3BwZWQsCi0gICAgTTRNQ1Nfa0VuY29kZXJSdW5uaW5nCi19OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgTUNTIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIE1DUyBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICBiaXRQb3M7Ci0gICAgICAgICAgICAgICAgIC8qIGJpdCBjb3VudCBvZiBudW1iZXIgb2YgYml0cyB1c2VkIHNvIGZhciAqLwotCi0gICAgTTRPU0FfVUludDggICAqc3RyZWFtQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEJpdHN0cmVhbSBCdWZmZXIgKi8KLQotICAgIE00T1NBX1VJbnQzMiAgICBieXRlQ250OwotICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBCeXRlcyB3cml0dGVuIGluIEJpdHN0cmVhbSBidWZmZXIqLwotCi0gICAgTTRPU0FfVUludDMyICAgIGN1cnJCdWZmOwotICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgYnVmZmVyIGhvbGRzLCA0Ynl0ZXMgb2YgYml0c3RyZWFtKi8KLQotICAgIE00T1NBX1VJbnQ4ICAgcHJldkJ5dGU7Ci0gICAgICAgICAgICAgICAgLyogUHJldmlvdXMgYnl0ZSB3cml0dGVuIGluIHRoZSBidWZmZXIgKi8KLQotICAgIE00T1NBX1VJbnQ4ICAgcHJldlByZXZCeXRlOwotICAgICAgICAgICAgICAgIC8qIFByZXZpb3VzIHRvIHByZXZpb3VzIGJ5dGUgd3JpdHRlbiBpbiB0aGUgYnVmZmVyICovCi0KLX1OU1dBVkNfYml0U3RyZWFtX3RfTUNTOwotCi0jZGVmaW5lIF9NQVhudW1fc2xpY2VfZ3JvdXBzICA4Ci0jZGVmaW5lIF9NQVhudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlICAyNTYKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTTRPU0FfVUludDMyICBsZXZlbF9pZGNfaW5kZXg7Ci0gIE00T1NBX1VJbnQzMiAgTWF4RnJhbWVOdW07Ci0gIE00T1NBX1VJbnQzMiAgZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGU7Ci0gIE00T1NBX0ludDMyICAgTWF4UGljT3JkZXJDbnRMc2I7Ci0gIE00T1NBX0ludDMyICAgbWF4X2RlY19mcmFtZV9idWZmZXJpbmc7Ci0KLSAgLyogKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKSAqLwotICBNNE9TQV9JbnQzMiAgIG9mZnNldF9mb3Jfbm9uX3JlZl9waWM7Ci0gIE00T1NBX0ludDMyICAgb2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOwotICBNNE9TQV9JbnQzMiAgIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQ7Ci0gIE00T1NBX0ludDMyICAgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQ7Ci0gIE00T1NBX0ludDMyICAgZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OwotICBNNE9TQV9JbnQzMiAgIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldDsKLSAgTTRPU0FfSW50MzIgICBvZmZzZXRfZm9yX3JlZl9mcmFtZVtfTUFYbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZV07Ci0KLSAgTTRPU0FfVUludDE2IFBpY1dpZHRoSW5NYnM7Ci0gIE00T1NBX1VJbnQxNiBGcmFtZUhlaWdodEluTWJzOwotICBNNE9TQV9VSW50MTYgIHBpY193aWR0aF9pbl9tYnNfbWludXMxOwotICBNNE9TQV9VSW50MTYgIHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMTsKLQotI2lmZGVmIF9DQVBfRk1PXwotICBNNE9TQV9VSW50MTYgTnVtU2xpY2VHcm91cE1hcFVuaXRzOwotICBNNE9TQV9VSW50MTYgTWF4UGljU2l6ZUluTWJzOwotI2VuZGlmIC8qX0NBUF9GTU9fKi8KLQotICBNNE9TQV9VSW50OCAgIHByb2ZpbGVfaWRjOwotICBNNE9TQV9VSW50OCAgIHJlc2VydmVkX3plcm9fNGJpdHM7Ci0gIE00T1NBX1VJbnQ4ICAgbGV2ZWxfaWRjOwotICBNNE9TQV9VSW50OCAgIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICBNNE9TQV9VSW50OCAgIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQ7Ci0gIE00T1NBX1VJbnQ4ICAgcGljX29yZGVyX2NudF90eXBlOwotICAvKiBpZihwaWNfb3JkZXJfY250X3R5cGUgPT0gMCkgKi8KLSAgTTRPU0FfVUludDggICBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ7Ci0KLSAgTTRPU0FfVUludDggICBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOwotICAvKiBmb3IoIGkgPSAwOyBpIDwgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgaSsrICkgKi8KLSAgTTRPU0FfVUludDggICBudW1fcmVmX2ZyYW1lczsKLQotICBNNE9TQV9Cb29sICAgIGNvbnN0cmFpbnRfc2V0MF9mbGFnOwotICBNNE9TQV9Cb29sICAgIGNvbnN0cmFpbnRfc2V0MV9mbGFnOwotICBNNE9TQV9Cb29sICAgIGNvbnN0cmFpbnRfc2V0Ml9mbGFnOwotICBNNE9TQV9Cb29sICAgIGNvbnN0cmFpbnRfc2V0M19mbGFnOwotICBNNE9TQV9Cb29sICAgIGRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOwotICBNNE9TQV9Cb29sICAgIGdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBmcmFtZV9tYnNfb25seV9mbGFnOwotICBNNE9TQV9Cb29sICAgIG1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBmcmFtZV9jcm9wcGluZ19mbGFnOwotICBNNE9TQV9Cb29sICAgIHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBBY3RpdmU7Ci0KLSAgLyogdnVpX3NlcV9wYXJhbWV0ZXJzX3QgdnVpX3NlcV9wYXJhbWV0ZXJzOyAqLwotfSBDb21TZXF1ZW5jZVBhcmFtZXRlclNldF90X01DUzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTTRPU0FfSW50MTYgICAgICAgcGljX2luaXRfcXBfbWludXMyNjsKLSAgTTRPU0FfSW50MTYgICAgICAgcGljX2luaXRfcXNfbWludXMyNjsKLSAgTTRPU0FfSW50MTYgICAgICAgY2hyb21hX3FwX2luZGV4X29mZnNldDsKLQotLy8jaWZkZWYgX0NBUF9GTU9fCi0gIC8qIGlmKCBzbGljZV9ncm91cF9tYXBfdHlwZSA9ID0gMCApICovCi0gIE00T1NBX1VJbnQxNiAgICAgIHJ1bl9sZW5ndGhfbWludXMxW19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLSAgLyogZWxzZSBpZiggc2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSA9IDIgKSAqLwotICBNNE9TQV9VSW50MTYgICAgICB0b3BfbGVmdFtfTUFYbnVtX3NsaWNlX2dyb3Vwc107Ci0gIE00T1NBX1VJbnQxNiAgICAgIGJvdHRvbV9yaWdodFtfTUFYbnVtX3NsaWNlX2dyb3Vwc107Ci0gIC8qIGVsc2UgaWYoIHNsaWNlX2dyb3VwX21hcF90eXBlID0gPSA2ICkgKi8KLSAgTTRPU0FfVUludDE2ICAgICAgcGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMTsKLSAgTTRPU0FfVUludDE2ICAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxOwotCi0gIE00T1NBX1VJbnQxNiBGaXJzdE1iSW5TbGljZUdyb3VwW19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLSAgTTRPU0FfVUludDE2IExhc3RNYkluU2xpY2VHcm91cFtfTUFYbnVtX3NsaWNlX2dyb3Vwc107Ci0KLQotICBNNE9TQV9VSW50OCAgKnNsaWNlX2dyb3VwX2lkOwotICBNNE9TQV9VSW50OCAgKk1hcFVuaXRUb1NsaWNlR3JvdXBNYXA7Ci0gIE00T1NBX1VJbnQ4ICAqTWJUb1NsaWNlR3JvdXBNYXA7Ci0gIE00T1NBX1VJbnQxNiAgTnVtU2xpY2VHcm91cE1hcFVuaXRzOwotCi0gIE00T1NBX1VJbnQ4ICAgICAgIHNsaWNlX2dyb3VwX21hcF90eXBlOwotICAvKiBlbHNlIGlmKCBzbGljZV9ncm91cF9tYXBfdHlwZSA9ID0gMyB8fCA0IHx8IDUgKi8KLSAgTTRPU0FfQm9vbCAgICAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnOwotICBNNE9TQV9Cb29sICAgbWFwX2luaXRpYWxpemVkOwotLy8gI2VuZGlmIC8qX0NBUF9GTU9fKi8KLQotICBNNE9TQV9VSW50OCAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZDsKLSAgTTRPU0FfVUludDggICAgICAgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gIE00T1NBX1VJbnQ4ICAgICAgbnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsKLSAgTTRPU0FfVUludDggICAgICBudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxOwotICBNNE9TQV9VSW50OCAgICAgICB3ZWlnaHRlZF9iaXByZWRfaWRjOwotICBNNE9TQV9VSW50OCAgICAgICBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsKLQotICBNNE9TQV9Cb29sICAgICAgICBlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWc7Ci0gIC8qIGlmKCBwaWNfb3JkZXJfY250X3R5cGUgPCAyICkgIGluIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0ICovCi0gIE00T1NBX0Jvb2wgICAgICAgIHBpY19vcmRlcl9wcmVzZW50X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgICAgIHdlaWdodGVkX3ByZWRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICAgICAgZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgICAgIGNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICAgICAgcmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnOwotICBNNE9TQV9Cb29sICAgIEFjdGl2ZTsKLQotICBDb21TZXF1ZW5jZVBhcmFtZXRlclNldF90X01DUyAqcF9hY3RpdmVfc3BzOwotfSBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgICAgTTRPU0FfVUludDMyIGJpdFBvczsgICAgICAgICAgICAgICAgLyohPCBiaXQgcG9zaXRpb24gaW4gYnVmZmVyICovCi0gICAgICBNNE9TQV9VSW50MzIgdG90YWxCaXRzOyAgICAgICAgICAgICAvKiE8IGJpdCBwb3NpdGlvbiBpbiBmaWxlICh0b3RhbCBiaXRzIHJlYWQgc28gZmFyKSAqLwotCi0gICAgICBNNE9TQV9VSW50MzIgbGFzdFRvdGFsQml0czsgICAgICAgICAvKiE8IGJpdCBwb3NpdGlvbiBpbiBmaWxlIG9mIHRoZSBsYXN0IFZPUCAqLwotICAgICAgTTRPU0FfVUludDMyIG51bUJpdHNJbkJ1ZmZlcjsgICAgICAgLyohPCBudW1iZXIgb2YgYml0cyBpbiBidWZmZXIgKi8KLSAgICAgIE00T1NBX1VJbnQzMiByZWFkYWJsZUJ5dGVzSW5CdWZmZXI7IC8qITwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQgaW4gZGVjb2RlciBidWZmZXIqLwotICAgICAgTTRPU0FfVUludDMyIG1heEJ1ZmZlclNpemU7ICAgICAgICAgLyohPCBtYXggYnVmZmVyIHNpemUgaW4gYml0IHVuaXRzICovCi0gICAgICBNNE9TQV9VSW50OCAgKkJ1ZmZlcjsgICAgICAgICAgICAgICAvKiE8IGNoYXIgYnVmZmVyIGF0IHJlYWRpbmcgZnJvbSBmaWxlICovCi0gICAgICBNNE9TQV9JbnQzMiAgICAgaThCaXRDbnQ7Ci0gICAgICBNNE9TQV9VSW50MzIgICAgIHVpMzJUZW1wQnVmZjsKLSAgICAgIE00T1NBX0ludDgqcHVpOEJmclB0cjsKLSAgICAgIE00T1NBX1VJbnQzMiAgICB1aTMyTGFzdFR3b0J5dGVzOyAgLyohPCBzdG9yZXMgdGhlIGxhc3QgcmVhZCB0d28gYnl0ZXMgKi8KLX0gQ29tQml0U3RyZWFtTUNTX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLQotICAgIE00T1NBX0ludDMyIHByZXZfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGN1cl9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgcHJldl9uZXdfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQ7Ci0gICAgTTRPU0FfSW50MzIgaXNfZG9uZTsKLSAgICBNNE9TQV9JbnQzMiBpc19maXJzdDsKLSAgICBNNE9TQV9JbnQzMiBmcmFtZV9jb3VudDsKLSAgICBNNE9TQV9JbnQzMiBmcmFtZV9tb2RfY291bnQ7Ci0gICAgTTRPU0FfSW50MzIgUE9DX2xzYjsKLSAgICBNNE9TQV9JbnQzMiBQT0NfbHNiX21vZDsKLQotCi0gICAgTTRPU0FfVUludDMyICAgIG1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGg7Ci0KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbzsgICAvKio8IFBvaW50ZXIgb24gc3BlY2lmaWMgaW5mb3JtYXRpb24gcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNyZWF0ZSBhIGRlY29kZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsvKio8IFNpemUgb2YgdGhlIHNwZWNpZmljIGluZm9ybWF0aW9uIHBvaW50ZXIgYWJvdmUqLwotCi0gICAgTTRPU0FfVUludDgqICAgIG1fcEVuY29kZXJTUFM7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fZW5jb2RlclNQU1NpemU7Ci0KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRW5jb2RlclBQUzsKLSAgICBNNE9TQV9VSW50MzIgICAgbV9lbmNvZGVyUFBTU2l6ZTsKLQotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BGaW5hbERTSTsKLSAgICBNNE9TQV9VSW50MzIgICAgbV9wRmluYWxEU0lTaXplOwotCi0gICAgTTRPU0FfVUludDMyICAgIG1fZW5jb2Rlcl9TUFNfQ250OwotICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICpwX2NsaXBfc3BzOwotICAgIE00T1NBX1VJbnQzMiAgICBtX2VuY29kZXJfUFBTX0NudDsKLSAgICBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTICAqcF9jbGlwX3BwczsKLQotICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICpwX2VuY29kZXJfc3BzOwotICAgIENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1MgICpwX2VuY29kZXJfcHBzOwotCi0KLSAgICBDb21TZXF1ZW5jZVBhcmFtZXRlclNldF90X01DUyAgZW5jb2Rlcl9zcHM7Ci0gICAgQ29tUGljdHVyZVBhcmFtZXRlclNldF90X01DUyAgIGVuY29kZXJfcHBzOwotICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICBjbGlwX3NwczsKLQotICAgIC8qIEVuY29kZXIgU1BTIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgZW5jX3NlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKLSAgICBNNE9TQV9VSW50MzIgZW5jX3BpY19vcmRlcl9jbnRfdHlwZTsKLSAgICBNNE9TQV9VSW50MzIgZW5jX2xvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsgLyogYXBwbGljYWJsZSB3aGVuIFBPQyB0eXBlID0gMCAqLwotICAgIE00T1NBX1VJbnQzMiBlbmNfZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7Ci0gICAgTTRPU0FfSW50MzIgZW5jX29mZnNldF9mb3Jfbm9uX3JlZl9waWM7Ci0gICAgTTRPU0FfSW50MzIgZW5jX29mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKLSAgICBNNE9TQV9VSW50MzIgZW5jX251bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7IC8qIHJhbmdlIDAgdG8gMjU1ICovCi0gICAgLyogYXJyYXkgb2Ygc2l6ZSBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlICovCi0gICAgTTRPU0FfSW50MzIgICBlbmNfb2Zmc2V0X2Zvcl9yZWZfZnJhbWVbMjU2XTsKLSAgICBNNE9TQV9VSW50MzIgZW5jX251bV9yZWZfZnJhbWVzOwotICAgIE00T1NBX1VJbnQzMiBlbmNfZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnOwotCi0KLSAgICAvKiBJbnB1dCBjbGlwIFNQUyBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfVUludDMyIGNsaXBfc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9waWNfb3JkZXJfY250X3R5cGU7Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0OyAvKiBhcHBsaWNhYmxlIHdoZW4gUE9DIHR5cGUgPSAwICovCi0gICAgTTRPU0FfVUludDMyIGNsaXBfZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7Ci0gICAgTTRPU0FfSW50MzIgIGNsaXBfb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKLSAgICBNNE9TQV9JbnQzMiAgY2xpcF9vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgLyogcmFuZ2UgMCB0byAyNTUgKi8KLSAgICAvKiBhcnJheSBvZiBzaXplIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgY2xpcF9vZmZzZXRfZm9yX3JlZl9mcmFtZVsyNTZdOwotICAgIE00T1NBX1VJbnQzMiBjbGlwX251bV9yZWZfZnJhbWVzOwotICAgIE00T1NBX1VJbnQzMiBjbGlwX2dhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZzsKLQotICAgIE00T1NBX1VJbnQzMiBmaW5hbF9QUFNfSUQ7Ci0gICAgTTRPU0FfVUludDMyIGZpbmFsX1NQU19JRDsKLSAgICBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICBlbmNiczsKLQotfSBOU1dBVkNfTUNTX3Q7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBNQ1MgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgTUNTIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogTUNTIFN0YXRlIGFuZCBzZXR0aW5ncyBzdHVmZiAqLwotICAgIE00TUNTX1N0YXRlcyAgICAgICAgICAgIFN0YXRlOyAgICAgLyoqPCBNQ1MgaW50ZXJuYWwgc3RhdGUgKi8KLSAgICBNNE1DU19TdHJlYW1TdGF0ZSAgICAgICBWaWRlb1N0YXRlOy8qKjwgU3RhdGUgb2YgdGhlIHZpZGVvIGVuY29kaW5nICovCi0gICAgTTRNQ1NfU3RyZWFtU3RhdGUgICAgICAgQXVkaW9TdGF0ZTsvKio8IFN0YXRlIG9mIHRoZSBhdWRpbyBlbmNvZGluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG5vYXVkaW87LyoqPCBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkZWFsIHdpdGggYXVkaW8gdHJhbnNjb2RpbmcgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBub3ZpZGVvOy8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZGVhbCB3aXRoIHZpZGVvIHRyYW5zY29kaW5nICovCi0KLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgSW5wdXRGaWxlUHJvcGVydGllczsvKio8IElucHV0IGF1ZGlvL3ZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgcElucHV0RmlsZTsgICAgICAgICAgICAgLyoqPCBSZW1lbWJlciBpbnB1dCBmaWxlIHBvaW50ZXIgYmV0d2VlbiBmYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuIGFuZCBub3JtYWwgb3BlbiAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGU7ICAgICAgICAgIC8qKjwgUmVtZW1iZXIgaW5wdXQgZmlsZSB0eXBlIGJldHdlZW4gZmFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbiBhbmQgbm9ybWFsIG9wZW4gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiRmlsZU9wZW5lZEluRmFzdE1vZGU7ICAvKio8IEZsYWcgdG8ga25vdyBpZiBhIHBhcnRpY3VsYXIgcmVhZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyBmYXN0IG9wZW4gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aU1heE1ldGFkYXRhU2l6ZTsgICAgICAvKio8IExpbWl0YXRpb24gb24gdGhlIG1heCBhY2NlcHRhYmxlIG1vb3YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgb2YgYSAzZ3BwIGZpbGUgKi8KLQotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIEVuY29kaW5nVmlkZW9Gb3JtYXQ7ICAgIC8qKjwgT3V0cHV0IHZpZGVvIGZvcm1hdCwgc2V0IGJ5IHRoZSB1c2VyICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgRW5jb2RpbmdXaWR0aDsgICAgICAgICAgLyoqPCBPdXRwdXQgdmlkZW8gd2lkdGgsIHNldCBieSB0aGUgdXNlciAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgIEVuY29kaW5nSGVpZ2h0OyAgICAgICAgIC8qKjwgT3V0cHV0IHZpZGVvIGhlaWdodCwgc2V0IGJ5IHRoZSB1c2VyICovCi0gICAgTTRFTkNPREVSX0ZyYW1lUmF0ZSAgICAgRW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZTsgLyoqPCBPdXRwdXQgdmlkZW8gZnJhbWVyYXRlLCBzZXQgYnkgdGhlIHVzZXIqLwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlCZWdpbkN1dFRpbWU7ICAgICAvKio8IEJlZ2luIGN1dCB0aW1lLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUVuZEN1dFRpbWU7ICAgICAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpTWF4RmlsZVNpemU7ICAgICAgLyoqPCBNYXhpbXVtIG91dHB1dCBmaWxlIHNpemUsIGluIGJ5dGVzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGU7ICAgICAvKio8IFRhcmdldGVkIGF1ZGlvIGJpdHJhdGUgaW4gYnBzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlWaWRlb0JpdHJhdGU7ICAgICAvKio8IFRhcmdldGVkIHZpZGVvIGJpdHJhdGUgaW4gYnBzICovCi0KLSAgICBNNE9TQV9VSW50OCAgICAgdWlQcm9ncmVzczsgIC8qKjwgUHJvZ3Jlc3MgaW5mb3JtYXRpb24gc2F2ZWQgYXQgZWFjaCBzdGVwIHRvIGJlIGFibGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0IGluIGNhc2Ugb2YgcGF1c2UgKi8KLQotICAgIC8qKgotICAgICAqIFJlYWRlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIHBSZWFkZXJDb250ZXh0OyAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSByZWFkZXIgbW9kdWxlICovCi0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiAgcFJlYWRlclZpZGVvU3RyZWFtOyAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIHZpZGVvIHN0cmVhbSAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIHBSZWFkZXJBdWRpb1N0cmVhbTsgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kOyAgIC8qKjwgVHJ1ZSBpZiBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaGFzIGJlZW4gZm91bmQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kOyAgIC8qKjwgVHJ1ZSBpZiBhbiB1bnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaGFzIGJlZW4gZm91bmQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJWaWRlb0FVOyAgICAgICAgICAgIC8qKjwgUmVhZCB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlclZpZGVvQVUxOyAgICAgICAgICAgLyoqPCBSZWFkIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyVmlkZW9BVTI7ICAgICAgICAgICAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJBdWRpb0FVOyAgICAgICAgICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlckF1ZGlvQVUxOyAgICAgICAgICAgLyoqPCBSZWFkIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyQXVkaW9BVTI7ICAgICAgICAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICBtX3BEYXRhQWRkcmVzczE7ICAgICAgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciBmb3IgQWNjZXNzIFVuaXQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICBtX3BEYXRhQWRkcmVzczI7ICAgICAgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciBmb3IgQWNjZXNzIFVuaXQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICBtX3BEYXRhVmlkZW9BZGRyZXNzMTsgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciBmb3IgQWNjZXNzIFVuaXQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICBtX3BEYXRhVmlkZW9BZGRyZXNzMjsgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciBmb3IgQWNjZXNzIFVuaXQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX2F1ZGlvQVVEdXJhdGlvbjsgICAgICAgIC8qKjwgQXVkaW8gQVUgZHVyYXRpb24gKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICBpQXVkaW9DdHNPZmZzZXQ7ICAgICAgICAgIC8qKjwgQXVkaW8gQVUgQ1RTIG9mZnNldCBkdWUgdG8gYmVnaW4gY3V0ICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBkZWNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgIHBWaURlY0N0eHQ7ICAgICAgICAgLyoqPCBWaWRlbyBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgZFZpRGVjU3RhcnRpbmdDdHM7ICAvKio8IFZpZGVvIENUUyBhdCB3aGljaCB0aGUgZGVjb2RlL2VuY29kZSB3aWxsIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlZCBmb3IgYmVnaW4gY3V0IGFuZCBwYXVzZS9yZXN1bWUpICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgIGRWaURlY0N1cnJlbnRDdHM7ICAgLyoqPCBWaWRlbyBDVFMgdG8gZGVjb2RlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgIGlWaWRlb0JlZ2luRGVjSW5jcjsgLyoqPCBDVFMgc3RlcCBmb3IgdGhlIGJlZ2luIGN1dCBkZWNvZGUgKGRvZXNuJ3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkIGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbikgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgZEN0c0luY3JlbWVudDsgICAgICAvKio8IEN0cyBpbmNyZW1lbnQgZnJvbSBvbmUgdmlkZW8gZnJhbWUgdG8gYW5vdGhlciovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgIGlzUmVuZGVyRHVwOyAgICAgICAgLyoqPCBUbyBoYW5kbGUgZHVwbGljYXRlIGZyYW1lIHJlbmRlcmluZyBpbiBjYXNlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgZGVjb2RpbmcgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgbGFzdERlY29kZWRQbGFuZTsgICAvKio8IExhc3QgZGVjb2RlZCBwbGFuZSAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZW5jb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICBwVmlFbmNDdHh0OyAgICAgICAgIC8qKjwgVmlkZW8gZW5jb2RlciBjb250ZXh0ICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqICAgIHBQcmVSZXNpemVGcmFtZTsgICAgLyoqPCBUaGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUgcmVzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY2F0ZWQgaWYgcmVzaXplIG5lZWRlZCBvbmx5KSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgIHVpRW5jVmlkZW9CaXRyYXRlOyAgLyoqPCBBY3R1YWwgdmlkZW8gYml0cmF0ZSBmb3IgdGhlIHZpZGVvIGVuY29kZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgb3V0cHV0VmlkZW9UaW1lc2NhbGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgIGVuY29kZXJTdGF0ZTsKLQotICAgIC8qKgotICAgICAqIEF1ZGlvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgcEF1ZGlvRGVjQ3R4dDsgICAgICAgIC8qKjwgQXVkaW8gKEFBQykgZGVjb2RlciBjb250ZXh0ICovCi0gICAgTTRBRF9CdWZmZXIgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVySW47ICAgICAvKio8IElucHV0IHN0cnVjdHVyZSBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBNNEFEX0J1ZmZlciAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJPdXQ7ICAgIC8qKjwgT3V0cHV0IHN0cnVjdHVyZSBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgcFBvc0luRGVjQnVmZmVyT3V0OyAgIC8qKjwgUG9zaXRpb24gaW50byB0aGUgZGVjb2RlciBidWZmZXIgKi8KLSAgICBBQUNfREVDX1NUUkVBTV9QUk9QUyAgQWFjUHJvcGVydGllczsgICAvKio8IFN0cnVjdHVyZSBmb3IgbmV3IGFwaSB0byBnZXQgQUFDIHByb3BlcnRpZXMgKi8KLQotICAgIC8qKgotICAgICAqIFNhbXBsZSBSYXRlIENvbnZlcnRvciAoU1NSQykgc3R1ZmYgKi8KLSAgICBTU1JDX0luc3RhbmNlX3QgICAgICAgIFNzcmNJbnN0YW5jZTsgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBTc3JjICovCi0gICAgU1NSQ19TY3JhdGNoX3QqICAgICAgICBTc3JjU2NyYXRjaDsgICAgICAgIC8qKjwgV29ya2luZyBtZW1vcnkgb2YgdGhlIFNzcmMgKi8KLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgIGlTc3JjTmJTYW1wbEluOyAgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG5lZWRzIGFzIGlucHV0ICovCi0gICAgc2hvcnQgICAgICAgICAgICAgICAgICBpU3NyY05iU2FtcGxPdXQ7ICAgIC8qKjwgTnVtYmVyIG9mIHNhbXBsZSB0aGUgU3NyYyBvdXRwdXRzICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICBwU3NyY0J1ZmZlckluOyAgICAgIC8qKjwgSW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIHBTc3JjQnVmZmVyT3V0OyAgICAgLyoqPCBPdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIHBQb3NJblNzcmNCdWZmZXJJbjsgLyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBTU1JDIGluIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgcFBvc0luU3NyY0J1ZmZlck91dDsvKio8IFBvc2l0aW9uIGludG8gdGhlIFNTUkMgb3V0IGJ1ZmZlciAqLwotCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICBwTFZBdWRpb1Jlc2FtcGxlcjsKLQotCi0gICAgLyoqCi0gICAgICogYXVkaW8gZW5jb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jQ3R4dDsgLyoqPCBDb250ZXh0IG9mIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvICBwQXVkaW9FbmNEU0k7IC8qKjwgRGVjb2RlciBzcGVjaWZpYyBpbmZvIGJ1aWx0IGJ5IHRoZSBlbmNvZGVyKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMgICAgICAgICAgIEF1ZGlvRW5jUGFyYW1zOy8qKjwgQ29uZmlnIG9mIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICBwQXVkaW9FbmNvZGVyQnVmZmVyOyAgICAgIC8qKjwgSW5wdXQgb2YgdGhlIGVuY29kZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgIHBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlcjsgLyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBlbmNvZGVyIGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgYXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7ICAvKio8IE1pbmltdW0gbnVtYmVyIG9mIHBjbSBzYW1wbGVzIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGZlZWQgYXVkaW8gZW5jb2RlciAqLwotCi0gICAgLyoqCi0gICAgICogV3JpdGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICBwV3JpdGVyQ29udGV4dDsgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgd3JpdGVyIG1vZHVsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgcE91dHB1dEZpbGU7ICAgICAgICAvKio8IE91dHB1dCBmaWxlIHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlOyAgICAgLyoqPCBUZW1wb3JhcnkgZmlsZSB0byBiZSBjcmVhdGVkIHRvIHN0b3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhICgibW9vdi5iaW4iKSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICAgV3JpdGVyVmlkZW9TdHJlYW07ICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuIHZpZGVvIHN0cmVhbSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICAgV3JpdGVyQXVkaW9TdHJlYW07ICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MgV3JpdGVyVmlkZW9TdHJlYW1JbmZvOy8qKjwgVmlkZW8gcHJvcGVydGllcyBvZiB0aGUgd3JpdHRlbiB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgV3JpdGVyVmlkZW9BVTsgICAgICAgIC8qKjwgV3JpdHRlbiB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgV3JpdGVyQXVkaW9BVTsgICAgICAgIC8qKjwgV3JpdHRlbiBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlWaWRlb0FVQ291bnQ7ICAgICAgIC8qKjwgTnVtYmVyIG9mIHZpZGVvIEFVIHdyaXR0ZW4gaW4gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlWaWRlb01heEF1U2l6ZTsgICAgIC8qKjwgTWF4IGFjY2VzcyB1bml0IHNpemUgZm9yIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIHVpVmlkZW9NYXhDaHVuY2tTaXplOyAvKio8IE1heCBjaHVuY2sgc2l6ZSBmb3IgdGhlIG91dHB1dCB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlBdWRpb0FVQ291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgYXVkaW8gQVUgd3JpdHRlbiBpbiBvdXRwdXQgZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlBdWRpb01heEF1U2l6ZTsgLyoqPCBNYXggYWNjZXNzIHVuaXQgc2l6ZSBmb3IgdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlBdWRpb0N0czsgICAgICAgLyoqPCBBdWRpbyBBVSBjdHMgKHdoZW4gYXVkaW8gaXMgdHJhbnNjb2RlZCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJfaXNSYXdXcml0ZXI7ICAgIC8qKjwgQm9vbGVhbiB0byBrbm93IGlmIHRoZSByYXcgd3JpdGVyIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkIG9yIG5vdCAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgcE91dHB1dFBDTWZpbGU7ICAgLyoqPCBPdXRwdXQgUENNIGZpbGUgaWYgbm90IE5VTEwgKi8KLQotICAgIC8qKgotICAgICAqIEZpbGVzeXN0ZW0gZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICBwT3NhRmlsZVJlYWRQdHI7IC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogIHBPc2FGaWxlV3JpdFB0cjsgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAgKiBNZWRpYSBhbmQgQ29kZWMgcmVnaXN0cmF0aW9uICovCi0gICAgLyoqPCBUYWJsZSBvZiBNNFZFU19Xcml0ZXJJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIFdyaXRlcnMgbGlzdCAqLwotICAgIE00TUNTX1dyaXRlckludGVyZmFjZSAgICAgICAgICAgICAgIFdyaXRlckludGVyZmFjZVtNNFdSSVRFUl9rVHlwZV9OQl07Ci0gICAgLyoqPCBvcGVuLCBjbG9zZSwgc2V0b3B0aW9uLGV0Yy4uLiBmdW5jdGlvbnMgb2YgdGhlIHVzZWQgd3JpdGVyKi8KLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0czsKLSAgICAvKio8IGRhdGEgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBvZiB0aGUgdXNlZCB3cml0ZXIgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHM7Ci0gICAgLyoqPCBUYWJsZSBvZiBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogICAgICAgICAgcFZpZGVvRW5jb2RlckludGVyZmFjZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICAvKio8IEZ1bmN0aW9ucyBvZiB0aGUgdXNlZCBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHM7Ci0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGE7Ci0KLSAgICAvKio8IFRhYmxlIG9mIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgZW5jb2RlcnMgbGlzdCAqLwotICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSogICAgIHBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTTRFTkNPREVSX2tBdWRpb19OQl07Ci0gICAgLyoqPCBUYWJsZSBvZiBpbnRlcm5hbC9leHRlcm5hbCBmbGFncyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyRmxhZ1tNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICAvKio8IEZ1bmN0aW9ucyBvZiB0aGUgdXNlZCBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHM7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbTTRFTkNPREVSX2tBdWRpb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YTsKLQotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICAgICAgICAgIG1fcFJlYWRlckdsb2JhbEl0VGFibGVbTTRSRUFERVJfa01lZGlhVHlwZV9OQl07Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0VGFibGVbTTRSRUFERVJfa01lZGlhVHlwZV9OQl07Ci0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICAgbV9wUmVhZGVyOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdDsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICBtX3VpTmJSZWdpc3RlcmVkUmVhZGVyczsKLQotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICAgICAgICAgIG1fcFZpZGVvRGVjb2RlcjsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgICAgICAgICBtX3BWaWRlb0RlY29kZXJJdFRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlX05CXTsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQl07Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgbV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjOwotCi0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgbV9wQXVkaW9EZWNvZGVyOwotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbTTRBRF9rVHlwZV9OQl07Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW000QURfa1R5cGVfTkJdOyAvKio8IHN0b3JlIGluZGljZXMgb2YgZXh0ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVycyAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbTTRBRF9rVHlwZV9OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgbV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhOwotCi0gICAgTTRNQ1NfTWVkaWFSZW5kZXJpbmcgICAgTWVkaWFSZW5kZXJpbmc7ICAgICAvKio8IEZCOiB0byBjcm9wLCByZXNpemUsIG9yIHJlbmRlciBibGFjayBib3JkZXJzKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICBtX2Fpcl9jb250ZXh0OwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJFeHRPTVhBdWREZWNvZGVyOyAgLyogRXh0ZXJuYWwgT01YIEF1ZGlvIGRlY29kZXIgKi8KLQotICAgIC8qKjwgRmxCIDIwMDkuMDMuMDQ6IEF1ZGlvIGVmZmVjdHMqLwotICAgIE00TUNTX0VmZmVjdFNldHRpbmdzICAgICpwRWZmZWN0czsgICAgICAgICAgICAgIC8qKjwgTGlzdCBvZiBlZmZlY3RzICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgbmJFZmZlY3RzOyAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWZmZWN0cyBpbiB0aGUgYWJvdmUgbGlzdCAqLwotICAgIE00T1NBX0ludDggICAgICAgICAgICAgIHBBY3RpdmVFZmZlY3ROdW1iZXI7ICAgIC8qKjwgRWZmZWN0IElEIHRvIGJlIGFwcGxpZWQsIGlmIC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGVmZmVjdCBoYXMgdG8gYmUgYXBwbGllZCBjdXJyZW50bHkqLwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9iSXNTdGlsbFBpY3R1cmU7ICAgICAgIC8qKjwgPVRSVUUgaWYgaW5wdXQgZmlsZSBpcyBhIHN0aWxsIHBpY3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEpQRUcsIFBORywgQk1QLCBHSUYpKi8KLSAgICBNNE1DU19Db250ZXh0ICAgICAgICAgICBtX3BTdGlsbFBpY3R1cmVDb250ZXh0OyAvKio8IENvbnRleHQgb2YgdGhlIHN0aWxsIHBpY3R1cmUgcGFydCBvZiBNQ1MqLwotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLSAgICBOU1dBVkNfTUNTX3QgICAgICAgICAgICAqbV9wSW5zdGFuY2U7Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgKkgyNjRNQ1NUZW1wQnVmZmVyOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIEgyNjRNQ1NUZW1wQnVmZmVyU2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBIMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJIMjY0VHJpbTsKLSAgICAvKiBGbGFnIHdoZW4gdG8gZ2V0ICBsYXN0ZGVjb2RlZGZyYW1lQ1RTICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkxhc3REZWNvZGVkRnJhbWVDVFM7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgZW5jb2RpbmdWaWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgZW5jb2RpbmdWaWRlb0xldmVsOwotCi19IE00TUNTX0ludGVybmFsQ29udGV4dDsKLQotCi0jZW5kaWYgLyogX19NNE1DU19JTlRFUk5BTFRZUEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjQ3MGU2Yi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidmlkZW9lZGl0b3JfbWNzCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl9tY3MKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRNQ1NfQVBJLmMgXAotICAgICAgTTRNQ1NfQXVkaW9FZmZlY3RzLmMgXAotICAgICAgTTRNQ1NfQ29kZWNzLmMgXAotICAgICAgTTRNQ1NfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jIFwKLSAgICAgIE00TUNTX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyAgICAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAotICAgIC1ETTRNQ1NfV0lUSF9GQVNUX09QRU4KLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDU2ZWYwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5NDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uIChWaWRlbyBDb21wcmVzc29yIFNlcnZpY2UpCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBUEkgYW5kIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBNQ1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbmNsdWRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiIC8qKjwgT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAvKio8IE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKiBQQ00gc2FtcGxlcyAqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUmVzYW1wbGVyLmgiCi0vKioKLSAqIERlY29kZXIgaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi0vKiBFbmNvZGVyIGludGVyZmFjZSovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi0vKiBFbmFibGUgZm9yIERFQlVHIGxvZ2dpbmcgKi8KLS8vI2RlZmluZSBNQ1NfRFVNUF9QQ01fVE9fRklMRQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0jaW5jbHVkZSA8c3RkaW8uaD4KLUZJTEUgKmZpbGVfYXVfcmVhZGVyID0gTlVMTDsKLUZJTEUgKmZpbGVfcGNtX2RlY29kZXIgPSBOVUxMOwotRklMRSAqZmlsZV9wY21fZW5jb2RlciA9IE5VTEw7Ci0jZW5kaWYKLQotLyogQ29yZSBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRNQ1NfQVBJLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbENvbmZpZy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsRnVuY3Rpb25zLmgiCi0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSNpbmNsdWRlICJNNE1DU19TdGlsbFBpY3R1cmUuaCIKLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLS8qIENvbW1vbiBoZWFkZXJzIChmb3IgYWFjKSAqLwotI2luY2x1ZGUgIk00X0NvbW1vbi5oIgotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotI2luY2x1ZGUgIk9NWF9WaWRlby5oIgotCi0vKiBWZXJzaW9uICovCi0jZGVmaW5lIE00TUNTX1ZFUlNJT05fTUFKT1IgMwotI2RlZmluZSBNNE1DU19WRVJTSU9OX01JTk9SIDQKLSNkZWZpbmUgTTRNQ1NfVkVSU0lPTl9SRVZJU0lPTiAgMwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RhdGljIGxvY2FsIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwU2V0KCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVXcml0ZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBFbmNvZGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFRyYW5zY29kZWRUaW1lICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICAgKnBDb250ZXh0ICk7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TUNTX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICk7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TUNTX2ludEdldEZyYW1lU2l6ZV9FVlJDKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApOwotc3RhdGljIE00VklERU9FRElUSU5HX0JpdHJhdGUgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBmcmVlYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggbW9kZSApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDbGVhblVwX1JlYWRlcnNEZWNvZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbmV3U2l6ZSApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMpOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zKiBFbmNQYXJhbXMpOwotc3RhdGljIE00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjNFbmMoTTRPU0FfSW50MzIgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9JbnQzMiBiaXRyYXRlKTsKLXN0YXRpYyBNNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JNcGVnNEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpOwotc3RhdGljIE00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjRFbmMoTTRPU0FfSW50MzIgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9JbnQzMiBiaXRyYXRlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRXh0ZXJuYWwgZnVuY3Rpb24gdXNlZCBvbmx5IGJ5IFZpZGVvRWRpdG9yIGFuZCB0aGF0IGRvZXMgbm90IGFwcGVhcgotICogaW4gdGhlIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSApOwotCi0vKiBBbGwgZXJyb3JzIGFyZSBmYXRhbCBpbiB0aGUgTUNTICovCi0jZGVmaW5lIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpIGlmKE00Tk9fRVJST1IhPWVycikgcmV0dXJuIGVycjsKLQotLyogQSBkZWZpbmUgdXNlZCB3aXRoIFNTUkMgMS4wNCBhbmQgYWJvdmUgdG8gYXZvaWQgdGFraW5nIGJsb2NrcyBzbWFsbGVyCi0gKiB0aGF0IHRoZSBtaW5pbWFsIGJsb2NrIHNpemUKLSAqLwotI2RlZmluZSBNNE1DU19TU1JDX01JTkJMT0NLU0laRSAgICAgICAgMTAwCi0KLXN0YXRpYyBNNE9TQV9VQ2hhciBUYWJfTUNTWzhdID0KLXsKLSAgICAxNywgNSwgMywgMywgMSwgMSwgMSwgMQotfTsKLQotTTRPU0FfRVJSIEgyNjRNQ1NfR2V0aW5zdGFuY2UoIE5TV0FWQ19NQ1NfdCAqKiBpbnN0YW5jZSApCi17Ci0gICAgTlNXQVZDX01DU190ICpwX2JzID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBwX2JzID0gKE5TV0FWQ19NQ1NfdCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTlNXQVZDX01DU190KSwgTTRNQ1MsCi0gICAgICAgIChNNE9TQV9DaGFyICopIk5TV0FWQ19NQ1NfdCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcF9icyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiSDI2NE1DU19HZXRpbnN0YW5jZTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcF9icy0+cHJldl9mcmFtZV9udW0gPSAwOwotICAgIHBfYnMtPmN1cl9mcmFtZV9udW0gPSAwOwotICAgIHBfYnMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPSAwOwotICAgIHBfYnMtPnByZXZfbmV3X2ZyYW1lX251bSA9IDA7Ci0gICAgcF9icy0+aXNfZG9uZSA9IDA7Ci0gICAgcF9icy0+aXNfZmlyc3QgPSAxOwotCi0gICAgcF9icy0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcF9icy0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0KLSAgICBwX2JzLT5tX3BFbmNvZGVyU1BTID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2VuY29kZXJTUFNTaXplID0gMDsKLQotICAgIHBfYnMtPm1fcEVuY29kZXJQUFMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2RlclBQU1NpemUgPSAwOwotCi0gICAgcF9icy0+bV9wRmluYWxEU0kgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fcEZpbmFsRFNJU2l6ZSA9IDA7Ci0KLSAgICBwX2JzLT5wX2NsaXBfc3BzID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2VuY29kZXJfU1BTX0NudCA9IDA7Ci0KLSAgICBwX2JzLT5wX2NsaXBfcHBzID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2VuY29kZXJfUFBTX0NudCA9IDA7Ci0KLSAgICBwX2JzLT5wX2VuY29kZXJfc3BzID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5wX2VuY29kZXJfcHBzID0gTTRPU0FfTlVMTDsKLQotICAgIHBfYnMtPmVuY29kZXJfcHBzLnNsaWNlX2dyb3VwX2lkID0gTTRPU0FfTlVMTDsKLQotICAgICppbnN0YW5jZSA9IChOU1dBVkNfTUNTX3QgKilwX2JzOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX1VJbnQzMiBIMjY0TUNTX2dldEJpdHMoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLCBNNE9TQV9VSW50MzIgbnVtQml0cyApCi17Ci0gICAgTTRPU0FfVUludDMyIHVpMzJSZXRCaXRzOwotICAgIE00T1NBX1VJbnQ4ICpwYnM7Ci0gICAgTTRPU0FfSW50MzIgYmNudDsKLSAgICBwX2JzLT5pOEJpdENudCAtPSBudW1CaXRzOwotICAgIGJjbnQgPSBwX2JzLT5pOEJpdENudDsKLQotICAgIC8qIE1lYXN1cmUgdGhlIHF1YW50aXR5IG9mIGJpdHMgdG8gYmUgcmVhZCBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICB1aTMyUmV0Qml0cyA9IHBfYnMtPnVpMzJUZW1wQnVmZiA+PiAoMzIgLSBudW1CaXRzKTsKLQotICAgIC8qIFJlYWQgbnVtQml0cyBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPDw9IG51bUJpdHM7Ci0gICAgcF9icy0+Yml0UG9zICs9IG51bUJpdHM7Ci0KLSAgICBpZiggYmNudCA+IDI0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAodWkzMlJldEJpdHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAvKiBhdCBsZWFzdCBvbmUgYnl0ZSBjYW4gYmUgYnVmZmVyZWQgaW4gdWkzMlRlbXBCdWZmICovCi0gICAgICAgIHBicyA9IChNNE9TQV9VSW50OCAqKXBfYnMtPnB1aThCZnJQdHI7Ci0KLSAgICAgICAgaWYoIGJjbnQgPCAoaW50KShwX2JzLT5udW1CaXRzSW5CdWZmZXIgLSBwX2JzLT5iaXRQb3MpICkKLSAgICAgICAgeyAvKiBub3QgZW5vdWdoIHJlbWFpbmluZyBiaXRzIGluIHVpMzJUZW1wQnVmZjogbmVlZCB0byBiZSBmaWxsZWQgKi8KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogT24gdGhlIGZseSBkZXRlY3Rpb24gb2YgRVBCIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICBpZiggKCAqKHBicykgPT0gMHgwMykKLSAgICAgICAgICAgICAgICAgICAgJiYgKCEoKCBwYnNbLTFdKQotICAgICAgICAgICAgICAgICAgICB8IChwYnNbLTJdKSkpKSAvLyhwX2JzLT51aTMyTGFzdFR3b0J5dGVzICYgMHgwMDAwRkZGRikgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEVQQiBieXRlIGZvdW5kOiBza2lwIGl0IGFuZCB1cGRhdGUgYml0UG9zIGFjY29yZGluZ2x5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBicykrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2JzLT5iaXRQb3MgKz0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmIHw9ICoocGJzKSsrIDw8ICgyNCAtIGJjbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmNudCArPSA4OwotICAgICAgICAgICAgfSB3aGlsZSAoIGJjbnQgPD0gMjQgKTsKLQotICAgICAgICAgICAgcF9icy0+cHVpOEJmclB0ciA9IChNNE9TQV9JbnQ4ICopcGJzOwotICAgICAgICAgICAgcF9icy0+aThCaXRDbnQgPSBiY250OwotICAgICAgICAgICAgcmV0dXJuICh1aTMyUmV0Qml0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggcF9icy0+Yml0UG9zIDw9IHBfYnMtPm51bUJpdHNJbkJ1ZmZlciApCi0gICAgewotICAgICAgICByZXR1cm4gKHVpMzJSZXRCaXRzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci19Ci0KLU00T1NBX1ZvaWQgSDI2NE1DU19mbHVzaEJpdHMoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLCBNNE9TQV9VSW50MzIgbnVtQml0cyApCi17Ci0gICAgTTRPU0FfVUludDggKnBiczsKLSAgICBNNE9TQV9VSW50MzIgYmNudDsKLSAgICBwX2JzLT5pOEJpdENudCAtPSBudW1CaXRzOwotICAgIGJjbnQgPSBwX2JzLT5pOEJpdENudDsKLQotICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA8PD0gbnVtQml0czsKLSAgICBwX2JzLT5iaXRQb3MgKz0gbnVtQml0czsKLQotICAgIGlmKCBiY250ID4gMjQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAvKiBhdCBsZWFzdCBvbmUgYnl0ZSBjYW4gYmUgYnVmZmVyZWQgaW4gdWkzMlRlbXBCdWZmICovCi0gICAgICAgIHBicyA9IChNNE9TQV9VSW50OCAqKXBfYnMtPnB1aThCZnJQdHI7Ci0KLSAgICAgICAgaWYoIGJjbnQgPCAocF9icy0+bnVtQml0c0luQnVmZmVyIC0gcF9icy0+Yml0UG9zKSApCi0gICAgICAgIHsgICAvKiBOb3QgZW5vdWdoIHJlbWFpbmluZyBiaXRzIGluIHVpMzJUZW1wQnVmZjogbmVlZCB0byBiZSBmaWxsZWQgKi8KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogIE9uIHRoZSBmbHkgZGV0ZWN0aW9uIG9mIEVQQiBieXRlICovCi0gICAgICAgICAgICAgICAgaWYoICggKihwYnMpID09IDB4MDMpICYmICghKCggcGJzWy0xXSkgfCAocGJzWy0yXSkpKSApCi0gICAgICAgICAgICAgICAgeyAvKiBKQzogRVBCIGJ5dGUgZm91bmQ6IHNraXAgaXQgYW5kIHVwZGF0ZSBiaXRQb3MgYWNjb3JkaW5nbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgKHBicykrKzsKLSAgICAgICAgICAgICAgICAgICAgcF9icy0+Yml0UG9zICs9IDg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfYnMtPnVpMzJUZW1wQnVmZiB8PSAqKHBicykrKyA8PCAoMjQgLSBiY250KTsKLSAgICAgICAgICAgICAgICBiY250ICs9IDg7Ci0gICAgICAgICAgICB9IHdoaWxlICggYmNudCA8PSAyNCApOwotCi0gICAgICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwYnM7Ci0gICAgICAgICAgICBwX2JzLT5pOEJpdENudCA9IGJjbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLU00T1NBX1VJbnQzMiBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icyApCi17Ci0gICAgTTRPU0FfVUludDMyIGNvZGUsIGwwID0gMCwgbDE7Ci0gICAgLyogUmVhZGluZyAzMiBCaXRzIGZyb20gbG9jYWwgY2FjaGUgYnVmZmVyIG9mIEJpdHN0cmVhbSBzdHJ1Y3R1cmUqLwotICAgIGNvZGUgPSBwX2JzLT51aTMyVGVtcEJ1ZmY7Ci0KLSAgICAvKiBDaGVja2luZyBpbiBmaXJzdCAzIGJpdHMqLwotICAgIGlmKCBjb2RlID4+IDI5ICkKLSAgICB7Ci0gICAgICAgIGwwID0gVGFiX01DU1soY29kZSA+PiAyOSldOwotICAgICAgICBjb2RlID0gY29kZSA+PiAoMzIgLSBsMCk7Ci0gICAgICAgIEgyNjRNQ1NfZmx1c2hCaXRzKHBfYnMsIGwwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY29kZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29kZSA8PD0gMzsKLQotICAgICAgICAgICAgICAgIGZvciAoIGwwID0gMzsgY29kZSA8IDB4ODAwMDAwMDA7IGNvZGUgPDw9IDEsIGwwKysgKTsKLQotICAgICAgICAgICAgICAgIGlmKCBsMCA8IDE2ICkgLyphbGwgdXNlZnVsIGJpdHMgYXJlIGluc2lkZSB0aGUgMzIgYml0cyByZWFkICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29kZSA+PiAoMzEgLSBsMCk7Ci0gICAgICAgICAgICAgICAgICAgIEgyNjRNQ1NfZmx1c2hCaXRzKHBfYnMsIDIgKiBsMCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7IC8qIFJlYWQgdGhlIHVzZWZ1bCBiaXRzIGluIDIgcGFydHMgKi8KLSAgICAgICAgICAgICAgICAgICAgbDEgPSAoIGwwIDw8IDEpIC0gMzE7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPj49IGwwOwotICAgICAgICAgICAgICAgICAgICBIMjY0TUNTX2ZsdXNoQml0cyhwX2JzLCAzMik7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSAoIGNvZGUgPDwgbDEpIHwgSDI2NE1DU19nZXRCaXRzKHBfYnMsIGwxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSDI2NE1DU19mbHVzaEJpdHMocF9icywgMzIpOwotCi0gICAgICAgICAgICAgICAgaWYoIEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBpZiBudW1iZXIgb2YgbGVhZGluZyAwJ3MgaXMgMzIsIHRoZSBvbmx5IGNvZGUgYWxsb3dlZCBpcyAxIGZvbGxvd2VkCi0gICAgICAgICAgICAgICAgICAgIGJ5IDMyIDAncyAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qcmVhZGluZyAzMiBtb3JlIGJpdHMgZnJvbSBiaXRzdHJlYW0gYnVmZmVyKi8KLSAgICAgICAgICAgICAgICAgICAgY29kZSA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAzMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNvZGUgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY29kZSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qaWYgbnVtYmVyIG9mIGxlYWRpbmcgMCdzIGlzID4zMiwgdGhlbiBzeW1ib2wgaXMgPjMyIGJpdHMsCi0gICAgICAgICAgICAgICAgd2hpY2ggaXMgYW4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICAvL3BfYnMtPnN0YXRlID0gX0JTX0VSUjsKLSAgICAgICAgICAgICAgICAvL3BfYnMtPmZsYWdzIHw9IF9CRl9TWU1fRVJSOwotICAgICAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggMSApIC8vKHBfYnMtPnN0YXRlID09IF9CU19PSykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChjb2RlIC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9Ci0gICAgfQotCi1NNE9TQV9JbnQzMiBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icyApCi17Ci0gICAgTTRPU0FfSW50MzIgY29kZU5vLCByZXQ7Ci0KLSAgICAvKiByZWFkIHRoZSB1bnNpZ25lZCBjb2RlIG51bWJlciAqLwotICAgIGNvZGVObyA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBtYXAgdG8gdGhlIHNpZ25lZCB2YWx1ZSwgaWYgdmFsdWUgaXMgb2RkIHRoZW4gaXQncyBwb3NpdGl2ZSwKLSAgICBpZiBldmVuIHRoZW4gaXQncyBuZWdhdGl2ZSwgZm9ybXVsYSBpcyAoLTEpXihrKzEpKkNFSUwoay8yKSAqLwotCi0gICAgcmV0ID0gKGNvZGVObyAmIDB4MDEpID8gKCggY29kZU5vICsgMSkgPj4gMSkgOiAoKCAtY29kZU5vKSA+PiAxKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLU00T1NBX1ZvaWQgRGVjQml0U3RyZWFtUmVzZXRfTUNTKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBieXRlc19yZWFkICkKLXsKLSAgICBwX2JzLT5iaXRQb3MgPSAwOwotCi0gICAgcF9icy0+bGFzdFRvdGFsQml0cyA9IDA7Ci0gICAgcF9icy0+bnVtQml0c0luQnVmZmVyID0gYnl0ZXNfcmVhZCA8PCAzOwotICAgIHBfYnMtPnJlYWRhYmxlQnl0ZXNJbkJ1ZmZlciA9IGJ5dGVzX3JlYWQ7Ci0gICAgLy9wX2JzLT5zdGF0ZSA9IE00Tk9fRVJST1I7Ly9fQlNfT0s7Ci0gICAgLy9wX2JzLT5mbGFncyA9IDA7Ci0KLSAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPSAwOwotICAgIHBfYnMtPmk4Qml0Q250ID0gMDsKLSAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwX2JzLT5CdWZmZXI7Ci0gICAgcF9icy0+dWkzMkxhc3RUd29CeXRlcyA9IDB4RkZGRkZGRkY7Ci0gICAgSDI2NE1DU19nZXRCaXRzKHBfYnMsIDApOwotfQotCi1NNE9TQV9FUlIgTlNXQVZDTUNTX2luaXRCaXRzdHJlYW0oIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgKmJTICkKLXsKLSAgICBiUy0+Yml0UG9zID0gMDsKLSAgICBiUy0+Ynl0ZUNudCA9IDA7Ci0gICAgYlMtPmN1cnJCdWZmID0gMDsKLSAgICBiUy0+cHJldkJ5dGUgPSAweGZmOwotICAgIGJTLT5wcmV2UHJldkJ5dGUgPSAweGZmOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfcHV0Qml0cyggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX1VJbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBsZW5ndGggKQotewotICAgIE00T1NBX1VJbnQzMiBtYXNrZWRWYWx1ZSA9IDAsIHRlbXAgPSAwOwotICAgIE00T1NBX1VJbnQ4IGJ5dGVPbmU7Ci0KLSAgICBNNE9TQV9VSW50MzIgbGVuMSA9IChsZW5ndGggPT0gMzIpID8gMzEgOiBsZW5ndGg7Ci0KLSAgICBpZiggIShsZW5ndGgpICkKLSAgICB7Ci0gICAgICAgIC8qIExlbmd0aCA9IDAsIHJldHVybiBPSyovCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIG1hc2tlZFZhbHVlID0gKE00T1NBX1VJbnQzMikodmFsdWUgJigoIDEgPDwgbGVuMSkgLSAxKSk7Ci0KLSAgICBpZiggMzIgPiAobGVuZ3RoICsgYlMtPmJpdFBvcykgKQotICAgIHsKLSAgICAgICAgYlMtPmJpdFBvcyArPSBsZW5ndGg7Ci0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSBtYXNrZWRWYWx1ZSA8PCAoMzIgLSBiUy0+Yml0UG9zKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdGVtcCA9ICgoIGJTLT5iaXRQb3MgKyBsZW5ndGgpIC0gMzIpOwotCi0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSAobWFza2VkVmFsdWUgPj4gKHRlbXApKTsKLQotICAgICAgICBieXRlT25lID0KLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDgpICYgMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoYlMtPmN1cnJCdWZmKSAmMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBiUy0+Y3VyckJ1ZmYgPSAwOwotCi0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSAoIG1hc2tlZFZhbHVlICYoKCAxIDw8IHRlbXApIC0gMSkpIDw8ICgzMiAtIHRlbXApOwotCi0gICAgICAgIGJTLT5iaXRQb3MgPSB0ZW1wOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTlNXQVZDTUNTX3B1dEJpdCggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX1VJbnQzMiB2YWx1ZSApCi17Ci0gICAgTTRPU0FfVUludDMyIG1hc2tlZFZhbHVlID0gMCwgdGVtcCA9IDA7Ci0gICAgTTRPU0FfVUludDggYnl0ZU9uZTsKLQotICAgIG1hc2tlZFZhbHVlID0gKHZhbHVlID8gMSA6IDApOwotCi0gICAgaWYoIDMyID4gKDEgKyBiUy0+Yml0UG9zKSApCi0gICAgewotICAgICAgICBiUy0+Yml0UG9zICs9IDE7Ci0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSBtYXNrZWRWYWx1ZSA8PCAoMzIgLSBiUy0+Yml0UG9zKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdGVtcCA9IDA7Ci0KLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IChtYXNrZWRWYWx1ZSk7Ci0KLSAgICAgICAgLyogd3JpdGluZyBpdCB0byBtZW1vcnkqLwotICAgICAgICBieXRlT25lID0KLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVPbmUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gMTYpICYgMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiA4KSAmIDB4ZmYpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVPbmUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKGJTLT5jdXJyQnVmZikgJjB4ZmYpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJTLT5jdXJyQnVmZiA9IDA7Ci0gICAgICAgIGJTLT5iaXRQb3MgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBOU1dBVkNNQ1NfcHV0UmJzcFRiaXRzKCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUyApCi17Ci0gICAgTTRPU0FfVUludDggdHJhaWxCaXRzID0gMDsKLSAgICBNNE9TQV9VSW50OCBieXRlQ250ID0gMDsKLQotICAgIHRyYWlsQml0cyA9IChNNE9TQV9VSW50OCkoYlMtPmJpdFBvcyAlIDgpOwotCi0gICAgLyogQWxyZWFkeSBpbiB0aGUgYnl0ZSBhbGlnbmVkIHBvc2l0aW9uLAotICAgIFJCU1AgdHJhaWxpbmcgYml0cyB3aWxsIGJlIDEwMDAgMDAwMCAqLwotICAgIGlmKCAwID09IHRyYWlsQml0cyApCi0gICAgewotICAgICAgICB0cmFpbEJpdHMgPSAoMSA8PCA3KTsKLSAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIHRyYWlsQml0cywgOCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRyYWlsQml0cyA9ICg4IC0gdHJhaWxCaXRzKTsKLSAgICAgICAgTlNXQVZDTUNTX3B1dEJpdChiUywgMSk7Ci0gICAgICAgIHRyYWlsQml0cy0tOwotCi0gICAgICAgIGlmKCB0cmFpbEJpdHMgKQotICAgICAgICB7IC8qIHB1dCB0cmFpbEJpdHMgdGltZXMgemVyb3MgKi8KLSAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKGJTLCAwLCB0cmFpbEJpdHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRm9yIHdyaXR0aW5nIHRoZSBjdXJyQnVmZiBpbiBzdHJlYW1CdWZmIDRieXRlIGFsaWdubWVudCBpcyByZXF1aXJlZCovCi0gICAgYnl0ZUNudCA9IChNNE9TQV9VSW50OCkoKCBiUy0+Yml0UG9zICsgNCkgLyA4KTsKLQotICAgIHN3aXRjaCggYnl0ZUNudCApCi0gICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IChNNE9TQV9VSW50OCkoYlMtPmN1cnJCdWZmID4+IDI0KTsKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gOCkgJiAweGZmKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qIEl0IHdpbGwgbm90IGNvbWUgaGVyZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gICAgYlMtPmJpdFBvcyA9MDsKLSAgICAvLyAgICBiUy0+Y3VyckJ1ZmYgPSAwOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfdUV4cFZMQyggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX0ludDMyIGNvZGVOdW0gKQotewotCi0gICAgTTRPU0FfSW50MzIgbG9vcCwgdGVtcDsKLSAgICBNNE9TQV9JbnQzMiBkYXRhID0gMDsKLSAgICBNNE9TQV9VSW50OCBjb2RlTGVuID0gMDsKLQotICAgIC8qIFRoZSBjb2RlTnVtIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybyBmb3IgdGhpcyB1ZSh2KSAqLwotICAgIGlmKCBjb2RlTnVtIDwgMCApCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBJbXBsZW1lbnRhdGlvbiBmb3IgRW5jb2Rpbmcgb2YgdGhlIFRhYmxlIDktMSBpbiB0aGUgU3RhbmRhcmQgKi8KLSAgICB0ZW1wID0gY29kZU51bSArIDE7Ci0KLSAgICBmb3IgKCBsb29wID0gMDsgdGVtcCAhPSAwOyBsb29wKysgKQotICAgIHsKLSAgICAgICAgdGVtcCAvPSAyOwotICAgIH0KLQotICAgIGNvZGVMZW4gPSAoKCBsb29wICogMikgLSAxKTsKLQotICAgIGRhdGEgPSBjb2RlTnVtICsgMTsKLQotICAgIE5TV0FWQ01DU19wdXRCaXRzKGJTLCBkYXRhLCBjb2RlTGVuKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTlNXQVZDTUNTX3NFeHBWTEMoIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgKmJTLCBNNE9TQV9JbnQzMiBjb2RlTnVtICkKLXsKLQotICAgIE00T1NBX0ludDMyIGxvb3AsIHRlbXAxLCB0ZW1wMjsKLSAgICBNNE9TQV9JbnQzMiBkYXRhID0gMDsKLSAgICBNNE9TQV9VSW50OCBjb2RlTGVuID0gMCwgaXNQb3NpdGl2ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGFic2NvZGVOdW07Ci0KLSAgICBpZiggY29kZU51bSA+IDAgKQotICAgIHsKLSAgICAgICAgaXNQb3NpdGl2ZSA9IDE7Ci0gICAgfQotCi0gICAgaWYoIGNvZGVOdW0gPiAwICkKLSAgICB7Ci0gICAgICAgIGFic2NvZGVOdW0gPSBjb2RlTnVtOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBhYnNjb2RlTnVtID0gLWNvZGVOdW07Ci0gICAgfQotCi0gICAgdGVtcDEgPSAoICggKCBhYnNjb2RlTnVtKSA8PCAxKSAtIGlzUG9zaXRpdmUpICsgMTsKLSAgICB0ZW1wMiA9IHRlbXAxOwotCi0gICAgZm9yICggbG9vcCA9IDA7IGxvb3AgPCAxNiAmJiB0ZW1wMiAhPSAwOyBsb29wKysgKQotICAgIHsKLSAgICAgICAgdGVtcDIgLz0gMjsKLSAgICB9Ci0KLSAgICBjb2RlTGVuID0gKCBsb29wICogMikgLSAxOwotCi0gICAgZGF0YSA9IHRlbXAxOwotCi0gICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIGRhdGEsIGNvZGVMZW4pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVSggICBNNE9TQV9Wb2lkICphaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKmluYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpbmJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpvdXRidWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpvdXRidWZfc2l6ZSApCi17Ci0gICAgQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIGJzOwotICAgIE5TV0FWQ19NQ1NfdCAqaW5zdGFuY2U7Ci0gICAgTTRPU0FfVUludDggbmFsdV9pbmZvOwotICAgIE00T1NBX0ludDMyIGZvcmJpZGRlbl9iaXQsIG5hbF9yZWZfaWRjLCBuYWxfdW5pdF90eXBlOwotICAgIE00T1NBX0ludDMyIGZpcnN0X21iX2luX3NsaWNlLCBzbGljZV90eXBlLCBwaWNfcGFyYW1ldGVyX3NldF9pZCwgZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OwotICAgIE00T1NBX0ludDMyIHRlbXBfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGJpdHN0b0RpYWNhcmQsIGJ5dGVzOwotICAgIE00T1NBX1VJbnQzMiBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgIE00T1NBX0ludDMyIG5ld19ieXRlcywgaW5pdF9iaXRfcG9zOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgY250OwotICAgIE00T1NBX1VJbnQzMiBvdXRidWZmcG9zID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbmFsX3NpemVfbG93MTYsIG5hbF9zaXplX2hpZ2gxNjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVfc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXAgPSAwOwotCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlciBkb2VzIG5vdCBwcm92aWRlIHRoZSBzaXplIGluIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBBVSwgYWRkIGl0Ci0gICAgTTRPU0FfSW50OCAqcFRtcEJ1ZmYxID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQ4ICpwVG1wQnVmZjIgPSBNNE9TQV9OVUxMOwotCi0gICAgcF9icyA9ICZiczsKLSAgICBpbnN0YW5jZSA9IChOU1dBVkNfTUNTX3QgKilhaW5zdGFuY2U7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgIkluICBIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVSB3aXRoIEZyYW1lU2l6ZSA9ICVkICBpbkJ1Zl9TaXplPSVkIiwKLSAgICAgICAgZnJhbWVfc2l6ZSwgaW5idWZfc2l6ZSk7Ci0KLSAgICAvLyBTdGFnZUZyaWdodCBjb2RlY3MgbWF5IGFkZCBhIHN0YXJ0IGNvZGUsIG1ha2Ugc3VyZSBpdCBpcyBub3QgcHJlc2VudAotCi0gICAgaWYoICFtZW1jbXAoKHZvaWQgKilpbmJ1ZmYsCi0gICAgICAgICJceDAwXHgwMFx4MDBceDAxIiwgNCkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzMoCi0gICAgICAgICAgICAiSDI2NE1DU19Qcm9jZXNzTkFMVSBFUlJPUiA6IE5BTFUgc3RhcnQgY29kZSBoYXMgbm90IGJlZW4gcmVtb3ZlZCAlZCAiCi0gICAgICAgICAgICAiMHglWCAweCVYIiwgaW5idWZfc2l6ZSwgKChNNE9TQV9VSW50MzIgKilpbmJ1ZmYpWzBdLAotICAgICAgICAgICAgKChNNE9TQV9VSW50MzIgKilpbmJ1ZmYpWzFdKTsKLQotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXIgZG9lcyBub3QgcHJvdmlkZSB0aGUgc2l6ZSBpbiB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgQVUsIGFkZCBpdAotICAgIHBUbXBCdWZmMSA9IChNNE9TQV9JbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGluYnVmX3NpemUgKyA0LCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikidG1wTkFMVSIpOwotICAgIG1lbWNweSgodm9pZCAqKShwVG1wQnVmZjEgKyA0KSwgKHZvaWQgKilpbmJ1ZmYsCi0gICAgICAgIGluYnVmX3NpemUpOwotICAgIHBUbXBCdWZmMVszXSA9ICggKE00T1NBX1VJbnQzMilpbmJ1Zl9zaXplKSAmIDB4MDAwMDAwRkY7Ci0gICAgcFRtcEJ1ZmYxWzJdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUgPj4gOCkgJiAweDAwMDAwMEZGOwotICAgIHBUbXBCdWZmMVsxXSA9ICggKE00T1NBX1VJbnQzMilpbmJ1Zl9zaXplID4+IDE2KSAmIDB4MDAwMDAwRkY7Ci0gICAgcFRtcEJ1ZmYxWzBdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUgPj4gMjQpICYgMHgwMDAwMDBGRjsKLSAgICBwVG1wQnVmZjIgPSAoTTRPU0FfSW50OCAqKWluYnVmZjsKLSAgICBpbmJ1ZmYgPSAoTTRPU0FfVUludDggKilwVG1wQnVmZjE7Ci0gICAgaW5idWZfc2l6ZSArPSA0OwotCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBhdmFpbGFibGUgc2l6ZSB3YXMgc2V0Ci0gICAgaWYoIGluYnVmX3NpemUgPj0gKm91dGJ1Zl9zaXplICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIiEhISBIMjY0TUNTX1Byb2Nlc3NOQUxVIEVSUk9SIDogc3BlY2lmaWVkIGF2YWlsYWJsZSBzaXplIGlzIGluY29ycmVjdCAlZCAiLAotICAgICAgICAgICAgKm91dGJ1Zl9zaXplKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLQotCi0gICAgd2hpbGUoIChNNE9TQV9JbnQzMilmcmFtZV9zaXplIDwgaW5idWZfc2l6ZSApCi0gICAgewotICAgICAgICBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikoaW5idWZmICsgZnJhbWVfc2l6ZSk7Ci0KLSAgICAgICAgLy8gVXNlIHVuc2lnbmVkIHZhbHVlIHRvIGZpeCBlcnJvcnMgZHVlIHRvIGJpdCBzaWduIGV4dGVuc2lvbiwgdGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMKLQotICAgICAgICBuYWxfc2l6ZV9oaWdoMTYgPSAoICggKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVswXSA8PCA4KQotICAgICAgICAgICAgKyAoKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVsxXTsKLSAgICAgICAgbmFsX3NpemVfbG93MTYgPSAoICggKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVsyXSA8PCA4KQotICAgICAgICAgICAgKyAoKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVszXTsKLQotICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbNF07Ci0KLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zXSA9IHBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgKyA1OwotCi0gICAgICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0gICAgICAgIHBfYnMtPmxhc3RUb3RhbEJpdHMgPSAwOwotICAgICAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPSAoIGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNSkgPDwgMzsKLSAgICAgICAgcF9icy0+cmVhZGFibGVCeXRlc0luQnVmZmVyID0gaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA1OwotCi0gICAgICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA9IDA7Ci0gICAgICAgIHBfYnMtPmk4Qml0Q250ID0gMDsKLSAgICAgICAgcF9icy0+cHVpOEJmclB0ciA9IChNNE9TQV9JbnQ4ICopcF9icy0+QnVmZmVyOwotICAgICAgICBwX2JzLT51aTMyTGFzdFR3b0J5dGVzID0gMHhGRkZGRkZGRjsKLQotICAgICAgICBIMjY0TUNTX2dldEJpdHMocF9icywgMCk7Ci0KLSAgICAgICAgbmFsX3NpemUgPSAoIG5hbF9zaXplX2hpZ2gxNiA8PCAxNikgKyBuYWxfc2l6ZV9sb3cxNjsKLQotICAgICAgICBmcmFtZV9zaXplICs9IG5hbF9zaXplICsgNDsKLQotICAgICAgICBmb3JiaWRkZW5fYml0ID0gKCBuYWx1X2luZm8gPj4gNykgJiAxOwotICAgICAgICBuYWxfcmVmX2lkYyA9ICggbmFsdV9pbmZvID4+IDUpICYgMzsKLSAgICAgICAgbmFsX3VuaXRfdHlwZSA9IChuYWx1X2luZm8pICYweDFmOwotCi0gICAgICAgIE5TV0FWQ01DU19pbml0Qml0c3RyZWFtKCZpbnN0YW5jZS0+ZW5jYnMpOwotCi0gICAgICAgIGluc3RhbmNlLT5lbmNicy5zdHJlYW1CdWZmZXIgPSBvdXRidWZmICsgb3V0YnVmZnBvcyArIDE7Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gOCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciA6IFBQUyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA3ICkKLSAgICAgICAgewotICAgICAgICAgICAgLypTUFMgUGFja2V0ICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgOiBTUFMiKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIChuYWxfdW5pdF90eXBlID09IDUpICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gMDsKLSAgICAgICAgICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIG5hbF91bml0X3R5cGUgPT0gMSkgfHwgKG5hbF91bml0X3R5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdF9tYl9pbl9zbGljZSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBzbGljZV90eXBlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIHBpY19wYXJhbWV0ZXJfc2V0X2lkID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgLyogRmlyc3QgTUIgaW4gc2xpY2UgKi8KLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIGZpcnN0X21iX2luX3NsaWNlKTsKLQotICAgICAgICAgICAgLyogU2xpY2UgVHlwZSAqLwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgc2xpY2VfdHlwZSk7Ci0KLSAgICAgICAgICAgIC8qIFBpY3R1cmUgUGFyYW1ldGVyIHNldCBJZCAqLwotICAgICAgICAgICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMucGljX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBwaWNfcGFyYW1ldGVyX3NldF9pZCk7Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywKLSAgICAgICAgICAgICAgICBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgaW5zdGFuY2UtPmZyYW1lX2NvdW50LAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0KLSAgICAgICAgICAgIC8vIEluIEJhc2VsaW5lIFByb2ZpbGU6IGZyYW1lX21ic19vbmx5X2ZsYWcgc2hvdWxkIGJlIE9OCi0gICAgICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA1ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5waWNfb3JkZXJfY250X3R5cGUgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0Ci0gICAgICAgICAgICAgICAgICAgICsgNCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbiBiYXNlbGluZSBwcm9maWxlIGZpZWxkX3BpY19mbGFnIHNob3VsZCBiZSBvZmYuCi0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfb3JkZXJfcHJlc2VudF9mbGFnICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICggaW5zdGFuY2UtPmVuY29kZXJfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKQotICAgICAgICAgICAgICAgICYmIChpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgICAgIC8vIGluIGJhc2VsaW5lIHByb2ZpbGUgZmllbGRfcGljX2ZsYWcgc2hvdWxkIGJlIG9mZi4KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfcHBzLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggaW5zdGFuY2UtPmNsaXBfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+UE9DX2xzYiwKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOwotCi0gICAgICAgICAgICAgICAgLy8gaW4gYmFzZWxpbmUgcHJvZmlsZSBmaWVsZF9waWNfZmxhZyBzaG91bGQgYmUgb2ZmLgotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMucGljX29yZGVyX3ByZXNlbnRfZmxhZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1Nfc0V4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGluc3RhbmNlLT5jbGlwX3Nwcy5waWNfb3JkZXJfY250X3R5cGUgPT0gMSkKLSAgICAgICAgICAgICAgICAmJiAoaW5zdGFuY2UtPmNsaXBfc3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3NFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgMCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbiBiYXNlbGluZSBwcm9maWxlIGZpZWxkX3BpY19mbGFnIHNob3VsZCBiZSBvZmYuCi0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfb3JkZXJfcHJlc2VudF9mbGFnICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19zRXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zICYgMHg3OwotCi0gICAgICAgICAgICBpZiggY250ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQgPSA4IC0gY250OwotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgY250KTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCBjbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgPj4gMzsKLQotICAgICAgICAgICAgd2hpbGUoIGNudCA8IChuYWxfc2l6ZSAtIDIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIDgpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIDgpOwotICAgICAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyA+PiAzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIDgpOwotCi0gICAgICAgICAgICBpZiggdGVtcCAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQgPSAwOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoICggdGVtcCAmIDB4MSkgPT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLQotICAgICAgICAgICAgICAgIGlmKCA4IC0gY250ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsICg4IC0gY250KSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dFJic3BUYml0cygmaW5zdGFuY2UtPmVuY2JzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFUgOiAxMyB0ZW1wID0gMCB0cmFpbGluZyBiaXRzID0gJWQiLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY2JzLmJpdFBvcyAlIDggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICg4IC0gaW5zdGFuY2UtPmVuY2JzLmJpdFBvcyAlIDgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlbXAgPSBpbnN0YW5jZS0+ZW5jYnMuYnl0ZUNudDsKLSAgICAgICAgICAgIHRlbXAgPSB0ZW1wICsgMTsKLQotICAgICAgICAgICAgb3V0YnVmZnBvcyA9IG91dGJ1ZmZwb3MgKyB0ZW1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKm91dGJ1Zl9zaXplID0gb3V0YnVmZnBvczsKLQotICAgIGluc3RhbmNlLT5QT0NfbHNiID0gaW5zdGFuY2UtPlBPQ19sc2IgKyAxOwotCi0gICAgaWYoIGluc3RhbmNlLT5QT0NfbHNiID09IGluc3RhbmNlLT5QT0NfbHNiX21vZCApCi0gICAgewotICAgICAgICBpbnN0YW5jZS0+UE9DX2xzYiA9IDA7Ci0gICAgfQotICAgIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9IGluc3RhbmNlLT5mcmFtZV9jb3VudCArIDE7Ci0KLSAgICBpZiggaW5zdGFuY2UtPmZyYW1lX2NvdW50ID09IGluc3RhbmNlLT5mcmFtZV9tb2RfY291bnQgKQotICAgIHsKLSAgICAgICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVyIGRvZXMgbm90IHByb3ZpZGUgdGhlIHNpemUgaW4gdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIEFVLCBhZGQgaXQKLQotICAgIGZyZWUocFRtcEJ1ZmYxKTsKLSAgICBwVG1wQnVmZjEgPSBNNE9TQV9OVUxMOwotICAgIGluYnVmZiA9IChNNE9TQV9VSW50OCAqKXBUbXBCdWZmMjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBEZWNTUFNNQ1MoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLAotICAgICAgICAgICAgICAgICAgICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICpzcHMgKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIE00T1NBX0ludDMyIHRlbXBfbWF4X2RwYl9zaXplOwotICAgIE00T1NBX0ludDMyIG5iX2lnbm9yZV9iaXRzOwotICAgIE00T1NBX0ludDMyIGVycm9yOwotICAgIE00T1NBX1VJbnQ4IHByb2ZpbGVfaWRjLCBsZXZlbF9pZGMsIHJlc2VydmVkX3plcm9fNGJpdHMsCi0gICAgICAgIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IGNvbnN0cmFpbnRfc2V0MF9mbGFnLCBjb25zdHJhaW50X3NldDFfZmxhZywKLSAgICAgICAgY29uc3RyYWludF9zZXQyX2ZsYWcsIGNvbnN0cmFpbnRfc2V0M19mbGFnOwotCi0gICAgc3BzLT5wcm9maWxlX2lkYyA9IChNNE9TQV9VSW50OClIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgc3BzLT5jb25zdHJhaW50X3NldDBfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBzcHMtPmNvbnN0cmFpbnRfc2V0MV9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHNwcy0+Y29uc3RyYWludF9zZXQyX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgc3BzLT5jb25zdHJhaW50X3NldDNfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICByZXNlcnZlZF96ZXJvXzRiaXRzID0gKE00T1NBX1VJbnQ4KUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA0KTsKLSAgICBzcHMtPmxldmVsX2lkYyA9IChNNE9TQV9VSW50OClIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgc3BzLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHNwcy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHNwcy0+TWF4RnJhbWVOdW0gPSAxIDw8IChzcHMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLSAgICBzcHMtPnBpY19vcmRlcl9jbnRfdHlwZSA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgaWYgKHNwcy0+cGljX29yZGVyX2NudF90eXBlID09IDApCi0gICAgewotICAgICAgICBzcHMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5NYXhQaWNPcmRlckNudExzYiA9Ci0gICAgICAgICAgICAxIDw8IChzcHMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOwotICAgIH0KLSAgICBlbHNlIGlmKCBzcHMtPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxICkKLSAgICB7Ci0gICAgICAgIHNwcy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgPQotICAgICAgICAgICAgKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgICAgIC8vIFRoaXMgZml4IHNob3VsZCBiZSBnZW5lcmljIHRvIHJlbW92ZSBjb2RlYyBkZXBlbmRlbmN5Ci0KLSAgICAgICAgc3BzLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljID0KLSAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgIHNwcy0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkID0KLSAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLQotICAgICAgICAvKm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwgMjU1Ki8KLQotICAgICAgICBzcHMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgLyogY29tcHV0ZSBkZWx0YVBPQyAqLwotICAgICAgICBzcHMtPmV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlID0gMDsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHNwcy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMgdG8gcmVtb3ZlIGNvZGVjIGRlcGVuZGVuY3kKLSAgICAgICAgICAgIHNwcy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV0gPQotICAgICAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgICAgIHNwcy0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgKz0KLSAgICAgICAgICAgICAgICBzcHMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogbnVtX3JlZl9mcmFtZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwxNiAqLwotICAgIHNwcy0+bnVtX3JlZl9mcmFtZXMgPSAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBzcHMtPmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZyA9Ci0gICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIHNwcy0+cGljX3dpZHRoX2luX21ic19taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgc3BzLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBpZiAoIXNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZykKLSAgICB7Ci0gICAgICAgIHNwcy0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyA9Ci0gICAgICAgICAgICAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNwcy0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyA9IDA7Ci0gICAgfQotCi0gICAgc3BzLT5QaWNXaWR0aEluTWJzID0gc3BzLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDE7Ci0gICAgc3BzLT5GcmFtZUhlaWdodEluTWJzID0gKCAyIC0gc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKSAqIFwKLSAgICAgICAgKHNwcy0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSk7Ci0jaWZkZWYgX0NBUF9GTU9fCi0KLSAgICBzcHMtPk51bVNsaWNlR3JvdXBNYXBVbml0cyA9Ci0gICAgICAgIHNwcy0+UGljV2lkdGhJbk1icyAqIChzcHMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEpOwotICAgIHNwcy0+TWF4UGljU2l6ZUluTWJzID0gc3BzLT5QaWNXaWR0aEluTWJzICogc3BzLT5GcmFtZUhlaWdodEluTWJzOwotCi0jZW5kaWYgLypfQ0FQX0ZNT18qLwotCi0gICAgc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgaWYoIHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9PSAwICkKLSAgICAgICAgc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID0gMTsKLQotICAgIHNwcy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIGlmKCBzcHMtPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgKQotICAgIHsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSAwOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gMDsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSAwOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBpZiAoc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpIHsKLSAgICAgICAgLyogbm8gZXJyb3IgbWVzc2FnZSBhcyBzdHJlYW0gY2FuIGJlIGRlY29kZWQgd2l0aG91dCBWVUkgbWVzc2FnZXMgKi8KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgRGVjUFBTTUNTKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywKLSAgICAgICAgICAgICAgICAgICAgICBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTICpwcHMgKQotewotICAgIE00T1NBX0ludDMyIGVycm9yOwotICAgIE00T1NBX1VJbnQzMiBwaWNfcGFyYW1ldGVyX3NldF9pZDsKLQotI2lmZGVmIF9DQVBfRk1PXwotICAgIE00T1NBX1VJbnQzMiBpLCBsZW5ndGgsIHY7Ci0jZW5kaWYKLQotICAgIE00T1NBX0ludDMyIG5iX2lnbm9yZV9iaXRzOwotCi0gICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHBwcy0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSAoTTRPU0FfVUludDgpcGljX3BhcmFtZXRlcl9zZXRfaWQ7Ci0KLSAgICBwcHMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgbXVzdCBiZSAwIG9yIDEgKi8KLSAgICBwcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBwcHMtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSNpZmRlZiBfQ0FQX0ZNT18KLSAgICAvKiBGTU8gc3R1ZmYgYmVnaW5zIGhlcmUgKi8KLQotICAgIHBwcy0+bWFwX2luaXRpYWxpemVkID0gRkFMU0U7Ci0KLSAgICBpZiggcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDAgKQotICAgIHsKLSAgICAgICAgcHBzLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICBzd2l0Y2goIHBwcy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBwcy0+cnVuX2xlbmd0aF9taW51czFbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBwcy0+dG9wX2xlZnRbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgICAgICBwcHMtPmJvdHRvbV9yaWdodFtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcHBzLT5zbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgICAgICAgICAgICAgcHBzLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICBwcHMtPnBpY19zaXplX2luX21hcF91bml0c19taW51czEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX2lkID0gKEgyNjRVSW50OAotICAgICAgICAgICAgICAgICAgICAqKU00SDI2NERlY19tYWxsb2MoKHBwcy0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMQotICAgICAgICAgICAgICAgICAgICArIDEpLCBNNEgyNjRfQ09SRUlELCAoTTRPU0FfQ2hhciAqKSJQUFMiKTsKLQotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBwcy0+c2xpY2VfZ3JvdXBfaWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRGVjUFBTTUNTOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBsZW5ndGggPSAwLCB2ID0gcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSArIDE7IHYgIT0gMDsKLSAgICAgICAgICAgICAgICAgICAgdiA+Pj0gMSwgbGVuZ3RoKysgKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBwcHMtPnBpY19zaXplX2luX21hcF91bml0c19taW51czE7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBwcy0+c2xpY2VfZ3JvdXBfaWRbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClnZXRCaXRzKHBfdmxjX2VuZ2luZS0+cF9icywgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX21hcF90eXBlID0gMDsKLSAgICB9Ci0gICAgLyogRW5kIG9mIEZNTyBzdHVmZiAqLwotCi0jZWxzZQotCi0jZW5kaWYgLyogX0NBUF9GTU9fICovCi0KLSAgICAvKiBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAsIDMxICovCi0KLSAgICBwcHMtPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAvKiBudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAsIDMxICovCi0gICAgcHBzLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgcHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICAvKiB3ZWlnaHRlZF9iaXByZWRfaWRjIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAsMiAqLwotICAgIHBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAyKTsKLQotICAgIC8qIHBpY19pbml0X3FwX21pbnVzMjYgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgLTI2LDI1ICovCi0gICAgcHBzLT5waWNfaW5pdF9xcF9taW51czI2ID0KLSAgICAgICAgKE00T1NBX0ludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBwaWNfaW5pdF9xc19taW51czI2IG11c3QgYmUgaW4gdGhlIHJhbmdlIC0yNiwyNSAqLwotICAgIHBwcy0+cGljX2luaXRfcXNfbWludXMyNiA9Ci0gICAgICAgIChNNE9TQV9JbnQxNilIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgLyogY2hyb21hX3FwX2luZGV4X29mZnNldCBtdXN0IGJlIGluIHRoZSByYW5nZSAtMTIsKzEyICovCi0gICAgcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID0KLSAgICAgICAgKE00T1NBX0ludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgcHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9Ci0gICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBwcHMtPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgSDI2NE1DU19Qcm9jZXNzU1BTX1BQUyggTlNXQVZDX01DU190ICppbnN0YW5jZSwgTTRPU0FfVUludDggKmluYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGluYnVmX3NpemUgKQotewotICAgIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLCBiczsKLSAgICBDb21CaXRTdHJlYW1NQ1NfdCAqcF9iczEsIGJzMTsKLQotICAgIE00T1NBX1VJbnQ4IG5hbHVfaW5mbyA9IDA7Ci0gICAgTTRPU0FfSW50MzIgZm9yYmlkZGVuX2JpdCwgbmFsX3JlZl9pZGMsIG5hbF91bml0X3R5cGU7Ci0gICAgTTRPU0FfSW50MzIgZmlyc3RfbWJfaW5fc2xpY2UsIHNsaWNlX3R5cGUsIHBpY19wYXJhbWV0ZXJfc2V0X2lkID0gMCwKLSAgICAgICAgZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OwotICAgIE00T1NBX0ludDMyIHRlbXBfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGJpdHN0b0RpYWNhcmQsIGJ5dGVzOwotICAgIE00T1NBX1VJbnQzMiBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgIE00T1NBX0ludDMyIG5ld19ieXRlcywgaW5pdF9iaXRfcG9zOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGNudCwgY250MTsKLSAgICBNNE9TQV9VSW50MzIgb3V0YnVmZnBvcyA9IDA7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplX2xvdzE2LCBuYWxfc2l6ZV9oaWdoMTY7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lX3NpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wID0gMDsKLSAgICBNNE9TQV9VSW50OCAqbENsaXBEU0k7Ci0gICAgTTRPU0FfVUludDggKmxDbGlwRFNJX1BQU19zdGFydDsKLSAgICBNNE9TQV9VSW50MzIgbENsaXBEU0lfUFBTX29mZnNldCA9IDA7Ci0KLSAgICBNNE9TQV9VSW50OCAqbFBQU19CdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBsUFBTX0J1ZmZlcl9TaXplID0gMDsKLQotICAgIE00T1NBX1VJbnQzMiBsU2l6ZSwgbFNpemUxOwotICAgIE00T1NBX1VJbnQzMiBsQWN0aXZlU1BTSURfQ2xpcDsKLSAgICBNNE9TQV9VSW50MzIgbENsaXBQUFNSZW1CaXRzID0gMDsKLQotICAgIE00T1NBX1VJbnQzMiBsRW5jb2Rlcl9TUFNJRCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGxFbmNvZGVyX1BQU0lEID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbEVuY29kZXJQUFNSZW1CaXRzID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbEZvdW5kID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZTsKLQotICAgIE00T1NBX1VJbnQ4IENsaXBfU1BTSURbMzJdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9Vc2VkU1BTSURbMzJdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9QUFNJRFsyNTZdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9TUFNJRF9pbl9QUFNbMjU2XSA9IHsgMCB9OwotICAgIE00T1NBX1VJbnQ4IENsaXBfVXNlZFBQU0lEWzI1Nl0gPSB7IDAgfTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIHBfYnMgPSAmYnM7Ci0gICAgcF9iczEgPSAmYnMxOwotCi0gICAgLyogRmluZCB0aGUgYWN0aXZlIFNQUyBJRCAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBpbnN0YW5jZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIkgyNjRNQ1NfUHJvY2Vzc1NQU19QUFM6IGluc3RhbmNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoID0KLSAgICAgICAgICAgIChpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mb1s0XSAmIDB4MDMpICsgMTsKLQotICAgIGluc3RhbmNlLT5tX2VuY29kZXJfU1BTX0NudCA9IGluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzVdICYgMHgxRjsKLQotICAgIGxDbGlwRFNJID0gaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8gKyA2OwotCi0gICAgbENsaXBEU0lfUFBTX29mZnNldCA9IDY7Ci0KLSAgICBmb3IgKCBjbnQgPSAwOyBjbnQgPCBpbnN0YW5jZS0+bV9lbmNvZGVyX1NQU19DbnQ7IGNudCsrICkKLSAgICB7Ci0gICAgICAgIGxTaXplID0gKCBsQ2xpcERTSVswXSA8PCA4KSArIGxDbGlwRFNJWzFdOwotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMjsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikobENsaXBEU0kgKyA0KTsKLSAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGxTaXplIC0gNCk7Ci0KLSAgICAgICAgQ2xpcF9TUFNJRFtjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgQ2xpcF9Vc2VkU1BTSURbQ2xpcF9TUFNJRFtjbnRdXSA9IDE7Ci0KLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIGxTaXplOwotICAgICAgICBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gbENsaXBEU0lfUFBTX29mZnNldCArIDIgKyBsU2l6ZTsKLSAgICB9Ci0KLSAgICBpbnN0YW5jZS0+bV9lbmNvZGVyX1BQU19DbnQgPSBsQ2xpcERTSVswXTsKLSAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMTsKLQotICAgIGxDbGlwRFNJX1BQU19zdGFydCA9IGxDbGlwRFNJOwotCi0gICAgZm9yICggY250ID0gMDsgY250IDwgaW5zdGFuY2UtPm1fZW5jb2Rlcl9QUFNfQ250OyBjbnQrKyApCi0gICAgewotICAgICAgICBsU2l6ZSA9ICggbENsaXBEU0lbMF0gPDwgOCkgKyBsQ2xpcERTSVsxXTsKLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIDI7Ci0KLSAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGxDbGlwRFNJICsgMSk7Ci0gICAgICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBsU2l6ZSAtIDEpOwotCi0gICAgICAgIENsaXBfUFBTSURbY250XSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgIENsaXBfVXNlZFBQU0lEW0NsaXBfUFBTSURbY250XV0gPSAxOwotICAgICAgICBDbGlwX1NQU0lEX2luX1BQU1tDbGlwX1BQU0lEW2NudF1dID0KLSAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIGxTaXplOwotICAgIH0KLQotICAgIC8qIEZpbmQgdGhlIGNsaXAgU1BTIElEIHVzZWQgYXQgdGhlIGN1dCBzdGFydCBmcmFtZSAqLwotICAgIHdoaWxlKCAoIChNNE9TQV9JbnQzMilmcmFtZV9zaXplKSA8IGluYnVmX3NpemUgKQotICAgIHsKLSAgICAgICAgbWFza19iaXRzID0gMHhGRkZGRkZGRjsKLSAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluYnVmZiArIGZyYW1lX3NpemUpOwotCi0gICAgICAgIHN3aXRjaCggaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGggKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgbmFsX3NpemUgPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbMF07Ci0gICAgICAgICAgICAgICAgbmFsdV9pbmZvID0gKHVuc2lnbmVkIGNoYXIpcF9icy0+QnVmZmVyWzFdOwotICAgICAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDI7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIG5hbF9zaXplX2hpZ2gxNiA9ICggcF9icy0+QnVmZmVyWzBdIDw8IDgpICsgcF9icy0+QnVmZmVyWzFdOwotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gbmFsX3NpemVfaGlnaDE2OwotICAgICAgICAgICAgICAgIG5hbHVfaW5mbyA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlclsyXTsKLSAgICAgICAgICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgKyAzOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZV9oaWdoMTYgPSAoIHBfYnMtPkJ1ZmZlclswXSA8PCA4KSArIHBfYnMtPkJ1ZmZlclsxXTsKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZV9sb3cxNiA9ICggcF9icy0+QnVmZmVyWzJdIDw8IDgpICsgcF9icy0+QnVmZmVyWzNdOwotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gKCBuYWxfc2l6ZV9oaWdoMTYgPDwgMTYpICsgbmFsX3NpemVfbG93MTY7Ci0gICAgICAgICAgICAgICAgbmFsdV9pbmZvID0gKHVuc2lnbmVkIGNoYXIpcF9icy0+QnVmZmVyWzRdOwotICAgICAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDU7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYWxfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiMCBzaXplIG5hbCB1bml0IGF0IGxpbmUgJWQiLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICBmcmFtZV9zaXplICs9IGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwX2JzLT5iaXRQb3MgPSAwOwotICAgICAgICBwX2JzLT5sYXN0VG90YWxCaXRzID0gMDsKLSAgICAgICAgcF9icy0+bnVtQml0c0luQnVmZmVyID0KLSAgICAgICAgICAgICggaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aCAtIDEpCi0gICAgICAgICAgICA8PCAzOwotICAgICAgICBwX2JzLT5yZWFkYWJsZUJ5dGVzSW5CdWZmZXIgPQotICAgICAgICAgICAgaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aCAtIDE7Ci0KLSAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmID0gMDsKLSAgICAgICAgcF9icy0+aThCaXRDbnQgPSAwOwotICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwX2JzLT5CdWZmZXI7Ci0gICAgICAgIHBfYnMtPnVpMzJMYXN0VHdvQnl0ZXMgPSAweEZGRkZGRkZGOwotCi0gICAgICAgIEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAwKTsKLQotICAgICAgICBmcmFtZV9zaXplICs9IG5hbF9zaXplICsgaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGg7Ci0KLSAgICAgICAgZm9yYmlkZGVuX2JpdCA9ICggbmFsdV9pbmZvID4+IDcpICYgMTsKLSAgICAgICAgbmFsX3JlZl9pZGMgPSAoIG5hbHVfaW5mbyA+PiA1KSAmIDM7Ci0gICAgICAgIG5hbF91bml0X3R5cGUgPSAobmFsdV9pbmZvKSAmMHgxZjsKLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc1NQU19QUFMoKSBFcnJvcjogUFBTIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU1BTIFBhY2tldCAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc1NQU19QUFMoKSBFcnJvcjogU1BTIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggbmFsX3VuaXRfdHlwZSA9PSAxKSB8fCAobmFsX3VuaXRfdHlwZSA9PSA1KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0X21iX2luX3NsaWNlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIHNsaWNlX3R5cGUgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBsQWN0aXZlU1BTSURfQ2xpcCA9IENsaXBfU1BTSURfaW5fUFBTW3BpY19wYXJhbWV0ZXJfc2V0X2lkXTsKLQotICAgIGluc3RhbmNlLT5maW5hbF9TUFNfSUQgPSBsQWN0aXZlU1BTSURfQ2xpcDsKLSAgICAvKiBEbyB3ZSBuZWVkIHRvIGFkZCBlbmNvZGVyIFBQUyB0byBjbGlwIFBQUyAqLwotCi0gICAgbENsaXBEU0kgPSBsQ2xpcERTSV9QUFNfc3RhcnQ7Ci0KLSAgICBmb3IgKCBjbnQgPSAwOyBjbnQgPCBpbnN0YW5jZS0+bV9lbmNvZGVyX1BQU19DbnQ7IGNudCsrICkKLSAgICB7Ci0gICAgICAgIGxTaXplID0gKCBsQ2xpcERTSVswXSA8PCA4KSArIGxDbGlwRFNJWzFdOwotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMjsKLQotICAgICAgICBpZiggbEFjdGl2ZVNQU0lEX0NsaXAgPT0gQ2xpcF9TUFNJRF9pbl9QUFNbQ2xpcF9QUFNJRFtjbnRdXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxQUFNfQnVmZmVyID0gbENsaXBEU0kgKyAxOwotICAgICAgICAgICAgbFBQU19CdWZmZXJfU2l6ZSA9IGxTaXplIC0gMTsKLQotICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGxDbGlwRFNJICsgMSk7Ci0gICAgICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFNpemUgLSAxKTsKLQotICAgICAgICAgICAgQ2xpcF9QUFNJRFtjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIENsaXBfVXNlZFBQU0lEW0NsaXBfU1BTSURbY250XV0gPSAxOwotICAgICAgICAgICAgQ2xpcF9TUFNJRF9pbl9QUFNbY250XSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBsQ2xpcFBQU1JlbUJpdHMgPSAoIGxTaXplIC0gMSkgPDwgMzsKLSAgICAgICAgICAgIGxDbGlwUFBTUmVtQml0cyAtPSBwX2JzLT5iaXRQb3M7Ci0KLSAgICAgICAgICAgIHRlbXAgPSBsQ2xpcERTSVtsU2l6ZSAtIDFdOwotCi0gICAgICAgICAgICBjbnQxID0gMDsKLQotICAgICAgICAgICAgd2hpbGUoICggdGVtcCAmIDB4MSkgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY250MSsrOwotICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbnQxKys7Ci0gICAgICAgICAgICBsQ2xpcFBQU1JlbUJpdHMgLT0gY250MTsKLQotICAgICAgICAgICAgbFNpemUxID0gaW5zdGFuY2UtPm1fZW5jb2RlclBQU1NpemUgLSAxOwotICAgICAgICAgICAgcF9iczEtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbnN0YW5jZS0+bV9wRW5jb2RlclBQUyArIDEpOwotICAgICAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMxLCBsU2l6ZTEpOwotCi0gICAgICAgICAgICBsRW5jb2Rlcl9QUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotICAgICAgICAgICAgbEVuY29kZXJfU1BTSUQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMxKTsKLQotICAgICAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzID0gKCBsU2l6ZTEpIDw8IDM7Ci0gICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgLT0gcF9iczEtPmJpdFBvczsKLQotICAgICAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTW2xTaXplMV07Ci0KLSAgICAgICAgICAgIGNudDEgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQxKys7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyAtPSBjbnQxOwotCi0gICAgICAgICAgICBpZiggbEVuY29kZXJQUFNSZW1CaXRzID09IGxDbGlwUFBTUmVtQml0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUoIGxFbmNvZGVyUFBTUmVtQml0cyA+IDggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAyID0gSDI2NE1DU19nZXRCaXRzKHBfYnMxLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzID0gbEVuY29kZXJQUFNSZW1CaXRzIC0gODsKLQotICAgICAgICAgICAgICAgICAgICBpZiggdGVtcDEgIT0gdGVtcDIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBsRW5jb2RlclBQU1JlbUJpdHMgPCA4ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBsRW5jb2RlclBQU1JlbUJpdHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCBsRW5jb2RlclBQU1JlbUJpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0ZW1wMSA9PSB0ZW1wMiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbEZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxGb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgfQotCi0gICAgLyogRm9ybSB0aGUgZmluYWwgU1BTIGFuZCBQUFMgZGF0YSAqLwotCi0gICAgaWYoIGxGb3VuZCA9PSAxICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIG5lZWQgdG8gYWRkIFBQUyAqLwotICAgICAgICBpbnN0YW5jZS0+ZmluYWxfUFBTX0lEID0gQ2xpcF9QUFNJRFtjbnRdOwotCi0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikiaW5zdGFuY2UtPm1fcEZpbmFsRFNJIik7Ci0KLSAgICAgICAgaWYoIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImluc3RhbmNlLT5tX3BGaW5hbERTSTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJU2l6ZSA9IGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilpbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAodm9pZCAqKWluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBBREQgUFBTICovCi0gICAgICAgIC8qIGZpbmQgdGhlIGZyZWUgUFBTIElEICovCi0KLSAgICAgICAgY250ID0gMDsKLQotICAgICAgICB3aGlsZSggQ2xpcF9Vc2VkUFBTSURbY250XSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNudCsrOwotICAgICAgICB9Ci0gICAgICAgIGluc3RhbmNlLT5maW5hbF9QUFNfSUQgPSBjbnQ7Ci0KLSAgICAgICAgc2l6ZSA9IGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgaW5zdGFuY2UtPm1fZW5jb2RlclBQU1NpemUKLSAgICAgICAgICAgICsgMTA7Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemUsIE00TUNTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiaW5zdGFuY2UtPm1fcEZpbmFsRFNJIik7Ci0KLSAgICAgICAgaWYoIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImluc3RhbmNlLT5tX3BGaW5hbERTSTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopaW5zdGFuY2UtPm1fcEZpbmFsRFNJLAotICAgICAgICAgICAgKHZvaWQgKilpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgIGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLQotICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2xDbGlwRFNJX1BQU19vZmZzZXRdOwotICAgICAgICB0ZW1wID0gdGVtcCArIDE7Ci0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVtsQ2xpcERTSV9QUFNfb2Zmc2V0XSA9IHRlbXA7Ci0KLSAgICAgICAgLy90ZW1wID0gaW5zdGFuY2UtPm1fcEVuY29kZXJQUFNbMF07Ci0gICAgICAgIGxTaXplMSA9IGluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplIC0gMTsKLSAgICAgICAgcF9iczEtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbnN0YW5jZS0+bV9wRW5jb2RlclBQUyArIDEpOwotICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9iczEsIGxTaXplMSk7Ci0KLSAgICAgICAgbEVuY29kZXJfUFBTSUQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMxKTsKLSAgICAgICAgbEVuY29kZXJfU1BTSUQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMxKTsKLQotICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSAoIGxTaXplMSkgPDwgMzsKLSAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzIC09IHBfYnMxLT5iaXRQb3M7Ci0KLSAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTW2xTaXplMV07Ci0KLSAgICAgICAgY250MSA9IDA7Ci0KLSAgICAgICAgd2hpbGUoICggdGVtcCAmIDB4MSkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0gICAgICAgIH0KLSAgICAgICAgY250MSsrOwotICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgLT0gY250MTsKLQotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lbaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyAyXSA9Ci0gICAgICAgICAgICBpbnN0YW5jZS0+bV9wRW5jb2RlclBQU1swXTsKLQotICAgICAgICBOU1dBVkNNQ1NfaW5pdEJpdHN0cmVhbSgmaW5zdGFuY2UtPmVuY2JzKTsKLSAgICAgICAgaW5zdGFuY2UtPmVuY2JzLnN0cmVhbUJ1ZmZlciA9Ci0gICAgICAgICAgICAmKGluc3RhbmNlLT5tX3BGaW5hbERTSVtpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSArIDNdKTsKLSAgICAgICAgbFBQU19CdWZmZXIgPSBpbnN0YW5jZS0+ZW5jYnMuc3RyZWFtQnVmZmVyOwotCi0gICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5maW5hbF9QUFNfSUQpOwotICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+ZmluYWxfU1BTX0lEKTsKLQotICAgICAgICB3aGlsZSggbEVuY29kZXJQUFNSZW1CaXRzID4gOCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIDgpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgOCk7Ci0gICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSBsRW5jb2RlclBQU1JlbUJpdHMgLSA4OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGxFbmNvZGVyUFBTUmVtQml0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCBsRW5jb2RlclBQU1JlbUJpdHMpOwotICAgICAgICB9Ci0gICAgICAgIE5TV0FWQ01DU19wdXRSYnNwVGJpdHMoJmluc3RhbmNlLT5lbmNicyk7Ci0KLSAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5lbmNicy5ieXRlQ250OwotICAgICAgICBsUFBTX0J1ZmZlcl9TaXplID0gdGVtcDsKLSAgICAgICAgdGVtcCA9IHRlbXAgKyAxOwotCi0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVtpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZV0gPQotICAgICAgICAgICAgKCB0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2luc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgMV0gPQotICAgICAgICAgICAgKHRlbXApICYweEZGOwotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lTaXplID0KLSAgICAgICAgICAgIGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgMiArIHRlbXA7Ci0gICAgfQotCi0gICAgLyogRGVjb2RlIHRoZSBjbGlwIFNQUyAqLwotCi0gICAgbENsaXBEU0kgPSBpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyArIDY7Ci0KLSAgICBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gNjsKLQotICAgIGZvciAoIGNudCA9IDA7IGNudCA8IGluc3RhbmNlLT5tX2VuY29kZXJfU1BTX0NudDsgY250KysgKQotICAgIHsKLSAgICAgICAgbFNpemUgPSAoIGxDbGlwRFNJWzBdIDw8IDgpICsgbENsaXBEU0lbMV07Ci0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAyOwotCi0gICAgICAgIGlmKCBDbGlwX1NQU0lEW2NudF0gPT0gaW5zdGFuY2UtPmZpbmFsX1NQU19JRCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShsQ2xpcERTSSArIDEpOwotICAgICAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGxTaXplIC0gMSk7Ci0KLSAgICAgICAgICAgIGVyciA9IERlY1NQU01DUyhwX2JzLCAmaW5zdGFuY2UtPmNsaXBfc3BzKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9DbGlwX1NQU0lEW2NudF0gPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgLy9DbGlwX1VzZWRTUFNJRFtDbGlwX1NQU0lEW2NudF1dID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIGxTaXplOwotICAgIH0KLQotICAgIC8qIERlY29kZSBlbmNvZGVyIFNQUyAqLwotICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbnN0YW5jZS0+bV9wRW5jb2RlclNQUyArIDEpOwotICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBpbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZSAtIDEpOwotICAgIGVyciA9IERlY1NQU01DUyhwX2JzLCAmaW5zdGFuY2UtPmVuY29kZXJfc3BzKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMubnVtX3JlZl9mcmFtZXMKLSAgICA+IGluc3RhbmNlLT5jbGlwX3Nwcy5udW1fcmVmX2ZyYW1lcyApCi0gICAgewotICAgICAgICByZXR1cm4gMTAwOyAvL25vdCBzdXBwb3J0ZWQKLSAgICB9Ci0KLSAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKilsUFBTX0J1ZmZlcjsKLSAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFBQU19CdWZmZXJfU2l6ZSk7Ci0gICAgRGVjUFBTTUNTKHBfYnMsICZpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMpOwotCi0gICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gMDsKLSAgICBpbnN0YW5jZS0+ZnJhbWVfbW9kX2NvdW50ID0KLSAgICAgICAgMSA8PCAoaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLQotICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICBpbnN0YW5jZS0+UE9DX2xzYl9tb2QgPQotICAgICAgICAxIDw8IChpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIEgyNjRNQ1NfUHJvY2Vzc05BTFUoIE5TV0FWQ19NQ1NfdCAqYWluc3RhbmNlLCBNNE9TQV9VSW50OCAqaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGluYnVmX3NpemUsIE00T1NBX1VJbnQ4ICpvdXRidWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpvdXRidWZfc2l6ZSApCi17Ci0gICAgQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIGJzOwotICAgIE5TV0FWQ19NQ1NfdCAqaW5zdGFuY2U7Ci0gICAgTTRPU0FfVUludDggbmFsdV9pbmZvOwotICAgIE00T1NBX0ludDMyIGZvcmJpZGRlbl9iaXQsIG5hbF9yZWZfaWRjLCBuYWxfdW5pdF90eXBlOwotICAgIE00T1NBX0ludDMyIGZpcnN0X21iX2luX3NsaWNlLCBzbGljZV90eXBlLCBwaWNfcGFyYW1ldGVyX3NldF9pZCwgZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OwotICAgIE00T1NBX0ludDMyIHRlbXBfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGJpdHN0b0RpYWNhcmQsIGJ5dGVzOwotICAgIE00T1NBX1VJbnQzMiBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgIE00T1NBX0ludDMyIG5ld19ieXRlcywgaW5pdF9iaXRfcG9zOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgY250OwotICAgIE00T1NBX1VJbnQzMiBvdXRidWZmcG9zID0gMDsKLSAgICAvLyNpZm5kZWYgREdSX0ZJWCAvLyArIG5ldwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZV9sb3cxNiwgbmFsX3NpemVfaGlnaDE2OwotICAgIC8vI2VuZGlmIC8vICsgZW5kIG5ldwotICAgIE00T1NBX1VJbnQzMiBmcmFtZV9zaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdGVtcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDggKmJ1ZmY7Ci0KLSAgICBwX2JzID0gJmJzOwotICAgIGluc3RhbmNlID0gKE5TV0FWQ19NQ1NfdCAqKWFpbnN0YW5jZTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gaW5zdGFuY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJIMjY0TUNTX1Byb2Nlc3NOQUxVOiBpbnN0YW5jZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggaW5zdGFuY2UtPmlzX2RvbmUgKQotICAgICAgICByZXR1cm4gZXJyOwotCi0gICAgaW5idWZmWzBdID0gMHgwMDsKLSAgICBpbmJ1ZmZbMV0gPSAweDAwOwotICAgIGluYnVmZlsyXSA9IDB4MDA7Ci0gICAgaW5idWZmWzNdID0gMHgwMTsKLQotCi0gICAgd2hpbGUoIChNNE9TQV9JbnQzMilmcmFtZV9zaXplIDwgaW5idWZfc2l6ZSApCi0gICAgewotICAgICAgICBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikoaW5idWZmICsgZnJhbWVfc2l6ZSk7Ci0KLQotICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbNF07Ci0KLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zXSA9IHBfYnMtPkJ1ZmZlclswXTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMV0gPSBwX2JzLT5CdWZmZXJbMV07Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDJdID0gcF9icy0+QnVmZmVyWzJdOwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAzXSA9IHBfYnMtPkJ1ZmZlclszXTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgNF0gPSBwX2JzLT5CdWZmZXJbNF07Ci0KLSAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyICsgNTsKLQotICAgICAgICBwX2JzLT5iaXRQb3MgPSAwOwotICAgICAgICBwX2JzLT5sYXN0VG90YWxCaXRzID0gMDsKLSAgICAgICAgcF9icy0+bnVtQml0c0luQnVmZmVyID0gKCBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIDUpIDw8IDM7Ci0gICAgICAgIHBfYnMtPnJlYWRhYmxlQnl0ZXNJbkJ1ZmZlciA9IGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNTsKLQotICAgICAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPSAwOwotICAgICAgICBwX2JzLT5pOEJpdENudCA9IDA7Ci0gICAgICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBfYnMtPkJ1ZmZlcjsKLSAgICAgICAgcF9icy0+dWkzMkxhc3RUd29CeXRlcyA9IDB4RkZGRkZGRkY7Ci0KLSAgICAgICAgSDI2NE1DU19nZXRCaXRzKHBfYnMsIDApOwotCi0KLQotICAgICAgICBuYWxfc2l6ZSA9IGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNDsKLSAgICAgICAgYnVmZiA9IGluYnVmZiArIGZyYW1lX3NpemUgKyA0OwotCi0gICAgICAgIHdoaWxlKCBuYWxfc2l6ZSA+IDQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggKCBidWZmWzBdID09IDB4MDApICYmIChidWZmWzFdID09IDB4MDApICYmIChidWZmWzJdID09IDB4MDApCi0gICAgICAgICAgICAgICAgJiYgKGJ1ZmZbM10gPT0gMHgwMSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZiA9IGJ1ZmYgKyAxOwotICAgICAgICAgICAgbmFsX3NpemUgPSBuYWxfc2l6ZSAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbmFsX3NpemUgPD0gNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbF9zaXplID0gMDsKLSAgICAgICAgfQotICAgICAgICBuYWxfc2l6ZSA9ICggaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA0KSAtIG5hbF9zaXplOwotCi0gICAgICAgIC8vICAgICAgTTRPU0FfVFJBQ0UxXzMoIkgyNjRNQ1NfUHJvY2Vzc05BTFUgZnJhbWUgIGlucHV0IGJ1ZmYgc2l6ZSA9ICVkICBjdXJyZW50IHBvc2l0aW9uCi0gICAgICAgIC8vPSAlZCAgIG5hbCBzaXplID0gJWQiLAotICAgICAgICAvLyAgaW5idWZfc2l6ZSwgZnJhbWVfc2l6ZSwgIG5hbF9zaXplICsgNCk7Ci0gICAgICAgIGZyYW1lX3NpemUgKz0gbmFsX3NpemUgKyA0OwotCi0KLQotICAgICAgICBmb3JiaWRkZW5fYml0ID0gKCBuYWx1X2luZm8gPj4gNykgJiAxOwotICAgICAgICBuYWxfcmVmX2lkYyA9ICggbmFsdV9pbmZvID4+IDUpICYgMzsKLSAgICAgICAgbmFsX3VuaXRfdHlwZSA9IChuYWx1X2luZm8pICYweDFmOwotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKklEUi9QUFMgUGFja2V0IC0gRG8gbm90aGluZyovCi0gICAgICAgICAgICBpbnN0YW5jZS0+aXNfZG9uZSA9IDE7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgTlNXQVZDTUNTX2luaXRCaXRzdHJlYW0oJmluc3RhbmNlLT5lbmNicyk7Ci0gICAgICAgIGluc3RhbmNlLT5lbmNicy5zdHJlYW1CdWZmZXIgPSBvdXRidWZmICsgb3V0YnVmZnBvcyArIDU7Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gOCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJIMjY0TUNTX1Byb2Nlc3NOQUxVKCkgRXJyb3I6IFBQUyIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDcgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlNQUyBQYWNrZXQgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJIMjY0TUNTX1Byb2Nlc3NOQUxVKCkgRXJyb3I6IFNQUyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKG5hbF91bml0X3R5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgICAgICAgICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIChuYWxfdW5pdF90eXBlID09IDEpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlyc3RfbWJfaW5fc2xpY2UgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgZmlyc3RfbWJfaW5fc2xpY2UpOwotCi0gICAgICAgICAgICBzbGljZV90eXBlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHNsaWNlX3R5cGUpOwotCi0gICAgICAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBwaWNfcGFyYW1ldGVyX3NldF9pZCk7Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywKLSAgICAgICAgICAgICAgICBpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgaW5zdGFuY2UtPmZyYW1lX2NvdW50LAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0KLSAgICAgICAgICAgIC8vIEluIEJhc2VsaW5lIFByb2ZpbGU6IGZyYW1lX21ic19vbmx5X2ZsYWcgc2hvdWxkIGJlIE9OCi0KLSAgICAgICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggaW5zdGFuY2UtPmNsaXBfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQKLSAgICAgICAgICAgICAgICAgICAgKyA0KTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+UE9DX2xzYiwKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBpbnN0YW5jZS0+Y2xpcF9zcHMucGljX29yZGVyX2NudF90eXBlID09IDEpCi0gICAgICAgICAgICAgICAgJiYgKGluc3RhbmNlLT5jbGlwX3Nwcy5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19zRXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmKCBjbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDggLSBjbnQ7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCBjbnQpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIGNudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyA+PiAzOwotCi0gICAgICAgICAgICB3aGlsZSggY250IDwgKG5hbF9zaXplIC0gMikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgOCk7Ci0gICAgICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zID4+IDM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0KLSAgICAgICAgICAgIGlmKCB0ZW1wICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotCi0gICAgICAgICAgICAgICAgaWYoIDggLSBjbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgKDggLSBjbnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0UmJzcFRiaXRzKCZpbnN0YW5jZS0+ZW5jYnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKDggLSBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5lbmNicy5ieXRlQ250OwotICAgICAgICAgICAgdGVtcCA9IHRlbXAgKyAxOwotCi0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gKE00T1NBX1VJbnQ4KSgoIHRlbXAgPj4gMjQpICYgMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAxXSA9IChNNE9TQV9VSW50OCkoKCB0ZW1wID4+IDE2KSAmIDB4RkYpOwotICAgICAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMl0gPSAoTTRPU0FfVUludDgpKCggdGVtcCA+PiA4KSAmIDB4RkYpOwotICAgICAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgM10gPSAoTTRPU0FfVUludDgpKCh0ZW1wKSAmMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmcG9zID0gb3V0YnVmZnBvcyArIHRlbXAgKyA0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyIC0gNTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSAmb3V0YnVmZltvdXRidWZmcG9zXSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnMtPkJ1ZmZlciwgbmFsX3NpemUgKyA0KTsKLQotICAgICAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zXSA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplID4+IDI0KSYgMHhGRik7Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDFdID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMTYpJiAweEZGKTs7Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDJdID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gOCkmIDB4RkYpOzsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgM10gPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSkmIDB4RkYpOzsKLQotICAgICAgICAgICAgb3V0YnVmZnBvcyA9IG91dGJ1ZmZwb3MgKyBuYWxfc2l6ZSArIDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqb3V0YnVmX3NpemUgPSBvdXRidWZmcG9zOwotCi0gICAgaW5zdGFuY2UtPlBPQ19sc2IgPSBpbnN0YW5jZS0+UE9DX2xzYiArIDE7Ci0KLSAgICBpZiggaW5zdGFuY2UtPlBPQ19sc2IgPT0gaW5zdGFuY2UtPlBPQ19sc2JfbW9kICkKLSAgICB7Ci0gICAgICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICB9Ci0gICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gaW5zdGFuY2UtPmZyYW1lX2NvdW50ICsgMTsKLQotICAgIGlmKCBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPT0gaW5zdGFuY2UtPmZyYW1lX21vZF9jb3VudCApCi0gICAgewotICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSICAgTTRNQ1NfY29udmV0RnJvbUJ5dGVTdHJlYW10b05BTFN0cmVhbSggIE00T1NBX1VJbnQ4ICppbmJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGluYnVmX3NpemUgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZXNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZSA9MDsKLSAgICBNNE9TQV9VSW50OCAqYnVmZjsKLQotCi0gICAgd2hpbGUoZnJhbWVzaXplIDwgaW5idWZfc2l6ZSkKLSAgICB7Ci0gICAgICAgICAgICBuYWxfc2l6ZSA9IGluYnVmX3NpemUgLSBmcmFtZXNpemUgLSA0OwotICAgICAgICAgICAgYnVmZiA9ICBpbmJ1ZmYgKyBmcmFtZXNpemUgKyA0OwotCi0gICAgICAgICAgICB3aGlsZShuYWxfc2l6ZSA+IDQpewotICAgICAgICAgICAgICAgIGlmKChidWZmWzBdID09IDB4MDApICYmCi0gICAgICAgICAgICAgICAgKGJ1ZmZbMV0gPT0gMHgwMCkgJiYKLSAgICAgICAgICAgICAgICAoYnVmZlsyXSA9PSAweDAwKSAmJgotICAgICAgICAgICAgICAgIChidWZmWzNdID09IDB4MDEpKXsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1ZmYgPSBidWZmICsgMTsKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZSA9IG5hbF9zaXplIC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihuYWxfc2l6ZSA8PSA0KXsKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYWxfc2l6ZSA9IChpbmJ1Zl9zaXplIC0gZnJhbWVzaXplIC0gNCkgLSBuYWxfc2l6ZTsKLQotICAgICAgICBpbmJ1ZmZbZnJhbWVzaXplICsgMF0gID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMjQpJiAweEZGKTsKLSAgICAgICAgaW5idWZmW2ZyYW1lc2l6ZSArIDFdICA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplID4+IDE2KSYgMHhGRik7Ci0gICAgICAgIGluYnVmZltmcmFtZXNpemUgKyAyXSAgPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiA4KSYgMHhGRik7Ci0gICAgICAgIGluYnVmZltmcmFtZXNpemUgKyAzXSAgPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSApJiAweEZGKTsKLSAgICAgICAgZnJhbWVzaXplICs9IG5hbF9zaXplICsgNDsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1NfY29udmV0RnJvbUJ5dGVTdHJlYW10b05BTFN0cmVhbSBmcmFtZXNpemUgPSAleCBuYWxzaXplID0gJXgiLAotICAgICAgICAgICAgZnJhbWVzaXplLCBuYWxfc2l6ZSkKLSAgICB9Ci0KLSAgICByZXR1cm4gIGVycjsKLX0KLQotCi1NNE9TQV9FUlIgSDI2NE1DU19GcmVlaW5zdGFuY2UoIE5TV0FWQ19NQ1NfdCAqaW5zdGFuY2UgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBpbnN0YW5jZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIkgyNjRNQ1NfRnJlZWluc3RhbmNlOiBpbnN0YW5jZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMuc2xpY2VfZ3JvdXBfaWQgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMuc2xpY2VfZ3JvdXBfaWQpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlLT5wX2VuY29kZXJfc3BzICkKLSAgICB7Ci0gICAgICAgIGZyZWUoaW5zdGFuY2UtPnBfZW5jb2Rlcl9zcHMpOwotICAgICAgICBpbnN0YW5jZS0+cF9lbmNvZGVyX3NwcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UtPnBfZW5jb2Rlcl9wcHMgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+cF9lbmNvZGVyX3Bwcyk7Ci0gICAgICAgIGluc3RhbmNlLT5wX2VuY29kZXJfcHBzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBpbnN0YW5jZS0+bV9wRmluYWxEU0kgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+bV9wRmluYWxEU0kpOwotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0kgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlICkKLSAgICB7Ci0gICAgICAgIGZyZWUoaW5zdGFuY2UpOwotICAgICAgICBpbnN0YW5jZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICAgR2V0IHRoZSBNQ1MgdmVyc2lvbi4KLSAqIEBub3RlIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0VmVyc2lvbiggTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uSW5mbyApCi17Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2dldFZlcnNpb24gY2FsbGVkIHdpdGggcFZlcnNpb25JbmZvPTB4JXgiLAotICAgICAgICBwVmVyc2lvbkluZm8pOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBWZXJzaW9uSW5mbyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2dldFZlcnNpb246IHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgPSBNNE1DU19WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciA9IE00TUNTX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uID0gTTRNQ1NfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfZ2V0VmVyc2lvbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgTUNTIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIE1DUyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNE1DU19pbml0KCBNNE1DU19Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVQdHJGY3QgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00TUNTX2luaXQgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcEZpbGVSZWFkUHRyRmN0PTB4JXgsIHBGaWxlV3JpdGVQdHJGY3Q9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwRmlsZVJlYWRQdHJGY3QsIHBGaWxlV3JpdGVQdHJGY3QpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfaW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19pbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfaW5pdDogcEZpbGVXcml0ZVB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIHRoZSBNQ1MgY29udGV4dCBhbmQgcmV0dXJuIGl0IHRvIHRoZSB1c2VyICovCi0gICAgcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1DU19JbnRlcm5hbENvbnRleHQpLAotICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikiTTRNQ1NfSW50ZXJuYWxDb250ZXh0Iik7Ci0gICAgKnBDb250ZXh0ID0gcEM7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19pbml0KCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBNNE1DU19JbnRlcm5hbENvbnRleHQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0IHRoZSBjb250ZXh0LiBBbGwgcG9pbnRlcnMgbXVzdCBiZSBpbml0aWFsaXplZCB0byBNNE9TQV9OVUxMCi0gICAgKiBiZWNhdXNlIENsZWFuVXAoKSBjYW4gYmUgY2FsbGVkIGp1c3QgYWZ0ZXIgSW5pdCgpLiAqLwotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9DUkVBVEVEOwotICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcEMtPnBPc2FGaWxlV3JpdFB0ciA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0gICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPm5vYXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bm92aWRlbyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT51aVByb2dyZXNzID0gMDsKLQotICAgIC8qKgotICAgICogUmVhZGVyIHN0dWZmICovCi0gICAgcEMtPnBJbnB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5JbnB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOwotICAgIHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+cFJlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0ID0gMDsKLSAgICAvKiBGaXJzdCB0ZW1wb3JhcnkgdmlkZW8gQVUgdG8gaGF2ZSBtb3JlIHByZWNpc2UgZW5kIHZpZGVvIGN1dCovCi0gICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9IDA7Ci0gICAgLyogU2Vjb25kIHRlbXBvcmFyeSB2aWRlbyBBVSB0byBoYXZlIG1vcmUgcHJlY2lzZSBlbmQgdmlkZW8gY3V0Ki8KLSAgICBwQy0+UmVhZGVyVmlkZW9BVTIubV9zdHJ1Y3RTaXplID0gMDsKLSAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9zdHJ1Y3RTaXplID0gMDsKLSAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9zdHJ1Y3RTaXplID0gMDsKLSAgICBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPSAwOwotICAgIHBDLT5tX3BEYXRhQWRkcmVzczEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgPSBNNE9TQV9OVUxMOwotICAgIC8qIEZpcnN0IHRlbXBvcmFyeSB2aWRlbyBBVSBkYXRhIHRvIGhhdmUgbW9yZSBwcmVjaXNlIGVuZCB2aWRlbyBjdXQqLwotICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgLyogU2Vjb25kIHRlbXBvcmFyeSB2aWRlbyBBVSBkYXRhIHRvIGhhdmUgbW9yZSBwcmVjaXNlIGVuZCB2aWRlbyBjdXQqLwotICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBwQy0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gMC4wOwotICAgIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IgPSAwOwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gMC4wOwotICAgIHBDLT5kQ3RzSW5jcmVtZW50ID0gMC4wOwotICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBWaWRlbyBlbmNvZGVyIHN0dWZmICovCi0gICAgcEMtPnBWaUVuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tOb0VuY29kZXI7Ci0KLSAgICAvKioKLSAgICAqIEF1ZGlvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBwQy0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkF1ZGlvRGVjQnVmZmVySW4ubV9idWZmZXJTaXplID0gMDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9IDA7Ci0gICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBTc3JjIHN0dWZmICovCi0gICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5pU3NyY05iU2FtcGxJbiA9IDA7Ci0gICAgcEMtPmlTc3JjTmJTYW1wbE91dCA9IDA7Ci0gICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIC8qKgotICAgICogQXVkaW8gZW5jb2RlciAqLwotICAgIHBDLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jRFNJLmluZm9TaXplID0gMDsKLSAgICBwQy0+cEF1ZGlvRW5jRFNJLnBJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5ID0gMDsKLQotICAgIC8qKgotICAgICogV3JpdGVyIHN0dWZmICovCi0gICAgcEMtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnVpVmlkZW9BVUNvdW50ID0gMDsKLSAgICBwQy0+dWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPnVpVmlkZW9NYXhDaHVuY2tTaXplID0gMDsKLSAgICBwQy0+dWlBdWRpb0FVQ291bnQgPSAwOwotICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gMDsKLQotICAgIHBDLT51aUF1ZGlvQ3RzID0gMDsKLSAgICBwQy0+Yl9pc1Jhd1dyaXRlciA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBFbmNvZGluZyBjb25maWcgKi8KLSAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rTlVMTDsgLyoqPCBObyBmb3JtYXQgc2V0IHlldCAqLwotICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gMDsgICAgICAgICAgICAgICAgICAgICAvKio8IE5vIHNpemUgc2V0IHlldCAqLwotICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKio8IE5vIHNpemUgc2V0IHlldCAqLwotICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gMDsgICAgICAgICAgICAvKio8IE5vIGZyYW1lcmF0ZSBzZXQgeWV0ICovCi0KLSAgICBwQy0+dWlCZWdpbkN1dFRpbWUgPSAwOyAgICAgICAgICAgICAgICAgICAgLyoqPCBObyBiZWdpbiBjdXQgKi8KLSAgICBwQy0+dWlFbmRDdXRUaW1lID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBObyBlbmQgY3V0ICovCi0gICAgcEMtPnVpTWF4RmlsZVNpemUgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm8gbGltaXQgKi8KLSAgICBwQy0+dWlBdWRpb0JpdHJhdGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZTsgLyoqPCBObyBiaXRyYXRlIHNldCB5ZXQgKi8KLSAgICBwQy0+dWlWaWRlb0JpdHJhdGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZTsgLyoqPCBObyBiaXRyYXRlIHNldCB5ZXQgKi8KLQotICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa1ZpZGVvVW5rbm93bjsKLSAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0KLSAgICBwQy0+b3V0cHV0VmlkZW9UaW1lc2NhbGUgPSAwOwotCi0gICAgLypGQiAyMDA4LzEwLzIwOiBhZGQgbWVkaWEgcmVuZGVyaW5nIHBhcmFtZXRlciBhbmQgQUlSIGNvbnRleHQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotICAgIHBDLT5NZWRpYVJlbmRlcmluZyA9IE00TUNTX2tSZXNpemluZzsKLSAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgLyoqLwotCi0gICAgLyoqCi0gICAgKiBGbEIgMjAwOS4wMy4wNDogYWRkIGF1ZGlvIEVmZmVjdHMqLwotICAgIHBDLT5wRWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm5iRWZmZWN0cyA9IDA7Ci0gICAgcEMtPnBBY3RpdmVFZmZlY3ROdW1iZXIgPSAtMTsKLSAgICAvKiovCi0KLSAgICAvKgotICAgICogUmVzZXQgcG9pbnRlcnMgZm9yIG1lZGlhIGFuZCBjb2RlY3MgaW50ZXJmYWNlcyAqLwotICAgIGVyciA9IE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKHBDKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qCi0gICAgKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhwQyk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSAgICAvKioKLSAgICAqIEluaXRpYWxpemUgdGhlIFN0aWxsIHBpY3R1cmUgcGFydCBvZiBNQ1MqLwotCi0gICAgZXJyID0gTTRNQ1Nfc3RpbGxQaWNJbml0KHBDLCBwRmlsZVJlYWRQdHJGY3QsIHBGaWxlV3JpdGVQdHJGY3QpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgcEMtPm1fYklzU3RpbGxQaWN0dXJlID0gTTRPU0FfRkFMU0U7Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICBwQy0+bV9wSW5zdGFuY2UgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyU2l6ZSA9IDA7Ci0gICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemUgPSAwOwotICAgIHBDLT5iSDI2NFRyaW0gPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEZsYWcgdG8gZ2V0IHRoZSBsYXN0IGRlY29kZWQgZnJhbWUgY3RzICovCi0gICAgcEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBpZiggcEMtPm1fcEluc3RhbmNlID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZXJyID0gSDI2NE1DU19HZXRpbnN0YW5jZSgmcEMtPm1fcEluc3RhbmNlKTsKLSAgICB9Ci0gICAgcEMtPmJFeHRPTVhBdWREZWNvZGVyID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2luaXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfb3BlbihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgaXMgbm90IGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwRmlsZUluICAgICAgICAgICAgIChJTikgSW5wdXQgZmlsZSB0byB0cmFuc2NvZGUgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIENvbnRhaW5lciB0eXBlICguM2dwLC5hbXIsbXAzIC4uLikgb2YgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBGaWxlT3V0ICAgICAgICAgICAgKElOKSBPdXRwdXQgZmlsZSB0byBjcmVhdGUgIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVJMLCBwaXBlLi4uKSBkZXBlbmRzIG9uIHRoZSBPU0FMIGltcGxlbWVudGF0aW9uKS4KLSAqIEBwYXJhbSAgIHBUZW1wRmlsZSAgICAgICAgICAgKElOKSBUZW1wb3JhcnkgZmlsZSBmb3IgdGhlIGNvbnN0YW50IG1lbW9yeSB3cml0ZXIgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIG1ldGFkYXRhICgibW9vdi5iaW4iKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiAgIFRoZSBpbnB1dCBmaWxlIGhhcyBub3QgYmVlbiBmb3VuZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTogICBUaGUgaW5wdXQgZmlsZSBpcyBub3QgYSB2YWxpZCBmaWxlLCBvciBpcyBjb3JydXB0ZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU06ICBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBubwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBhdWRpbyBvciB2aWRlbyBzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX29wZW4oIE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQgKnBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBJbnB1dEZpbGVUeXBlLCBNNE9TQV9Wb2lkICpwRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNFJFQURFUl9NZWRpYUZhbWlseSBtZWRpYUZhbWlseTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcjsKLQotICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAiTTRNQ1Nfb3BlbiBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwRmlsZUluPTB4JXgsIHBGaWxlT3V0PTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcEZpbGVJbiwgcEZpbGVPdXQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfb3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZUluKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfb3BlbjogcEZpbGVJbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggKCBJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcpCi0gICAgICAgIHx8IChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QTkcpCi0gICAgICAgIHx8IChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9HSUYpCi0gICAgICAgIHx8IChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9CTVApICkKLSAgICB7Ci0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0gICAgICAgIC8qKgotICAgICAgICAqIEluZGljYXRlIHRoYXQgd2UgbXVzdCB1c2UgdGhlIHN0aWxsIHBpY3R1cmUgZnVuY3Rpb25zKi8KLQotICAgICAgICBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9ucyovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY09wZW4ocEMsIHBGaWxlSW4sIElucHV0RmlsZVR5cGUsIHBGaWxlT3V0KTsKLQotI2Vsc2UKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19vcGVuOiBTdGlsbCBwaWN0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgTUNTIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOwotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0NSRUFURUQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ29weSBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzIGludG8gb3VyIGNvbnRleHQgKi8KLSAgICBwQy0+cElucHV0RmlsZSA9IHBGaWxlSW47Ci0gICAgcEMtPklucHV0RmlsZVR5cGUgPSBJbnB1dEZpbGVUeXBlOwotICAgIHBDLT5wT3V0cHV0RmlsZSA9IHBGaWxlT3V0OwotICAgIHBDLT5wVGVtcG9yYXJ5RmlsZSA9IHBUZW1wRmlsZTsKLSAgICBwQy0+dWlQcm9ncmVzcyA9IDA7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogT3BlbiBpbnB1dCBmaWxlIHdpdGggdGhlIHJlYWRlciAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRSZWFkZXIocENvbnRleHQsIHBDLT5JbnB1dEZpbGVUeXBlKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgcmVhZGVyIHJlbGF0ZWQgdmFyaWFibGVzICovCi0gICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBJbml0aWFsaXplcyB0aGUgcmVhZGVyIHNoZWxsIGFuZCBvcGVuIHRoZSBkYXRhIGZpbGUgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDLT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBMaW5rIHRoZSByZWFkZXIgaW50ZXJmYWNlIHRvIHRoZSByZWFkZXIgY29udGV4dCAqLwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcmVhZGVyQ29udGV4dCA9IHBDLT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSByZWFkZXIgc2hlbGwgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zICovCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+cE9zYUZpbGVSZWFkUHRyKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZmRlZiBNNE1DU19XSVRIX0ZBU1RfT1BFTgotCi0gICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfQm9vbCB0cnVlVmFsdWUgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qIEZvciBmaXJzdCBjYWxsIHVzZSBmYXN0IG9wZW4gbW9kZSAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUsICZ0cnVlVmFsdWUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggKCAoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkgPT0gZXJyKQotICAgICAgICAgICAgICAgIHx8ICgoIChNNE9TQV9VSW50MzIpTTRFUlJfUEFSQU1FVEVSKSA9PSBlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBOb3QgZmF0YWwsIHNvbWUgcmVhZGVycyBtYXkgbm90IHN1cHBvcnQgZmFzdCBvcGVuIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBwQy0+YkZpbGVPcGVuZWRJbkZhc3RNb2RlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9Cb29sIGZhbHNlVmFsdWUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKiBGb3Igc2Vjb25kIGNhbGwgdXNlIG5vcm1hbCBvcGVuIG1vZGUgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlLCAmZmFsc2VWYWx1ZSk7Ci0gICAgfQotCi0jZW5kaWYgLyogTTRNQ1NfV0lUSF9GQVNUX09QRU4gKi8KLQotICAgIC8qKgotICAgICogT3BlbiB0aGUgaW5wdXQgZmlsZSAqLwotCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0T3BlbihwQy0+cFJlYWRlckNvbnRleHQsIHBDLT5wSW5wdXRGaWxlKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlEdW1teSwgdWlDb3JlSWQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIElmIHRoZSBlcnJvciBpcyBmcm9tIHRoZSBjb3JlIHJlYWRlciwgd2UgY2hhbmdlIGl0IHRvIGEgcHVibGljIFZYUyBlcnJvciAqLwotICAgICAgICBNNE9TQV9FUlJfU1BMSVQoZXJyLCB1aUR1bW15LCB1aUNvcmVJZCwgdWlEdW1teSk7Ci0KLSAgICAgICAgaWYoIE00TVA0X1JFQURFUiA9PSB1aUNvcmVJZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBzdHJlYW1zIGZyb20gdGhlIGlucHV0IGZpbGUgKi8KLSAgICB3aGlsZSggTTROT19FUlJPUiA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0oIHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gY2FzZSB3ZSBmb3VuZCBhIEJJRlMgc3RyZWFtIG9yIHNvbWV0aGluZyBlbHNlLi4uKi8KLSAgICAgICAgaWYoICggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFKSkKLSAgICAgICAgICAgIHx8IChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRXQVJfVE9PX01VQ0hfU1RSRUFNUykpICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgLyoqPCBPbmUgc3RyZWFtIGZvdW5kICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCB0aGUgZmlyc3QgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiggKCBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbyA9PSBtZWRpYUZhbWlseSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0Ci0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogRm91bmQgYSBIMjYzIG9yIE1QRUctNCB2aWRlbyBzdHJlYW0gaW4gaW5wdXQgM2dwcCBjbGlwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyICopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciB2aWRlbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXIsICZwQy0+UmVhZGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IEZvdW5kIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAoMHgleCkgaW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IDNncHAgY2xpcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogK0NSTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAqLwotICAgICAgICAgICAgICAgIGlmKCBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTUFMgYW5kIFBQUyBhcmUgc3RvcmVhZCBhcyBwZXIgdGhlIDNncCBmaWxlIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiAtQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRm91bmQgdGhlIGZpcnN0IGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiggKCBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbyA9PSBtZWRpYUZhbWlseSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IEZvdW5kIGFuIEFNUi1OQiwgQUFDIG9yIE1QMyBhdWRpbyBzdHJlYW0gaW4gaW5wdXQgY2xpcCIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEtlZXAgcG9pbnRlciB0byB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdCBvdXIgYXVkaW8gc3RyZWFtIHN0YXRlIHZhcmlhYmxlICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0UmVzZXQocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdFJlc2V0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLCAmcEMtPlJlYWRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogT3V0cHV0IG1heCBBVSBzaXplIGlzIGVxdWFsIHRvIGlucHV0IG1heCBBVSBzaXplICh0aGlzIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICogd2lsbCBiZSBjaGFuZ2VkIGlmIHRoZXJlIGlzIGF1ZGlvIHRyYW5zY29kaW5nKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBOb3QgQU1SLU5CLCBBQUMsIE1QMyBub3IgRVZSQyAoQU1SLVdCLCBXQVYuLi4pICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IEZvdW5kIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIHN0cmVhbSAoMHgleCkgaW4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCAzZ3BwIGNsaXAiLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+YlVuc3VwcG9ydGVkQXVkaW9Gb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvKio8IGVuZCBvZiB3aGlsZSAoTTROT19FUlJPUiA9PSBlcnIpICovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgc3RyZWFtICovCi0gICAgaWYoICggTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKQotICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IHJldHVybmluZyBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOwotICAgIH0KLQotICAgIGlmKCBwQy0+VmlkZW9TdGF0ZSA9PSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCApCi0gICAgewotICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgLypGQiAyMDA5LTAyLTA5OiB0aGUgZXJyb3IgaXMgY2hlY2sgYW5kIHJldHVybmVkIG9ubHkgaWYgdmlkZW8gY29kZWNzIGFyZSBjb21waWxlZCwKLSAgICAgICAgZWxzZSBvbmx5IGF1ZGlvIGlzIHVzZWQsIHRoYXQgaXMgd2h5IHRoZSBlZGl0aW5nIHByb2Nlc3MgY2FuIGNvbnRpbnVlKi8KLSNpZm5kZWYgTTRNQ1NfQVVESU9PTkxZCi0KLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQgIT0gZXJyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0KLSAgICB9Ci0KLSAgICBpZiggcEMtPkF1ZGlvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQgKQotICAgIHsKLSAgICAgICAgLy9FVlJDCi0gICAgICAgIGlmKCBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMKLSAgICAgICAgICAgICE9IHBTdHJlYW1IYW5kbGVyLT4KLSAgICAgICAgICAgIG1fc3RyZWFtVHlwZSApIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0RlY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgIGVyciA9IE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX29wZW4oKTogTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBiZWdpbiBjdXQgZGVjb2RpbmcgaW5jcmVtZW50IGFjY29yZGluZyB0byB0aGUgaW5wdXQgZnJhbWUgcmF0ZSAqLwotICAgIGlmKCAwLiAhPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSApIC8qKjwgc2FuaXR5IGNoZWNrICovCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0gKE00T1NBX0ludDMyKSgzMDAwLgotICAgICAgICAgICAgLyBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy4KLSAgICAgICAgICAgIGZBdmVyYWdlRnJhbWVSYXRlKTsgLyoqPCBhYm91dCAzIGZyYW1lcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0KLSAgICAgICAgICAgIDIwMDsgLyoqPCBkZWZhdWx0IHZhbHVlOiAyMDAgbWlsbGlzZWNvbmRzICgzIGZyYW1lcyBAIDE1ZnBzKSovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX09QRU5FRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1Nfb3BlbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zdGVwKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiB0cmFuY29kaW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIHRyYW5zY29kaW5nCi0gKiBAbm90ZSAgICBwUHJvZ3Jlc3MgbXVzdCBiZSBhIHZhbGlkIGFkZHJlc3MuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIE9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkU6IFRyYW5zY29kaW5nIGlzIG92ZXIsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00TUNTX2Nsb3NlKCkKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT19DT05WRVJTSU9OX0ZBSUxFRDogVGhlIGF1ZGlvIGNvbnZlcnNpb24gKEFBQyB0byBBTVItTkIgb3IgTVAzKSBmYWlsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k6IFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIGFuIEFBQyBhdWRpbyB0cmFjawotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIGludmFsaWQgc2FtcGxpbmcgZnJlcXVlbmN5IChzaG91bGQgbmV2ZXIgaGFwcGVuKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3RlcCggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX3N0ZXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX3N0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFByb2dyZXNzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc3RlcDogcFByb2dyZXNzIGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbnMqLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNTdGVwKHBDLCBwUHJvZ3Jlc3MpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9SRUFEWToKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX2ludFN0ZXBTZXQocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA6Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gcEMtPnVpUHJvZ3Jlc3M7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU6Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gcEMtPnVpUHJvZ3Jlc3M7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRTdGVwRW5jb2RpbmcocEMsIHBQcm9ncmVzcyk7Ci0gICAgICAgICAgICAgICAgLyogU2F2ZSBwcm9ncmVzcyBpbmZvIGluIGNhc2Ugb2YgcGF1c2UgKi8KLSAgICAgICAgICAgICAgICBwQy0+dWlQcm9ncmVzcyA9ICpwUHJvZ3Jlc3M7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qKjwgU3RhdGUgZXJyb3IgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19zdGVwKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3BhdXNlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUGF1c2UgdGhlIHRyYW5zY29kaW5nIGkuZS4gcmVsZWFzZSB0aGUgKGV4dGVybmFsIGhhcmR3YXJlKSB2aWRlbyBkZWNvZGVyLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGlmIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9ycyBhcmUgdXNlZC4KLSAqICAgICAgICAgIEluIHRoYXQgY2FzZSwgcGF1c2luZyB0aGUgTUNTIGlzIHNpbXBseSBhY2hpZXZlZCBieSB0ZW1wb3JhcmlseSBzdXNwZW5kaW5nCi0gKiAgICAgICAgICB0aGUgTTRNQ1Nfc3RlcCBmdW5jdGlvbiBjYWxscy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcGF1c2UoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX3BhdXNlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19wYXVzZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNQYXVzZShwQyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9KVU1QOiAvKio8IHRoZSB2aWRlbyBkZWNvZGVyIGhhcyBiZWVuIGNyZWF0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIG11c3QgZGVzdHJveSBpdCAqLwotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFOiAvKio8IHRoZSB2aWRlbyBpcyBiZWluZyB1c2VkLCB3ZSBtdXN0IGRlc3Ryb3kgaXQgKi8KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzogLyoqPCB0aGUgdmlkZW8gaXMgYmVpbmcgdXNlZCwgd2UgbXVzdCBkZXN0cm95IGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qKjwgT0ssIG5vdGhpbmcgdG8gZG8gaGVyZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyoqPCBTdGF0ZSBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3BhdXNlKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgQ1RTIGF0IHdoaWNoIHdlIHdpbGwgcmVzdW1lIHRoZSBkZWNvZGluZyAqLwotICAgIGlmKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyA+IHBDLT5kVmlEZWNTdGFydGluZ0N0cyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBwYXNzZWQgdGhlIHN0YXJ0aW5nIENUUywgc28gdGhlIHJlc3VtZSB0YXJnZXQgaXMgdGhlIGN1cnJlbnQgQ1RTICovCi0gICAgICAgIHBDLT5kVmlEZWNTdGFydGluZ0N0cyA9IHBDLT5kVmlEZWNDdXJyZW50Q3RzOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgaGF2ZW4ndCBwYXNzZWQgdGhlIHN0YXJ0aW5nIENUUyB5ZXQsIHNvIHRoZSByZXN1bWUgdGFyZ2V0IGlzIHN0aWxsIHRoZSBzdGFydGluZyBDVFMKLSAgICAgICAgKiAtLT4gbm90aGluZyB0byBkbyBpbiB0aGUgZWxzZSBibG9jayAqLwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB2aWRlbyBkZWNvZGVyIHN0dWZmICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBWaURlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVzdHJveShwQy0+cFZpRGVjQ3R4dCk7Ci0gICAgICAgIHBDLT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfcGF1c2U6IG1fcFZpZGVvRGVjb2Rlci0+cEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFN0YXRlIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUEFVU0VEOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX3BhdXNlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3Jlc3VtZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIFJlc3VtZSB0aGUgdHJhbnNjb2RpbmcgYWZ0ZXIgYSBwYXVzZSAoc2VlIE00TUNTX3BhdXNlKS4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG5lZWRlZCBpZiBubyBoYXJkd2FyZSBhY2NlbGVyYXRvcnMgYXJlIHVzZWQuCi0gKiAgICAgICAgICBJbiB0aGF0IGNhc2UsIHJlc3VtaW5nIHRoZSBNQ1MgaXMgc2ltcGx5IGFjaGlldmVkIGJ5IGNhbGxpbmcKLSAqICAgICAgICAgIHRoZSBNNE1DU19zdGVwIGZ1bmN0aW9uLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19yZXN1bWUoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX3Jlc3VtZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfcmVzdW1lOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1Jlc3VtZShwQyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX1BBVVNFRDogLyoqPCBPSywgbm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIC8qKjwgU3RhdGUgZXJyb3IgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19yZXN1bWUoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB2aWRlbyBkZWNvZGVyICovCi0gICAgZXJyID0gTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcihwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfcmVzdW1lKCk6IE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU3RhdGUgdHJhbnNpdGlvbiAqLwotICAgIGlmKCAwLjAgPT0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBzdGlsbCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkZWNvZGVkIHN0cmVhbSwgbm8gbmVlZCB0byBqdW1wLCB3ZSBjYW4gcHJvY2VlZCAqLwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSnVtcGluZyAqLwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX3Jlc3VtZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbG9zZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE1DUyB0cmFuc2NvZGluZy4KLSAqIEBub3RlIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Nsb3NlKCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotICAgIE00U1lTX1N0cmVhbUlEbWVtQWRkciBzdHJlYW1IZWFkZXI7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUiwgZXJyMjsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE1DU19jbG9zZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfY2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBJbmRpY2F0ZSB0aGF0IGN1cnJlbnQgZmlsZSBpcyBubyBsb25nZXIgYSBzdGlsbCBwaWN0dXJlKi8KLSAgICAgICAgcEMtPm1fYklzU3RpbGxQaWN0dXJlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY0Nsb3NlKHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9GSU5JU0hFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Nsb3NlKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ2xvc2UgdGhlIGVuY29kZXIgYmVmb3JlIHRoZSB3cml0ZXIgdG8gYmUgY2VydGFpbiBhbGwgdGhlIEFVcyBoYXZlIGJlZW4gd3JpdHRlbiBhbmQgd2UgY2FuCi0gICAgZ2V0IHRoZSBEU0kuICovCi0KLSAgICAvKiBIYXMgdGhlIGVuY29kZXIgYWN0dWFsbHkgYmVlbiBzdGFydGVkPyBEb24ndCBzdG9wIGl0IGlmIHRoYXQncyBub3QgdGhlIGNhc2UuICovCi0gICAgaWYoIE00TUNTX2tFbmNvZGVyUnVubmluZyA9PSBwQy0+ZW5jb2RlclN0YXRlICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBXZWxsLi4uIGhvdyB0aGUgaGVjayBkbyB5b3UgaGFuZGxlIGEgZmFpbGVkIGNsZWFudXA/ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJTdG9wcGVkOwotICAgIH0KLQotICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICBpZiggTTRNQ1Nfa0VuY29kZXJTdG9wcGVkID09IHBDLT5lbmNvZGVyU3RhdGUgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UocEMtPnBWaUVuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKiBXZWxsLi4uIGhvdyB0aGUgaGVjayBkbyB5b3UgaGFuZGxlIGEgZmFpbGVkIGNsZWFudXA/ICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJDbG9zZWQ7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIENsb3NlIHRoZSB3cml0ZXIgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBXcml0ZXJDb250ZXh0ICkgLyogaGFwcGVucyBpbiBzdGF0ZSBfU0VUICovCi0gICAgewotICAgICAgICAvKiBIVyBlbmNvZGVyOiBmZXRjaCB0aGUgRFNJIGZyb20gdGhlIHNoZWxsIHZpZGVvIGVuY29kZXIsIGFuZCBmZWVkIGl0IHRvIHRoZSB3cml0ZXIgYmVmb3JlCi0gICAgICAgIGNsb3NpbmcgaXQuICovCi0KLSAgICAgICAgaWYoIHBDLT5ub3ZpZGVvICE9IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggKCBNNEVOQ09ERVJfa01QRUc0ID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KQotICAgICAgICAgICAgICAgIHx8IChNNEVOQ09ERVJfa0gyNjQgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RHZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZlbmNIZWFkZXIpOwotCi0gICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpIHx8IChNNE9TQV9OVUxMID09IGVuY0hlYWRlci0+cEJ1ZikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBubyByZXR1cm4gaGVyZSwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBkZWFsbG9jYXRlIGFmdGVyIGNsb3NlLCBldmVuCi0gICAgICAgICAgICAgICAgICAgICBpZiBpdCBmYWlscy4gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRoaXMgaGVhZGVyIGluIHRoZSB3cml0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnN0cmVhbUlEID0gTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnNpemUgPSBlbmNIZWFkZXItPlNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5hZGRyID0gKE00T1NBX01lbUFkZHIzMillbmNIZWFkZXItPnBCdWY7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImNhbGxpbmcgc2V0IG9wdGlvbiIpOwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tEU0ksICZzdHJlYW1IZWFkZXIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJzZXQgb3B0aW9uIGRvbmUiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogZmFpbGVkIHRvIHNldCB0aGUgRFNJIGluIHRoZSB3cml0ZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICggTTRPU0FfVFJVRSA9PSBwQy0+YkgyNjRUcmltKQotICAgICAgICAgICAgICAgICYmIChNNEVOQ09ERVJfa05VTEwgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJEZWNvZGVyIHNwZWNpZmljIGluZm8gc2l6ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkRlY29kZXIgc3BlY2lmaWMgaW5mbyBwb2ludGVyID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5tX3BJbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPm1fcEluc3RhbmNlLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnN0YW5jZS0+bV9wRmluYWxEU0kiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImluc3RhbmNlLT5tX3BGaW5hbERTSTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wSW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc3RyZWFtSUQgPSBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5zaXplID0gcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSVNpemU7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLmFkZHIgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0k7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImNhbGxpbmcgc2V0IG9wdGlvbiIpOwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tEU0ksICZzdHJlYW1IZWFkZXIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJzZXQgb3B0aW9uIGRvbmUiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogZmFpbGVkIHRvIHNldCB0aGUgRFNJIGluIHRoZSB3cml0ZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBXcml0ZSBhbmQgY2xvc2UgdGhlIDNHUCBvdXRwdXQgZmlsZSAqLwotICAgICAgICBlcnIyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZShwQy0+cFdyaXRlckNvbnRleHQpOwotICAgICAgICBwQy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVycjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycjIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4gaWYgaXQgZmFpbHMuKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENsb3NlIG91dHB1dCBQQ00gZmlsZSBpZiBuZWVkZWQgKi8KLSAgICBpZiggcEMtPnBPdXRwdXRQQ01maWxlICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+Y2xvc2VXcml0ZShwQy0+cE91dHB1dFBDTWZpbGUpOwotICAgICAgICBwQy0+cE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qRmxCIDIwMDkuMDMuMDQ6IGFkZCBhdWRpbyBlZmZlY3RzLAotICAgIGZyZWUgZWZmZWN0cyBsaXN0Ki8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEVmZmVjdHMgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cEVmZmVjdHMpOwotICAgICAgICBwQy0+cEVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBwQy0+bmJFZmZlY3RzID0gMDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdE51bWJlciA9IC0xOwotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSB0cmFuc2l0aW9uICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0NMT1NFRDsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlcik7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2Nsb3NlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTUNTLgotICogQG5vdGUgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2NsZWFuVXAoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNE1DU19jbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgaWYoIGZpbGVfYXVfcmVhZGVyICkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShmaWxlX2F1X3JlYWRlcik7Ci0gICAgICAgIGZpbGVfYXVfcmVhZGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggZmlsZV9wY21fZGVjb2RlciApCi0gICAgewotICAgICAgICBmY2xvc2UoZmlsZV9wY21fZGVjb2Rlcik7Ci0gICAgICAgIGZpbGVfcGNtX2RlY29kZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKCBmaWxlX3BjbV9lbmNvZGVyICkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShmaWxlX3BjbV9lbmNvZGVyKTsKLSAgICAgICAgZmlsZV9wY21fZW5jb2RlciA9IE5VTEw7Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ29udGV4dCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0NMT1NFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcCgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX3BJbnN0YW5jZSApCi0gICAgewotICAgICAgICBlcnIgPSBIMjY0TUNTX0ZyZWVpbnN0YW5jZShwQy0+bV9wSW5zdGFuY2UpOwotICAgICAgICBwQy0+bV9wSW5zdGFuY2UgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdmlkZW8gZW5jb2RlciBzdHVmZiwgaWYgbmVlZGVkIC0tLS0tICovCi0KLSAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlFbmNDdHh0KQotICAgICAgICAmJiAoTTRPU0FfTlVMTCAhPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMpICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAocEMtPnBWaUVuY0N0eHQpOwotICAgICAgICBwQy0+cFZpRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa05vRW5jb2RlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluIHRoZSBIMjYzIGNhc2UsIHdlIGFsbG9jYXRlZCBvdXIgb3duIERTSSBidWZmZXIgKi8KLSAgICBpZiggKCBNNEVOQ09ERVJfa0gyNjMgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpCi0gICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYpICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1Zik7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUHJlUmVzaXplRnJhbWUgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocEMtPnBQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdGhlIHNzcmMgc3R1ZmYgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5Tc3JjU2NyYXRjaCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5Tc3JjU2NyYXRjaCk7Ci0gICAgICAgIHBDLT5Tc3JjU2NyYXRjaCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFNzcmNCdWZmZXJJbik7Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFNzcmNCdWZmZXJPdXQpOwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChwQy0+cExWQXVkaW9SZXNhbXBsZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIExWRGVzdHJveShwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdGhlIGF1ZGlvIGVuY29kZXIgc3R1ZmYgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKHBDLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwKHBDLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyKTsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgYWxsIG90aGVyIHN0dWZmIC0tLS0tICovCi0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHJlYWRlcnMgYW5kIHRoZSBkZWNvZGVycyAqLwotICAgIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKHBDKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc3RpbGwgcGljdHVyZSByZXNvdXJjZXMgKi8KLQotICAgIE00TUNTX3N0aWxsUGljQ2xlYW5VcChwQyk7Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0KLSAgICBNNE1DU191blJlZ2lzdGVyQWxsV3JpdGVycyhwQ29udGV4dCk7Ci0gICAgTTRNQ1NfdW5SZWdpc3RlckFsbEVuY29kZXJzKHBDb250ZXh0KTsKLSAgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycyhwQ29udGV4dCk7Ci0gICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY29udGV4dCBpdHNlbGYgKi8KLSAgICBmcmVlKHBDKTsKLSAgICBwQyA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfY2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19hYm9ydChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE1DUyB0cmFuc2NvZGluZyBhbmQgZnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIE1DUwotICogICAgICAgICAgd2hhdGV2ZXIgdGhlIHN0YXRlIGlzLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19hYm9ydCggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfRVJSIGVycjEgPSBNNE5PX0VSUk9SOwotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmKCAoIHBDLT5TdGF0ZSA9PSBNNE1DU19rU3RhdGVfQ1JFQVRFRCkKLSAgICAgICAgfHwgKHBDLT5TdGF0ZSA9PSBNNE1DU19rU3RhdGVfQ0xPU0VEKSApCi0gICAgewotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQ0xPU0VEOwotCi0gICAgICAgIGVyciA9IE00TUNTX2NsZWFuVXAocENvbnRleHQpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19hYm9ydCA6IE00TUNTX2NsZWFuVXAgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgICAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENhbmNlbCB0aGUgb25nb2luZyBwcm9jZXNzZXMgaWYgYW55Ki8KLSAgICAgICAgICAgIGVyciA9IE00TUNTX3N0aWxsUGljQ2FuY2VsKHBDKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Fib3J0IDogTTRNQ1Nfc3RpbGxQaWNDYW5jZWwgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKlN0aWxsIHBpY3R1cmUgcHJvY2VzcyBpcyBub3cgc3RvcHBlZDsgQ2Fycnkgb24gd2l0aCBjbG9zZSBhbmQgY2xlYW51cCovCi0gICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgZXJyID0gTTRNQ1NfY2xvc2UocENvbnRleHQpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19hYm9ydCA6IE00TUNTX2Nsb3NlIGZhaWxzIGVyciA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgZXJyMSA9IGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00TUNTX2NsZWFuVXAocENvbnRleHQpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19hYm9ydCA6IE00TUNTX2NsZWFuVXAgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZXJyID0gKGVycjEgPT0gTTROT19FUlJPUikgPyBlcnIgOiBlcnIxOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyogcEZpbGVQcm9wZXJ0aWVzKTsKLSAqIEBicmllZiAgIFJldHJpZXZlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFByb3BlcnRpZXMgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIGFuIGFsbG9jYXRlZCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcwotc3RydWN0dXJlIHdoaWNoIGlzIGZpbGxlZCB3aXRoIHRoZSBpbnB1dCBzdHJlYW0gcHJvcGVydGllcy4KLSAqIEBub3RlICAgIFRoZSBzdHJ1Y3R1cmUgcFByb3BlcnRpZXMgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIGZ1cnRoZXIgZGUtYWxsb2NhdGVkCi1ieSB0aGUgYXBwbGljYXRpb24uIFRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3BlbmVkIHN0YXRlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBcCi0gICAgICAgICAgICAgICAgICAgcEZpbGVQcm9wZXJ0aWVzPTB4JXgiLCBwQ29udGV4dCwgcEZpbGVQcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXM6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVQcm9wZXJ0aWVzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllczogcFByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNHZXRJbnB1dEZpbGVQcm9wZXJ0aWVzKHBDLCBwRmlsZVByb3BlcnRpZXMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX09QRU5FRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcygpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSBwcmV2aW91c2x5IGNvbXB1dGVkIHByb3BlcnRpZXMgaW50byBnaXZlbiBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwRmlsZVByb3BlcnRpZXMsCi0gICAgICAgICh2b2lkICopICZwQy0+SW5wdXRGaWxlUHJvcGVydGllcywKLSAgICAgICAgc2l6ZW9mKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKSk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX091dHB1dFBhcmFtcyogcFBhcmFtcyk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyB2aWRlbyBvdXRwdXQgcGFyYW1ldGVycy4KLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGFmdGVyIE00TUNTX29wZW4uIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19zdGVwLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUGFyYW1zICAgICAgICAgICAgIChJTi9PVVQpIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjMgOiBPdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQgICAgIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmcmFtZSByYXRlCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQgOiBVbmRlZmluZWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCBwYXJhbWV0ZXIKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9EVVJBVElPTl9JU19OVUxMIDogU3BlY2lmaWVkIG91dHB1dCBwYXJhbWV0ZXJzIGRlZmluZSBhIG51bGwgZHVyYXRpb24gc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vIGF1ZGlvIGFuZCB2aWRlbykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldE91dHB1dFBhcmFtcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfT3V0cHV0UGFyYW1zICpwUGFyYW1zICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfVUludDMyIHVpRnJhbWVXaWR0aDsKLSAgICBNNE9TQV9VSW50MzIgdWlGcmFtZUhlaWdodDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoCi0gICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFBhcmFtcz0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBQYXJhbXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IHBQYXJhbSBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1NldE91dHB1dFBhcmFtcyhwQywgcFBhcmFtcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfT1BFTkVEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBJZ25vcmUgYXVkaW8gb3IgdmlkZW8gc3RyZWFtIGlmIHRoZSBvdXRwdXQgZG8gbm90IG5lZWQgaXQsICovCi0gICAgLyogb3IgaWYgdGhlIGlucHV0IGZpbGUgZG9lcyBub3QgaGF2ZSBhbnkgYXVkaW8gb3IgdmlkZW8gc3RyZWFtICovCi0gICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBtY3Mgb3V0cHV0IGZvcm1hdCovCi0gICAgaWYoICggcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbykKLSAgICAgICAgfHwgKHBDLT5WaWRlb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSkKLSAgICAgICAgfHwgKHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIpCi0gICAgICAgIHx8IChwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzKSApCi0gICAgewotICAgICAgICBwQy0+bm92aWRlbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgaWYoICggcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbykKLSAgICAgICAgfHwgKHBDLT5BdWRpb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSkgKQotICAgIHsKLSAgICAgICAgcEMtPm5vYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIGlmKCBwQy0+bm9hdWRpbyAmJiBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICIhISEgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zIDogY2xpcCBpcyBOVUxMLCB0aGVyZSBpcyBubyBhdWRpbywgbm8gdmlkZW8iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9EVVJBVElPTl9JU19OVUxMOwotICAgIH0KLQotICAgIC8qIFNldCB3cml0ZXIgKi8KLSAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50V3JpdGVyKHBDb250ZXh0LCBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKiBTZXQgdmlkZW8gcGFyYW1ldGVycyAqLwotICAgIGlmKCBwQy0+bm92aWRlbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBGb3JtYXQgY29ycmVjdG5lc3MgKi8KLQotICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNCApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSDI2M19GT1JCSURERU5fSU5fTVA0X0ZJTEU7Ci0KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotCi0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLQotICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID0gTTRFTkNPREVSX2tIMjY0OwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTnVsbFZpZGVvOgotICAgICAgICAgICAgICAgIGlmKCAoIHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDQpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0gyNjMpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9IMjYzX0ZPUkJJRERFTl9JTl9NUDRfRklMRTsKLQotCi0gICAgICAgICAgICAgICAgLyogRW5jb2RlciBuZWVkZWQgZm9yIGJlZ2luIGN1dCB0byBnZW5lcmF0ZSBhbiBJLWZyYW1lICovCi0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPSBNNEVOQ09ERVJfa05VTEw7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZvcm1hdCAoJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIFZpZGVvIGZyYW1lIHNpemUgY29ycmVjdG5lc3MgKi8KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW8gPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUZyYW1lV2lkdGggPQotICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoOwotICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFNldCBvdXRwdXQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvUHJvZmlsZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgLyoqIFNldCB0aGUgdGFyZ2V0IHZpZGVvIGxldmVsLCBiZWNhdXNlIGlucHV0IDNncCBmaWxlIG1heQotICAgICAgICAgICAgICogIGhhdmUgd3JvbmcgdmlkZW8gbGV2ZWwgdmFsdWUgKHNvbWUgZW5jb2RlcnMgZG8gbm90IHJlc3BlY3QKLSAgICAgICAgICAgICAqICBsZXZlbCByZXN0cmljdGlvbnMgbGlrZSB2aWRlbyByZXNvbHV0aW9uIHdoZW4gY29udGVudCBpcyBjcmVhdGVkKS4KLSAgICAgICAgICAgICAqKi8KLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvTGV2ZWwgPSBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgICAgICAgICAvLyBDbGlwJ3Mgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCBtYXkgbm90IGJlCi0gICAgICAgICAgICAvLyBtdWx0aXBsZSBvZiAxNi4KLSAgICAgICAgICAgIC8vIEVuc3VyZSBlbmNvZGluZyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBtdWx0aXBsZSBvZiAxNgotCi0gICAgICAgICAgICB1aW50MzJfdCByZW1haW5kZXIgPSBwQy0+RW5jb2RpbmdXaWR0aCAlIDE2OwotICAgICAgICAgICAgaWYgKHJlbWFpbmRlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlciA+PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgZm9yd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCArICgxNi1yZW1haW5kZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgYmFja3dhcmQKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggLSByZW1haW5kZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZW1haW5kZXIgPSBwQy0+RW5jb2RpbmdIZWlnaHQgJSAxNjsKLSAgICAgICAgICAgIGlmIChyZW1haW5kZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIgPj0gOCkgewotICAgICAgICAgICAgICAgICAgICAvLyBSb2xsIGZvcndhcmQKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCArICgxNi1yZW1haW5kZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgYmFja3dhcmQKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCAtIHJlbWFpbmRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFNldCBvdXRwdXQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvUHJvZmlsZSA9IHBQYXJhbXMtPm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvTGV2ZWwgPSBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfU1FDSUZfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfU1FDSUZfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9RUVZHQV9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9RUVZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfUUNJRl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9RQ0lGX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9RVkdBX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1FWR0FfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfQ0lGX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX0NJRl9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9WR0FfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfVkdBX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tXVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9XVkdBX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1dWR0FfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05UU0M6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX05UU0NfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfTlRTQ19IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvKiAtUFIgTFY1ODA3Ki8KLSAgICAgICAgICAgICAgICAgICAgLyogK0NSIEdvb2dsZSAqLwotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzY0MF8zNjBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzY0MF8zNjBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl84NTRfNDgwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl84NTRfNDgwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjgwXzcyMDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzEyODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl8xMjgwXzcyMF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfMTA4MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl85NjBfNzIwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl85NjBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl8xOTIwXzEwODBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvKiAtQ1IgR29vZ2xlICovCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSwgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdmlkZW8gbWF4IGF1IHNpemUgYW5kIG1heCBjaHVuY2sgc2l6ZS4KLSAgICAgICAgKiBXZSBkbyBpdCBoZXJlIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgZnJhbWUgc2l6ZSBvbmx5LCBhbmQKLSAgICAgICAgKiBiZWNhdXNlIHdlIG5lZWQgaXQgZm9yIHRoZSBmaWxlIHNpemUvdmlkZW8gYml0cmF0ZSBlc3RpbWF0aW9ucyAqLwotICAgICAgICBwQy0+dWlWaWRlb01heEF1U2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgxLjVGICooTTRPU0FfRmxvYXQpKHVpRnJhbWVXaWR0aCAqIHVpRnJhbWVIZWlnaHQpIFwKLSAgICAgICAgICAgICpNNE1DU19WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8pOwotICAgICAgICBwQy0+dWlWaWRlb01heENodW5ja1NpemUgPSAoTTRPU0FfVUludDMyKShwQy0+dWlWaWRlb01heEF1U2l6ZSAgICAgICBcCi0gICAgICAgICAgICAqCi0gICAgICAgICAgICBNNE1DU19WSURFT19DSFVOS19BVV9TSVpFX1JBVElPKTsgLyoqPCBmcm9tIG1heCBBVSBzaXplIHRvIG1heCBDaHVuY2sgc2l6ZSAqLwotCi0gICAgICAgIGlmKCAwID09IHBDLT51aVZpZGVvTWF4QXVTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2l6ZSBtYXkgYmUgemVybyBpbiBjYXNlIG9mIG51bGwgZW5jb2Rpbmcgd2l0aCB1bnJlY29nbml6ZWQgc3RyZWFtICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiB2aWRlbyBmcmFtZSBzaXplIGlzIDAgcmV0dXJuaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNpemUgY2hlY2sgZm9yIEgyNjMgKG9ubHkgdmFsaWQgc2l6ZXMgYXJlIENJRiwgUUNJRiBhbmQgU1FDSUYpICovCi0KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tIMjYzID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICAgICAgICAgIC8qIE9LICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBGcmFtZSByYXRlIGNvcnJlY3RuZXNzICovCi0gICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rTnVsbFZpZGVvICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2s1X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA9IE00RU5DT0RFUl9rN181X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2sxMF9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTJfNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2sxMl81X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2sxNV9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA9IE00RU5DT0RFUl9rMjBfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazI1X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2szMF9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHJhdGVcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQpLCByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRnJhbWUgcmF0ZSBjaGVjayBmb3IgSDI2MyAob25seSBkaXZpZGVycyBvZiAzMCBmcHMgKDI5Ljk3IGFjdHVhbGx5KSkgKi8KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tIMjYzID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMzBfRlBTOgotICAgICAgICAgICAgICAgICAgICAvKiBPSyAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9SQVRFX0ZPUl9IMjYzIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9SQVRFX0ZPUl9IMjYzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IGF1ZGlvIHBhcmFtZXRlcnMgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgQXVkaW8gRm9ybWF0IGNvcnJlY3RuZXNzICovCi0gICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFtclNJRCA9IE00RU5DT0RFUl9rQW1yTm9TSUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLQotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxNjAwMEh6OwotCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ0MTAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTEwMjVfQVNGOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAocFBhcmFtcy0+YkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFKSA/IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uUmVndWxhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0FhY1JlZ3VsTm9uZTsgLy9NNEVOQ09ERVJfa0FhY0JpdFJlc2Vydm9pcgotICAgICAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYk1TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iUE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gY2hhbmdlIGludG8gaGlnaHNwZWVkIGFzYXAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgbWNzIG91dHB1dCBmb3JtYXQsIGFkZCBtcDMgZW5jb2RlciovCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUDM7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5iQXVkaW9Nb25vID09IE00T1NBX1RSVUUpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazExMDI1X0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxMTAyNUh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2syMjA1MEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazMyMDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ0MTAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s0NDEwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa051bGxBdWRpbzoKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBFZmZlY3RzID09IE00T1NBX05VTEwgfHwgcFBhcmFtcy0+bmJFZmZlY3RzID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBlbmNvZGVyIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQXVkaW9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMgY2FsbGluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyIE00VklERU9FRElUSU5HX2tOdWxsLCBBTVIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0gTTRFTkNPREVSX2tNb25vOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSA4MDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQU1STkI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFtclNJRCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0Ftck5vU0lEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zIGNhbGxpbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlciBNNFZJREVPRURJVElOR19rTnVsbCwgQUFDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBQUM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rQWFjUmVndWxOb25lOyAvL000RU5DT0RFUl9rQWFjQml0UmVzZXJ2b2lyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2syMjA1MEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazMyMDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s0NDEwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBQUM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW51c2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYlBOUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBjaGFuZ2UgaW50byBoaWdoc3BlZWQgYXNhcCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iSGlnaFNwZWVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcyBjYWxsaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyIE00VklERU9FRElUSU5HX2tOdWxsLCBNUDMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa01QMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBPdXRwdXQgYXVkaW8gZm9ybWF0ICglZCkgaXNcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIGF1ZGlvIGVmZmVjdHMsIHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLyogRVZSQwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsIHBQYXJhbXMtPlwKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIE91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0VWUkM7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGJyZWFrOyAqLwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX3NldE91dHB1dFBhcmFtczogVW5kZWZpbmVkIG91dHB1dCBhdWRpbyBmb3JtYXQgKCVkKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggcFBhcmFtcy0+cE91dHB1dFBDTWZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwQy0+cE91dHB1dFBDTWZpbGUgPSBwUGFyYW1zLT5wT3V0cHV0UENNZmlsZTsKLQotICAgICAgICAvKiBPcGVuIG91dHB1dCBQQ00gZmlsZSAqLwotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLT5vcGVuV3JpdGUoJihwQy0+cE91dHB1dFBDTWZpbGUpLAotICAgICAgICAgICAgcFBhcmFtcy0+cE91dHB1dFBDTWZpbGUsIE00T1NBX2tGaWxlV3JpdGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+cE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qU3RvcmUgbWVkaWEgcmVuZGVyaW5nIHBhcmFtZXRlciBpbnRvIHRoZSBpbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBwQy0+TWVkaWFSZW5kZXJpbmcgPSBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZzsKLQotICAgIC8qIEFkZCBhdWRpbyBlZmZlY3RzKi8KLSAgICAvKkNvcHkgTUNTIGVmZmVjdHMgc3RydWN0dXJlIGludG8gaW50ZXJuYWwgY29udGV4dCovCi0gICAgaWYoIHBQYXJhbXMtPm5iRWZmZWN0cyA+IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGogPSAwOwotICAgICAgICBwQy0+bmJFZmZlY3RzID0gcFBhcmFtcy0+bmJFZmZlY3RzOwotICAgICAgICBwQy0+cEVmZmVjdHMgPSAoTTRNQ1NfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPm5iRWZmZWN0cyBcCi0gICAgICAgICAgICAqc2l6ZW9mKE00TUNTX0VmZmVjdFNldHRpbmdzKSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJBbGxvY2F0aW9uIG9mIGVmZmVjdHMgbGlzdCIpOwotCi0gICAgICAgIGlmKCBwQy0+cEVmZmVjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBwQy0+bmJFZmZlY3RzOyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb3B5IGVmZmVjdCB0byAibG9jYWwiIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBFZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSAmKHBQYXJhbXMtPnBFZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRNQ1NfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQy0+cEVmZmVjdHNbal0uQXVkaW9FZmZlY3RUeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfTm9uZToKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIE5vbmUiLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW46Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBlZmZlY3QgdHlwZSAlaSBpcyBGYWRlSW4iLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIEZhZGVPdXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgaik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLkV4dEF1ZGlvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlT3V0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9FeHRlcm5hbDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIEV4dGVybmFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRWZmZWN0cyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBFZmZlY3RzW2pdLkV4dEF1ZGlvRWZmZWN0RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBubyBleHRlcm5hbCBlZmZlY3QgZnVuY3Rpb25cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB0byBleHRlcm5hbCBlZmZlY3QgbnVtYmVyICVpIiwgaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRWZmZWN0c1tqXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBFZmZlY3RzW2pdLkV4dEF1ZGlvRWZmZWN0RmN0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgbm90IHJlY29nbml6ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bmJFZmZlY3RzID0gMDsKLSAgICAgICAgcEMtPnBFZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfU0VUOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcykKLSAqIEBicmllZiAgIFNldCB0aGUgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydCgpLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBSYXRlcyAgICAgICAgICAgICAoSU4pIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDogQXVkaW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gOTYga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzogQXVkaW8gYml0cmF0ZSBpcyB0b28gbG93ICgxNiBrYnBzIG1pbiBmb3IgYWFjLCAxMi4yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFtciwgOCBmb3IgbXAzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDogQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT046IEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBjbGlwCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24KLSAqIEByZXR1cm4gIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ6IEVuZCBjdXQgdGltZSBpcyBzbWFsbGVyIHRoYW4gYmVnaW4gY3V0IHRpbWUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEw6IE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgd2hvbGUgb3V0cHV0IGZpbGUgYXQgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6IFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOiAgVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FbmNvZGluZ1BhcmFtcyAqcFJhdGVzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfVUludDMyIGogPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoCi0gICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwUmF0ZXM9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwUmF0ZXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFJhdGVzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IHBSYXRlcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1NldEVuY29kaW5nUGFyYW1zKHBDLCBwUmF0ZXMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX1NFVCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBTZXQgZ2l2ZW4gdmFsdWVzICovCi0gICAgcEMtPnVpVmlkZW9CaXRyYXRlID0gcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPnVpQXVkaW9CaXRyYXRlID0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgcEMtPnVpQmVnaW5DdXRUaW1lID0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgcEMtPnVpRW5kQ3V0VGltZSA9IHBSYXRlcy0+RW5kQ3V0VGltZTsKLSAgICBwQy0+dWlNYXhGaWxlU2l6ZSA9IHBSYXRlcy0+T3V0cHV0RmlsZVNpemU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGJlZ2luIGN1dCB0aW1lIHZhbGlkaXR5ICovCi0gICAgaWYoIHBDLT51aUJlZ2luQ3V0VGltZSA+PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogQmVnaW4gY3V0IGxhcmdlciB0aGFuIGR1cmF0aW9uICglZD4lZCksXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBDLT51aUJlZ2luQ3V0VGltZSwgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24pOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIElmIGVuZCBjdXQgdGltZSBpcyB0b28gbGFyZ2UsIHdlIHNldCBpdCB0byB0aGUgY2xpcCBkdXJhdGlvbiAqLwotICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcEMtPnVpRW5kQ3V0VGltZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgZW5kIGN1dCB0aW1lIHZhbGlkaXR5ICovCi0gICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPiAwICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lIDwgcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00TUNTX3NldEVuY29kaW5nUGFyYW1zKCk6IEJlZ2luIGN1dCBncmVhdGVyIHRoYW4gZW5kIGN1dCAoJWQsJWQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dWlCZWdpbkN1dFRpbWUsIHBDLT51aUVuZEN1dFRpbWUpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA9PSBwQy0+dWlCZWdpbkN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogQmVnaW4gYW5kIEVuZCBjdXRzIGFyZSBlcXVhbCAoJWQsJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51aUJlZ2luQ3V0VGltZSwgcEMtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogRmxCIDIwMDkuMDMuMDQ6IGNoZWNrIGF1ZGlvIGVmZmVjdHMgc3RhcnQgdGltZSBhbmQgZHVyYXRpb24gdmFsaWRpdHkqLwotICAgIGZvciAoIGogPSAwOyBqIDwgcEMtPm5iRWZmZWN0czsgaisrICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBvdXRwdXRFbmRDdXQgPSBwQy0+dWlFbmRDdXRUaW1lOwotCi0gICAgICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRFbmRDdXQgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+cEVmZmVjdHNbal0udWlTdGFydFRpbWUgPiAob3V0cHV0RW5kQ3V0IC0gcEMtPnVpQmVnaW5DdXRUaW1lKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBFZmZlY3RzIHN0YXJ0IHRpbWUgaXMgbGFyZ2VyIHRoYW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiAoJWQsJWQpLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZSArIHBDLT5wRWZmZWN0c1tqXS51aUR1cmF0aW9uID4gXAotICAgICAgICAgICAgKG91dHB1dEVuZEN1dCAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBSZS1hZGp1c3QgdGhlIGVmZmVjdCBkdXJhdGlvbiB1bnRpbCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgY2xpcCovCi0gICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0udWlEdXJhdGlvbiA9IChvdXRwdXRFbmRDdXQgLSBwQy0+dWlCZWdpbkN1dFRpbWUpIC0gXAotICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENoZWNrIGF1ZGlvIGJpdHJhdGUgY29uc2lzdGVuY3kgKi8KLSAgICBpZiggKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgJiYgKHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgIT0gTTRFTkNPREVSX2tBdWRpb05VTEwpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0FNUk5CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFMgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9FVlJDCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIGVsc2UgaWYocEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0VWUkMpCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmKHBDLT51aUF1ZGlvQml0cmF0ZSA+IE00VklERU9FRElUSU5HX2s5XzJfS0JQUykKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmKHBDLT51aUF1ZGlvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2s5XzJfS0JQUykKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBtY3Mgb3V0cHV0IGZvcm1hdCwgYWRkIG1wMyBlbmNvZGVyKi8KLSAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tNUDMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID49IE00RU5DT0RFUl9rMzIwMDBIeiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1wZWcgbGF5ZXIgMSovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgPiAzMjAwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IDMyMDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPj0gTTRFTkNPREVSX2sxNjAwMEh6ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTXBlZyBsYXllciAyKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDE2MDAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+dWlBdWRpb0JpdHJhdGUgPCA4MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAocEMtPnVpQXVkaW9CaXRyYXRlIDwgMTYwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNEVOQ09ERVJfa1N0ZXJlbykgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9PSBNNEVOQ09ERVJfazgwMDBIegotICAgICAgICAgICAgICAgICAgICB8fCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID09IE00RU5DT0RFUl9rMTEwMjVIegotICAgICAgICAgICAgICAgICAgICB8fCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID09IE00RU5DT0RFUl9rMTIwMDBIeiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1wZWcgbGF5ZXIgMi41Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDY0MDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IDgwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwQy0+dWlBdWRpb0JpdHJhdGUgPCAxNjAwMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0KLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00RU5DT0RFUl9rU3RlcmVvKSApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IE1QMyBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY3kgZXJyb3JcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICglZCkiLCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IE00VklERU9FRElUSU5HX2sxOTJfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazE2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2szMl9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5VTEwgYXVkaW8gOiBjb3B5IGlucHV0IGZpbGUgYml0cmF0ZSAqLwotICAgICAgICBwQy0+dWlBdWRpb0JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB2aWRlbyBiaXRyYXRlIGNvbnNpc3RlbmN5ICovCi0gICAgaWYoICggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCAhPSBNNEVOQ09ERVJfa05VTEwpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+dWlWaWRlb0JpdHJhdGUgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPnVpVmlkZW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+dWlWaWRlb0JpdHJhdGUgPCBNNFZJREVPRURJVElOR19rMTZfS0JQUyApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBOVUxMIHZpZGVvIDogY29weSBpbnB1dCBmaWxlIGJpdHJhdGUgKi8KLSAgICAgICAgcEMtPnVpVmlkZW9CaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotCi0gICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9UaW1lc2NhbGUgPD0gMzAwMDAKLSAgICAgICAgJiYgcFJhdGVzLT5PdXRwdXRWaWRlb1RpbWVzY2FsZSA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPm91dHB1dFZpZGVvVGltZXNjYWxlID0gcFJhdGVzLT5PdXRwdXRWaWRlb1RpbWVzY2FsZTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmaWxlIHNpemUgKi8KLSAgICByZXR1cm4gTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZShwQyk7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcykKLSAqIEBicmllZiAgIEdldCB0aGUgZXh0ZW5kZWQgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBDb3VsZCBiZSBjYWxsZWQgYWZ0ZXIgTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFJhdGVzICAgICAgICAgICAgIChPVVQpIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDogRW5jb2Rpbmcgc2V0dGluZ3Mgd291bGQgcHJvZHVjZSBhIG51bGwgZHVyYXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCA9IGVuY29kaW5nIGlzIGltcG9zc2libGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FbmNvZGluZ1BhcmFtcyAqcFJhdGVzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9JbnQzMiBtaW5hdWRpb2JpdHJhdGU7Ci0gICAgTTRPU0FfSW50MzIgbWludmlkZW9iaXRyYXRlOwotICAgIE00T1NBX0ludDMyIG1heGNvbWJpbmVkYml0cmF0ZTsKLQotICAgIE00T1NBX0ludDMyIGNhbGNiaXRyYXRlOwotCi0gICAgTTRPU0FfVUludDMyIG1heGR1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBjYWxjZHVyYXRpb247Ci0KLSAgICBNNE9TQV9Cb29sIGZpeGVkX2F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBmaXhlZF92aWRlbyA9IE00T1NBX0ZBTFNFOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNHZXRFeHRlbmRlZEVuY29kaW5nUGFyYW1zKHBDLCBwUmF0ZXMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUocEMtPnVpVmlkZW9CaXRyYXRlLCAwKTsKLSAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKHBDLT51aUF1ZGlvQml0cmF0ZSwgMCk7Ci0gICAgcFJhdGVzLT5CZWdpbkN1dFRpbWUgPSBwQy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcEMtPnVpRW5kQ3V0VGltZTsKLSAgICBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID0gcEMtPnVpTWF4RmlsZVNpemU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBNNE1DU19rU3RhdGVfU0VUICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcygpOiBXcm9uZyBTdGF0ZSAoJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgbWluIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgIHsKLSAgICAgICAgZml4ZWRfYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBdWRpb05VTEwgKQotICAgIHsKLSAgICAgICAgZml4ZWRfYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgICAgICBtaW5hdWRpb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBTVJOQiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpeGVkX2F1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgIH0KLSAgICAgICAgLy9FVlJDCi0gICAgICAgIC8vICAgICAgICBpZihwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rRVZSQykKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICBmaXhlZF9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIC8vICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOV8yX0tCUFM7Ci0gICAgICAgIC8vICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazlfMl9LQlBTOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG1jcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa01QMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7IC8qRGVmYXVsdCBtaW4gYXVkaW8gYml0cmF0ZSBmb3IgTVBFRyBsYXllciAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGJvdGggbW9ubyBhbmQgc3RlcmVvIGNoYW5uZWxzKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IChwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rMTZfS0JQUyA6IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgYXVkaW8gYml0cmF0ZSBpcyBpbiB0aGUgY29ycmVjdCByYW5nZSAqLwotICAgIGlmKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggKCBwQy0+dWlBdWRpb0JpdHJhdGUgPiAwKQotICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBtaW4gdmlkZW8gYml0cmF0ZSAqLwotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBmaXhlZF92aWRlbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gMDsKLSAgICAgICAgbWludmlkZW9iaXRyYXRlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMICkKLSAgICB7Ci0gICAgICAgIGZpeGVkX3ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgbWludmlkZW9iaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1pbnZpZGVvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxNl9LQlBTOwotICAgIH0KLQotICAgIC8qIENoZWNrIHZpZGVvIGJpdHJhdGUgaXMgaW4gdGhlIGNvcnJlY3QgcmFuZ2UgKi8KLSAgICBpZiggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgaWYoICggcEMtPnVpVmlkZW9CaXRyYXRlID4gMCkKLSAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLSAgICAgICAgfQotICAgICAgICAvKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazhfTUJQUzsKLSAgICAgICAgfQotICAgICAgICAvKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICB9Ci0KLSAgICAvKiBDaGVjayBjdXQgdGltZXMgYXJlIGluIGNvcnJlY3QgcmFuZ2UgKi8KLSAgICBpZiggKCBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbikKLSAgICAgICAgfHwgKCggcFJhdGVzLT5CZWdpbkN1dFRpbWUgPj0gcFJhdGVzLT5FbmRDdXRUaW1lKQotICAgICAgICAmJiAocFJhdGVzLT5FbmRDdXRUaW1lID4gMCkpICkKLSAgICB7Ci0gICAgICAgIHBSYXRlcy0+QmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gMDsKLSAgICB9Ci0KLSAgICBpZiggcFJhdGVzLT5FbmRDdXRUaW1lID09IDAgKQotICAgICAgICBjYWxjZHVyYXRpb24gPQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgIGVsc2UKLSAgICAgICAgY2FsY2R1cmF0aW9uID0gcFJhdGVzLT5FbmRDdXRUaW1lIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0KLSAgICAvKiBwcmlvcml0eSAxIDogbWF4IGZpbGUgc2l6ZSAqLwotICAgIGlmKCBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID09IDAgKQotICAgIHsKLSAgICAgICAgLyogd2UgY2FuIHB1dCBtYXhpbXVtIHZhbHVlcyBmb3IgYWxsIHVuZGVmaW5lZCBwYXJhbWV0ZXJzICovCi0gICAgICAgIGlmKCBwUmF0ZXMtPkVuZEN1dFRpbWUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+RW5kQ3V0VGltZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpCi0gICAgICAgICAgICAmJiAoZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOTZfS0JQUzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKQotICAgICAgICAgICAgJiYgKGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotICAgICAgICAgICAgLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogY29tcHV0ZSBtYXggZHVyYXRpb24gKi8KLSAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgLyAobWludmlkZW9iaXRyYXRlICsgbWluYXVkaW9iaXRyYXRlKSAqIDgwMDAuMCk7Ci0KLSAgICAgICAgaWYoIG1heGR1cmF0aW9uCi0gICAgICAgICAgICArIHBSYXRlcy0+QmVnaW5DdXRUaW1lID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhkdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHByaW9yaXR5IDIgOiBjdXQgdGltZXMgKi8KLSAgICAgICAgaWYoICggcFJhdGVzLT5CZWdpbkN1dFRpbWUgPiAwKSB8fCAocFJhdGVzLT5FbmRDdXRUaW1lID4gMCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhbGNkdXJhdGlvbiA9IG1heGR1cmF0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8gLyAoY2FsY2R1cmF0aW9uIC8gODAwMC4wKSk7Ci0KLSAgICAgICAgICAgIC8qIGF1ZGlvIGFuZCB2aWRlbyBiaXRyYXRlcyAqLwotICAgICAgICAgICAgaWYoICggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHNldCBhdWRpbyA9IDEvMyBhbmQgdmlkZW8gPSAyLzMgKi8KLSAgICAgICAgICAgICAgICBpZiggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZSAvIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBtaW5hdWRpb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOTZfS0JQUzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPCBtaW52aWRlb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBtaW52aWRlb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rOF9NQlBTOyAvKisgTmV3IEVuY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGVzICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDMgOiBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID49IG1pbmF1ZGlvYml0cmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW52aWRlb2JpdHJhdGUgPiBtYXhjb21iaW5lZGJpdHJhdGUpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA8IG1pbmF1ZGlvYml0cmF0ZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazhfTUJQUzsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICgoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA+IGNhbGNiaXRyYXRlKSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDQgOiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPj0gbWludmlkZW9iaXRyYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWluYXVkaW9iaXRyYXRlID4gbWF4Y29tYmluZWRiaXRyYXRlKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlIDwgbWludmlkZW9iaXRyYXRlKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBtaW52aWRlb2JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazk2X0tCUFM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID4gY2FsY2JpdHJhdGUpKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBjYWxjYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHByaW9yaXR5IDMgOiBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDQgOiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKSAqIDgwMDAuMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIG1heGR1cmF0aW9uICsgcFJhdGVzLT5CZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNkdXJhdGlvbiA9IG1heGR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBtaW4gdmlkZW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSkgKiA4MDAwLjApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtYXhkdXJhdGlvbiArIHBSYXRlcy0+QmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjZHVyYXRpb24gPSBtYXhkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2VhcmNoIG1heCBwb3NzaWJsZSB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZSA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChjYWxjZHVyYXRpb24gLyA4MDAwLjApKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPCBNNFZJREVPRURJVElOR19rOF9NQlBTKSApIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlLCArMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPD0gbWF4Y29tYmluZWRiaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDQgOiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggbWluIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBtaW5hdWRpb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0ZSBtYXggZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggbWF4ZHVyYXRpb24gKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNlYXJjaCBtYXggcG9zc2libGUgYXVkaW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAoY2FsY2R1cmF0aW9uIC8gODAwMC4wKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoICggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDwgTTRWSURFT0VESVRJTkdfazk2X0tCUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSwgKzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlIDw9IG1heGNvbWJpbmVkYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBjYWxjYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChtaW52aWRlb2JpdHJhdGUgKyBtaW5hdWRpb2JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggbWF4ZHVyYXRpb24gKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNldCBhdWRpbyA9IDEvMyBhbmQgdmlkZW8gPSAyLzMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4Y29tYmluZWRiaXRyYXRlID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKGNhbGNkdXJhdGlvbiAvIDgwMDAuMCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAzLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA+IE00VklERU9FRElUSU5HX2s5Nl9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPCBtaW52aWRlb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rOF9NQlBTOyAvKisgTmV3IEVuY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGVzICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByZWNvbXB1dGUgbWF4IGR1cmF0aW9uIHdpdGggZmluYWwgYml0cmF0ZXMgKi8KLSAgICBpZiggcFJhdGVzLT5PdXRwdXRGaWxlU2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgLyAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSkKLSAgICAgICAgICAgICogODAwMC4wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBpZiggbWF4ZHVyYXRpb24KLSAgICAgICAgKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIG1heGR1cmF0aW9uID0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgfQotCi0gICAgaWYoIHBSYXRlcy0+RW5kQ3V0VGltZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBSYXRlcy0+RW5kQ3V0VGltZSA9IHBSYXRlcy0+QmVnaW5DdXRUaW1lICsgbWF4ZHVyYXRpb247Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGNhbGNkdXJhdGlvbiA9IHBSYXRlcy0+RW5kQ3V0VGltZSAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotCi0gICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+RW5kQ3V0VGltZSA9IHBSYXRlcy0+QmVnaW5DdXRUaW1lICsgbWF4ZHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuIDogY29uc3RyYWludHMgYXJlIHRvbyBzdHJvbmcgKi8KLSAgICBpZiggcFJhdGVzLT5FbmRDdXRUaW1lID09IHBSYXRlcy0+QmVnaW5DdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgIH0KLQotICAgIC8qIGVzdGltYXRlZCByZXN1bHRpbmcgZmlsZSBzaXplICovCi0gICAgcFJhdGVzLT5PdXRwdXRGaWxlU2l6ZSA9IChNNE9TQV9VSW50MzIpKE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAqIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKQotICAgICAgICAqICgoIHBSYXRlcy0+RW5kQ3V0VGltZSAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lKSAvIDgwMDAuMCkpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgIENoZWNrIHBhcmFtZXRlcnMgdG8gc3RhcnQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLjIgZm9yIGFtciwgOCBmb3IgbXAzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT046Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBpbnB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwIGR1cmF0aW9uCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHdob2xlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGF0IGdpdmVuIGJpdHJhdGVzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19ISUdIOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA4MDAga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMgVmVyaWZ5UmF0ZXM7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQ6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljQ2hlY2tQYXJhbXNBbmRTdGFydChwQyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfU0VUICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQXVkaW8gYml0cmF0ZSBzaG91bGQgbm90IHN0YXkgdW5kZWZpbmVkIGF0IHRoaXMgcG9pbnQgKi8KLSAgICBpZiggKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgJiYgKHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgIT0gTTRFTkNPREVSX2tBdWRpb05VTEwpCi0gICAgICAgICYmIChwQy0+dWlBdWRpb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogdW5kZWZpbmVkIGF1ZGlvIGJpdHJhdGUiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICB9Ci0KLSAgICAvKiBWaWRlbyBiaXRyYXRlIHNob3VsZCBub3Qgc3RheSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCAqLwotICAgIGlmKCAoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgIT0gTTRFTkNPREVSX2tOVUxMKQotICAgICAgICAmJiAocEMtPnVpVmlkZW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydCA6IHVuZGVmaW5lZCB2aWRlbyBiaXRyYXRlIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgfQotCi0gICAgLyogU2V0IGVuZCBjdXQgdGltZSBpZiBuZWNlc3NhcnkgKG5vdCBhbiBlcnJvcikgKi8KLSAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBDLT51aUVuZEN1dFRpbWUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiBGb3JjZSBhIHJlLXNldCB0byBjaGVjayB2YWxpZGl0eSBvZiBwYXJhbWV0ZXJzICovCi0gICAgVmVyaWZ5UmF0ZXMuT3V0cHV0VmlkZW9CaXRyYXRlID0gcEMtPnVpVmlkZW9CaXRyYXRlOwotICAgIFZlcmlmeVJhdGVzLk91dHB1dEF1ZGlvQml0cmF0ZSA9IHBDLT51aUF1ZGlvQml0cmF0ZTsKLSAgICBWZXJpZnlSYXRlcy5CZWdpbkN1dFRpbWUgPSBwQy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgVmVyaWZ5UmF0ZXMuRW5kQ3V0VGltZSA9IHBDLT51aUVuZEN1dFRpbWU7Ci0gICAgVmVyaWZ5UmF0ZXMuT3V0cHV0RmlsZVNpemUgPSBwQy0+dWlNYXhGaWxlU2l6ZTsKLSAgICBWZXJpZnlSYXRlcy5PdXRwdXRWaWRlb1RpbWVzY2FsZSA9IHBDLT5vdXRwdXRWaWRlb1RpbWVzY2FsZTsKLQotICAgIGVyciA9IE00TUNTX3NldEVuY29kaW5nUGFyYW1zKHBDb250ZXh0LCAmVmVyaWZ5UmF0ZXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBwYXJhbWV0ZXJzIGNvbnNpc3RlbmN5ICovCi0gICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogaW52YWxpZCBwYXJhbWV0ZXIgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbCBpcyBPSyA6IHVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPSBwQy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlBdWRpb0JpdHJhdGU7Ci0KLSNpZmRlZiBNNE1DU19XSVRIX0ZBU1RfT1BFTgotICAgIC8qKgotICAgICogUmVtYWtlIHRoZSBvcGVuIGlmIGl0IHdhcyBkb25lIGluIGZhc3QgbW9kZSAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSApCi0gICAgewotICAgICAgICAvKiBDbG9zZSB0aGUgZmlsZSBvcGVuZWQgaW4gZmFzdCBtb2RlICovCi0gICAgICAgIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKHBDKTsKLQotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQ1JFQVRFRDsKLQotICAgICAgICAvKiBSZW9wZW4gaXQgaW4gbm9ybWFsIG1vZGUgKi8KLSAgICAgICAgZXJyID0gTTRNQ1Nfb3BlbihwQ29udGV4dCwgcEMtPnBJbnB1dEZpbGUsIHBDLT5JbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgcEMtPnBPdXRwdXRGaWxlLCBwQy0+cFRlbXBvcmFyeUZpbGUpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogTTRNQ1NfT3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotI2VuZGlmIC8qIE00TUNTX1dJVEhfRkFTVF9PUEVOICovCi0KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUkVBRFk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcFNldChNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBTZXQoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB2aWRlbyBkZWNvZGVyICovCi0gICAgZXJyID0gTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcihwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcFNldCgpOiBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoICggcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KQotICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMKSApCi0gICAgewotICAgICAgICBwQy0+YkgyNjRUcmltID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHZpZGVvIGVuY29kZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggKCBwQy0+dWlCZWdpbkN1dFRpbWUgIT0gMCkKLSAgICAgICAgJiYgKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkKLSAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCkgKQotICAgIHsKLQotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX0gyNjRQcm9jZXNzTkFMVUNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+bV9wSW5zdGFuY2UpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRTdGV0U2V0IDpwRmN0U2V0T3B0aW9uIGZhaWxlZCAgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX1NldEgyNjRQcm9jZXNzTkFMVWZjdHNQdHIsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJkgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVKTsKLQotICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50U3RldFNldCA6cEZjdFNldE9wdGlvbiBmYWlsZWQgIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKHBDLT5wVmlFbmNDdHh0LAotICAgICAgICAgICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZlbmNIZWFkZXIpOwotCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBmYWlsZWQgdG8gZ2V0IHRoZSBlbmNvZGVyIGhlYWRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBubyByZXR1cm4gaGVyZSwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBkZWFsbG9jYXRlIGFmdGVyIGNsb3NlLCBldmVuIGlmIGl0IGZhaWxzLiovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBIYW5kbGUgRFNJIGZpcnN0IGJpdHMKLSNkZWZpbmUgU1BTX1NUQVJUX1BPUyA2Ci0KLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKCBlbmNIZWFkZXItPnBCdWZbU1BTX1NUQVJUX1BPU10gPDwgOCkKLSAgICAgICAgICAgICAgICArIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TICsgMV07Ci0gICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fcEVuY29kZXJTUFMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKShlbmNIZWFkZXItPnBCdWYpICsgU1BTX1NUQVJUX1BPUyArIDI7Ci0KLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKCBlbmNIZWFkZXItPnBCdWZbU1BTX1NUQVJUX1BPUyArIDMKLSAgICAgICAgICAgICAgICArIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZV0gPDwgOCkKLSAgICAgICAgICAgICAgICArIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TICsgNAotICAgICAgICAgICAgICAgICsgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplXTsKLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRW5jb2RlclBQUyA9IChNNE9TQV9VSW50OCAqKWVuY0hlYWRlci0+cEJ1ZiArIFNQU19TVEFSVF9QT1MgKyA1Ci0gICAgICAgICAgICAgICAgKyBwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemU7Ci0KLSAgICAgICAgICAgIC8qIENoZWNrIHRoZSBEU0kgaW50ZWdyaXR5ICovCi0gICAgICAgICAgICBpZiggZW5jSGVhZGVyLT5TaXplICE9IChwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemUKLSAgICAgICAgICAgICAgICArIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSArIDUgKyBTUFNfU1RBUlRfUE9TKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoCi0gICAgICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50U3RlcFNldCBFUlJPUiA6IGludmFsaWQgU1BTIC8gUFBTICVkICVkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplLCBwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemUsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSBhdWRpbyBwcm9jZXNzaW5nICovCi0gICAgZXJyID0gTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZyhwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcFNldCgpOiBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlV3JpdGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVXcml0ZXIoKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSnVtcCB0aGUgYXVkaW8gc3RyZWFtIHRvIHRoZSBiZWdpbiBjdXQgdGltZSAoYWxsIEFVcyBhcmUgUkFQKQotICAgICogTXVzdCBiZSBkb25lIGFmdGVyIHRoZSAzZ3BwIHdyaXRlciBpbml0LCBiZWNhdXNlIGl0IG1heSB3cml0ZSB0aGUgZmlyc3QKLSAgICAqIGF1ZGlvIEFVIGluIHNvbWUgY2FzZXMgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dChwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcFNldCgpOiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCAwID09IHBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgewotICAgICAgICBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgPSAwLjA7Ci0gICAgICAgIC8qKgotICAgICAgICAqIE5vIGJlZ2luIGN1dCwgZG8gdGhlIGVuY29kaW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBSZW1lbWJlciB0aGF0IHdlIG11c3Qgc3RhcnQgdGhlIGRlY29kZS9lbmNvZGUgcHJvY2VzcyBhdCB0aGUgYmVnaW4gY3V0IHRpbWUgKi8KLSAgICAgICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gKE00T1NBX0RvdWJsZSlwQy0+dWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSnVtcGluZyAqLwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRTdGVwU2V0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgdmlkZW8gZGVjb2Rlci4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIE00TUNTX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRAotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1ZvaWQgKmRlY29kZXJVc2VyRGF0YTsKLSAgICBNNERFQ09ERVJfT3V0cHV0RmlsdGVyIEZpbHRlck9wdGlvbjsKLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBDcmVhdGUgdGhlIGRlY29kZXIsIGlmIGl0IGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldCAodG8gZ2V0IHZpZGVvIHByb3BlcnRpZXMgZm9yIGV4YW1wbGUpICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBWaURlY0N0eHQgKQotICAgIHsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgICAgICBkZWNvZGVyVXNlckRhdGEgPSBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhOwotCi0jZWxzZQotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgPyAqLwotCi0gICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSgmcEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAmcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMsIHBDLT5tX3BSZWFkZXIsCi0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0LCAmcEMtPlJlYWRlclZpZGVvQVUsIGRlY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAgICAgaWYoIChNNE9TQV9VSW50MzIpKE00RVJSX0RFQ09ERVJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQpID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPdXIgZGVjb2RlciBpcyBub3QgY29tcGF0aWJsZSB3aXRoIEgyNjMgcHJvZmlsZSBvdGhlciB0aGFuIDAuCi0gICAgICAgICAgICAqIFNvIGl0IHJldHVybnMgdGhpcyBpbnRlcm5hbCBlcnJvciBjb2RlLgotICAgICAgICAgICAgKiBXZSB0cmFuc2xhdGUgaXQgdG8gb3VyIG93biBlcnJvciBjb2RlICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RDcmVhdGUgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0gyNjQgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsdGVyT3B0aW9uLm1fcEZpbHRlckZ1bmN0aW9uID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSAmTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjA7Ci0gICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyLAotICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsdGVyT3B0aW9uKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgdmlkZW8gZW5jb2Rlci4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyBFbmNQYXJhbXM7IC8qKjwgRW5jb2RlciBhZHZhbmNlZCBwYXJhbWV0ZXJzICovCi0gICAgTTRFTkNPREVSX1BhcmFtcyBFbmNQYXJhbXMxOwotICAgIE00T1NBX0RvdWJsZSBkRnJhbWVSYXRlOyAgICAgICAgICAgIC8qKjwgdG1wIHZhcmlhYmxlICovCi0KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgIHsKLSAgICAgICAgLyogQXBwcm94aW1hdGl2ZSBjdHMgaW5jcmVtZW50ICovCi0gICAgICAgIHBDLT5kQ3RzSW5jcmVtZW50ID0gMTAwMC4wIC8gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9hdmVyYWdlRnJhbWVSYXRlOwotCi0gICAgICAgIGlmKCBwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IE51bGwgZW5jb2RpbmcsIGRvIG5vdGhpbmcuIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IE51bGwgZW5jb2RpbmcsIEktZnJhbWUgZGVmYXVsdHMuIik7Ci0KLSAgICAgICAgICAgIC8qIFNldCB1c2VmdWwgcGFyYW1ldGVycyB0byBlbmNvZGUgdGhlIGZpcnN0IEktZnJhbWUgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5JbnB1dEZvcm1hdCA9IE00RU5DT0RFUl9rSVlVVjQyMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZW5jb2RpbmdWaWRlb1Byb2ZpbGU7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmVuY29kaW5nVmlkZW9MZXZlbDsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IHVua25vd24gZW5jb2RpbmcgdmlkZW8gZm9ybWF0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJWQpLCByZXR1cm5pbmcgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5CaXRyYXRlID0gcEMtPnVpRW5jVmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKiBkbyBub3QgY29uc3RyYWluIHRoZSBJLWZyYW1lICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGU7Ci0KLSAgICAgICAgICAgIC8qIE90aGVyIGVuY29kaW5nIHNldHRpbmdzIChxdWl0ZSBhbGwgZHVtbXkuLi4pICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgPSAwOyAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpVmVydGljYWxTZWFyY2hSYW5nZSA9IDA7ICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7IC8qIG5vIGVycm9yIHJlc2lsaWVuY2UgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgPSAwOyAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlNb3Rpb25Fc3RpbWF0aW9uVG9vbHMgPQotICAgICAgICAgICAgICAgIDA7IC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLmJBY1ByZWRpY3Rpb24gPSBNNE9TQV9UUlVFOyAgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSA1OyAgIC8qIGluaXRpYWwgUVAgPSA1ICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKiBubyBkYXRhIHBhcnRpdGlvbmluZyAqLwotCi0gICAgICAgICAgICAvKiBSYXRlIGZhY3RvciAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogTm9ybWFsIGVuY29kaW5nLCBzZXQgZnVsbCBjb25maWcuIik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IGVuY29kZXIgc2hlbGwgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gTUNTIHNldHRpbmdzICovCi0gICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdDsKLSAgICAgICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgICAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlID0gcEMtPmVuY29kaW5nVmlkZW9Qcm9maWxlOwotICAgICAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmVuY29kaW5nVmlkZW9MZXZlbDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBmcmFtZSBzaXplICovCi0gICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGg7Ci0gICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBiaXRyYXRlIGhhcyBiZWVuIHByZXZpb3VzbHkgY29tcHV0ZWQgKi8KLSAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTUNTIHVzZSB0aGUgInRydWUiIGNvcmUgaW50ZXJuYWwgYml0cmF0ZSByZWd1bGF0aW9uICovCi0gICAgICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdGhlciBlbmNvZGVyIHNldHRpbmdzICovCi0KLSAgICAgICAgRW5jUGFyYW1zLnVpSG9yaXpvbnRhbFNlYXJjaFJhbmdlID0gMDsgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpVmVydGljYWxTZWFyY2hSYW5nZSA9IDA7ICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgICAgICBFbmNQYXJhbXMudWlJVm9wUGVyaW9kID0gMDsgICAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICBFbmNQYXJhbXMudWlNb3Rpb25Fc3RpbWF0aW9uVG9vbHMgPQotICAgICAgICAgICAgMDsgLyogTTRWX01PVElPTl9FU1RfVE9PTFNfQUxMICovCi0gICAgICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgIC8qIHVzZSBBQyBwcmVkaWN0aW9uICovCi0gICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgIC8qIGluaXRpYWwgUVAgPSAxMCAqLwotICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPQotICAgICAgICAgICAgTTRPU0FfRkFMU0U7IC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBlbmNvZGVyIGZyYW1lIHJhdGUgYW5kIHJhdGUgZmFjdG9yICovCi0gICAgICAgIEVuY1BhcmFtcy5GcmFtZVJhdGUgPSBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZTsKLSAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPm91dHB1dFZpZGVvVGltZXNjYWxlOwotCi0gICAgICAgIHN3aXRjaCggcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDUuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazdfNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDcuNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMTAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAxMi41OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTVfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAxNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjBfRlBTOiAvKio8IE1QRUctNCBvbmx5ICovCi0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDIwLjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2syNV9GUFM6IC8qKjwgTVBFRy00IG9ubHkgKi8KLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMjUuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMzAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IHVua25vd24gZW5jb2RpbmcgdmlkZW8gZnJhbWUgcmF0ZVwKLSAgICAgICAgICAgICAgICAgICAgKDB4JXgpLCByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0d28gZnJhbWVzICovCi0gICAgICAgIGlmKCBNNEVOQ09ERVJfa0gyNjMgPT0gRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5kQ3RzSW5jcmVtZW50ID0gMTAwMS4wIC8gZEZyYW1lUmF0ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qKjwgTVBFRzQgb3IgSC4yNjQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAxMDAwLjAgLyBkRnJhbWVSYXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGltaXQgdGhlIHZpZGVvIGJpdHJhdGUgYWNjb3JkaW5nIHRvIGVuY29kZXIgcHJvZmlsZQotICAgICAqIGFuZCBsZXZlbCAqLwotICAgIGVyciA9IE00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsKCZFbmNQYXJhbXMpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyOiBsaW1pdCBiaXRyYXRlIHJldHVybmVkIGVyciBcCi0gICAgICAgICAgICAgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDcmVhdGUgdmlkZW8gZW5jb2RlciAqLwotICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5wVmlFbmNDdHh0LAotICAgICAgICBwQy0+cFdyaXRlckRhdGFGY3RzLCBcCi0gICAgICAgIE00TUNTX2ludEFwcGx5VlBQLCBwQywgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEksIFwKLSAgICAgICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgLyoqPCBXZSBwdXQgdGhlIE1DUyBjb250ZXh0IGluIHBsYWNlIG9mIHRoZSBWUFAgY29udGV4dCAqLwotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyOiBFbmNvZGVySW50LT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJDbG9zZWQ7Ci0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkgyNjRUcmltICkKLSAgICAgICAgLy9pZigoTTRFTkNPREVSX2tOVUxMID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KQotICAgICAgICAvLyAgICAmJiAoTTRWSURFT0VESVRJTkdfa0gyNjQgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKSkKLSAgICB7Ci0gICAgICAgIEVuY1BhcmFtczEuSW5wdXRGb3JtYXQgPSBFbmNQYXJhbXMuSW5wdXRGb3JtYXQ7Ci0gICAgICAgIC8vRW5jUGFyYW1zMS5JbnB1dEZyYW1lV2lkdGggPSBFbmNQYXJhbXMuSW5wdXRGcmFtZVdpZHRoOwotICAgICAgICAvL0VuY1BhcmFtczEuSW5wdXRGcmFtZUhlaWdodCA9IEVuY1BhcmFtcy5JbnB1dEZyYW1lSGVpZ2h0OwotICAgICAgICBFbmNQYXJhbXMxLkZyYW1lV2lkdGggPSBFbmNQYXJhbXMuRnJhbWVXaWR0aDsKLSAgICAgICAgRW5jUGFyYW1zMS5GcmFtZUhlaWdodCA9IEVuY1BhcmFtcy5GcmFtZUhlaWdodDsKLSAgICAgICAgRW5jUGFyYW1zMS52aWRlb1Byb2ZpbGU9IEVuY1BhcmFtcy52aWRlb1Byb2ZpbGU7Ci0gICAgICAgIEVuY1BhcmFtczEudmlkZW9MZXZlbD0gRW5jUGFyYW1zLnZpZGVvTGV2ZWw7Ci0gICAgICAgIEVuY1BhcmFtczEuQml0cmF0ZSA9IEVuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICBFbmNQYXJhbXMxLkZyYW1lUmF0ZSA9IEVuY1BhcmFtcy5GcmFtZVJhdGU7Ci0gICAgICAgIEVuY1BhcmFtczEuRm9ybWF0ID0gTTRFTkNPREVSX2tIMjY0OyAvL0VuY1BhcmFtcy5Gb3JtYXQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJtY3MgZW5jb2RlciBvcGVuIHByb2ZpbGUgOiVkLCBsZXZlbCAlZCIsCi0gICAgICAgICAgICBFbmNQYXJhbXMxLnZpZGVvUHJvZmlsZSwgRW5jUGFyYW1zMS52aWRlb0xldmVsKTsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgICZwQy0+V3JpdGVyVmlkZW9BVSwgJkVuY1BhcmFtczEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigibWNzIGVuY29kZXIgb3BlbiBBZHYgcHJvZmlsZSA6JWQsIGxldmVsICVkIiwKLSAgICAgICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUsIEVuY1BhcmFtcy52aWRlb0xldmVsKTsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgICZwQy0+V3JpdGVyVmlkZW9BVSwgJkVuY1BhcmFtcyk7Ci0gICAgfQotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IEVuY29kZXJJbnQtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlclN0b3BwZWQ7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydChwQy0+cFZpRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IEVuY29kZXJJbnQtPnBGY3RTdGFydCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogVmlkZW8gcmVzaXplIG1hbmFnZW1lbnQgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKgotICAgICogQ29tcGFyZSB2aWRlbyBpbnB1dCBzaXplIGFuZCB2aWRlbyBvdXRwdXQgc2l6ZSB0byBjaGVjayBpZiByZXNpemUgaXMgbmVlZGVkICovCi0gICAgaWYoICggKE00T1NBX1VJbnQzMilFbmNQYXJhbXMuRnJhbWVXaWR0aAotICAgICAgICAhPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGgpCi0gICAgICAgIHx8ICgoTTRPU0FfVUludDMyKUVuY1BhcmFtcy5GcmFtZUhlaWdodAotICAgICAgICAhPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvSGVpZ2h0KSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIHZpZGVvIHBsYW5lIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBkZWNvZGVkIGltYWdlIGJlZm9yZQotICAgICAgICAgcmVzaXppbmcgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZSA9Ci0gICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMyAqIHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFByZVJlc2l6ZUZyYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWUsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSB0aGUgWSBwbGFuZSAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgbV92aWRlb1dpZHRoOyAvKio8IGlucHV0IHdpZHRoICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQgPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fdmlkZW9IZWlnaHQ7IC8qKjwgaW5wdXQgaGVpZ2h0ICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aDsgLyoqPCBzaW1wbGUgY2FzZTogc3RyaWRlIGVxdWFscyB3aWR0aCAqLwotCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPQotICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfc3RyaWRlIFwKLSAgICAgICAgICAgICpwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0LCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6XAotICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBVIHBsYW5lICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoID0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoCi0gICAgICAgICAgICA+PiAxOyAvKio8IFUgd2lkdGggaXMgaGFsZiB0aGUgWSB3aWR0aCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0ID0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodAotICAgICAgICAgICAgPj4gMTsgLyoqPCBVIGhlaWdodCBpcyBoYWxmIHRoZSBZIGhlaWdodCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGg7IC8qKjwgc2ltcGxlIGNhc2U6IHN0cmlkZSBlcXVhbHMgd2lkdGggKi8KLQotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X3N0cmlkZSBcCi0gICAgICAgICAgICAqcEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X2hlaWdodCwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBWIHBsYW5lICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X3dpZHRoID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGg7IC8qKjwgViB3aWR0aCBlcXVhbHMgVSB3aWR0aCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfaGVpZ2h0ID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0OyAvKio8IFYgaGVpZ2h0IGVxdWFscyBVIGhlaWdodCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGg7IC8qKjwgc2ltcGxlIGNhc2U6IHN0cmlkZSBlcXVhbHMgd2lkdGggKi8KLQotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSBcCi0gICAgICAgICAgICAqcEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X2hlaWdodCwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpOwotICogQGJyaWVmICAgIFByZXBhcmUgdGhlIEFBQyBkZWNvZGVyLCB0aGUgU1JDIGFuZCB0aGUgQU1SLU5CIGVuY29kZXIgYW5kIHRoZSBNUDMgZW5jb2Rlci4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgU1NSQ19SZXR1cm5TdGF0dXNfZW4KLSAgICAgICAgUmV0dXJuU3RhdHVzOyAvKiBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9JTlQxNiBOclNhbXBsZXNNaW4gPQotICAgICAgICAwOyAvKiBNaW5pbWFsIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBpbnB1dCBvciBvbiB0aGUgb3V0cHV0ICovCi0gICAgTFZNX0lOVDMyIFNjcmF0Y2hTaXplOyAvKiBUaGUgc2l6ZSBvZiB0aGUgc2NyYXRjaCBtZW1vcnkgICAgICAgICAgICAgICAqLwotICAgIExWTV9JTlQxNgotICAgICAgICAqcElucHV0SW5TY3JhdGNoOyAvKiBQb2ludGVyIHRvIGlucHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAqLwotICAgIExWTV9JTlQxNgotICAgICAgICAqcE91dHB1dEluU2NyYXRjaDsgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgKi8KLSAgICBTU1JDX1BhcmFtc190IHNzcmNQYXJhbXM7ICAgICAgICAgIC8qIE1lbW9yeSBmb3IgaW5pdCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgTUNTX0RVTVBfUENNX1RPX0ZJTEUKLQotICAgIGZpbGVfYXVfcmVhZGVyID0gZm9wZW4oIm1jc19SZWFkZXJPdXRwdXQucmF3IiwgIndiIik7Ci0gICAgZmlsZV9wY21fZGVjb2RlciA9IGZvcGVuKCJtY3NfRGVjb2Rlck91dHB1dC5wY20iLCAid2IiKTsKLSAgICBmaWxlX3BjbV9lbmNvZGVyID0gZm9wZW4oIm1jc19FbmNvZGVySW5wdXQucGNtIiwgIndiIik7Ci0KLSNlbmRpZgotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCk6IE51bGwgZW5jb2RpbmcsIGRvIG5vdGhpbmcuIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgQ3JlYXRlIGFuZCAic3RhcnQiIHRoZSBkZWNvZGVyIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+bV9wQXVkaW9EZWNvZGVyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKTogRmFpbHMgdG8gaW5pdGlhdGUgdGhlIGF1ZGlvIGRlY29kZXIuIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoJnBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApIHsKLSAgICAgICAgLyogQU1SIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTRWSURFT0VESVRJTkdfa0VWUkMgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkgewotICAgICAgICAvKiBFVlJDIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTRWSURFT0VESVRJTkdfa01QMyA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIC8qIE1QMyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEFBQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLSAgICAgICAgTTRfQWFjRGVjb2RlckNvbmZpZyBBYWNEZWNQYXJhbTsKLQotICAgICAgICBBYWNEZWNQYXJhbS5tX0FBQ0RlY29kZXJQcm9maWxlID0gQUFDX2tBQUM7Ci0gICAgICAgIEFhY0RlY1BhcmFtLm1fRG93blNhbXBsaW5nTW9kZSA9IEFBQ19rRFNfT0ZGOwotCi0gICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQU1STkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGb3IgdGhpcyB2ZXJzaW9uLCB3ZSBlbmNvZGUgb25seSBpbiBBQUMgKi8KLSAgICAgICAgICAgIGlmKCBNNEVOQ09ERVJfa01vbm8gPT0gcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFhY0RlY1BhcmFtLm1fT3V0cHV0TW9kZSA9IEFBQ19rTW9ubzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa1N0ZXJlbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfVXNlclBhcmFtLCAoTTRPU0FfRGF0YU9wdGlvbikgJkFhY0RlY1BhcmFtKTsKLSAgICB9Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLCAoTTRPU0FfRGF0YU9wdGlvbikgcEMtPm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9BVSwgKE00T1NBX0RhdGFPcHRpb24pICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCBpbiBhbGwgZGVjb2RlcnMgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPQotICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aURlY29kZWRQY21TaXplOwotICAgICAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJBdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUiKTsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCk6XAotICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IFNldCB0aGUgU1NSQyBwYXJhbWV0ZXJzIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIHN3aXRjaCggcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgewotICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfODAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTEwMjU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzEyMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMjIwNTA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfNDQxMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyOiBpbnZhbGlkIGlucHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3kgKCVkIEh6KSxcCi0gICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZIiwKLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5KTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZOwotICAgIH0KLQotICAgIGlmKCAxID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyApCi0gICAgewotICAgICAgICBzc3JjUGFyYW1zLlNTUkNfTnJPZkNoYW5uZWxzID0gTFZNX01PTk87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fU1RFUkVPOwotICAgIH0KLQotICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBQUMKLSAgICAgICAgfHwgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa01QMyApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rODAwMEh6OgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazExMDI1SHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18xMTAyNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEyMDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18xMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazE2MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazIyMDUwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazI0MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazMyMDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazQ0MTAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazQ4MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6IGludmFsaWQgb3V0cHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3kgXAotICAgICAgICAgICAgICAgICAgICAoJWQgSHopLCByZXR1cm5pbmcgTTRNQ1NfRVJSX0lOVkFMSURfQUFDX1NBTVBMSU5HX0ZSRVFVRU5DWSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfODAwMDsKLSAgICB9Ci0KLQotCi0gICAgUmV0dXJuU3RhdHVzID0gMDsKLQotICAgIHN3aXRjaCggc3NyY1BhcmFtcy5TU1JDX0ZzX0luICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gNDQxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTYwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gNjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gODgyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMzIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ0MTAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDE3NjQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU180ODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFJldHVyblN0YXR1cyA9IC0xOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3dpdGNoKCBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDMyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzExMDI1OgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA0NDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTYwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDY0MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzIyMDUwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18yNDAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMzIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDEyODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU180NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFJldHVyblN0YXR1cyA9IC0xOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0KLQotICAgIGlmKCBSZXR1cm5TdGF0dXMgIT0gU1NSQ19PSyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nOlwKLSAgICAgICAgICAgICBFcnJvciBjb2RlICVkIHJldHVybmVkIGJ5IHRoZSBTU1JDX0dldE5yU2FtcGxlcyBmdW5jdGlvbiIsCi0gICAgICAgICAgICBSZXR1cm5TdGF0dXMpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOwotICAgIH0KLQotICAgIE5yU2FtcGxlc01pbiA9Ci0gICAgICAgIChMVk1fSU5UMTYpKChzc3JjUGFyYW1zLk5yU2FtcGxlc0luID4gc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQpCi0gICAgICAgID8gc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgOiBzc3JjUGFyYW1zLk5yU2FtcGxlc0luKTsKLQotICAgIHdoaWxlKCBOclNhbXBsZXNNaW4gPCBNNE1DU19TU1JDX01JTkJMT0NLU0laRSApCi0gICAgeyAvKiBEb24ndCB0YWtlIGJsb2NrcyBzbWFsbGVyIHRoYXQgdGhlIG1pbmltYWwgYmxvY2sgc2l6ZSAqLwotICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA8PCAxKTsKLSAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA8PCAxKTsKLSAgICAgICAgTnJTYW1wbGVzTWluID0gKExWTV9JTlQxNikoTnJTYW1wbGVzTWluIDw8IDEpOwotICAgIH0KLQotCi0gICAgcEMtPmlTc3JjTmJTYW1wbEluID0gKExWTV9JTlQxNikoCi0gICAgICAgIHNzcmNQYXJhbXMuCi0gICAgICAgIE5yU2FtcGxlc0luKTsgLyogbXVsdGlwbGljYXRpb24gYnkgTnJPZkNoYW5uZWxzIGlzIGRvbmUgYmVsb3cgKi8KLSAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQpOwotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBpbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgIHBDLT5wU3NyY0J1ZmZlckluID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpIFwKLSAgICAgICAgKnBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscywgTTRNQ1MsCi0gICAgICAgIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVySW4iKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTpcCi0gICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVySW4sIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgXAotICAgICAgICAqcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzLCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCk6XAotICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwU3NyY0J1ZmZlck91dCwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLQotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoCi0gICAgICAgIDE2LCAvKmdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50Ki8KLSAgICAgICAgKE00T1NBX0ludDE2KXBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscy8qc3NyY1BhcmFtcy5TU1JDX05yT2ZDaGFubmVscyovLAotICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kpLypzc3JjUGFyYW1zLlNTUkNfRnNfT3V0Ki8sIDEpOwotCi0gICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wTFZBdWRpb1Jlc2FtcGxlcikKLSAgICAgewotICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICB9Ci0KLSAgICBMVkF1ZGlvc2V0U2FtcGxlUmF0ZShwQy0+cExWQXVkaW9SZXNhbXBsZXIsCi0gICAgICAgIC8qZ0lucHV0UGFyYW1zLmx2SW5TYW1wbGVSYXRlKi8KLSAgICAgICAgLypwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kvKnNzcmNQYXJhbXMuU1NSQ19Gc19JbiovKTsKLQotICAgIExWQXVkaW9zZXRWb2x1bWUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLCAoTTRPU0FfSW50MTYpKDB4MTAwMCAvKiAweDdmZmYgKi8pLAotICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMC8qMHg3ZmZmKi8pKTsKLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IEluaXQgdGhlIGF1ZGlvIGVuY29kZXIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBhdWRpbyBlbmNvZGVyICovCi0KLSAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgcEMtPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgZXJyID0gcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgJnBDLT5BdWRpb0VuY1BhcmFtcywgJnBDLT5wQXVkaW9FbmNEU0ksCi0gICAgICAgIE00T1NBX05VTEwgLyogbm8gZ3JhYmJpbmcgKi8pOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgaW5wdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZW5jb2RlciAqLwotICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSBNNE1DU19QQ01fQU1SX0dSQU5VTEFSSVRZX1NBTVBMRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQUFDOgotICAgICAgICAgICAgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5ID0gTTRNQ1NfUENNX0FBQ19HUkFOVUxBUklUWV9TQU1QTEVTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUDM6Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSBNNE1DU19QQ01fTVAzX0dSQU5VTEFSSVRZX1NBTVBMRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmKCBNNEVOQ09ERVJfa01vbm8gPT0gcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gKQotICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgKj0gc2l6ZW9mKHNob3J0KTsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSAqPSBzaXplb2Yoc2hvcnQpICogMjsKLQotICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHksIE00TUNTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciIpOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVXcml0ZXIoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgd3JpdGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVXcml0ZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpVmVyc2lvbjsgLyoqPCBUbyB3cml0ZSBjb21wb25lbnQgdmVyc2lvbiBpbiAzZ3Agd3JpdGVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggcERTSSA9IE00T1NBX05VTEw7IC8qKjwgVG8gY3JlYXRlIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8gKi8KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlIG9wdGlvblZhbHVlOyAvKio8IEZvciB0aGUgc2V0b3B0aW9uIGNhbGxzICovCi0gICAgTTRPU0FfVUludDMyIFRhcmdldGVkRmlsZVNpemU7Ci0gICAgTTRPU0FfQm9vbCBiTVVMUFBTU1BTID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIHdyaXRlciAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4oJnBDLT5wV3JpdGVyQ29udGV4dCwgcEMtPnBPdXRwdXRGaWxlLAotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwQy0+cFRlbXBvcmFyeUZpbGUsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdG8gdGhlIHdyaXRlciBjb250ZXh0IGluIHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBwQy0+cFdyaXRlckNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvZHVjdCBkZXNjcmlwdGlvbiBzdHJpbmcgaW4gdGhlIHdyaXR0ZW4gZmlsZSAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZywgKE00T1NBX0RhdGFPcHRpb24pIk5YUC1TVyA6IE1DUyAgICAiKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjpcCi0gICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvZHVjdCB2ZXJzaW9uIGluIHRoZSB3cml0dGVuIGZpbGUgKi8KLSAgICB1aVZlcnNpb24gPQotICAgICAgICBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SICogMTAwICsgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUiAqIDEwCi0gICAgICAgICsgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLSAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLCAoTTRPU0FfRGF0YU9wdGlvbikgJnVpVmVyc2lvbik7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IFwKLSAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgYSB2aWRlbyBpbnB1dCwgYWxsb2NhdGUgYW5kIGZpbGwgdGhlIHZpZGVvIHN0cmVhbSBzdHJ1Y3R1cmVzIGZvciB0aGUgd3JpdGVyICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEZpbGwgVmlkZW8gcHJvcGVydGllcyBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uaGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLndpZHRoID0gcEMtPkVuY29kaW5nV2lkdGg7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uZnBzID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgTTRPU0FfTlVMTDsgLyoqPCBXaWxsIGJlIHVwZGF0ZWQgbGF0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IDA7IC8qKjwgV2lsbCBiZSB1cGRhdGVkIGxhdGVyICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogRmlsbCBWaWRlbyBzdHJlYW0gZGVzY3JpcHRpb24gc3RydWN0dXJlIGZvciB0aGUgQWRkU3RyZWFtIG1ldGhvZCAqLwotICAgICAgICBzd2l0Y2goIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QRUc0OgotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjM6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa05VTEw6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjY0OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBjYXNlIGlucHV0PU00RU5DT0RFUl9rTlVMTCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKio8IEl0IHNob3VsZCBuZXZlciBoYXBwZW4sIGFscmVhZHkgdGVzdGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiB1bmtub3duIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVmlkZW8gYml0cmF0ZSB2YWx1ZSB3aWxsIGJlIHRoZSByZWFsIHZhbHVlICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfSW50MzIpcEMtPnVpRW5jVmlkZW9CaXRyYXRlOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0ubWF4Qml0cmF0ZSA9IChNNE9TQV9JbnQzMilwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogbW9zdCBvdGhlciBwYXJhbWV0ZXJzIGFyZSAiZHVtbXkiICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS50aW1lU2NhbGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKTsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJihwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgRW5jb2RlciBIZWFkZXIgcHJvcGVydGllcyBmb3IgVmlkZW8gc3RyZWFtIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggTTRFTkNPREVSX2tIMjYzID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENyZWF0ZXMgdGhlIEgyNjMgRFNJICovCi0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0KLSAgICAgICAgICAgICAgICA3OyAvKio8IEgyNjMgb3V0cHV0IERTSSBpcyBhbHdheXMgNyBieXRlcyAqLwotICAgICAgICAgICAgcERTSSA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoNywgTTRNQ1MsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgKikicEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiAoRFNJIEgyNjMpIik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBEU0kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlV3JpdGVyKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBwRFNJIChIMjYzKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVmVuZG9yIGlzIE5YUCBTb2Z0d2FyZTogTiwgWCwgUCwgUy4gKi8KLSAgICAgICAgICAgIHBEU0lbMF0gPSAnTic7Ci0gICAgICAgICAgICBwRFNJWzFdID0gJ1gnOwotICAgICAgICAgICAgcERTSVsyXSA9ICdQJzsKLSAgICAgICAgICAgIHBEU0lbM10gPSAnUyc7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBEZWNvZGVyIHZlcnNpb24gaXMgMCAqLwotICAgICAgICAgICAgcERTSVs0XSA9IDA7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBMZXZlbCBpcyB0aGUgc2l4dGggYnl0ZSBvZiB0aGUgRFNJLiAqLwotICAgICAgICAgICAgc3dpdGNoKCBwQy0+RW5jb2RpbmdXaWR0aCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfU1FDSUZfV2lkdGg6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfUUNJRl9XaWR0aDoKLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlIDw9IE00RU5DT0RFUl9rNjRfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazE1X0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2sxMjhfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazE1X0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gNDU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2sxMjhfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazMwX0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gMjA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2szODRfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazMwX0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gMzA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw9IE00RU5DT0RFUl9rODAwX0tCUFMvKjIwNDgqLykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazMwX0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gNDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9DSUZfV2lkdGg6Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazEyOF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMTVfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAyMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazM4NF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAzMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRFTkNPREVSX2s4MDBfS0JQUy8qMjA0OCovKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSA0MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFByb2ZpbGUgaXMgdGhlIHNldmVudGggYnl0ZSBvZiB0aGUgRFNJLiAqLwotICAgICAgICAgICAgcERTSVs2XSA9IDA7Ci0KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPSBwRFNJOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00RU5DT0RFUl9rTlVMTCA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHdlIGNvcHkgdGhlIHN0cmVhbSBmcm9tIHRoZSBpbnB1dCwgd2UgY29weSBpdHMgRFNJICovCi0KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLlNpemUgPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0KLSAgICAgICAgfQotICAgICAgICAvKiBvdGhlcndpc2UgKE1QRUc0KSwgdGhlIERTSSB3aWxsIGJlIHJlY292ZXJlZCBmcm9tIHRoZSBlbmNvZGVyIGxhdGVyIG9uLiAqLwotCi0gICAgICAgIC8qK0NSTFY2Nzc1IC0gSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIGlmKCBwQy0+YkgyNjRUcmltID09IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiTVVMUFBTU1BTID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTVVMX1BQU19TUFMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZiTVVMUFBTU1BTKTsKLQotICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgJiYgKCggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAgICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjpcCi0gICAgICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTVVMX1BQU19TUFMpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKi1DUkxWNjc3NSAtIEguMjY0IFRyaW1taW5nICAqLwotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0QWRkU3RyZWFtKHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVwZGF0ZSBBVSBwcm9wZXJ0aWVzIGZvciB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuc3RyZWFtID0gJihwQy0+V3JpdGVyVmlkZW9TdHJlYW0pOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSAwOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5DVFMgPSAwOyAvKiogUmVzZXQgdGltZSAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5EVFMgPSAwOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLm5iRnJhZyA9IDA7IC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHdyaXRlciBtYXggdmlkZW8gQVUgc2l6ZSAqLwotICAgICAgICBvcHRpb25WYWx1ZS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlID0gcEMtPnVpVmlkZW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogXAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBjaHVuayBzaXplICovCi0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlID0gcEMtPnVpVmlkZW9NYXhDaHVuY2tTaXplOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6XAotICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCB2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIGFuIGF1ZGlvIGlucHV0LCBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgYXVkaW8gc3RyZWFtIHN0cnVjdHVyZXMgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyBzdHJlYW1BdWRpb0luZm87Ci0KLSAgICAgICAgc3RyZWFtQXVkaW9JbmZvLm5iU2FtcGxlc1BlclNlYyA9IDA7IC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLSAgICAgICAgc3RyZWFtQXVkaW9JbmZvLm5iQml0c1BlclNhbXBsZSA9IDA7IC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLSAgICAgICAgc3RyZWFtQXVkaW9JbmZvLm5iQ2hhbm5lbHMgPSAxOyAgICAgIC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLQotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgMDsgLyoqPCBJdCBpcyBub3QgdXNlZCBieSB0aGUgc2hlbGwsIHRoZSBEU0kgaXMgdGFrZW4gaW50byBhY2NvdW50IGluc3RlYWQgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBGaWxsIEF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5tYXhCaXRyYXRlID0gcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG91dHB1dCBmb3JtYXQqLwotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QMzoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBdWRpb05VTEw6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tFVlJDOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tQQ006Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyoqPCBJdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBhbHJlYWR5IHRlc3RlZCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogXAotICAgICAgICAgICAgICAgICAgICB1bmtub3duIGZvcm1hdCAoMHgleCksIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTUNTIHByb2R1Y2VzIG9ubHkgQU1SLU5CIG91dHB1dCAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtSUQgPSBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0udGltZVNjYWxlID0gcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeTsKLQotICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHdlIGNvcHkgdGhlIHN0cmVhbSBmcm9tIHRoZSBpbnB1dCwgd2UgY29weSBpdHMgRFNJICovCi0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLlNpemUgPSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+cEF1ZGlvRW5jRFNJLnBJbmZvICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFVzZSB0aGUgRFNJIGdpdmVuIGJ5IHRoZSBlbmNvZGVyIG9wZW4oKSAqLwotICAgICAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wQXVkaW9FbmNEU0kuaW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5wQnVmID0gcEMtPnBBdWRpb0VuY0RTSS5wSW5mbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXcml0ZXIgd2lsbCBwdXQgYSBkZWZhdWx0IFBoaWxpcHMgRFNJICovCi0gICAgICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gMDsKLSAgICAgICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogT3VyIHdyaXRlciBzaGVsbCBpbnRlcmZhY2UgaXMgYSBsaXR0bGUgdHJpY2t5OiB3ZSBwdXQgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcwotICAgICAgICAgaW4gdGhlIERTSSBwb2ludGVyLi4uICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpICZzdHJlYW1BdWRpb0luZm87Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIHRoZSBhdWRpbyBzdHJlYW0gdG8gdGhlIHdyaXRlciAqLwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0QWRkU3RyZWFtKGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTGluayB0aGUgQVUgYW5kIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc3RyZWFtID0gJihwQy0+V3JpdGVyQXVkaW9TdHJlYW0pOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSAwOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5DVFMgPSAwOyAvKiogUmVzZXQgdGltZSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5EVFMgPSAwOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgPSAwOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5uYkZyYWcgPSAwOyAvKiogTm8gZnJhZ21lbnQgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuZnJhZyA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgYXVkaW8gbWF4IEFVIHNpemUgKi8KLSAgICAgICAgLyogQXMgbWF4IGJpdHJhdGUgaXMgbm93IDMyMGticHMgaW5zdGVhZCBvZiAxMjhrYnBzLCBtYXggQVUKLSAgICAgICAgICogc2l6ZSBoYXMgdG8gYmUgaW5jcmVhc2VkIGFkYXB0IHRoZSBtYXggQVUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIGFuZCB0aGUKLSAgICAgICAgICogY2hhbm5lbHMgbnVtYmVycyovCi0gICAgICAgIC8qIEFmdGVyIHRlc3RzLCBhIG1hcmdpbiBvZiAzIGlzIHRha2VuICgyIHdhcyBub3QgZW5vdWdoIGFuZCByYWlzZXMgdG8gbWVtb3J5IG92ZXJ3cml0ZSkKLSAgICAgICAgICovCi0gICAgICAgIC8vcEMtPnVpQXVkaW9NYXhBdVNpemUgPSBNNE1DU19BVURJT19NQVhfQVVfU0laRTsKLSAgICAgICAgc3dpdGNoKCBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX1BDTV9BTVJfR1JBTlVMQVJJVFlfU0FNUExFUwotICAgICAgICAgICAgICAgICAgICAqICgoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzaG9ydCkpICsgMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QMzoKLSAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX1BDTV9NUDNfR1JBTlVMQVJJVFlfU0FNUExFUwotICAgICAgICAgICAgICAgICAgICAqICgoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzaG9ydCkpICsgMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX1BDTV9BQUNfR1JBTlVMQVJJVFlfU0FNUExFUwotICAgICAgICAgICAgICAgICAgICAqICgoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzaG9ydCkpICsgMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLypjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX0VWUkNfR1JBTlVMQVJJVFlfU0FNUExFUyoKLSAgICAgICAgICAgICAgICAoKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyAqIHNpemVvZihzaG9ydCkpKzMpOwotICAgICAgICAgICAgICAgIGJyZWFrOyovCi0gICAgICAgICAgICBkZWZhdWx0OiAvKio8IEl0IHNob3VsZCBuZXZlciBoYXBwZW4sIGFscmVhZHkgdGVzdGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiB1bmtub3duIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uVmFsdWUuc3RyZWFtSUQgPSBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IHBDLT51aUF1ZGlvTWF4QXVTaXplOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4QVVTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4QVVTaXplKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBNNE1DU19BVURJT19NQVhfQ0hVTktfU0laRTsKLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihhdWRpbyxcCi0gICAgICAgICAgICAgICAgTTRXUklURVJfa01heENodW5ja1NpemUpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogU2V0IHRoZSBsaW1pdGF0aW9uIHNpemUgb2YgdGhlIHdyaXRlciAqLwotICAgIFRhcmdldGVkRmlsZVNpemUgPSBwQy0+dWlNYXhGaWxlU2l6ZTsKLSAgICAvKiBhZGQgMSBrQiBtYXJnaW4gKi8KLSAgICBpZiggVGFyZ2V0ZWRGaWxlU2l6ZSA+IDgxOTIgKQotICAgICAgICBUYXJnZXRlZEZpbGVTaXplIC09IDEwMjQ7Ci0KLSAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlU2l6ZSwKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZUYXJnZXRlZEZpbGVTaXplKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb25cCi0gICAgICAgICAgICAoTTRXUklURVJfa01heEZpbGVTaXplKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgc3RyZWFtIHJlZ2lzdGVyaW5nIGluIG9yZGVyIHRvIGJlIHJlYWR5IHRvIHdyaXRlIGRhdGEgKi8KLSAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTdGFydFdyaXRpbmcocEMtPnBXcml0ZXJDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFByZXBhcmVXcml0ZXIoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgRE8gdGhlIGF1ZGlvIGJlZ2luIGN1dC4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQzMiBpQ3RzOwotICAgIE00T1NBX1VJbnQzMiB1aUZyYW1lU2l6ZTsKLQotICAgIGlmKCBwQy0+bm9hdWRpbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBhbiBhdWRpbyBiZWdpbiBjdXQgaXMgbmVlZGVkICovCi0gICAgaWYoICggTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSB8fCAoMCA9PSBwQy0+dWlCZWdpbkN1dFRpbWUpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIChhKSIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEp1bXAgYXQgdGhlIGJlZ2luIGN1dCB0aW1lICovCi0gICAgaUN0cyA9IHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RKdW1wKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLCAmaUN0cyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQ6IG1fcEZjdEp1bXAoQXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJlbWVtYmVyIGF1ZGlvIGJlZ2luIGN1dCBvZmZzZXQgKi8KLSAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0ID0gaUN0czsKLQotICAgIC8qKgotICAgICogQU1SLU5CICYgRVZSQzogdGhlcmUgbWF5IGJlIG1hbnkgZnJhbWVzIHBlciBBVS4KLSAgICAqIEluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIHNsaWNlIHRoZSBmaXJzdCBBVSB0byBrZWVwIHRoZSAyMCBtcyBjdXQgcHJlY2lzaW9uICovCi0gICAgaWYoICggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIElmIHRoZSBuZXh0IGZyYW1lIENUUyBpcyBsb3dlciB0aGFuIHRoZSBiZWdpbiBjdXQgdGltZSwKLSAgICAgICAgKiB3ZSBtdXN0IHJlYWQgdGhlIEFVIGFuZCBwYXJzZSBpdHMgZnJhbWVzIHRvIHJlYWNoIHRoZQotICAgICAgICAqIG5lYXJlc3QgdG8gdGhlIGJlZ2luIGN1dCAqLwotICAgICAgICBpZiggKCBpQ3RzICsgMjApIDwgKE00T1NBX0ludDMyKXBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBSZWFkIHRoZSBmaXJzdCBhdWRpbyBBVSBhZnRlciB0aGUganVtcCAqLwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KGF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSEgUmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBubyBmYXRhbCBlcnJvciBoZXJlLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBwdXJzdWUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KEF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFdoaWxlIHRoZSBuZXh0IEFVIGhhcyBhIGxvd2VyIENUUyB0aGFuIHRoZSBiZWdpbiBjdXQgdGltZSwgd2UgYWR2YW5jZSB0bwotICAgICAgICAgICAgdGhlIG5leHQgZnJhbWUgKi8KLSAgICAgICAgICAgIHdoaWxlKCAoIGlDdHMgKyAyMCkgPD0gKE00T1NBX0ludDMyKXBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGZyYW1lICovCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aUZyYW1lU2l6ZSA9IE00TUNTX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjOgotICAgICAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVNpemUgPSBNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aUZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggMCA9PSB1aUZyYW1lU2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3JydXB0ZWQgZnJhbWUhIFdlIGdldCBvdXQgb2YgdGhpcyBtZXNzIQotICAgICAgICAgICAgICAgICAgICAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZS4uLiAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXRGcmFtZVNpemVfeHh4IHJldHVybnMgMCEgUmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IG5vIGZhdGFsIGVycm9yIGhlcmUsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHB1cnN1ZSAqLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogR28gdG8gdGhlIG5leHQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzICs9IHVpRnJhbWVTaXplOwotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSAtPSB1aUZyYW1lU2l6ZTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogR2V0IHRoZSBDVFMgb2YgdGhlIG5leHQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBpQ3RzICs9IDIwOyAvKio8IEFNUiwgRVZSQyBmcmFtZSBkdXJhdGlvbiBpcyBhbHdheXMgMjAgbXMgKi8KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyA9IGlDdHM7Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9EVFMgPSBpQ3RzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVXBkYXRlIHRoZSBhdWRpbyBiZWdpbiBjdXQgb2Zmc2V0ICovCi0gICAgICAgICAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0ID0gaUN0czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEVuY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMsIE00T1NBX1VJbnQ4KiBwUHJvZ3Jlc3MpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEVuY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdWlBdWRpb1N0ZXBDb3VudCA9IDA7Ci0KLSAgICAvKiAtLS0tLS0tLS0tIFZJREVPIFRSQU5TQ09ESU5HIC0tLS0tLS0tLS0gKi8KLQotICAgIGlmKCAoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFKSAmJiAoTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQKLSAgICAgICAgPT0gcEMtPlZpZGVvU3RhdGUpICkgLyoqPCBJZiB0aGUgdmlkZW8gZW5jb2RpbmcgaXMgZ29pbmcgb24gKi8KLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyhwQyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKHBDKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIE5vIG1vcmUgc3BhY2UsIHF1aXQgcHJvcGVybHkgKi8KLSAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+ZFZpRGVjQ3VycmVudEN0cwotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMCkKLSAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0KLSAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgLyogYmFkIGZpbGUgcHJvZHVjZWQgb24gdmVyeSBzaG9ydCAzZ3AgZmlsZSAqLwotICAgICAgICAgICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzIC0gcEMtPnVpQmVnaW5DdXRUaW1lID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgaGFzIGJlZW4gZW5jb2RlZCAtPiBiYWQgcHJvZHVjZWQgZmlsZSAtPiBlcnJvciByZXR1cm5lZCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IHZpZGVvIHRyYW5zY29kaW5nIHJldHVybnNcCi0gICAgICAgICAgICAgICAgICAgICBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX09VVFBVVF9GSUxFX1NJWkVfVE9PX1NNQUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAgICAgICAgICAgICAvKiBjbGVhbiBBSVIgY29udGV4dCBuZWVkZWQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fYWlyX2NvbnRleHQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gY2xlYW5pbmcgQUlSOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19BVURJT09OTFkqLwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdmlkZW8gdHJhbnNjb2RpbmcgcmV0dXJucyBNNE1DU19FUlJfTk9NT1JFX1NQQUNFIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9OT01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKio8IFRoZSBpbnB1dCBwbGFuZSBpcyBudWxsIGJlY2F1c2UgdGhlIGlucHV0IGltYWdlIHdpbGwgYmUgb2J0YWluZWQgYnkgdGhlCi0gICAgICAgIFZQUCBmaWx0ZXIgZnJvbSB0aGUgY29udGV4dCAqLwotICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdmlkZW8gdHJhbnNjb2RpbmcgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tIEFVRElPIFRSQU5TQ09ESU5HIC0tLS0tLS0tLS0gKi8KLQotICAgIGlmKCAoIHBDLT5ub2F1ZGlvID09IE00T1NBX0ZBTFNFKSAmJiAoTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQKLSAgICAgICAgPT0gcEMtPkF1ZGlvU3RhdGUpICkgLyoqPCBJZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIHdoaWxlKAotICAgICAgICAgICAgLyoqPCBJZiB0aGUgdmlkZW8gZW5jb2RpbmcgaXMgcnVubmluZywgZW5jb2RlIGF1ZGlvIHVudGlsIHdlIHJlYWNoIHZpZGVvIHRpbWUgKi8KLSAgICAgICAgICAgICggKCBwQy0+bm92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICYmIChNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCA9PSBwQy0+VmlkZW9TdGF0ZSkKLSAgICAgICAgICAgICYmIChwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgKyBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPCBwQy0+UmVhZGVyVmlkZW9BVS5tX0NUUykpIHx8Ci0gICAgICAgICAgICAvKio8IElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBub3QgcnVubmluZywgcGVyZm9ybSAxIHN0ZXAgb2YgYXVkaW8gZW5jb2RpbmcgKi8KLSAgICAgICAgICAgICgoIE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5BdWRpb1N0YXRlKQotICAgICAgICAgICAgJiYgKHVpQXVkaW9TdGVwQ291bnQgPCAxKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUF1ZGlvU3RlcENvdW50Kys7Ci0KLSAgICAgICAgICAgIC8qKjwgY2hlY2sgaWYgYW4gYWRpbyBlZmZlY3QgaGFzIHRvIGJlIGFwcGxpZWQqLwotICAgICAgICAgICAgZXJyID0gTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzIHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcocEMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IEF1ZGlvIHRyYW5zY29kaW5nICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZyhwQyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBObyBtb3JlIHNwYWNlLCBxdWl0IHByb3Blcmx5ICovCi0gICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCAoIChNNE9TQV9VSW50MzIpcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMKLSAgICAgICAgICAgICAgICAgICAgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICogMTAwKQotICAgICAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0KLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBiYWQgZmlsZSBwcm9kdWNlZCBvbiB2ZXJ5IHNob3J0IDNncCBmaWxlICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTIC0gcEMtPnVpQmVnaW5DdXRUaW1lID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogTm90aGluZyBoYXMgYmVlbiBlbmNvZGVkIC0+IGJhZCBwcm9kdWNlZCBmaWxlIC0+IGVycm9yIHJldHVybmVkICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIE00TUNTX0VSUl9PVVRQVVRfRklMRV9TSVpFX1RPT19TTUFMTCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX09VVFBVVF9GSUxFX1NJWkVfVE9PX1NNQUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAgICAgICAgICAgICAgICAgLyogY2xlYW4gQUlSIGNvbnRleHQgbmVlZGVkIHRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9haXJfY29udGV4dCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBjbGVhbmluZyBBSVI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhbnNjb2RpbmcgcmV0dXJucyBNNE1DU19FUlJfTk9NT1JFX1NQQUNFIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfTk9NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDaGVjayBmb3IgZW5kIGN1dCAqLwotICAgICAgICAgICAgLyogV2UgYWJzb2x1dGVseSB3YW50IHRvIGhhdmUgbGVzcyBvciBzYW1lIGF1ZGlvIGR1cmF0aW9uIGFzIHZpZGVvIC0+Ci0gICAgICAgICAgICAoMipwQy0+bV9hdWRpb0FVRHVyYXRpb24pICovCi0gICAgICAgICAgICBpZiggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgICsgKDIgKnBDLT5tX2F1ZGlvQVVEdXJhdGlvbikgPiBwQy0+dWlFbmRDdXRUaW1lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0gUFJPR1JFU1MgTUFOQUdFTUVOVCAtLS0tLS0tLS0tICovCi0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcHJvZ3Jlc3MgKi8KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTIDwgcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMCkKLSAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9wcmludGYoIjogJTYuMGZcYlxiXGJcYlxiXGJcYlxiIiwgcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMpOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyA8IHBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoKCAoIChNNE9TQV9VSW50MzIpcEMtPmRWaURlY0N1cnJlbnRDdHMKLSAgICAgICAgICAgICAgICAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKiAxMDApCi0gICAgICAgICAgICAgICAgLyAocEMtPnVpRW5kQ3V0VGltZSAtIHBDLT51aUJlZ2luQ3V0VGltZSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vcHJpbnRmKCI6ICU2LjBmXGJcYlxiXGJcYlxiXGJcYiIsIHBDLT5kVmlEZWNDdXJyZW50Q3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCAqcFByb2dyZXNzID4gOTkgKQotICAgIHsKLSAgICAgICAgKnBQcm9ncmVzcyA9IDk5OwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IENUUyBmb3IgbmV4dCBzdGVwICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzICs9ICAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgKz0gcEMtPmRDdHNJbmNyZW1lbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFRoZSB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCB3aGVuIG5vIHN0cmVhbSBpcyBiZWluZyBlbmNvZGVkIGFueW1vcmUgKi8KLSAgICBpZiggKCAoIHBDLT5ub3ZpZGVvKSB8fCAoTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEID09IHBDLT5WaWRlb1N0YXRlKSkKLSAgICAgICAgJiYgKCggcEMtPm5vYXVkaW8pIHx8IChNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQgPT0gcEMtPkF1ZGlvU3RhdGUpKSApCi0gICAgewotICAgICAgICAvKiB0aGUgQUlSIHBhcnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHZpZGVvIGNvZGVjcyBhcmUgY29tcGlsZWQqLwotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAgICAgLyogY2xlYW4gQUlSIGNvbnRleHQgbmVlZGVkIHRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9haXJfY29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBjbGVhbmluZyBBSVI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLSAgICAgICAgLyoqLwotCi0gICAgICAgICpwUHJvZ3Jlc3MgPSAxMDA7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IHRyYW5zY29kaW5nIGZpbmlzaGVkLCByZXR1cm5pbmcgTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9UUkFOU0NPRElOR19ET05FOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcChNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcCggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQzMiBpQ3RzOwotCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBpbiB0aGUgY2xpcCAoZmlyc3QgZ2V0IHRoZSB0aW1lLCB0aGVuIGp1bXApICovCi0gICAgaUN0cyA9IChNNE9TQV9JbnQzMilwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0UHJldlJhcFRpbWUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZpQ3RzKTsKLQotICAgIGlmKCBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQgPT0gZXJyICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIFJBUCB0YWJsZSwganVtcCBiYWNrd2FyZCBhbmQgcHJlZGVjb2RlICovCi0gICAgICAgIGlDdHMgPSAoTTRPU0FfSW50MzIpcEMtPmRWaURlY1N0YXJ0aW5nQ3RzIC0gTTRNQ1NfTk9fU1RTU19KVU1QX1BPSU5UOwotCi0gICAgICAgIGlmKCBpQ3RzIDwgMCApCi0gICAgICAgICAgICBpQ3RzID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wOiBtX3BGY3RHZXRQcmV2UmFwVGltZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgIHsKLQotICAgICAgICAvLyBTYXZlIGp1bXAgdGltZSBmb3Igc2FmZXR5LCB0aGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYwotCi0gICAgICAgIE00T1NBX0ludDMyIGlDdHNPcmkgPSBpQ3RzOwotCi0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0SnVtcChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZpQ3RzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMS5tX3N0cnVjdFNpemUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVMS5tX3N0cnVjdFNpemUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gSDI2NE1DU19Qcm9jZXNzU1BTX1BQUyhwQy0+bV9wSW5zdGFuY2UsCi0gICAgICAgICAgICAoTTRPU0FfVUludDggKilwQy0+UmVhZGVyVmlkZW9BVTEubV9kYXRhQWRkcmVzcywgcEMtPlJlYWRlclZpZGVvQVUxLm1fc2l6ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcDogSDI2NE1DU19Qcm9jZXNzU1BTX1BQUyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gUmVzdG9yZSBqdW1wIHRpbWUgZm9yIHNhZmV0eSwgdGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMKLQotICAgICAgICBpQ3RzID0gaUN0c09yaTsKLQotCi0gICAgfQotICAgIC8qIC0gQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0KLSAgICAvKioKLSAgICAqIERlY29kZSBvbmUgc3RlcCAqLwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gKE00T1NBX0RvdWJsZSkoaUN0cyArIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IpOwotCi0gICAgLyoqCi0gICAgKiBCZSBzdXJlIHdlIGRvbid0IGRlY29kZSB0b28gZmFyICovCi0gICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzID4gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzICkKLSAgICB7Ci0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgIH0KLQotICAgIC8qKgotICAgICogRGVjb2RlIGF0IGxlYXN0IG9uY2Ugd2l0aCB0aGUgYkp1bXAgZmxhZyB0byB0cnVlICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0czogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiIsCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzKTsKLSAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9GQUxTRTsKLSAgICBlcnIgPQotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocEMtPnBWaURlY0N0eHQsICZwQy0+ZFZpRGVjQ3VycmVudEN0cywKLSAgICAgICAgTTRPU0FfVFJVRSwgMCk7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKQotICAgICAgICAmJiAoZXJyICE9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXA6IG1fcEZjdERlY29kZSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggZXJyID09IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJEZWNvZGluZyBvdXRwdXQgdGhlIHNhbWUgZnJhbWUgYXMgYmVmb3JlIDEiKTsKLSAgICAgICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluY3JlbWVudCBkZWNvZGluZyBjdHMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyArPSAoTTRPU0FfRG91YmxlKXBDLT5pVmlkZW9CZWdpbkRlY0luY3I7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggcEMtPmRWaURlY0N1cnJlbnRDdHMgPiBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQmUgc3VyZSB3ZSBkb24ndCBkZWNvZGUgdG9vIGZhciAqLwotICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyA9IHBDLT5kVmlEZWNTdGFydGluZ0N0czsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX1BST0NFU1NJTkc7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvRGVjb2RlKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRfTWVkaWFUaW1lIGREZWNUYXJnZXQ7Ci0KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX1BST0NFU1NJTkc7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICogRGVjb2RlICovCi0gICAgZERlY1RhcmdldCA9IHBDLT5kVmlEZWNDdXJyZW50Q3RzOwotICAgIE00T1NBX1RSQUNFM18xKCJNNE1DU19pbnRTdGVwQmVnaW5EZWNvZGU6IERlY29kaW5nIHVwVG8gQ1RTICUuM2YiLAotICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyk7Ci0gICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0gICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVjb2RlKHBDLT5wVmlEZWNDdHh0LCAmZERlY1RhcmdldCwKLSAgICAgICAgTTRPU0FfRkFMU0UsIDApOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikKLSAgICAgICAgJiYgKGVyciAhPSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGU6IG1fcEZjdERlY29kZSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggZXJyID09IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJEZWNvZGluZyBvdXRwdXQgdGhlIHNhbWUgZnJhbWUgYXMgYmVmb3JlIDIiKTsKLSAgICAgICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluY3JlbWVudCBkZWNvZGluZyBjdHMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyArPSAoTTRPU0FfRG91YmxlKXBDLT5pVmlkZW9CZWdpbkRlY0luY3I7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24sIGlmIG5lZWRlZCAqLwotICAgIGlmKCAoIChNNE9TQV9VSW50MzIpcEMtPmRWaURlY0N1cnJlbnRDdHMgPiBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMpCi0gICAgICAgIHx8IChNNFdBUl9OT19NT1JFX0FVID09IGVycikgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQmUgc3VyZSB3ZSBkb24ndCBkZWNvZGUgdG9vIGZhciAqLwotICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyA9IChNNE9TQV9Eb3VibGUpcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFN0ZXBCZWdpblZpZGVvRGVjb2RlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGRlZmluZSBBTVIgc2lsZW5jZSBmcmFtZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgMTMKLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTiAxNjAKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4WwotICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV0gPQotICAgIHsKLSAgICAgICAgMHgwNCwgMHhGRiwgMHgxOCwgMHhDNywgMHhGMCwgMHgwRCwgMHgwNCwgMHgzMywgMHhGRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMAotICAgIH07Ci0jZWxzZQotCi1leHRlcm4KLWNvbnN0Ci1NNE9TQV9VSW50OAotTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OFtNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdOwotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVmaW5lIEFBQyBzaWxlbmNlIGZyYW1lcyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkUgICAgICA0Ci0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLQotY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9bCi0gICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRV0gPQotICAgIHsKLSAgICAgICAgMHgwMCwgMHhDOCwgMHgyMCwgMHgwNwotICAgIH07Ci0jZWxzZQotCi1leHRlcm4gY29uc3QgTTRPU0FfVUludDgKLU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkVdOwotCi0jZW5kaWYKLQotI2RlZmluZSBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkUgICAgICAgIDYKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPWwotICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRV0gPQotICAgIHsKLSAgICAgICAgMHgyMSwgMHgxMCwgMHgwMywgMHgyMCwgMHg1NCwgMHgxQwotICAgIH07Ci0jZWxzZQotCi1leHRlcm4gY29uc3QKLU00T1NBX1VJbnQ4Ci1NNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRV07Ci0KLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBpZiBhbGwgYXVkaW8gZnJhbWUgaGFzIGJlZW4gd3JpdHRlbiAoaGFwcGVucyBhdCBiZWdpbiBjdXQpICovCi0gICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3IEFVIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUxLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUxKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplLAotICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgQVUxIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTEpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTpcCi0gICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qRkIgMjAwOS4wNC4wMjogUFIgc3VybnhwIzYxNjogQ3Jhc2ggaW4gTUNTIHdoaWxlIEF1ZGlvIEFVIGNvcHlpbmcgLAotICAgICAgICAgICAgIGNvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSovCi0gICAgICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZQotICAgICAgICA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMSksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgICAgICAvKiBiZWNhdXNlIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UKLSAgICAgICAgICAgICAgICAgbWF4aW11bSB2YWx1ZS4gVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlckF1ZGlvQVU/Lm1fbWF4c2l6ZSA+Ci0gICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgICAgICAvKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4gKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMiksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YUFkZHJlc3MxLAotICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlckF1ZGlvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUxLm1fc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUyLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUyKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgPQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZSwKLSAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikiVGVtcG9yYXJ5IEFVIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmVhZCB0aGUgbmV4dCBhdWRpbyBBVSBpbiB0aGUgaW5wdXQgZmlsZSAqLwotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUyLm1fQ1RTID4gcEMtPlJlYWRlckF1ZGlvQVUxLm1fQ1RTICkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICZwQy0+UmVhZGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlckF1ZGlvQVUyLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVMSk7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplCi0gICAgICAgICAgICAgICAgPiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczEpLCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiAgIHBDLT5tX3BEYXRhQWRkcmVzczEKLSAgICAgICAgICAgICAgICAgKiBhbmQgcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKgotICAgICAgICAgICAgICAgICAqIGJlY2F1c2UgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZQotICAgICAgICAgICAgICAgICAqIG1heGltdW0gdmFsdWUuIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJBdWRpb0FVPy5tX21heHNpemUgPgotICAgICAgICAgICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZSAqCi0gICAgICAgICAgICAgICAgICogYW5kIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgYnVmZmVyIGlzIG5ldmVyIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczIpLCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiBwQy0+bV9wRGF0YUFkZHJlc3MxIGFuZAotICAgICAgICAgICAgICAgICAqIHBDLT5tX3BEYXRhQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lCi0gICAgICAgICAgICAgICAgICogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFBZGRyZXNzMSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVMS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX3NpemUpOwotICAgICAgICAgICAgcEMtPm1fYXVkaW9BVUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9DVFMgLSBwQy0+UmVhZGVyQXVkaW9BVTIubV9DVFM7Ci0gICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFBZGRyZXNzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSAmcEMtPlJlYWRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgKHZvaWQgKikgJnBDLT5SZWFkZXJBdWRpb0FVMSwgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpKTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTIpOwotICAgICAgICAgICAgLyogQ3Jhc2ggaW4gTUNTIHdoaWxlIEF1ZGlvIEFVIGNvcHlpbmcgLAotICAgICAgICAgICAgICogY29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplCi0gICAgICAgICAgICAgICAgPiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczIpLCBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiBwQy0+bV9wRGF0YUFkZHJlc3MxIGFuZAotICAgICAgICAgICAgICAgICAqIHBDLT5tX3BEYXRhQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lCi0gICAgICAgICAgICAgICAgICogYmVjYXVzZSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSB0YWtlIG1heGltdW0KLSAgICAgICAgICAgICAgICAgKiB2YWx1ZS4gVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlckF1ZGlvQVU/Lm1fbWF4c2l6ZSA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAqIG1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZQotICAgICAgICAgICAgICAgICAqIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YUFkZHJlc3MxKSwgcEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAgICAgLyogWyBFTkQgXSAyMDA5MTAwOCAgSkZWIFBSIGZpeCBzdXJueHBzdyMxMDcxOiBwQy0+bV9wRGF0YUFkZHJlc3MxIGFuZAotICAgICAgICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhQWRkcmVzczIsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVTIubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9zaXplKTsKLSAgICAgICAgICAgIHBDLT5tX2F1ZGlvQVVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUyLm1fQ1RTIC0gcEMtPlJlYWRlckF1ZGlvQVUxLm1fQ1RTOwotICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IHBDLT5tX3BEYXRhQWRkcmVzczE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IFwKLSAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSB0aGUgd3JpdGVyIEFVICovCi0gICAgZXJyID0gcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPldyaXRlckF1ZGlvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBwQy0+dWlBdWRpb0FVQ291bnQKLSAgICAgICAgPT0gMCApIC8qIElmIGl0IGlzIHRoZSBmaXJzdCBBVSwgd2Ugc2V0IGl0IHRvIHNpbGVuY2UKLSAgICAgICAgKGVsc2UsIGVycm9ycyAweDM4NDEsIDB4Mzg0NyBpbiBvdXIgQUFDIGRlY29kZXIpICovCi0gICAgewotICAgICAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tBQUMKLSAgICAgICAgICAgIHx8IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQ3BsdXMKLSAgICAgICAgICAgIHx8IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPT0gMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBNdXN0IG5ldmVyIGhhcHBlbiAuLi4qLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2Rpbmc6IEJhZCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gYXVkaW8gaW5wdXQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4LAotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgLyogU29tZSByZW1haW5pbmcgQU1SIEFVIG5lZWRzIHRvIGJlIGNvcGllZCAqLwotICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgV3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSArPSBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemU7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKHBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICsgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFKSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLypNUDMgY2FzZTogY29weSB0aGUgQVUqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IENvcHlpbmcgYXVkaW8gQVU6IHNpemU9JWQiLAotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29weSBhdWRpbyBkYXRhIGZyb20gcmVhZGVyIEFVIHRvIHdyaXRlciBBVSAqLwotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOiBDb3B5aW5nIGF1ZGlvIEFVOiBzaXplPSVkIiwKLSAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbnZlcnQgQ1RTIHVuaXQgZnJvbSBtaWxsaXNlY29uZHMgdG8gdGltZXNjYWxlICovCi0gICAgcEMtPldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgKE00T1NBX1RpbWUpKCgoIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTIC0gcEMtPmlBdWRpb0N0c09mZnNldCkKLSAgICAgICAgKiAocEMtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZSAvIDEwMDAuMCkpKTsKLQotICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICAmJiBwQy0+dWlBdWRpb0FVQ291bnQgPT0gMCApCi0gICAgewotICAgICAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0IC09Ci0gICAgICAgICAgICAyMDsgLyogRHVyYXRpb24gb2YgYSBzaWxlbmNlIEFNUiBBVSwgdG8gaGFuZGxlIHRoZSBkdXJhdGlvbiBvZiB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICBzaWxlbmNlIGZyYW1lICovCi0gICAgfQotICAgIHBDLT5Xcml0ZXJBdWRpb0FVLm5iRnJhZyA9IDA7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IGF1ZGlvIEFVOiBDVFM9JWQgbXMiLAotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5DVFMpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSBpdCB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBwQy0+dWlBdWRpb0FVQ291bnQrKzsKLSAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEFsbCB0aGUgYXVkaW8gaGFzIGJlZW4gd3JpdHRlbiAqLwotICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEluaXQgQXVkaW8gVHJhbnNjb2RpbmcKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEdlbmVyYWwgZXJyb3IgKi8KLQotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUJ5dGVzRGVjOyAvKio8IE5iIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgZGVjb2RlciBPVVQgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpRGVjb2RlcjJTc3JjX05iQnl0ZXM7IC8qKjwgTmIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIHNzcmMgSU4gYnVmZmVyICovCi0KLSAgICBpbnQgc3NyY0VycjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3Igd2hpbGUgc3NyYyBwcm9jZXNzaW5nICovCi0gICAgTTRPU0FfVUludDMyIHVpU3NyY0luU2l6ZTsgLyoqPCBTaXplIGluIGJ5dGVzIG9mIHNzcmMgaW50cHV0IGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aVNzcmNJblJvb207IC8qKjwgTmIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBzc3JjIElOIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4Ci0gICAgICAgIHBTc3JjSW5wdXQ7IC8qKjwgUG9pbnRlciB0byB0aGUgZ29vZCBidWZmZXIgbG9jYXRpb24gZm9yIHNzcmMgaW5wdXQgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlTc3JjT3V0U2l6ZTsgLyoqPCBTaXplIGluIGJ5dGVzIG9mIHNzcmMgb3V0cHV0IGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUJ5dGVzU3NyYzsgLyoqPCBOYiBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHNzcmMgT1VUIGJ1ZmZlciAqLwotCi0gICAgTTRPU0FfVUludDgKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uOyAvKio8IEZsYWcgdG8gaW5kaWNhdGUgaWYgYSBzdGVyZW8gPC0+IG1vbm8gY29udmVyc2lvbiBpcyBuZWVkZWQgKi8KLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmY7IC8qKjwgTXVsdGlwbGljYXRpdmUgY29lZmZpY2llbnQgaWYgc3RlcmVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LT4gbW9ubyBjb252ZXJzaW9uIGlzIGFwcGxpZWQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCBwQ2hhbm5lbENvbnZlcnRvcklucHV0ID0KLSAgICAgICAgTTRPU0FfTlVMTDsgLyoqPCBQb2ludGVyIHRvIHRoZSBnb29kIGJ1ZmZlciBsb2NhdGlvbiBmb3IgY2hhbm5lbCBjb252ZXJ0b3IgaW5wdXQgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgMDsgLyoqPCBOYiBvZiBwY20gc2FtcGxlcyB0byBjb252ZXJ0IGluIGNoYW5uZWwgY29udmVydG9yICovCi0gICAgTTRPU0FfTWVtQWRkcjggcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQgPQotICAgICAgICBNNE9TQV9OVUxMOyAvKio8IFBvaW50ZXIgdG8gdGhlIGdvb2QgYnVmZmVyIGxvY2F0aW9uIGZvciBjaGFubmVsIGNvbnZlcnRvciBvdXRwdXQgKi8KLQotICAgIE00T1NBX1RpbWUKLSAgICAgICAgZnJhbWVUaW1lRGVsdGE7IC8qKjwgRHVyYXRpb24gb2YgdGhlIGVuY29kZWQgKHRoZW4gd3JpdHRlbikgZGF0YSAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUVuY29kZXJJblJvb207IC8qKjwgTmIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBlbmNvZGVyIElOIGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzOyAvKio8IE5iIG9mIGJ5dGVzIGNvcGllZCBmcm9tIHRoZSBzc3JjIE9VVCBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOAotICAgICAgICBwRW5jb2RlcklucHV0OyAvKio8IFBvaW50ZXIgdG8gdGhlIGdvb2QgYnVmZmVyIGxvY2F0aW9uIGZvciBlbmNvZGVyIGlucHV0ICovCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgICAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY091dEJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBvdXRwdXQgYnVmZmVyIGZvciBhcGkgKi8KLQotICAgIE00T1NBX0ludDE2ICp0ZW1wQnVmZk91dCA9IE00T1NBX05VTEw7Ci0gICAgLypGbEIgMjAwOS4wMy4wNDogYXBwbHkgYXVkaW8gZWZmZWN0cyBpZiBhbiBlZmZlY3QgaXMgYWN0aXZlKi8KLSAgICBNNE9TQV9JbnQ4ICpwQWN0aXZlRWZmZWN0TnVtYmVyID0gJihwQy0+cEFjdGl2ZUVmZmVjdE51bWJlcik7Ci0KLSAgICB1aW50MzJfdCBlcnJDb2RlID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBwQy0+bm9hdWRpbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBSRUFEIEFORCBERUNPREUgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgdG8gZW1wdHkgdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciBmaXJzdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2ZlZWRfcmVzYW1wbGVyOwotICAgIH0KLQotICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgTTRPU0FfTlVMTCwgJnBDLT5BdWRpb0RlY0J1ZmZlck91dCwgTTRPU0FfRkFMU0UpOwotCi0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBtX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgZndyaXRlKHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplLCAxLCBmaWxlX3BjbV9kZWNvZGVyKTsKLQotI2VuZGlmCi0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfR2V0QXVkaW9BVUVyckNvZGUsIChNNE9TQV9EYXRhT3B0aW9uKSAmZXJyQ29kZSk7Ci0KLSAgICBpZiAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyQ29kZSApIHsKLSAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgcmV0dXJuIGVyckNvZGU7Ci0gICB9Ci0KLSAgICAvKiBTZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciAqLwotICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgPSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLQotICAgIC8qIF9fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IEZFRUQgUkVTQU1QTEVSIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19mZWVkX3Jlc2FtcGxlcjoKLQotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgdG8gZW1wdHkgdGhlIHNzcmMgb3V0IGJ1ZmZlciBmaXJzdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICkKLSAgICB7Ci0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19wcmVwYXJlX2lucHV0X2J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIGRlY29kZXIgYnVmZmVyICovCi0gICAgdWlTc3JjSW5TaXplID0gcEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLSAgICB1aUJ5dGVzRGVjID0gKCBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcwotICAgICAgICArIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpIC0gcEMtPnBQb3NJbkRlY0J1ZmZlck91dDsKLQotICAgIC8qIENoZWNrIGlmIHdlIGNhbiBmZWVkIGRpcmVjdGx5IHRoZSBTc3JjIHdpdGggdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPT0gcEMtPnBTc3JjQnVmZmVySW4pCi0gICAgICAgICYmICh1aUJ5dGVzRGVjID49IHVpU3NyY0luU2l6ZSkgKQotICAgIHsKLSAgICAgICAgcFNzcmNJbnB1dCA9IHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQ7Ci0KLSAgICAgICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBkZWNvZGVyIGJ1ZmZlciBhZnRlciByZXNhbXBsaW5nICovCi0gICAgICAgIGlmKCB1aUJ5dGVzRGVjID09IHVpU3NyY0luU2l6ZSApCi0gICAgICAgICAgICBwQy0+cFBvc0luRGVjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCArPSB1aVNzcmNJblNpemU7Ci0KLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2RvX3Jlc2FtcGxpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHJlbWFpbmluZyBzcGFjZSBpbiBTc3JjIGJ1ZmZlciBpbiAqLwotICAgIHVpU3NyY0luUm9vbSA9ICggcEMtPnBTc3JjQnVmZmVySW4gKyB1aVNzcmNJblNpemUpIC0gcEMtPnBQb3NJblNzcmNCdWZmZXJJbjsKLQotICAgIC8qKgotICAgICogTmIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBtaW5pbXVtIGJldHdlZW4gbmIgb2YgYnl0ZXMgcmVtYWluaW5nIGluCi0gICAgKiBkZWNvZGVyIG91dCBidWZmZXIgYW5kIHNwYWNlIHJlbWFpbmluZyBpbiBzc3JjIGluIGJ1ZmZlciAqLwotICAgIHVpRGVjb2RlcjJTc3JjX05iQnl0ZXMgPQotICAgICAgICAodWlTc3JjSW5Sb29tIDwgdWlCeXRlc0RlYykgPyB1aVNzcmNJblJvb20gOiB1aUJ5dGVzRGVjOwotCi0gICAgLyoqCi0gICAgKiBDb3B5IGZyb20gdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciBpbnRvIHRoZSBTc3JjIGluIGJ1ZmZlciAqLwotICAgIG1lbWNweSgodm9pZCAqKXBDLT5wUG9zSW5Tc3JjQnVmZmVySW4sICh2b2lkICopcEMtPnBQb3NJbkRlY0J1ZmZlck91dCwKLSAgICAgICAgdWlEZWNvZGVyMlNzcmNfTmJCeXRlcyk7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciAqLwotICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgKz0gdWlEZWNvZGVyMlNzcmNfTmJCeXRlczsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHRoZSBwb3NpdGlvbiBpbiB0aGUgU3NyYyBpbiBidWZmZXIgKi8KLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluICs9IHVpRGVjb2RlcjJTc3JjX05iQnl0ZXM7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHRoZSBkZWNvZGVyIGJ1ZmZlciBvdXQgaXMgZW1wdHkgKi8KLSAgICBpZiggKCBwQy0+cFBvc0luRGVjQnVmZmVyT3V0IC0gcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpCi0gICAgICAgID09IChNNE9TQV9JbnQzMilwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICB7Ci0gICAgICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBTc3JjIGluIGJ1ZmZlciBpcyByZWFkeSAoPSBmdWxsKSAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSBwQy0+cFNzcmNCdWZmZXJJbikKLSAgICAgICAgPCAoTTRPU0FfSW50MzIpdWlTc3JjSW5TaXplICkKLSAgICB7Ci0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmQ7Ci0gICAgfQotCi0gICAgcFNzcmNJbnB1dCA9IHBDLT5wU3NyY0J1ZmZlckluOwotCi0gICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBzc3JjIGJ1ZmZlciBpbiBhZnRlciByZXNhbXBsaW5nIChlbXB0eSkgKi8KLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBETyBUSEUgUkVTQU1QTElORyB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19ffCovCi0KLW00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZG9fcmVzYW1wbGluZzoKLQotICAgIC8qKgotICAgICogTm8gbmVlZCBmb3IgbWVtY29weSwgd2UgY2FuIGZlZWQgU3NyYyBkaXJlY3RseSB3aXRoIHRoZSBkYXRhIGluIHRoZSBhdWRpbwotICAgIGRlY29kZXIgb3V0IGJ1ZmZlciovCi0KLSAgICBzc3JjRXJyID0gMDsKLQotICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSApCi0gICAgewotICAgICAgICB0ZW1wQnVmZk91dCA9Ci0gICAgICAgICAgICAoc2hvcnQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogMgotICAgICAgICAgICAgKiAoKCpwQykuSW5wdXRGaWxlUHJvcGVydGllcykudWlOYkNoYW5uZWxzKSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSAidGVtcEJ1ZmZPdXQiKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopdGVtcEJ1ZmZPdXQsIDAsKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogMgotICAgICAgICAgICAgKiAoKCpwQykuSW5wdXRGaWxlUHJvcGVydGllcykudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0ICopdGVtcEJ1ZmZPdXQsIChzaG9ydCAqKXBTc3JjSW5wdXQsCi0gICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0LCBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsIDAsIChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgKiAoKCpwQykuSW5wdXRGaWxlUHJvcGVydGllcykudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgKHNob3J0ICopcFNzcmNJbnB1dCwgcEMtPmlTc3JjTmJTYW1wbE91dCwgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICB9Ci0KLSAgICBpZiggcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEgKQotICAgIHsKLSAgICAgICAgRnJvbTJpVG9Nb25vXzE2KChzaG9ydCAqKXRlbXBCdWZmT3V0LCAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAoc2hvcnQpcEMtPmlTc3JjTmJTYW1wbE91dCk7Ci0gICAgICAgIGZyZWUodGVtcEJ1ZmZPdXQpOwotICAgIH0KLQotCi0gICAgaWYoIDAgIT0gc3NyY0VyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nOiBTU1JDX1Byb2Nlc3MgcmV0dXJucyAweCV4LCBcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEIiwKLSAgICAgICAgICAgIHNzcmNFcnIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOwotICAgIH0KLQotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgUFJFUEFSRSBJTlBVVCBCVUZGRVIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX3ByZXBhcmVfaW5wdXRfYnVmZmVyOgotCi0gICAgLyogU2V0IHRoZSBmbGFnIGZvciBjaGFubmVsIGNvbnZlcnNpb24gcmVxdWlyZW1lbnQgKi8KLSAgICBpZiggKCBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICYmIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMikgKQotICAgIHsKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uID0gMTsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmYgPSA0OwotICAgIH0KLSAgICBlbHNlIGlmKCAoIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rU3RlcmVvKQotICAgICAgICAmJiAocEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEpICkKLSAgICB7Ci0gICAgICAgIG5lZWRDaGFubmVsQ29udmVyc2lvbiA9IDI7Ci0gICAgICAgIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uID0gMDsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmYgPSAyOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgU3NyYyBidWZmZXIgKi8KLSAgICB1aVNzcmNPdXRTaXplID0gcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgdWlCeXRlc1NzcmMgPQotICAgICAgICAoIHBDLT5wU3NyY0J1ZmZlck91dCArIHVpU3NyY091dFNpemUpIC0gcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQ7Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgc3NyYyBidWZmZXIgaXMgZnVsbCAqLwotICAgIGlmKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgdWlTc3JjMkVuY29kZXJfTmJCeXRlcyA9Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgKiB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiAvIDI7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgd2UgY2FuIGZlZWQgZGlyZWN0bHkgdGhlIGVuY29kZXIgd2l0aCB0aGUgc3NyYyBvdXQgYnVmZmVyICovCi0gICAgICAgIGlmKCAoIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICYmICh1aUJ5dGVzU3NyYyA+PSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHVwZGF0ZSBwb3NpdGlvbiBpbiBzc3JjIG91dCBidWZmZXIgYWZ0ZXIgZW5jb2RpbmcgKi8KLSAgICAgICAgICAgIGlmKCB1aUJ5dGVzU3NyYyA9PSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzICkKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKz0gdWlTc3JjMkVuY29kZXJfTmJCeXRlczsKLQotICAgICAgICAgICAgLyogbWFyayB0aGUgZW5jb2RlciBidWZmZXIgcmVhZHkgKD0gZnVsbCkgKi8KLSAgICAgICAgICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyICsgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5OwotCi0gICAgICAgICAgICBpZiggbmVlZENoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY2hhbm5lbCBjb252ZXJ0b3Igd3JpdGVzIGRpcmVjdGx5IGludG8gZW5jb2RlciBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jb2RlcklucHV0ID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0KLSAgICAgICAgICAgICAgICBwQ2hhbm5lbENvbnZlcnRvcklucHV0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgICAgICAgICAgICAgIHBDaGFubmVsQ29udmVydG9yT3V0cHV0ID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0gICAgICAgICAgICAgICAgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgICAgICAgICAgICAgdWlTc3JjMkVuY29kZXJfTmJCeXRlcyAvIHNpemVvZihzaG9ydCk7Ci0KLSAgICAgICAgICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfY2hhbm5lbF9jb252ZXJ0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogZW5jb2RlIGRpcmVjdGx5IGZyb20gc3NyYyBvdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgcEVuY29kZXJJbnB1dCA9IHBDLT5wU3NyY0J1ZmZlck91dDsKLQotICAgICAgICAgICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmNvZGVfYW5kX3dyaXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHJlbWFpbmluZyBzcGFjZSBpbiBlbmNvZGVyIGJ1ZmZlciBpbiAqLwotICAgIGlmKCBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyOwotICAgIH0KLQotICAgIHVpRW5jb2RlckluUm9vbSA9ICggcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgKyBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkpCi0gICAgICAgIC0gcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlcjsKLSAgICBwRW5jb2RlcklucHV0ID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0KLSAgICAvKioKLSAgICAqIE5iIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbWluaW11bSBiZXR3ZWVuIG5iIG9mIGJ5dGVzIHJlbWFpbmluZyBpbgotICAgICogZGVjb2RlciBvdXQgYnVmZmVyIGFuZCBzcGFjZSByZW1haW5pbmcgaW4gc3NyYyBpbiBidWZmZXIgKi8KLSAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzID0KLSAgICAgICAgKCggdWlFbmNvZGVySW5Sb29tICogdWlDaGFubmVsQ29udmVydG9yQ29lZmYgLyAyKSA8IHVpQnl0ZXNTc3JjKQotICAgICAgICA/ICh1aUVuY29kZXJJblJvb20gKiB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiAvIDIpIDogdWlCeXRlc1NzcmM7Ci0KLSAgICBpZiggbmVlZENoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICAvKiBjaGFubmVsIGNvbnZlcnRvciB3cml0ZXMgZGlyZWN0bHkgaW50byBlbmNvZGVyIGJ1ZmZlciAqLwotICAgICAgICBwQ2hhbm5lbENvbnZlcnRvcklucHV0ID0gcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgIHBDaGFubmVsQ29udmVydG9yT3V0cHV0ID0gcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlcjsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0gdWlTc3JjMkVuY29kZXJfTmJCeXRlcyAvIHNpemVvZihzaG9ydCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGNvcHkgZnJvbSB0aGUgc3NyYyBvdXQgYnVmZmVyIGludG8gdGhlIGVuY29kZXIgaW4gYnVmZmVyICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIsICh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzKTsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgcG9zaXRpb24gaW4gc3NyYyBvdXQgYnVmZmVyIGFmdGVyIGVuY29kaW5nICovCi0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKz0gdWlTc3JjMkVuY29kZXJfTmJCeXRlczsKLQotICAgIC8qIFVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gdGhlIGVuY29kZXIgaW4gYnVmZmVyICovCi0gICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciArPQotICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzICogMiAvIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmOwotCi0gICAgLyogQ2hlY2sgaWYgdGhlIHNzcmMgYnVmZmVyIG91dCBpcyBlbXB0eSAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0KQotICAgICAgICA9PSAoTTRPU0FfSW50MzIpdWlTc3JjT3V0U2l6ZSApCi0gICAgewotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogZ28gdG8gbmV4dCBzdGF0ZW1lbnQgKi8KLSAgICBpZiggbmVlZENoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19jaGFubmVsX2NvbnZlcnRvcjsKLSAgICBlbHNlCi0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmNvZGVfYW5kX3dyaXRlOwotCi0gICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBTVEVSRU8gPC0+IE1PTk8gfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19jaGFubmVsX2NvbnZlcnRvcjoKLQotICAgIC8qIGNvbnZlcnQgdGhlIGlucHV0IHBjbSBzdHJlYW0gdG8gbW9ubyBvciB0byBzdGVyZW8gKi8KLSAgICBzd2l0Y2goIG5lZWRDaGFubmVsQ29udmVyc2lvbiApCi0gICAgewotICAgICAgICBjYXNlIDE6IC8qIHN0ZXJlbyB0byBtb25vICovCi0gICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopcENoYW5uZWxDb252ZXJ0b3JJbnB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQgKilwQ2hhbm5lbENvbnZlcnRvck91dHB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQpKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAvIDIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgIE1vbm9UbzJJXzE2KChzaG9ydCAqKXBDaGFubmVsQ29udmVydG9ySW5wdXQsCi0gICAgICAgICAgICAgICAgKHNob3J0ICopcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQsCi0gICAgICAgICAgICAgICAgKHNob3J0KXVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgRU5DT0RFIEFORCBXUklURSB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmNvZGVfYW5kX3dyaXRlOgotCi0gICAgLyogQ2hlY2sgaWYgdGhlIGVuY29kZXIgaW4gYnVmZmVyIGlzIHJlYWR5ICg9IGZ1bGwpICovCi0gICAgaWYoICggcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciAtIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyKQotICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuZDsKLSAgICB9Ci0KLSAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPSBwRW5jb2RlcklucHV0OwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5OwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgKCBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAqIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmIC8gMikKLSAgICAgICAgLyBzaXplb2Yoc2hvcnQpIC8gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKkZsQiAyMDA5LjAzLjA0OiBhcHBseSBhdWRpbyBlZmZlY3RzIGlmIGFuIGVmZmVjdCBpcyBhY3RpdmUqLwotICAgIGlmKCAqcEFjdGl2ZUVmZmVjdE51bWJlciA+PSAwICYmICpwQWN0aXZlRWZmZWN0TnVtYmVyIDwgcEMtPm5iRWZmZWN0cyApCi0gICAgewotICAgICAgICBpZiggcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS5FeHRBdWRpb0VmZmVjdEZjdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyBwUHJvZ3Jlc3M7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcFByb2dyZXNzID0gMDsKLSAgICAgICAgICAgIHBQcm9ncmVzcy51aUNsaXBUaW1lID0gKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUzsKLQotICAgICAgICAgICAgcFByb2dyZXNzLnVpT3V0cHV0VGltZSA9ICggcEMtPldyaXRlckF1ZGlvQVUuQ1RTICogMTAwMCkKLSAgICAgICAgICAgICAgICAvIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGU7Ci0gICAgICAgICAgICB0ZW1wUHJvZ3Jlc3MgPSAoIChNNE9TQV9VSW50MzIpcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMKLSAgICAgICAgICAgICAgICAtIHBDLT5wRWZmZWN0c1sqcEFjdGl2ZUVmZmVjdE51bWJlcl0udWlTdGFydFRpbWUKLSAgICAgICAgICAgICAgICAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKiAxMDAwOwotICAgICAgICAgICAgcFByb2dyZXNzLnVpUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHRlbXBQcm9ncmVzcyAvIChNNE9TQV9VSW50MzIpcEMtPnBFZmZlY3RzWwotICAgICAgICAgICAgICAgICAgICAqcEFjdGl2ZUVmZmVjdE51bWJlcl0udWlEdXJhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS5FeHRBdWRpb0VmZmVjdEZjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1sqcEFjdGl2ZUVmZmVjdE51bWJlcl0ucEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSwgJnBQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogRXh0QXVkaW9FZmZlY3RGY3QoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzOwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgZndyaXRlKHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0sIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdLCAxLAotICAgICAgICBmaWxlX3BjbV9lbmNvZGVyKTsKLQotI2VuZGlmCi0KLSAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJfaXNSYXdXcml0ZXIgKQotICAgIHsKLSAgICAgICAgLyogVGhpcyBhbGxvdyB0byB3cml0ZSBQQ00gZGF0YSB0byBmaWxlIGFuZCB0byBlbmNvZGUgQU1SIGRhdGEsCi0gICAgICAgICB3aGVuIG91dHB1dCBmaWxlIGlzIG5vdCBSQVcgKi8KLSAgICAgICAgaWYoIHBDLT5wT3V0cHV0UENNZmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5wT3V0cHV0UENNZmlsZSwKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdLCBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotICAgICAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKHBDLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBlbmNvZGVyIGJ1ZmZlciBpbiBhZnRlciBlbmNvZGluZyAoZW1wdHkpICovCi0gICAgICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9Ci0gICAgICAgICAgICBwRW5jT3V0QnVmZmVyLgotICAgICAgICAgICAgcFRhYmxlQnVmZmVyU2l6ZVswXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgZHVyYXRpb24gb2YgdGhlIGVuY29kZWQgQVUgKi8KLSAgICAgICAgcEMtPm1fYXVkaW9BVUR1cmF0aW9uID0KLSAgICAgICAgICAgICggZnJhbWVUaW1lRGVsdGEgKiAxMDAwKSAvIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIGVuY29kZWQgQVUgdG8gdGhlIG91dHB1dCBmaWxlICovCi0gICAgICAgIHBDLT51aUF1ZGlvQVVDb3VudCsrOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSBkYXRhIGNvbnN1bWVkIGludG8gZW5jb2RlciBidWZmZXIgaW4gYWZ0ZXIgZW5jb2RpbmcgKGVtcHR5KSAqLwotICAgICAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKQotICAgICAgICAgICAgcEVuY29kZXJJbnB1dDsgLyogd2lsbCBiZSBjb252ZXJ0ZWQgYmFjayB0byB1OCogaW4gZmlsZSB3cml0ZSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5OwotICAgICAgICBwQy0+dWlBdWRpb0FVQ291bnQrKzsKLQotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IE9ORSBQQVNTIERPTkUgfCovCi0gICAgLyp8X19fX19fX19fX19fX19ffCovCi0KLW00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZW5kOgotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVShNNE9TQV9NZW1BZGRyOCogYWRkciwgTTRPU0FfVUludDMyIG5ld1NpemUpCi0gKiBVc2VkIG9ubHkgaW4gY2FzZSBvZiAzR1AgY29uc3RhbnQgbWVtb3J5IHJlYWRlciwgdG8gYmUgYWJsZSB0byByZWFsbG9jIHRlbXBvcmFyeSBBVQotICogYmVjYXVzZSBtYXggQVUgc2l6ZSBjYW4gYmUgcmVldmFsdWF0ZWQgZHVyaW5nIHJlYWRpbmcKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKCBNNE9TQV9NZW1BZGRyOCAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuZXdTaXplICkKLXsKLSAgICBpZiggKmFkZHIgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKCphZGRyKTsKLSAgICAgICAgKmFkZHIgPSAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5ld1NpemUsIE00TUNTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUmVhbGxvY2F0aW9uIG9mIHRlbXBvcmFyeSBBVSBidWZmZXIiKTsKLQotICAgICAgICBpZiggKmFkZHIgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICogQGF1dGhvciAgIEFsZXhpcyBWYXBpbGxvbiAoTlhQIFNvZnR3YXJlIFZpc2lvbikKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIC8qIER1cmF0aW9uIG9mIHRoZSBBVSAoZmluZCB0aGUgbmV4dCBBVSBkdXJhdGlvbgotICAgICAqIHRvIG9idGFpbiBhIG1vcmUgcHJlY2lzZSB2aWRlbyBlbmQgY3V0KQotICAgICAqLwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0FVRHVyYXRpb24gPSAwOwotCi0gICAgTTRPU0FfTWVtQWRkcjggV3JpdGVidWZmZXJBZGQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIGxhc3RkZWNvZGVkQ1RTID0gMDsKLSAgICBNNF9BY2Nlc3NVbml0IGxSZWFkZXJWaWRlb0FVOyAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKi8KLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyogSC4yNjQgVHJpbW1pbmcgKi8KLSAgICBpZiggKCAoIHBDLT5iSDI2NFRyaW0gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHBDLT51aVZpZGVvQVVDb3VudCA8IHBDLT5tX3BJbnN0YW5jZS0+Y2xpcF9zcHMubnVtX3JlZl9mcmFtZXMpCi0gICAgICAgICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkKLSAgICAgICAgfHwgKCggcEMtPnVpVmlkZW9BVUNvdW50ID09IDApICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyhwQyk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICBpZigocEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID09IE00T1NBX0ZBTFNFKSAmJiAocEMtPnVpQmVnaW5DdXRUaW1lID4gMCkpCi0gICAgewotICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVyIGRvZXMgcHJlZmV0Y2gsIHRoZSBvbmUgZnJhbWUgd2UgcmVxdWVzdGVkIHdpbGwgbm90IGJlIHdyaXR0ZW4gdW50aWwKLSAgICAgICAgLy8gdGhlIGVuY29kZXIgaXMgY2xvc2VkLCBzbyBkbyBpdCBub3cgcmF0aGVyIHRoYW4gaW4gTUNTX2Nsb3NlCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgfHwgKE00TUNTX2tFbmNvZGVyUnVubmluZyAhPSBwQy0+ZW5jb2RlclN0YXRlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcgRVJST1IgOiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nICIKLSAgICAgICAgICAgICAgICAicmV0dXJucyAweCVYIHcvIGVuY1N0YXRlPSVkIiwgZXJyLCBwQy0+ZW5jb2RlclN0YXRlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFN0b3AgYW5kIGNsb3NlIHRoZSBlbmNvZGVyIG5vdyB0byBmbHVzaCB0aGUgZnJhbWUgKHByZWZldGNoKSAqLwotICAgICAgICBpZiggcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcChwQy0+cFZpRW5jQ3R4dCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcgRVJST1IgOiBlbmNvZGVyIHN0b3AgcmV0dXJucyAweCVYIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlclN0b3BwZWQ7Ci0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiISEhIE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nIEVSUk9SIDogZW5jb2RlciBjbG9zZSByZXR1cm5zIDB4JVgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlckNsb3NlZDsKLSAgICB9Ci0KLQotICAgIGlmICgocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMKQotICAgICAgICAmJiAocEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPnVpQmVnaW5DdXRUaW1lID4gMCkpIHsKLQotICAgICAgICBwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPSBNNE9TQV9UUlVFOwotICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb24ocEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0FWQ0xhc3REZWNvZGVkRnJhbWVDVFMsICZsYXN0ZGVjb2RlZENUUyk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qIERvIG5vdCBuZWVkIHZpZGVvIGRlY29kZXIgYW55IG1vcmUsIG5lZWQgdG8gZGVzdHJveSBpdC4gT3RoZXJ3aXNlIGl0Ci0gICAgICAgICAqIHdpbGwgY2FsbCByZWFkZXIgZnVuY3Rpb24gd2hpY2ggd2lsbCBjYXVzZSBmcmFtZSBsb3N0IGR1cmluZyB0cmltaW5nLAotICAgICAgICAgKiBzaW5jZSB0aGUgM2dwIHJlYWRlciBpcyBzaGFyZWQgYmV0d2VlbiBNQ1MgYW5kIGRlY29kZXIuKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBWaURlY0N0eHQpIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3kocEMtPnBWaURlY0N0eHQpOwotICAgICAgICAgICAgcEMtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nOiBkZWNvZGVyIHBGY3REZXN0cm95IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEp1bXAocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLCAmbGFzdGRlY29kZWRDVFMpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZsUmVhZGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pXAotICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmxSZWFkZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiAoTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICIjIyMgW1RTX0NIRUNLXSBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyAgdmlkZW8gQVUgQ1RTOiAlZCAiLAotICAgICAgICAgICAgbFJlYWRlclZpZGVvQVUubV9DVFMpOwotCi0KLSAgICB9Ci0KLQotICAgIHBDLT5iTGFzdERlY29kZWRGcmFtZUNUUyA9IE00T1NBX1RSVUU7Ci0KLQotICAgIC8qIEZpbmQgdGhlIG5leHQgQVUgZHVyYXRpb24gdG8gb2J0YWluIGEgbW9yZSBwcmVjaXNlIHZpZGVvIGVuZCBjdXQqLwotICAgIC8qKgotICAgICogSW5pdGlhbGl6ZXMgYSBuZXcgQVUgaWYgbmVlZGVkICovCi0KLSAgICBpZiAocEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgdmlkZW8gQVUxIGJ1ZmZlciIpOwotCi0gICAgICAgIGlmIChwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTpcCi0gICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHZpZGVvKSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHZpZGVvKVwKLSAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZQotICAgICAgICAgICAgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSwgd2UgbmVlZCB0byByZWFsbG9jYXRlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEKLSAgICAgICAgICAgIGFuZCBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBiZWNhdXNlIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UgbWF4aW11bSB2YWx1ZS4KLSAgICAgICAgICAgICBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyVmlkZW9BVT8ubV9tYXhzaXplID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlICovCi0gICAgICAgICAgICAvKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4gKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiksIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgLyogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJWaWRlb0FVMS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fc2l6ZSk7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMi5tX3N0cnVjdFNpemUgPT0gMCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPlJlYWRlclZpZGVvQVUyLm1fbWF4c2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgdmlkZW8gQVUgYnVmZmVyIik7Ci0KLSAgICAgICAgaWYoIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIFJlYWQgdGhlIG5leHQgdmlkZW8gQVUgaW4gdGhlIGlucHV0IGZpbGUgKi8KLSAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUyLm1fQ1RTID4gcEMtPlJlYWRlclZpZGVvQVUxLm1fQ1RTICkKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUsCi0gICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUyLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMSk7Ci0KLSAgICAgICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemUKLSAgICAgICAgICAgID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSksIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZSBtYXhpbXVtIHZhbHVlLgotICAgICAgICAgICAgIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJWaWRlb0FVPy5tX21heHNpemUgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSwKLSAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9zaXplKTsKLSAgICAgICAgdmlkZW9BVUR1cmF0aW9uID0gcEMtPlJlYWRlclZpZGVvQVUxLm1fQ1RTIC0gcEMtPlJlYWRlclZpZGVvQVUyLm1fQ1RTOwotICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKikgJnBDLT5SZWFkZXJWaWRlb0FVLAotICAgICAgICAgICAgKHZvaWQgKikgJnBDLT5SZWFkZXJWaWRlb0FVMSwgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpKTsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTIpOwotCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplCi0gICAgICAgICAgICA+IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIpLCBwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplKTsKLSAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSBhbmQKLSAgICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBiZWNhdXNlIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UgbWF4aW11bSB2YWx1ZS4KLSAgICAgICAgICAgICBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyVmlkZW9BVT8ubV9tYXhzaXplID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlICovCi0gICAgICAgICAgICAvKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4gKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSksIHBDLT5SZWFkZXJWaWRlb0FVMi5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgLyogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUyLm1fbWF4c2l6ZTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJWaWRlb0FVMi5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUyLm1fc2l6ZSk7Ci0gICAgICAgIHZpZGVvQVVEdXJhdGlvbiA9IHBDLT5SZWFkZXJWaWRlb0FVMi5tX0NUUyAtIHBDLT5SZWFkZXJWaWRlb0FVMS5tX0NUUzsKLSAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyA9IHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMTsKLSAgICB9Ci0KLSAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTpcCi0gICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAvKiBUaGUgdmlkZW8gdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KFZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUHJlcGFyZSB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoVmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb3B5IHZpZGVvIGRhdGEgZnJvbSByZWFkZXIgQVUgdG8gd3JpdGVyIEFVICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogQ29weWluZyB2aWRlbyBBVTogc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgIC8qICsgQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkgyNjRUcmltICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPkgyNjRNQ1NUZW1wQnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICAgICA8IChwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUgKyAyMDQ4KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUgKyAyMDQ4KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPkgyNjRNQ1NUZW1wQnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopInBDLT5IMjY0TUNTVGVtcEJ1ZmZlciIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+SDI2NE1DU1RlbXBCdWZmZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSA9IHBDLT5IMjY0TUNTVGVtcEJ1ZmZlclNpemU7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBIMjY0TUNTX1Byb2Nlc3NOQUxVKHBDLT5tX3BJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplLCBwQy0+SDI2NE1DU1RlbXBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMiAqKSZwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEMtPm1fcEluc3RhbmNlLT5pc19kb25lID09IDEgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfY29udmV0RnJvbUJ5dGVTdHJlYW10b05BTFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKXBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MgLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MgKyA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSAtIDQpOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPlJlYWRlclZpZGVvQVUubV9zaXplIC0gNDsKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVidWZmZXJBZGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciArIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemUgLSA0KTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5IMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplIC0gNDsKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVidWZmZXJBZGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPlJlYWRlclZpZGVvQVUubV9zaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENvbnZlcnQgQ1RTIHVuaXQgZnJvbSBtaWxsaXNlY29uZHMgdG8gdGltZXNjYWxlICovCi0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5DVFMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9UaW1lKSgoKCBwQy0+UmVhZGVyVmlkZW9BVS5tX0NUUyAtIHBDLT5kVmlEZWNTdGFydGluZ0N0cykKLSAgICAgICAgICAgICAgICAqIChwQy0+V3JpdGVyVmlkZW9TdHJlYW0udGltZVNjYWxlIC8gMTAwMC4wKSkpOwotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IHBDLT5SZWFkZXJWaWRlb0FVLm1fYXR0cmlidXRlOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogdmlkZW8gQVU6IENUUz0lZCBtcyIsCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuQ1RTKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSBpdCB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgcEMtPnVpVmlkZW9BVUNvdW50Kys7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKFZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qICsgQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPm1fcEluc3RhbmNlLT5pc19kb25lID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKShXcml0ZWJ1ZmZlckFkZCAtIDQpLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKShwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzKSwgNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKFdyaXRlYnVmZmVyQWRkIC0gNCksCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciksIDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IC8qIEguMjY0IFRyaW1taW5nICovCi0gICAgfQotICAgIC8qKgotICAgICogQ2hlY2sgZm9yIGVuZCBjdXQuICovCi0gICAgLyogQnVnIGZpeCAxMS8xMi8yMDA4OiBXZSBhYnNvbHV0ZWx5IHdhbnQgdG8gaGF2ZSBsZXNzIG9yIHNhbWUgdmlkZW8gZHVyYXRpb24gLT4KLSAgICAoMip2aWRlb0FVRHVyYXRpb24pIHRvIGhhdmUgYSBtb3JlIHByZWNpc2UgZW5kIGN1dCovCi0gICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVLm1fQ1RTICsgKDIgKnZpZGVvQVVEdXJhdGlvbikgPiBwQy0+dWlFbmRDdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICogQGF1dGhvciAgIEFsZXhpcyBWYXBpbGxvbiAoTlhQIFNvZnR3YXJlIFZpc2lvbikKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfTWVkaWFUaW1lIG10VHJhbnNjb2RlZFRpbWUgPSAwLjA7Ci0gICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGU7Ci0gICAgTTRPU0FfSW50MzIgZGVyaXZlID0gMDsKLQotICAgIC8qKgotICAgICogR2V0IHZpZGVvIENUUyB0byBkZWNvZGUgKi8KLSAgICBtdFRyYW5zY29kZWRUaW1lID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0gICAgRnJhbWVNb2RlID0gTTRFTkNPREVSX2tOb3JtYWxGcmFtZTsKLQotICAgIC8qKgotICAgICogRGVjb2RlIHZpZGVvICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCk6IENhbGxpbmcgbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUoJS4yZikiLAotICAgICAgICBtdFRyYW5zY29kZWRUaW1lKTsKLSAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9GQUxTRTsKLSAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocEMtPnBWaURlY0N0eHQsICZtdFRyYW5zY29kZWRUaW1lLAotICAgICAgICBNNE9TQV9GQUxTRSwgMCk7Ci0KLSAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgRnJhbWVNb2RlID0KLSAgICAgICAgICAgIE00RU5DT0RFUl9rTGFzdEZyYW1lOyAvKio8IFdlIHdpbGwgZ2l2ZSB0aGlzIHZhbHVlIHRvIHRoZSBlbmNvZGVyIHRvCi0gICAgICAgICAgICBhc2sgZm9yIHRoZSBlbmQgb2YgdGhlIGVuY29kaW5nICovCi0gICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgIH0KLSAgICBlbHNlIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkRlY29kaW5nIG91dHB1dCB0aGUgc2FtZSBmcmFtZSBhcyBiZWZvcmUgMyIpOwotICAgICAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCk6IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGZvciBlbmQgY3V0LgotICAgICogV2UgbXVzdCBjaGVjayBoZXJlIGlmIHRoZSBlbmQgY3V0IGlzIHJlYWNoZWQsIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHdlIG11c3QKLSAgICAqIGNhbGwgdGhlIGxhc3QgZW5jb2RlIHN0ZXAgKC0+IGJMYXN0RnJhbWUgc2V0IHRvIHRydWUpICovCi0gICAgaWYoICggcEMtPmRWaURlY0N1cnJlbnRDdHMgKyBwQy0+ZEN0c0luY3JlbWVudCApID49IChwQy0+dWlFbmRDdXRUaW1lCi0gICAgICAgICsgTTRNQ1NfQUJTKHBDLT5kVmlEZWNTdGFydGluZ0N0cyAtIHBDLT51aUJlZ2luQ3V0VGltZSkpICkKLSAgICB7Ci0gICAgICAgIEZyYW1lTW9kZSA9Ci0gICAgICAgICAgICBNNEVOQ09ERVJfa0xhc3RGcmFtZTsgLyoqPCBXZSB3aWxsIGdpdmUgdGhpcyB2YWx1ZSB0byB0aGUgZW5jb2RlciB0bwotICAgICAgICAgICAgYXNrIGZvciB0aGUgZW5kIG9mIHRoZSBlbmNvZGluZyAqLwotICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgZGVyaXZlID0gKE00T1NBX0ludDMyKSgoIHBDLT5kVmlEZWNDdXJyZW50Q3RzICsgcEMtPmRDdHNJbmNyZW1lbnQgKyAwLjUpCi0gICAgICAgICAgICAtIChwQy0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICArIE00TUNTX0FCUyhwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKSk7Ci0gICAgfQotCi0gICAgLyogVXBkYXRlIHN0YXJ0aW5nIENUUyB0byBoYXZlIGEgbW9yZSBwcmVjaXNlIHZhbHVlICgKLSAgICB0aGUgYmVnaW4gY3V0IGlzIG5vdCBhIHJlYWwgQ1RTKSovCi0gICAgaWYoIHBDLT51aVZpZGVvQVVDb3VudCA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5kVmlEZWNTdGFydGluZ0N0cyA9IG10VHJhbnNjb2RlZFRpbWU7Ci0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5jb2RlIHZpZGVvICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCk6IENhbGxpbmcgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUgd2l0aCB2aWRlb0N0c1wKLSAgICAgICAgID0gJS4yZiIscEMtPlJlYWRlclZpZGVvQVUubV9DVFMpOwotICAgIHBDLT51aVZpZGVvQVVDb3VudCsrOwotICAgIC8qIHVwZGF0ZSB0aGUgZ2l2ZW4gZHVyYXRpb24gKHRoZSBiZWdpbiBjdXQgaXMgbm90IGEgcmVhbCBDVFMpKi8KLSAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUocEMtPnBWaUVuY0N0eHQsIE00T1NBX05VTEwsCi0gICAgICAgIChwQy0+ZFZpRGVjQ3VycmVudEN0cyAtIHBDLT5kVmlEZWNTdGFydGluZ0N0cyAtIChkZXJpdmUgPj4gMSkpLAotICAgICAgICBGcmFtZU1vZGUpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDb250ZXh0KQotICogQGF1dGhvciAgIERvdW55YSBNYW5haSAoTlhQIFNvZnR3YXJlIFZpc2lvbikKLSAqIEBicmllZiAgICBSZXRyaWV2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyBEZWNDb25mSW5mbzsKLSAgICBNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgSDI2M3Byb3A7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9CaXRyYXRlOwotICAgIE00REVDT0RFUl9WaWRlb1NpemUgdmlkZW9TaXplOwotICAgIE00X0FBQ1R5cGUgaUFhY1R5cGUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEMsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6IHBDIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgY29tbW9uIGNoYXJhY3RlcmlzdGljcyAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkZpbGVUeXBlID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WZXJzaW9uWzBdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUjsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WZXJzaW9uWzFdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUjsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WZXJzaW9uWzJdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9IDA7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKikgJnBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZ0eXAsCi0gICAgICAgIDAsIHNpemVvZihNNFZJREVPRURJVElOR19GdHlwQm94KSk7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IHZpZGVvIGNoYXJhY3RlcmlzdGljcyAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbiA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9NYXhBdVNpemUgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuZkF2ZXJhZ2VGcmFtZVJhdGUgPSAwLjA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRkYXRhUGFydGl0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0cnZsYyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNHJlc3luY2hNYXJrZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgYXVkaW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUV4dGVuZGVkU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPSAwOwotCi0gICAgLyogUmVzZXQgY29tcGF0aWJpbGl0eSBjaGFydCAobm90IHVzZWQgaW4gTUNTKSAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJWaWRlb0lzRWRpdGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYlZpZGVvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBWaWRlbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa01QRUc0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVVua25vd246Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tVbnN1cHBvcnRlZFZpZGVvOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaWYgYml0cmF0ZSBub3QgYXZhaWxhYmxlIHJldHJpZXZlIGFuIGVzdGltYXRpb24gb2YgdGhlIG92ZXJhbGwgYml0cmF0ZSAqLwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotCi0gICAgICAgIGlmKCAwID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSwgJnZpZGVvQml0cmF0ZSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHdlIGdldCB0aGUgb3ZlcmFsbCBiaXRyYXRlLCBzdWJzdHJhY3QgdGhlIGF1ZGlvIGJpdHJhdGUgaWYgYW55ICovCi0gICAgICAgICAgICAgICAgdmlkZW9CaXRyYXRlIC09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IHZpZGVvQml0cmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFJldHJpZXZlIHRoZSBQcm9maWxlICYgTGV2ZWwgKi8KLSAgICAgICAgaWYoICggTTRWSURFT0VESVRJTkdfa0gyNjMgIT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKQotICAgICAgICAgICAgJiYgKE00VklERU9FRElUSU5HX2tIMjY0Ci0gICAgICAgICAgICAhPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVXNlIHRoZSBEU0kgcGFyc2luZyBmdW5jdGlvbiBmcm9tIHRoZSBleHRlcm5hbCB2aWRlbyBzaGVsbCBkZWNvZGVyLgotICAgICAgICAgICAgU2VlIHRoZSBjb21tZW50cyBpbiBNNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMsIGl0J3MgcHJldHR5IG11Y2ggdGhlCi0gICAgICAgICAgICBzYW1lIGlzc3VlLiAqLwotCi0gICAgICAgICAgICBlcnIgPSBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSShwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgJkRlY0NvbmZJbmZvLCAmdmlkZW9TaXplKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoKTpcCi0gICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSSByZXR1cm5zIDB4JTA4WCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV92aWRlb1dpZHRoID0gdmlkZW9TaXplLm1fdWlXaWR0aDsKLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQgPSB2aWRlb1NpemUubV91aUhlaWdodDsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgPSBEZWNDb25mSW5mby51aVRpbWVTY2FsZTsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPQotICAgICAgICAgICAgICAgIERlY0NvbmZJbmZvLmJEYXRhUGFydGl0aW9uOwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0cnZsYyA9IERlY0NvbmZJbmZvLmJVc2VPZlJWTEM7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRyZXN5bmNoTWFya2VyID0KLSAgICAgICAgICAgICAgICBEZWNDb25mSW5mby51aVVzZU9mUmVzeW5jaE1hcmtlcjsKLQotICAgICAgICAgICAgZXJyID0gZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwoRGVjQ29uZkluZm8udWlQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgJihwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCkpOwotICAgICAgICAgICAgaWYgKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRWSURFT0VESVRJTkdfa0gyNjMgPT0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApIHsKLQotICAgICAgICAgICAgZXJyID0gZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgJihwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCkpOwotICAgICAgICAgICAgaWYgKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgICAgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEZvciBoMjYzIHNldCBkZWZhdWx0IHRpbWVzY2FsZSA6IDMwMDAwOjEwMDEgKi8KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgPSAzMDAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggTTRWSURFT0VESVRJTkdfa0gyNjQgPT0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApIHsKLQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDMwMDAwOwotICAgICAgICAgICAgZXJyID0gZ2V0QVZDUHJvZmlsZUFuZExldmVsKHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICAgICBnZXRBVkNQcm9maWxlQW5kTGV2ZWwgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBIZXJlIGJlY2F1c2Ugd2lkdGggeCBoZWlnaHQgaXMgY29ycmVjdCBvbmx5IGFmdGVyIGRzaSBwYXJzaW5nCi0gICAgICAgIChkb25lIGluIGNyZWF0ZSBkZWNvZGVyKSAqLwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQ7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemU7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPnZpZGVvUm90YXRpb25EZWdyZWVzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlVuc3VwcG9ydGVkVmlkZW9Gb3VuZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkVmlkZW87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tBQUM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa01QMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVW5rbm93bjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXIpCi0gICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cEF1ZGlvRGVjQ3R4dCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczogY2FsbGluZyBDcmVhdGVBdWRpb0RlY29kZXIsIHVzZXJEYXRhPSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iRXh0T01YQXVkRGVjb2RlciApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcyhwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQy0+cEF1ZGlvRGVjQ3R4dCwgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogQUFDIHByb3BlcnRpZXMqLwotICAgICAgICAgICAgICAgICAgICAvL2dldCBmcm9tIFJlYWRlcjsgdGVtcG9yYXJ5LCB0aWxsIEF1ZGlvIGRlY29kZXIgc2hlbGwgQVBJIGF2YWlsYWJsZSB0bwotICAgICAgICAgICAgICAgICAgICAvL2dldCB0aGUgQUFDIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4gPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZpQWFjVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjIHJldHVybnMgZXJyIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSA9IE00X2tBQUM7IC8vc2V0IHRvIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBzdHJlYW1UeXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGlBYWNUeXBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7IC8vVE9ETwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7IC8vVE9ETwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tVbmtub3duOgotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczogQUFDIE5CQ2hhbnM9JWQsIFNhbXBsRnJlcT0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9FVlJDCi0gICAgICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGRlY29kZXIgbm90IGltcGxlbWVudGVkIHlldCwgcHJvdmlkZSBzb21lIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgbnVsbCBlbmNvZGluZyAqLwotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSA4MDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQnVnZml4IFA0TUUwMDAwMTEyODogV2l0aCBzb21lIElNVEMgZmlsZXMsIHRoZSBBTVIgYml0IHJhdGUgaXMgMCBrYnBzIGFjY29yZGluZwotICAgICAgICAgdGhlIEdldFByb3BlcnRpZXMgZnVuY3Rpb24gKi8KLSAgICAgICAgaWYoIDAgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CCi0gICAgICAgICAgICAgICAgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJldHRlciByZXR1cm5pbmcgYSBndWVzc2VkIDEyLjIga2JwcyB2YWx1ZSB0aGFuIGEgc3VyZS10by1iZS1mYWxzZQotICAgICAgICAgICAgICAgIDAga2JwcyB2YWx1ZSEgKi8KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rRVZSQwotICAgICAgICAgICAgICAgID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBCZXR0ZXIgcmV0dXJuaW5nIGEgZ3Vlc3NlZCA4LjUga2JwcyB2YWx1ZSB0aGFuIGEgc3VyZS10by1iZS1mYWxzZQotICAgICAgICAgICAgICAgIDAga2JwcyB2YWx1ZSEgKi8KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s5XzJfS0JQUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZUJpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAvKiBDYW4gaGFwcGVuIGFsc28gZm9yIGFhYywgaW4gdGhpcyBjYXNlIHdlIGNhbGN1bGF0ZSBhbiBhcHByb3hpbWF0aXZlICovCi0gICAgICAgICAgICAgICAgLyogdmFsdWUgZnJvbSBnbG9iYWwgYml0cmF0ZSBhbmQgdmlkZW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbihwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJkZpbGVCaXRyYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOiBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBGaWxlQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAtIHBDLT4KLSAgICAgICAgICAgICAgICAgICAgSW5wdXRGaWxlUHJvcGVydGllcy4KLSAgICAgICAgICAgICAgICAgICAgdWlWaWRlb0JpdHJhdGUgLyogbm9ybWFsbHkgc2V0dGVkIHRvIDAsIGlmIG5vIHZpZGVvICovOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotCi0gICAgICAgIC8qIEJ1Zzogd2l0aCBhYWMsIHZhbHVlIGlzIDAgdW50aWwgZGVjb2RlciBzdGFydCgpIGlzIGNhbGxlZCAqLwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aURlY29kZWRQY21TaXplID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgICAgIC8qIE5ldyBhYWMgcHJvcGVydGllcyAqLwotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMKLSAgICAgICAgICAgID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9IHBDLT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuOwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxOwotCi0gICAgICAgICAgICBpZiggcEMtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tBQUNwbHVzOwotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFFeHRlbnNpb25TYW1wRnJlcTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBDLT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tlQUFDcGx1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlVuc3VwcG9ydGVkQXVkaW9Gb3VuZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogR2V0ICdmdHlwJyBhdG9tICovCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3gsICZwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mdHlwKTsKLQotICAgIC8qIEFuYWx5c2lzIGlzIHN1Y2Nlc3NmdWwgKi8KLSAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbgotICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gKQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgZWxzZQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0KLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5GaWxlVHlwZSA9IHBDLT5JbnB1dEZpbGVUeXBlOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lKQotICogQGJyaWVmICAgUmV0dXJuIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgQU1SIE5hcnJvdy1CYW5kIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgQU1STkIgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKCBNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSApCi17Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lVHlwZSA9ICggKCAqcEF1ZGlvRnJhbWUpICYoMHhGIDw8IDMpKSA+PiAzOwotCi0gICAgc3dpdGNoKCBmcmFtZVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZnJhbWVTaXplID0gOTU7Ci0gICAgICAgICAgICBicmVhazsgLyogIDQ3NTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTAzOwotICAgICAgICAgICAgYnJlYWs7IC8qICA1MTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDExODsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNTkwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMzQ7Ci0gICAgICAgICAgICBicmVhazsgLyogIDY3MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTQ4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3NDAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE1OTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNzk1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyMDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTAyMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMjQ0OwotICAgICAgICAgICAgYnJlYWs7IC8qIDEyMDAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDM5OwotICAgICAgICAgICAgYnJlYWs7IC8qIFNJRCAoU2lsZW5jZSkgKi8KLQotICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiBObyBkYXRhICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRGcmFtZVNpemVfQU1STkIoKTogQ29ycnVwdGVkIEFNUiBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0VWUkMoTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBFVlJDIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogICAgIDAgMSAyIDMKLSAqICAgICstKy0rLSstKwotICogICAgfGZyIHR5cGV8ICAgICAgICAgICAgICBSRkMgMzU1OAotICogICAgKy0rLSstKy0rCi0gKgotICogRnJhbWUgVHlwZTogNCBiaXRzCi0gKiAgICBUaGUgZnJhbWUgdHlwZSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29kZWMgZGF0YQotICogICAgZnJhbWUgaW4gdGhlIFJUUCBwYWNrZXQuCi0gKgotICogRm9yIEVWUkMgYW5kIFNNViBjb2RlY3MsIHRoZSBmcmFtZSB0eXBlIHZhbHVlcyBhbmQgc2l6ZSBvZiB0aGUKLSAqIGFzc29jaWF0ZWQgY29kZWMgZGF0YSBmcmFtZSBhcmUgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBiZWxvdzoKLSAqCi0gKiBWYWx1ZSAgIFJhdGUgICAgICBUb3RhbCBjb2RlYyBkYXRhIGZyYW1lIHNpemUgKGluIG9jdGV0cykKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogICAwICAgICBCbGFuayAgICAgIDAgICAgKDAgYml0KQotICogICAxICAgICAxLzggICAgICAgIDIgICAgKDE2IGJpdHMpCi0gKiAgIDIgICAgIDEvNCAgICAgICAgNSAgICAoNDAgYml0czsgbm90IHZhbGlkIGZvciBFVlJDKQotICogICAzICAgICAxLzIgICAgICAgMTAgICAgKDgwIGJpdHMpCi0gKiAgIDQgICAgIDEgICAgICAgICAyMiAgICAoMTcxIGJpdHM7IDUgcGFkZGVkIGF0IGVuZCB3aXRoIHplcm9zKQotICogICA1ICAgICBFcmFzdXJlICAgIDAgICAgKFNIT1VMRCBOT1QgYmUgdHJhbnNtaXR0ZWQgYnkgc2VuZGVyKQotICoKLSAqIEBwYXJhbSAgIHBDcEF1ZGlvRnJhbWUgICAoSU4pIEVWUkMgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0VWUkMoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAqcEF1ZGlvRnJhbWUpICYweDBGOwotCi0gICAgc3dpdGNoKCBmcmFtZVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgYmxhbmsgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNjsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS84ICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gNDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvNCAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDgwOwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzIgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNzE7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEgKi8KLQotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBlcmFzdXJlICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQygpOiBDb3JydXB0ZWQgRVZSQyBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZShNNE1DU19Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIENoZWNrIGlmIG1heCBmaWxlIHNpemUgaXMgZ3JlYXRlciBlbm91Z2ggdG8gZW5jb2RlIGEgZmlsZSB3aXRoIHRoZQotICogICAgICAgICAgIGN1cnJlbnQgc2VsZWN0ZWQgYml0cmF0ZXMgYW5kIGR1cmF0aW9uLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IKLSAqIEByZXR1cm4gICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgTTRPU0FfVUludDMyIGR1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBhdWRpb2JpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvYml0cmF0ZTsKLQotICAgIC8qIGZyZWUgZmlsZSBzaXplIDogT0sgKi8KLSAgICBpZiggcEMtPnVpTWF4RmlsZVNpemUgPT0gMCApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyogZHVyYXRpb24gKi8KLSAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLSBwQy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGR1cmF0aW9uID0gcEMtPnVpRW5kQ3V0VGltZSAtIHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0KLSAgICAvKiBhdWRpbyBiaXRyYXRlICovCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICB7Ci0gICAgICAgIGF1ZGlvYml0cmF0ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBdWRpb05VTEwgKQotICAgIHsKLSAgICAgICAgYXVkaW9iaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgICAgICAgICAgYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tFVlJDOgotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGF1ZGlvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5XzJfS0JQUzsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyogQUFDIGFuZCBNUDMqLwotICAgICAgICAgICAgICAgIGF1ZGlvYml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfazE2X0tCUFMgOiBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBhdWRpb2JpdHJhdGUgPSBwQy0+dWlBdWRpb0JpdHJhdGU7Ci0gICAgfQotCi0gICAgLyogdmlkZW8gYml0cmF0ZSAqLwotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgIHsKLSAgICAgICAgdmlkZW9iaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT51aVZpZGVvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTZfS0JQUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmlkZW9iaXRyYXRlID0gcEMtPnVpVmlkZW9CaXRyYXRlOwotICAgIH0KLQotICAgIC8qIG1heCBmaWxlIHNpemUgKi8KLSAgICBpZiggKE00T1NBX1VJbnQzMilwQy0+dWlNYXhGaWxlU2l6ZQotICAgICAgICA8IChNNE9TQV9VSW50MzIpKE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAqIChhdWRpb2JpdHJhdGUgKyB2aWRlb2JpdHJhdGUpICogKGR1cmF0aW9uIC8gODAwMC4wKSkgKQotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklERU9FRElUSU5HX0JpdHJhdGUgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoTTRPU0FfVUludDMyIGZyZWViaXRyYXRlLCBNNE9TQV9JbnQ4IG1vZGUpCi0gKiBAYnJpZWYgICAgUmV0dXJucyB0aGUgY2xvc2VzdCBiaXRyYXRlIHZhbHVlIGZyb20gdGhlIGVudW0gbGlzdCBvZiB0eXBlIE00VklERU9FRElUSU5HX0JpdHJhdGUKLSAqIEBwYXJhbSAgICBmcmVlYml0cmF0ZTogdW5zaWduZWQgaW50IHZhbHVlCi0gKiBAcGFyYW0gICAgbW9kZTogLTE6cHJldmlvdXMsMDpjdXJyZW50LDE6bmV4dAotICogQHJldHVybiAgIGJpdHJhdGUgdmFsdWUgaW4gZW51bSBsaXN0IE00VklERU9FRElUSU5HX0JpdHJhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00VklERU9FRElUSU5HX0JpdHJhdGUKLU00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKCBNNE9TQV9JbnQzMiBmcmVlYml0cmF0ZSwgTTRPU0FfSW50OCBtb2RlICkKLXsKLSAgICBNNE9TQV9JbnQzMiBiaXRhcnJheSBbXSA9Ci0gICAgewotICAgICAgICAwLCBNNFZJREVPRURJVElOR19rMTZfS0JQUywgTTRWSURFT0VESVRJTkdfazI0X0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2szMl9LQlBTLCBNNFZJREVPRURJVElOR19rNDhfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFMsIE00VklERU9FRElUSU5HX2s5Nl9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rMTI4X0tCUFMsIE00VklERU9FRElUSU5HX2sxOTJfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTLCBNNFZJREVPRURJVElOR19rMjg4X0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUywgTTRWSURFT0VESVRJTkdfazUxMl9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rODAwX0tCUFMsIE00VklERU9FRElUSU5HX2syX01CUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2s1X01CUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2s4X01CUFMsIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICBNNE9TQV9JTlQzMl9NQVgKLSAgICB9OwotCi0gICAgY29uc3QgTTRPU0FfVUludDMyIG5iYml0cmF0ZXMgPSAxNDsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIGZvciAoIGkgPSAwOyBmcmVlYml0cmF0ZSA+PSBiaXRhcnJheVtpXTsgaSsrICk7Ci0KLSAgICBzd2l0Y2goIG1vZGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAtMTogLyogcHJldmlvdXMgKi8KLSAgICAgICAgICAgIGlmKCBpIDw9IDIgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBiaXRhcnJheVtpIC0gMl07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDA6IC8qIGN1cnJlbnQgKi8KLSAgICAgICAgICAgIGlmKCBpIDw9IDEgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBiaXRhcnJheVtpIC0gMV07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6IC8qIG5leHQgKi8KLSAgICAgICAgICAgIGlmKCBpID49IG5iYml0cmF0ZXMgKQotICAgICAgICAgICAgICAgIHJldHVybiBNNE9TQV9JTlQzMl9NQVg7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGFycmF5W2ldOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpOwotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgTTRNQ1Nfb3BlbigpCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE1DU19pbnRDbGVhblVwX1JlYWRlcnNEZWNvZGVycyBjYWxsZWQgd2l0aCBwQz0weCV4IiwgcEMpOwotCi0gICAgLyoqLwotICAgIC8qIC0tLS0tIEZyZWUgdmlkZW8gZGVjb2RlciBzdHVmZiwgaWYgbmVlZGVkIC0tLS0tICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFZpRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KHBDLT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcEMtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBtX3BWaWRlb0RlY29kZXItPnBGY3REZXN0cm95IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdGhlIGF1ZGlvIGRlY29kZXIgc3R1ZmYgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9EZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgICAgIHBDLT5wQXVkaW9EZWNDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3REZXN0cm95QXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLSBGcmVlIHJlYWRlciBzdHVmZiwgaWYgbmVlZGVkIC0tLS0tICovCi0gICAgLy8gV2UgY2Fubm90IGZyZWUgdGhlIHJlYWRlciBiZWZvcmUgZGVjb2RlcnMgYmVjYXVzZSB0aGUgZGVjb2RlcnMgbWF5IHJlYWQKLSAgICAvLyBmcm9tIHRoZSByZWFkZXIgKGluIGFub3RoZXIgdGhyZWFkKSBiZWZvcmUgYmVpbmcgc3RvcHBlZC4KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT4KLSAgICAgICAgcFJlYWRlckNvbnRleHQgKSAvKio8IG1heSBiZSBNNE9TQV9OVUxMIGlmIE00TUNTX29wZW4gd2FzIG5vdCBjYWxsZWQgKi8KLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdENsb3NlKHBDLT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2NsZWFuVXA6IG1fcFJlYWRlci0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RGVzdHJveShwQy0+cFJlYWRlckNvbnRleHQpOwotICAgICAgICBwQy0+cFJlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBtX3BSZWFkZXItPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBwQy0+bV9wRGF0YUFkZHJlc3MxICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wRGF0YUFkZHJlc3MxKTsKLSAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BEYXRhQWRkcmVzczIgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BEYXRhQWRkcmVzczIpOwotICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLypCdWcgZml4IDExLzEyLzIwMDggKHRvIG9idGFpbiBtb3JlIHByZWNpc2UgdmlkZW8gZW5kIGN1dCkqLwotICAgIGlmKCBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSk7Ci0gICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyKTsKLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX29wZW5fbm9ybWFsTW9kZShNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlT3V0LCBNNE9TQV9Wb2lkKiBwVGVtcEZpbGUpOwotICogQGJyaWVmICAgU2V0IHRoZSBNQ1MgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4gSXQgaXMgdGhlIHNhbWUgYXMgTTRNQ1Nfb3BlbiB3aXRob3V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV0lUSF9GQVNUX09QRU4gZmxhZwotSXQgaXMgdXNlZCBpbiBWaWRlb0FydGlzdAotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgaXMgbm90IGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwRmlsZUluICAgICAgICAgICAgIChJTikgSW5wdXQgZmlsZSB0byB0cmFuc2NvZGUgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIENvbnRhaW5lciB0eXBlICguM2dwLC5hbXIsIC4uLikgb2YgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBGaWxlT3V0ICAgICAgICAgICAgKElOKSBPdXRwdXQgZmlsZSB0byBjcmVhdGUgIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgcFRlbXBGaWxlICAgICAgICAgICAoSU4pIFRlbXBvcmFyeSBmaWxlIGZvciB0aGUgY29uc3RhbnQgbWVtb3J5IHdyaXRlciB0byBzdG9yZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSAoIm1vb3YuYmluIikuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORDogICBUaGUgaW5wdXQgZmlsZSBoYXMgbm90IGJlZW4gZm91bmQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEU6ICAgVGhlIGlucHV0IGZpbGUgaXMgbm90IGEgdmFsaWQgZmlsZSwgb3IgaXMgY29ycnVwdGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOiAgVGhlIGlucHV0IGZpbGUgY29udGFpbnMgbm8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGF1ZGlvIG9yIHZpZGVvIHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBJbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlT3V0LCBNNE9TQV9Wb2lkKiBwVGVtcEZpbGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00UkVBREVSX01lZGlhRmFtaWx5IG1lZGlhRmFtaWx5OwotICAgIE00X1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00TUNTX29wZW5fbm9ybWFsTW9kZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwRmlsZUluPTB4JXgsXAotICAgICBwRmlsZU91dD0weCV4IiwgcENvbnRleHQsIHBGaWxlSW4sIHBGaWxlT3V0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgIk00TUNTX29wZW5fbm9ybWFsTW9kZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZUluKSAsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgIk00TUNTX29wZW5fbm9ybWFsTW9kZTogcEZpbGVJbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiAoKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRykKLSAgICAgICAgfHwoSW5wdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUE5HKQotICAgICAgICB8fChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9HSUYpCi0gICAgICAgIHx8KElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0JNUCkpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlOiBTdGlsbCBwaWN0dXJlIGlzIG5vdFwKLSAgICAgICAgICAgICBzdXBwb3J0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYgKE00TUNTX2tTdGF0ZV9DUkVBVEVEICE9IHBDLT5TdGF0ZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ29weSBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzIGludG8gb3VyIGNvbnRleHQgKi8KLSAgICBwQy0+cElucHV0RmlsZSAgICAgPSBwRmlsZUluOwotICAgIHBDLT5JbnB1dEZpbGVUeXBlICA9IElucHV0RmlsZVR5cGU7Ci0gICAgcEMtPnBPdXRwdXRGaWxlICAgID0gcEZpbGVPdXQ7Ci0gICAgcEMtPnBUZW1wb3JhcnlGaWxlID0gcFRlbXBGaWxlOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIE9wZW4gaW5wdXQgZmlsZSB3aXRoIHRoZSByZWFkZXIgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50UmVhZGVyKHBDb250ZXh0LCBwQy0+SW5wdXRGaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IHJlYWRlciByZWxhdGVkIHZhcmlhYmxlcyAqLwotICAgIHBDLT5WaWRlb1N0YXRlICAgICAgICAgID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNOwotICAgIHBDLT5BdWRpb1N0YXRlICAgICAgICAgID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNOwotICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtICA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBJbml0aWFsaXplcyB0aGUgcmVhZGVyIHNoZWxsIGFuZCBvcGVuIHRoZSBkYXRhIGZpbGUgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDLT5wUmVhZGVyQ29udGV4dCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogTGluayB0aGUgcmVhZGVyIGludGVyZmFjZSB0byB0aGUgcmVhZGVyIGNvbnRleHQgKi8KLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3JlYWRlckNvbnRleHQgPSBwQy0+cFJlYWRlckNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcmVhZGVyIHNoZWxsIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbihwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT5wT3NhRmlsZVJlYWRQdHIpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE9wZW4gdGhlIGlucHV0IGZpbGUgKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RPcGVuKHBDLT5wUmVhZGVyQ29udGV4dCwgcEMtPnBJbnB1dEZpbGUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aUR1bW15LCB1aUNvcmVJZDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBtX3BSZWFkZXItPm1fcEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLQotICAgICAgICBpZiAoZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEUpKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IHJldHVybmluZyBNNE1DU19FUlJfRklMRV9EUk1fUFJPVEVDVEVEIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0ZJTEVfRFJNX1BST1RFQ1RFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBJZiB0aGUgZXJyb3IgaXMgZnJvbSB0aGUgY29yZSByZWFkZXIsIHdlIGNoYW5nZSBpdCB0byBhIHB1YmxpYyBWWFMgZXJyb3IgKi8KLSAgICAgICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLSAgICAgICAgICAgIGlmIChNNE1QNF9SRUFERVIgPT0gdWlDb3JlSWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiByZXR1cm5pbmcgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZSAqLwotICAgIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0ocEMtPnBSZWFkZXJDb250ZXh0LCAmbWVkaWFGYW1pbHksCi0gICAgICAgICAgICAmcFN0cmVhbUhhbmRsZXIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluIGNhc2Ugd2UgZm91bmQgYSBCSUZTIHN0cmVhbSBvciBzb21ldGhpbmcgZWxzZS4uLiovCi0gICAgICAgIGlmKChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgLyoqPCBPbmUgc3RyZWFtIGZvdW5kICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCB0aGUgZmlyc3QgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiAoKE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvID09IG1lZGlhRmFtaWx5KSBcCi0gICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0PT1wU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERU9fQVZDCi0gICAgICAgICAgICAgICAgICAgIHx8KE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpKQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgfHwoKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgICYmKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlQVZDXSAhPSBNNE9TQV9OVUxMKSkpCi0jZW5kaWYKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IHZpZGVvIHN0cmVhbSBpbiBpbnB1dCAzZ3BwIGNsaXAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBLZWVwIHBvaW50ZXIgdG8gdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtID0gKE00X1ZpZGVvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciB2aWRlbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQodmlkZW8pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwgcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbykgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtICgweCV4KSBpbiBpbnB1dCAzZ3BwIGNsaXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+YlVuc3VwcG9ydGVkVmlkZW9Gb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIHRoZSBmaXJzdCBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKChNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbyA9PSBtZWRpYUZhbWlseSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZD09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjPT1wU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogRm91bmQgYW4gQU1SLU5CLCBBQUMgXAotICAgICAgICAgICAgICAgICAgICAgICAgb3IgTVAzIGF1ZGlvIHN0cmVhbSBpbiBpbnB1dCBjbGlwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdCBvdXIgYXVkaW8gc3RyZWFtIHN0YXRlIHZhcmlhYmxlICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0UmVzZXQocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdFJlc2V0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogT3V0cHV0IG1heCBBVSBzaXplIGlzIGVxdWFsIHRvIGlucHV0IG1heCBBVSBzaXplICh0aGlzIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICogd2lsbCBiZSBjaGFuZ2VkIGlmIHRoZXJlIGlzIGF1ZGlvIHRyYW5zY29kaW5nKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKio8IE5vdCBBTVItTkIsIEFBQywgTVAzIG5vciBFVlJDIChBTVItV0IsIFdBVi4uLikgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBGb3VuZCBhbiB1bnN1cHBvcnRlZCBhdWRpbyBzdHJlYW1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgKDB4JXgpIGluIGlucHV0IDNncHAgY2xpcCIsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8qKjwgZW5kIG9mIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikgKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgd2UgZm91bmQgYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBzdHJlYW0gKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKSAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogcmV0dXJuaW5nIFwKLSAgICAgICAgICAgIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU0iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0gICAgfQotCi0jaWZuZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIGlmKHBDLT5WaWRlb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRGVjb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYocEMtPkF1ZGlvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQpCi0gICAgewotICAgICAgICAvL0VWUkMKLSAgICAgICAgaWYoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjICE9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAvKiBkZWNvZGVyIG5vdCBzdXBwb3J0ZWQgeWV0LCBidXQgYWxsb3cgdG8gZG8gbnVsbCBlbmNvZGluZyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9EZWNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgZXJyID0gTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyhwQyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGJlZ2luIGN1dCBkZWNvZGluZyBpbmNyZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBmcmFtZSByYXRlICovCi0gICAgaWYgKDAuICE9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlKSAvKio8IHNhbml0eSBjaGVjayAqLwotICAgIHsKLSAgICAgICAgcEMtPmlWaWRlb0JlZ2luRGVjSW5jciA9IChNNE9TQV9JbnQzMikoMzAwMC4gXAotICAgICAgICAgICAgLyBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSk7IC8qKjwgYWJvdXQgMyBmcmFtZXMgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPmlWaWRlb0JlZ2luRGVjSW5jciA9IDIwMDsgLyoqPCBkZWZhdWx0IHZhbHVlOiAyMDAgbWlsbGlzZWNvbmRzICgzIGZyYW1lcyBAIDE1ZnBzKSovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX09QRU5FRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00QURfQnVmZmVyIG91dHB1dEJ1ZmZlcjsKLSAgICB1aW50MzJfdCBvcHRpb25WYWx1ZSA9MDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcyA6c3RhcnQiKTsKLQotICAgIC8vIERlY29kZSBmaXJzdCBhdWRpbyBmcmFtZSBmcm9tIGNsaXAgdG8gZ2V0IHByb3BlcnRpZXMgZnJvbSBjb2RlYwotCi0gICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09Ci0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpIHsKLQotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLCAmKHBDLT5BYWNQcm9wZXJ0aWVzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSk7Ci0gICAgfQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzOiBtX3BGY3RDcmVhdGVBdWRpb0RlYyBcCi0gICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLCAoTTRPU0FfRGF0YU9wdGlvbikgcEMtPm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9BVSwgKE00T1NBX0RhdGFPcHRpb24pICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQpOwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllczogbV9wRmN0U3RhcnRBdWRpb0RlYyBcCi0gICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgPQotICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICBpZiggb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA+IDAgKSB7Ci0KLSAgICAgICAgb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplIFwKLSAgICAgICAgICAgICpzaXplb2Yoc2hvcnQpLCBNNE1DUywgKE00T1NBX0NoYXIgKikib3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXMoKTpcCi0gICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcywgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgIE00T1NBX05VTEwsICZvdXRwdXRCdWZmZXIsIE00T1NBX0ZBTFNFKTsKLQotICAgIGlmICggZXJyID09IE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSApIHsKLQotICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnRpZXMgZnJvbSBjb2RlYyBub2RlCi0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9BdWRpb05iQ2hhbm5lbHMsIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIC8vIFJlc2V0IFJlYWRlciBzdHJ1Y3R1cmUgdmFsdWUgYWxzbwotICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeSwgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkgewotCi0gICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiA9Ci0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiggZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYyByZXR1cm5zIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIGZyZWUob3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIKLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzXAotICAgICAgICAgICAgRXJyb3IgaW4gcmVzZXRpbmcgcmVhZGVyOiAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotCi19Ci0KLU00T1NBX0VSUiBNNE1DU19pbnRMaW1pdEJpdHJhdGVQZXJDb2RlY1Byb2ZpbGVMZXZlbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyogRW5jUGFyYW1zKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIHN3aXRjaCAoRW5jUGFyYW1zLT5Gb3JtYXQpIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjM6Ci0gICAgICAgICAgICBFbmNQYXJhbXMtPkJpdHJhdGUgPSBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjYzRW5jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9MZXZlbCwgRW5jUGFyYW1zLT5CaXRyYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUEVHNDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy0+Qml0cmF0ZSA9IE00TUNTX2ludExpbWl0Qml0cmF0ZUZvck1wZWc0RW5jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9MZXZlbCwgRW5jUGFyYW1zLT5CaXRyYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tIMjY0OgotICAgICAgICAgICAgRW5jUGFyYW1zLT5CaXRyYXRlID0gTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2NEVuYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNQYXJhbXMtPnZpZGVvUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNQYXJhbXMtPnZpZGVvTGV2ZWwsIEVuY1BhcmFtcy0+Qml0cmF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsOiBcCi0gICAgICAgICAgICAgICAgV3JvbmcgZW5jIGZvcm1hdCAlZCIsIEVuY1BhcmFtcy0+Rm9ybWF0KTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotTTRPU0FfSW50MzIgTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2NEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpIHsKLQotICAgIE00T1NBX0ludDMyIHZpZEJpdHJhdGUgPSAwOwotCi0gICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZToKLSAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZU1haW46Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNjQwMDApID8gNjQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMWI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDE5MjAwMCkgPyAxOTIwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDM4NDAwMCkgPyAzODQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTM6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDc2ODAwMCkgPyA3NjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjAwMDAwMCkgPyAyMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDIxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA0MDAwMDAwKSA/IDQwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDQwMDAwMDApID8gNDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMDAwMDAwMCkgPyAxMDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTQwMDAwMDApID8gMTQwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMzI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDIwMDAwMDAwKSA/IDIwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQ6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDIwMDAwMDAwKSA/IDIwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA1MDAwMDAwMCkgPyA1MDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw0MjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNTAwMDAwMDApID8gNTAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTM1MDAwMDAwKSA/IDEzNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1MToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjQwMDAwMDAwKSA/IDI0MDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g6Ci0gICAgICAgICAgICBzd2l0Y2ggKGxldmVsKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA4MDAwMCkgPyA4MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxYjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTYwMDAwKSA/IDE2MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjQwMDAwKSA/IDI0MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNDgwMDAwKSA/IDQ4MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gOTYwMDAwKSA/IDk2MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNTAwMDAwKSA/IDI1MDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDUwMDAwMDApID8gNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNTAwMDAwMCkgPyA1MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDM6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyNTAwMDAwKSA/IDEyNTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNzUwMDAwMCkgPyAxNzUwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjUwMDAwMDApID8gMjUwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjUwMDAwMDApID8gMjUwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDYyNTAwMDAwKSA/IDYyNTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2MjUwMDAwMCkgPyA2MjUwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNjg3NTAwMDApID8gMTY4NzUwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDUxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAzMDAwMDAwMDApID8gMzAwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhbmRsZSBhbnkgb3RoZXIgQVZDIHByb2ZpbGUgZm9yIG5vdy4KLSAgICAgICAgICAgIC8vIFJldHVybiBpbnB1dCBiaXRyYXRlCi0gICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB2aWRCaXRyYXRlOwotfQotCi1NNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JNcGVnNEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpIHsKLQotICAgIE00T1NBX0ludDMyIHZpZEJpdHJhdGUgPSAwOwotCi0gICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZToKLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwwOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDBiOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMjgwMDApID8gMTI4MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNjQwMDApID8gNjQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMjgwMDApID8gMTI4MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMzg0MDAwKSA/IDM4NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYW5kbGUgYW55IG90aGVyIE1QRUc0IHByb2ZpbGUgZm9yIG5vdy4KLSAgICAgICAgICAgIC8vIFJldHVybiBpbnB1dCBiaXRyYXRlCi0gICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB2aWRCaXRyYXRlOwotfQotCi1NNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjYzRW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSkgewotCi0gICAgTTRPU0FfSW50MzIgdmlkQml0cmF0ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZToKLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNMZXZlbDEwOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMjA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNMZXZlbDMwOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAzODQwMDApID8gMzg0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhbmRsZSBhbnkgb3RoZXIgSDI2MyBwcm9maWxlIGZvciBub3cuCi0gICAgICAgICAgICAvLyBSZXR1cm4gaW5wdXQgYml0cmF0ZQotICAgICAgICAgICAgdmlkQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmlkQml0cmF0ZTsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0F1ZGlvRWZmZWN0cy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQXVkaW9FZmZlY3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4OGRlNjguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQXVkaW9FZmZlY3RzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX0FQSS5jCi0gKiBAYnJpZWYgIE1DUyBpbXBsZW1lbnRhdGlvbiAoVmlkZW8gQ29tcHJlc3NvciBTZXJ2aWNlKQotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQVBJIGFuZCB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgTUNTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotLyogT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19FcnJvckNvZGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLQotLyogQ29tbW9uIGhlYWRlcnMgKGZvciBhYWMpICovCi0jaW5jbHVkZSAiTTRfQ29tbW9uLmgiCi0KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQ29udGV4dCkKLSAqIEBicmllZiAgICBDaGVjayBpZiBhbiBlZmZlY3QgaGFzIHRvIGJlIGFwcGxpZWQgY3VycmVudGx5Ci0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHN0ZXBFbmNvZGluZyBmdW5jdGlvbgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgTUNTIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi17Ci0gICAgTTRPU0FfSW50OCAqcEFjdGl2ZUVmZmVjdE51bWJlciA9ICYocEMtPnBBY3RpdmVFZmZlY3ROdW1iZXIpOwotCi0gICAgKnBBY3RpdmVFZmZlY3ROdW1iZXIgPSAtMTsKLQotICAgIGlmKHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTID4gcEMtPnVpQmVnaW5DdXRUaW1lCi0gICAgJiYgcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgPCBwQy0+dWlFbmRDdXRUaW1lKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIG91dHB1dFJlbGF0ZWRUaW1lID0gMDsKLSAgICAgICAgTTRPU0FfVUludDggdWlFZmZlY3RJbmRleCA9IDA7Ci0gICAgICAgIG91dHB1dFJlbGF0ZWRUaW1lID0KLSAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgIC0gcEMtPnVpQmVnaW5DdXRUaW1lICsgMC41KTsKLQotICAgICAgICBmb3IodWlFZmZlY3RJbmRleD0wOyB1aUVmZmVjdEluZGV4PHBDLT5uYkVmZmVjdHM7IHVpRWZmZWN0SW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChvdXRwdXRSZWxhdGVkVGltZSA+PQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wRWZmZWN0c1t1aUVmZmVjdEluZGV4XS51aVN0YXJ0VGltZSkpICYmCi0gICAgICAgICAgICAgICAgKG91dHB1dFJlbGF0ZWRUaW1lIDwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKShwQy0+cEVmZmVjdHNbdWlFZmZlY3RJbmRleF0udWlTdGFydFRpbWUgK1wKLSAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbdWlFZmZlY3RJbmRleF0udWlEdXJhdGlvbikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwQWN0aXZlRWZmZWN0TnVtYmVyID0gdWlFZmZlY3RJbmRleDsKLSAgICAgICAgICAgICAgICB1aUVmZmVjdEluZGV4ID0gcEMtPm5iRWZmZWN0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlSW4oKQotICogQGJyaWVmICAgIEFwcGx5IGF1ZGlvIGVmZmVjdCBGYWRlSW4gdG8gcFBDTWRhdGEKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBDTWRhdGEgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgIChJTikgICAgIEVmZmVjdCBwcm9ncmVzcwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbiggIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKQotewotICAgIC8qIHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGU7Ci0KLSAgICAvKioKLSAgICAgKiBTYW5pdHkgY2hlY2sgKi8KLSAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPiAxMDAwKQotICAgIHsKLSAgICAgICAgcFByb2dyZXNzLT51aVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcm9tIGJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpOiBkaXZpZGUgYnkgdHdvICovCi0gICAgdWlQQ01zaXplID4+PSAxOwotCi0gICAgLyoqCi0gICAgICogTG9vcCBvbiBzYW1wbGVzICovCi0gICAgd2hpbGUgKHVpUENNc2l6ZS0tPjApIC8qKjwgZGVjcmVtZW50aW5nIHRvIG9wdGltaXplICovCi0gICAgewotICAgICAgICBpMzJzYW1wbGUgPSAqcFBDTWRhdGE7Ci0gICAgICAgIGkzMnNhbXBsZSAqPSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3M7Ci0gICAgICAgIGkzMnNhbXBsZSAvPSAxMDAwOwotICAgICAgICAqcFBDTWRhdGErKyA9IChNNE9TQV9JbnQxNilpMzJzYW1wbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlSW46IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQoKQotICogQGJyaWVmICAgIEFwcGx5IGF1ZGlvIGVmZmVjdCBGYWRlSW4gdG8gcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQQ01kYXRhICAgIChJTi9PVVQpIElucHV0IGFuZCBPdXRwdXQgUENNIGF1ZGlvIGRhdGEKLSAqIEBwYXJhbSAgICB1aVBDTXNpemUgICAgKElOKSAgICAgU2l6ZSBvZiBwUENNZGF0YQotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAoSU4pICAgICBFZmZlY3QgcHJvZ3Jlc3MKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQoIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKQotewotICAgIC8qIHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGU7Ci0KLSAgICAvKioKLSAgICAgKiBTYW5pdHkgY2hlY2sgKi8KLSAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPiAxMDAwKQotICAgIHsKLSAgICAgICAgcFByb2dyZXNzLT51aVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0gICAgcFByb2dyZXNzLT51aVByb2dyZXNzID0gMTAwMCAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzczsKLQotICAgIC8qKgotICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAvKioKLSAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICB3aGlsZSAodWlQQ01zaXplLS0+MCkgLyoqPCBkZWNyZW1lbnRpbmcgdG8gb3B0aW1pemUgKi8KLSAgICB7Ci0gICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgaTMyc2FtcGxlICo9IHBQcm9ncmVzcy0+dWlQcm9ncmVzczsKLSAgICAgICAgaTMyc2FtcGxlIC89IDEwMDA7Ci0gICAgICAgICpwUENNZGF0YSsrID0gKE00T1NBX0ludDE2KWkzMnNhbXBsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQ6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0NvZGVjcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQ29kZWNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NDQ5MmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQ29kZWNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQ29kZWNzLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gYXVkaW8vdmlkZW8KLSAqICAgICAgICAgY29kZWMgbWFuaXB1bGF0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW5jbHVkZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAgICAgLyogSW5jbHVkZSBmb3IgT1NBTCBkZWJ1ZyBzZXJ2aWNlcyAqLwotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsVHlwZXMuaCIgICAgLyogSW50ZXJuYWwgdHlwZXMgb2YgdGhlIE1DUyAqLwotCi0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1ZJREVDXzNHUAotI2luY2x1ZGUgIk00X01QRUc0VklfVmlkZW9IYW5kbGVyLmgiICAvKm5lZWRlZCBmb3IgcmVuZGVyZXIgZXJyb3IgY29kZXMqLwotI2VuZGlmCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19jbGVhckludGVyZmFjZVRhYmxlcygpCi0gKiBAYnJpZWYgICAgQ2xlYXIgZW5jb2RlcnMsIGRlY29kZXJzLCByZWFkZXIgYW5kIHdyaXRlcnMgaW50ZXJmYWNlcyB0YWJsZXMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgVGhlIGNvbnRleHQgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19jbGVhckludGVyZmFjZVRhYmxlcyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50OCBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNFdSSVRFUl9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00RU5DT0RFUl9rVmlkZW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzICA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICAgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIHBDLT5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotICAgIGZvciAoaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgZmlsZSBmb3JtYXQgd3JpdGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiAgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFd0ckRhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3RyRGF0YUludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwQyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTUNTOiBjb250ZXh0IGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJXcml0ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBXdHJHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBXdHJHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckRhdGFJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBXdHJEYXRhSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJXcml0ZXIiKTsKLQotICAgIE00T1NBX1RSQUNFM18zKCJNQ1M6IE00TUNTX3JlZ2lzdGVyV3JpdGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsXAotICAgICBwV3RyR2xvYmFsSW50ZXJmYWNlPTB4JXgsIHBXdHJEYXRhSW50ZXJmYWNlPTB4JXgiLCBwQyxwV3RyR2xvYmFsSW50ZXJmYWNlLAotICAgICBwV3RyRGF0YUludGVyZmFjZSk7Ci0KLSAgICBpZigoTWVkaWFUeXBlID09IE00V1JJVEVSX2tVbmtub3duKSB8fCAoTWVkaWFUeXBlID49IE00V1JJVEVSX2tUeXBlX05CKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgLyogYSB3cml0ZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIlRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTYXZlIHdyaXRlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbTWVkaWFUeXBlXS5wR2xvYmFsRmN0cyA9IHBXdHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBEYXRhRmN0cyA9IHBXdHJEYXRhSW50ZXJmYWNlOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJFbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyB2aWRlbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyICgKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk1DUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwRW5jR2xvYmFsSW50ZXJmYWNlID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIiKTsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNQ1M6IE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsXAotICAgICAgICAgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4IiwgcEMsIHBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0gICAgaWYgKE1lZGlhVHlwZSA+PSBNNEVOQ09ERVJfa1ZpZGVvX05CKQotICAgIHsKLSAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIHZpZGVvIGVuY29kZXIgdHlwZSIpOwotICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGVuY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBlbmNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBlbmNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTYXZlIGVuY29kZXIgaW50ZXJmYWNlIGluIGNvbnRleHQgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gcEVuY0dsb2JhbEludGVyZmFjZTsKLSAgICAvKiBUaGUgYWN0dWFsIHVzZXJEYXRhIGFuZCBleHRlcm5hbCBBUEkgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGVuY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0gICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwQyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTUNTOiBjb250ZXh0IGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBFbmNHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk1DUzogTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCxcCi0gICAgICAgICBwRW5jR2xvYmFsSW50ZXJmYWNlPTB4JXgiLCBwQywgcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLSAgICBpZiAoTWVkaWFUeXBlID49IE00RU5DT0RFUl9rQXVkaW9fTkIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBhdWRpbyBlbmNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNZWRpYVR5cGVdKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNZWRpYVR5cGVdKTsKLSAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogU2F2ZSBlbmNvZGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IHBFbmNHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJGbGFnW01lZGlhVHlwZV0gPSBNNE9TQV9GQUxTRTsgLyogaW50ZXJuYWwgZW5jb2RlciAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHJlYWRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZHJHbG9iYWxJbnRlcmZhY2UpLAotICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRNQ1NfcmVnaXN0ZXJSZWFkZXI6IGludmFsaWQgcG9pbnRlciBvbiBnbG9iYWwgaW50ZXJmYWNlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZHJEYXRhSW50ZXJmYWNlKSwKLSAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00TUNTX3JlZ2lzdGVyUmVhZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZGF0YSBpbnRlcmZhY2UiKTsKLQotICAgIGlmIChtZWRpYVR5cGUgPT0gTTRSRUFERVJfa01lZGlhVHlwZVVua25vd24gfHwgbWVkaWFUeXBlID49IE00UkVBREVSX2tNZWRpYVR5cGVfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBtZWRpYSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW21lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIGEgcmVhZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW21lZGlhVHlwZV0gPSBwUmRyR2xvYmFsSW50ZXJmYWNlOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVttZWRpYVR5cGVdICAgPSBwUmRyRGF0YUludGVyZmFjZTsKLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBEZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpLCBvciB0aGUgZGVjb2RlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYgKGRlY29kZXJUeXBlID49IE00REVDT0RFUl9rVmlkZW9UeXBlX05CKQotICAgIHsKLSAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIHZpZGVvIGRlY29kZXIgdHlwZSIpOwotICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwpCi0gICAgewotI2lmbmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICAgICAgLyogYSBkZWNvZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkRlY29kZXIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0jZWxzZSAvKiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUgKi8KLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGRlY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBkZWNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBkZWNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAvKiBvaCwgYW5kIGRvbid0IGZvcmdldCB0aGUgdXNlciBkYXRhLCB0b28uICovCi0gICAgICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotI2VuZGlmIC8qIGFyZSBleHRlcm5hbCBkZWNvZGVycyBwb3NzaWJsZT8gKi8KLSAgICB9Ci0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGRlY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRWaWRlb0RlYysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIGF1ZGlvIGRlY29kZXIKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWx5IGJ5IHRoZSBNQ1MgdG8KLSAqICAgICAgICAgICAgICByZWdpc3RlciBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZGVjb2RlciBpbnRlcmZhY2UiKTsKLQotICAgIGlmIChkZWNvZGVyVHlwZSA+PSBNNEFEX2tUeXBlX05CKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgYXVkaW8gZGVjb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9GQUxTRTsgLyogaW50ZXJuYWwgZGVjb2RlciAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFdyaXRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE00V1JJVEVSX2tUeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzICk7Ci0gICAgICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbEVuY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBlbmNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gKTsKLSAgICAgICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNEVOQ09ERVJfa0F1ZGlvX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgLypEb24ndCBmcmVlIGV4dGVybmFsIGF1ZGlvIGVuY29kZXJzIGludGVyZmFjZXMqLwotICAgICAgICAgICAgaWYgKE00T1NBX0ZBTFNFID09IHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFJlYWRlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gKTsKLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAocEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzID0gMDsKLSAgICBwQy0+bV9wUmVhZGVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB0aGUgZGVjb2RlcnMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE00REVDT0RFUl9rVmlkZW9UeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSApOwotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00QURfa1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlcnMgaW50ZXJmYWNlcyovCi0gICAgICAgICAgICBpZiAoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjID0gMDsKLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFdyaXRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFdyaXRlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgd3JpdGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2szR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjoKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rQU1SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BDTToKLSAgICAgICAgICAgIHBDLT5iX2lzUmF3V3JpdGVyID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rUENNOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiV3JpdGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBwQy0+V3JpdGVySW50ZXJmYWNlW3dyaXRlclR5cGVdLnBHbG9iYWxGY3RzOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBwQy0+V3JpdGVySW50ZXJmYWNlW3dyaXRlclR5cGVdLnBEYXRhRmN0czsKLQotICAgIGlmIChwQy0+cFdyaXRlckdsb2JhbEZjdHMgPT0gTTRPU0FfTlVMTCB8fCBwQy0+cFdyaXRlckRhdGFGY3RzID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJXcml0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGEgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0IG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCBlbmNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tIMjY0OwotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgIlZpZGVvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSA9IHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtlbmNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEgPSBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdOwotCi0gICAgaWYgKHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAiVmlkZW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYW4gYXVkaW8gZW5jb2RlcgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCBtZWRpYVR5cGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBlbmNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QMzoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUDM7Ci0gICAgICAgICAgICBicmVhazsKLS8vRVZSQwotLy8gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0vLyAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tFVlJDOwotLy8gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtlbmNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEgPSBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdOwotCi0gICAgaWYgKHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAiQXVkaW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50UmVhZGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50UmVhZGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNFJFQURFUl9NZWRpYVR5cGUgcmVhZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGUzR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlQU1SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+bV9wUmVhZGVyICAgICAgID0gcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbcmVhZGVyVHlwZV07Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdCA9IHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtyZWFkZXJUeXBlXTsKLQotICAgIGlmIChwQy0+bV9wUmVhZGVyID09IE00T1NBX05VTEwgfHwgcEMtPm1fcFJlYWRlckRhdGFJdCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlQVZDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiVmlkZW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXTsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXTsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVyID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURUUzoKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhY0FESUY6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb01wMzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZU1QMzsKLSAgICAgICAgICAgIGJyZWFrOwotLy9FVlJDCi0vLyAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0vLyAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUVWUkM7Ci0vLyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0gICAgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXTsKLQotICAgIGlmIChwQy0+bV9wQXVkaW9EZWNvZGVyID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzMWNhODcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwotICogQGJyaWVmICBNZWRpYSByZWFkZXJzIGFuZCBjb2RlY3Mgc3Vic2NyaXB0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzdWJzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIG1lZGlhCi0gKiAgICAgICAgIHJlYWRlcnMgYW5kIGRlY29kZXJzIGZvciB0aGUgTUNTLiBQb3RlbnRpYWwgc3VwcG9ydCBjYW4KLSAqICAgICAgICAgYmUgYWN0aXZhdGVkIG9yIGRlLWFjdGl2YXRlZAotICogICAgICAgICB1c2luZyBjb21waWxhdGlvbiBmbGFncyBzZXQgaW4gdGhlIHByb2plY3RzIHNldHRpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbmNsdWRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIiAgICAgICAgICAgICAgICAvKio8IEluY2x1ZGUgZm9yIE1DUyBzcGVjaWZpYyB0eXBlcyAqLwotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsRnVuY3Rpb25zLmgiICAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gbW9kdWxlICovCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qIFJlYWRlciByZWdpc3RyYXRpb24gOiBhdCBsZWFzdCBvbmUgcmVhZGVyIG11c3QgYmUgZGVmaW5lZCAqLwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2Vycm9yICJubyByZWFkZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AgKi8KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCByZWFkZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaCIKLSNlbmRpZgotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaW5jbHVkZSAiTTRSRUFERVJfQW1yLmgiCi0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMKLSNpbmNsdWRlICJWaWRlb0VkaXRvck1wM1JlYWRlci5oIgotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGRlY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIgotCi0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHdyaXRlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyogV3JpdGVyIHJlZ2lzdHJhdGlvbiA6IGF0IGxlYXN0IG9uZSB3cml0ZXIgbXVzdCBiZSBkZWZpbmVkICovCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX0FNUgotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX1BDTQotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9NUDMKLSNlcnJvciAibm8gd3JpdGVyIHJlZ2lzdGVyZWQiCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfTVAzICovCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfUENNICovCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUCAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSX0FNUiAqLwotCi0vKiBJbmNsdWRlIGZpbGVzIGZvciBlYWNoIHdyaXRlciB0byBzdWJzY3JpYmUgKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfQU1SX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9QQ00KLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfUENNX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfTVAzCi1leHRlcm4gTTRPU0FfRVJSIE00V1JJVEVSX01QM19nZXRJbnRlcmZhY2VzKCBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSogVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLSNlbmRpZgotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICB2aWRlbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgiCi0KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCB2aWRlbyBlbmNvZGVyIHRvIHN1YnNjcmliZSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotLy8jaW5jbHVkZSAiTTRNUDRFX2ludGVyZmFjZS5oIgotI2VuZGlmCi0KLQotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIFwKLSAgICBpZiAoKHBvaW50ZXIpID09IE00T1NBX05VTEwpIHJldHVybiAoKE00T1NBX0VSUikocmV0dmFsKSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX1N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgTUNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00UkVBREVSX01lZGlhVHlwZSAgICAgICAgICByZWFkZXJNZWRpYVR5cGU7Ci0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlOwotCi0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgICAgIHdyaXRlck1lZGlhVHlwZTsKLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqICAgcFdyaXRlckdsb2JhbEludGVyZmFjZTsKLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2U7Ci0KLSAgICBNNEFEX1R5cGUgICAgICAgICAgICAgICAgICAgYXVkaW9EZWNvZGVyVHlwZTsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgICAgICAgYXVkaW9Db2RlY1R5cGU7Ci0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiBwQXVkaW9Db2RlY0ludGVyZmFjZTsKLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZTsKLQotICAgIE00REVDT0RFUl9WaWRlb1R5cGUgICAgICAgICB2aWRlb0RlY29kZXJUeXBlOwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgICAgICB2aWRlb0NvZGVjVHlwZTsKLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgcFZpZGVvQ29kZWNJbnRlcmZhY2U7Ci0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiAgIHBWaWRlb0RlY29kZXJJbnRlcmZhY2U7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KTsKLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHJlYWRlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gM0dQIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0gICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlKCZyZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIDNHUCByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AgKi8KLQotICAgIC8qIC0tLSBBTVIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSAgICBlcnIgPSBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyggICAmcmVhZGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUiBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQU1SIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotCi0gICAgZXJyID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKCZyZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9NUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QMyByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0ICYgSDI2MyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoICZ2aWRlb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX01QRUc0IGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCAgIHBDb250ZXh0LCB2aWRlb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVBFRzQgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERUNfM0dQICovCi0KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERU9fQVZDCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCggJnZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00REVDT0RFUl9BVkMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoICAgcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBVkMgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERU9fQVZDICovCi0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgYXVkaW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIEFNUk5CIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQgotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BTVJOQigmYXVkaW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBRCBQSElMSVBTIEFNUk5CIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCAgIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgUEhJTElQUyBBTVJOQiBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfQUFDCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgUEhJTElQUyBBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoICAgcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQSElMSVBTIEFBQyBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMgKi8KLQotICAgIC8qIC0tLSBNUDMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX01QMwotCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMygmYXVkaW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFEIFBISUxJUFMgTVAzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCAgIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgUEhJTElQUyBNUDMgZGVjb2RlciIpOwotI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX01QMyAqLwotCi0gICAgLyogLS0tIEVWUkMgLS0tICovCi0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHdyaXRlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gUENNIC0tLSAqLwotCi0KLSAgICAvKiAtLS0gM0dQUCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAKLSAgICAvKiByZXRyaWV2ZXMgdGhlIDNHUFAgd3JpdGVyIG1lZGlhIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggICAmd3JpdGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00V1JJVEVSXzNHUCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlcldyaXRlciggcENvbnRleHQsIHdyaXRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgM0dQUCB3cml0ZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0IC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgICAgLyogcmV0cmlldmVzIHRoZSBNUEVHNCBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoJnZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNEVfTVBFRzQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIoICAgcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIE1QRUc0IGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotICAgIC8qIC0tLSBIMjYzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgLyogcmV0cmlldmVzIHRoZSBIMjYzIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKCZ2aWRlb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmlkZW9Db2RlY0ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNEVfSDI2MyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjYzIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJnZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEgyNjRFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIEgyNjQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgYXVkaW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIEFNUiAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BTVIKLSAgICAgICAvKiByZXRyaWV2ZXMgdGhlIEFNUiBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQU1STkIoJmF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoICAgcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFNUiBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEFBQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUFDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCAgIHBDb250ZXh0LCBhdWRpb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBBQUMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMgKi8KLQotCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUDMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIE1QMyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKCZhdWRpb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVAzRSBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciggcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBNUDMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUDMgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX1ZpZGVvUHJlUHJvY2Vzc2luZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0OWY2OGUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCi0gKiBAYnJpZWYgIE1DUyBpbXBsZW1lbnRhdGlvbgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZW5jb2RlciBjYWxsYmFjayBvZiB0aGUgTUNTLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgICAgIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAgICAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyogQ29yZSBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00TUNTX0Vycm9yQ29kZXMuaCIKLQotLyoqCi0gKiBWaWRlbyBwcmVwcm9jZXNzaW5nIGludGVyZmFjZSBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRWUFBfQVBJLmgiCi0KLS8qKgotICogVmlkZW8gZmlsdGVycyAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiIC8qKjwgZm9yIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKCkgKi8KLQotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0vKiovCi0KLQotCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgICBEbyB0aGUgdmlkZW8gcmVuZGVyaW5nIGFuZCB0aGUgcmVzaXplIChpZiBuZWVkZWQpCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgTUNTIGludGVybmFsIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pIENvbnRhaW5zIHRoZSBpbWFnZQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZSBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNE1DU19FUlJfVklERU9fREVDT0RFX0VSUk9SOiB0aGUgdmlkZW8gZGVjb2RpbmcgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00TUNTX0VSUl9SRVNJWkVfRVJST1I6IHRoZSByZXNpemluZyBmYWlsZWQKLSAqIEByZXR1cm4gICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotewotICAgIE00T1NBX0VSUiAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLQotLyogVGhpcyBwYXJ0IGlzIHVzZWQgb25seSBpZiB2aWRlbyBjb2RlY3MgYXJlIGNvbXBpbGVkKi8KLSNpZm5kZWYgTTRNQ1NfQVVESU9PTkxZCi0gICAgLyoqCi0gICAgICogVGhlIFZQUCBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBNQ1MgY29udGV4dCEgKi8KLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLQotICAgIE00X01lZGlhVGltZSBtdEN0cyA9IHBDLT5kVmlEZWNDdXJyZW50Q3RzOwotCi0gICAgLyoqCi0gICAgICogV2hlbiBDbG9zaW5nIGFmdGVyIGFuIGVycm9yIG9jY3VyZWQsIGl0IG1heSBoYXBwZW4gdGhhdCBwUmVhZGVyVmlkZW9BVS0+bV9kYXRhQWRkcmVzcyBoYXMKLSAgICAgKiBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0LiBXaGVuIGNsb3NpbmcgaW4gcGF1c2UgbW9kZSwgdGhlIGRlY29kZXIgY2FuIGJlIG51bGwuCi0gICAgICogV2UgZG9uJ3Qgd2FudCBhbiBlcnJvciB0byBiZSByZXR1cm5lZCBiZWNhdXNlIGl0IHdvdWxkIGludGVycnVwdCB0aGUgY2xvc2UgcHJvY2VzcyBhbmQKLSAgICAgKiB0aHVzIHNvbWUgcmVzb3VyY2VzIHdvdWxkIGJlIGxvY2tlZC4gU28gd2UgcmV0dXJuIE00Tk9fRVJST1IuCi0gICAgICovCi0gICAgLyogSW5pdGlhbGl6ZSB0byBibGFjayBwbGFuZSB0aGUgb3V0cHV0IHBsYW5lIGlmIHRoZSBtZWRpYSByZW5kZXJpbmcKLSAgICAgaXMgYmxhY2sgYm9yZGVycyAqLwotICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rQmxhY2tCb3JkZXJzKQotICAgIHsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLFlfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCpwUGxhbmVPdXRbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgKHBQbGFuZU91dFsxXS51X2hlaWdodCpwUGxhbmVPdXRbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgKHBQbGFuZU91dFsyXS51X2hlaWdodCpwUGxhbmVPdXRbMl0udV9zdHJpZGUpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKE00T1NBX05VTEwgPT0gcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcykgfHwKLSAgICAgICAgICAgICAoTTRPU0FfTlVMTCA9PSBwQy0+cFZpRGVjQ3R4dCkpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogV2UgbXVzdCBmaWxsIHRoZSBpbnB1dCBvZiB0aGUgZW5jb2RlciB3aXRoIGEgZHVtbXkgaW1hZ2UsIGJlY2F1c2UKLSAgICAgICAgICogZW5jb2Rpbmcgbm9pc2UgbGVhZHMgdG8gYSBodWdlIHZpZGVvIEFVLCBhbmQgdGh1cyBhIHdyaXRlciBidWZmZXIgb3ZlcmZsb3cuICovCi0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3N0cmlkZSAqIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgIHBQbGFuZU91dFsxXS51X3N0cmlkZSAqIHBQbGFuZU91dFsxXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsyXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3N0cmlkZSAqIHBQbGFuZU91dFsyXS51X2hlaWdodCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludEFwcGx5VlBQOiBwUmVhZGVyVmlkZW9BVS0+bV9kYXRhQWRkcmVzcyBpcyBNNE9TQV9OVUxMLFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYocEMtPmlzUmVuZGVyRHVwID09IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIG1fcFByZVJlc2l6ZUZyYW1lIGRpZmZlcmVudCB0aGFuIE00T1NBX05VTEwgbWVhbnMgdGhhdCByZXNpemluZyBpcyBuZWVkZWQgKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqIEZCIDIwMDgvMTAvMjA6Ci0gICAgICAgICAgICBVc2VkIGZvciBjcm9wcGluZyBhbmQgYmxhY2sgYm9yZGVycyovCi0gICAgICAgICAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IE5lZWQgdG8gcmVzaXplIik7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RSZW5kZXIocEMtPnBWaURlY0N0eHQsICZtdEN0cywKLSAgICAgICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50QXBwbHlWUFA6IG1fcEZjdFJlbmRlciByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa1Jlc2l6aW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ2FsbCB0aGUgcmVzaXplIGZpbHRlci4gRnJvbSB0aGUgaW50ZXJtZWRpYXRlIGZyYW1lIHRvIHRoZSBlbmNvZGVyCi0gICAgICAgICAgICAgICAgICogaW1hZ2UgcGxhbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lLCBwUGxhbmVPdXQpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRBcHBseVZQUDogTTRWaUZpbFJlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXNUZW1wWzNdOwotICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVZID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVUgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lViA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVkgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLQotICAgICAgICAgICAgICAgIC8qRkIgMjAwOC8xMC8yMDogdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotICAgICAgICAgICAgICAgIC8qSW5pdGlhbGl6ZSBBSVIgUGFyYW1zKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcEMtPnBQcmVSZXNpemVGcmFtZS0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fYk91dHB1dFN0cmlwZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgIE1lZGlhIHJlbmRlcmluZzogQmxhY2sgYm9yZGVycyovCi0gICAgICAgICAgICAgICAgaWYocEMtPk1lZGlhUmVuZGVyaW5nID09IE00TUNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gcFBsYW5lT3V0WzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IHBQbGFuZU91dFsyXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzJdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZXMgcGxhbiBpbiBsb2NhbCBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzBdXAotICAgICAgICAgICAgICAgICAgICAgICAgLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclkiKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIE00TUNTX2ludEFwcGx5VlBQIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzFdXAotICAgICAgICAgICAgICAgICAgICAgICAgLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclUiKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIE00TUNTX2ludEFwcGx5VlBQIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzJdXAotICAgICAgICAgICAgICAgICAgICAgICAgLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyViIpIDsKLSAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gTTRNQ1NfaW50QXBwbHlWUFAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBJblBsYW5lWSA9IHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgOwotICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVUgPSBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhIDsKLSAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVWID0gcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSxVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSxWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKSgocEMtPnBQcmVSZXNpemVGcmFtZS0+dV9oZWlnaHQgKiBwUGxhbmVPdXQtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoKSA8PSBwUGxhbmVPdXQtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0IDwgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaXQgaXMgaGVpZ2h0IHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBvbiB0aGUgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocEMtPnBQcmVSZXNpemVGcmFtZS0+dV9oZWlnaHQgKiBwUGxhbmVPdXQtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPnBQcmVSZXNpemVGcmFtZS0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk+PjEpKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcFBsYW5lT3V0LT51X2hlaWdodClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aC1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aC1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE1DU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGgtXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4qLwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIHRoYXQgdmFsdWVzIGFyZSBjb2hlcmVudCovCi0gICAgICAgICAgICAgICAgICAgIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID09IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wID0gcEltYWdlUGxhbmVzVGVtcDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICBNZWRpYSByZW5kZXJpbmc6IENyb3BwaW5nKi8KLSAgICAgICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa0Nyb3BwaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgaWYoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDxQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaGVpZ2h0IHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qd2lkdGggd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBDYWxsIEFJUiBmdW5jdGlvbnMgKi8KLSAgICAgICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHBDLT5tX2Fpcl9jb250ZXh0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZwQy0+bV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gaW5pdGlhbGl6aW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmUGFyYW1zKTsKLSAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfZ2V0KHBDLT5tX2Fpcl9jb250ZXh0LCBwQy0+cFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wKTsKLSAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gZ2V0dGluZyBBSVIgcGxhbmU6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzBdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggICAodm9pZCAqKXBPdXRQbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwSW5QbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVZICs9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcE91dFBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMV0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAgICh2b2lkICopcE91dFBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBJblBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0UGxhbmVVICs9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsyXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICAgKHZvaWQgKilwT3V0UGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEluUGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQbGFuZVYgKz0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEFwcGx5VlBQOiBEb24ndCBuZWVkIHJlc2l6aW5nIik7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RSZW5kZXIocEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm10Q3RzLCBwUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludEFwcGx5VlBQOiBtX3BGY3RSZW5kZXIgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+bGFzdERlY29kZWRQbGFuZSA9IHBQbGFuZU91dDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAqIHBQbGFuZU91dFswXS51X3dpZHRoKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwUGxhbmVPdXRbMV0udV9oZWlnaHQgKiBwUGxhbmVPdXRbMV0udV93aWR0aCkpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0ICogcFBsYW5lT3V0WzJdLnVfd2lkdGgpKTsKLSAgICAgICAgcEMtPmxhc3REZWNvZGVkUGxhbmUgPSBwUGxhbmVPdXQ7Ci0gICAgfQotCi0KLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEFwcGx5VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzYyN2VjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYnZzcwotIwotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX2NvcmUKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRQVE8zR1BQX0FQSS5jIFwKLSAgICAgIE00UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYyBcCi0gICAgICBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jIFwKLSAgICAgIE00eFZTU19BUEkuYyBcCi0gICAgICBNNHhWU1NfaW50ZXJuYWwuYyBcCi0gICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmcuYyBcCi0gICAgICBNNFZTUzNHUFBfQ2xpcC5jIFwKLSAgICAgIE00VlNTM0dQUF9DbGlwQW5hbHlzaXMuYyBcCi0gICAgICBNNFZTUzNHUFBfQ29kZWNzLmMgXAotICAgICAgTTRWU1MzR1BQX0VkaXQuYyBcCi0gICAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvLmMgXAotICAgICAgTTRWU1MzR1BQX0VkaXRWaWRlby5jIFwKLSAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgXAotICAgICAgTTRDaGFubmVsQ29udmVydGVyLmMgXAotICAgICAgTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYyBcCi0gICAgICBNNEFJUl9BUEkuYyBcCi0gICAgICBNNFJFQURFUl9QY20uYyBcCi0gICAgICBNNFBDTVJfQ29yZVJlYWRlci5jIFwKLSAgICAgIE00QURfTnVsbC5jIFwKLSAgICAgIE00QU1SUl9Db3JlUmVhZGVyLmMgXAotICAgICAgTTRSRUFERVJfQW1yLmMgXAotICAgICAgTTRWRF9Ub29scy5jIFwKLSAgICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcCBcCi0gICAgICBNNERFQ09ERVJfTnVsbC5jCi0KLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCi0gICAgbGliYXVkaW9yZXNhbXBsZXIgICAgICAgICAgIFwKLSAgICBsaWJhdWRpb3V0aWxzICAgICAgICAgICAgICAgXAotICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJsb2cgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X29teCAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX3ZpZGVvZmlsdGVycyBcCi0gICAgbGlidmlkZW9lZGl0b3JwbGF5ZXIgICAgICAgIFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbiBcCi0gICAgbGlidmlkZW9lZGl0b3JfbWNzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9zdGFnZWZyaWdodHNoZWxscyBcCi0gICAgbGlidmlkZW9lZGl0b3JfM2dwd3JpdGVyIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLSAgICAkKFRPUCkvc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCi0gICAgJChUT1ApL3N5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLURNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFbm8gXAotICAgIC1EREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBRF9OdWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkMWVjNzMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRBRF9OdWxsLmMKLSAqIEBicmllZiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBNUDMgZGVjb2RlciBwdWJsaWMgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBhICJudWxsIiBhdWRpbyBkZWNvZGVyLCB0aGF0IGlzIGEgZGVjb2RlcgotICogICAgICAgICAgdGhhdCBkbyBub3RoaW5nIGV4Y2VwdCBnZXR0aW5nIEFVIGZyb20gdGhlIHJlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00QURfTnVsbC5oIgotCi0jZGVmaW5lIE00QURfRk9SQ0VfMTZCSVRTCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTlVMTCBBdWRpbyBEZWNvZGVyIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0jZGVmaW5lIE00QURfTlVMTF9NQUpPUiAgICAxCi0jZGVmaW5lIE00QURfTlVMTF9NSU5PUiAgICAxCi0jZGVmaW5lIE00QURfTlVMTF9SRVZJU0lPTiA0Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00QURfTnVsbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgSW50ZXJuYWwgbnVsbCBkZWNvZGVyIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgUG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgIG1fcEF1ZGlvU3RyZWFtaGFuZGxlcjsKLX0gTTRBRF9OdWxsQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE5YUCBNUDMgZGVjb2RlciBmdW5jdGlvbnMgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBudWxsIGRlY29kZXIKLSAqIEBub3RlICAgIEFsbG9jYXRlcyB0aGUgY29udGV4dAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICBQb2ludGVyIHRvIGFuIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbgotICogQHBhcmFtICAgIHBVc2VyRGF0YTogICAgICAgIChJTikgICAgUG9pbnRlciB0byBVc2VyIGRhdGEKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgICBNNEFEX05VTExfY3JlYXRlKCAgTTRBRF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKQotewotICAgIE00QURfTnVsbENvbnRleHQqIHBDOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNEFEX05VTExfY3JlYXRlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRBRF9OVUxMX2NyZWF0ZTogaW52YWxpZCBwb2ludGVyIHBTdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBwQyA9IChNNEFEX051bGxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00QURfTnVsbENvbnRleHQpLAotICAgICAgICAgICAgICAgICBNNERFQ09ERVJfQVVESU8sIChNNE9TQV9DaGFyICopIk00QURfTnVsbENvbnRleHQiKTsKLSAgICBpZiAocEMgPT0gKE00QURfTnVsbENvbnRleHQqKTApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQ2FuIG5vdCBhbGxvY2F0ZSBudWxsIGRlY29kZXIgY29udGV4dCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBDb250ZXh0ID0gcEM7Ci0KLSAgICBwQy0+bV9wQXVkaW9TdHJlYW1oYW5kbGVyID0gcFN0cmVhbUhhbmRsZXI7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgRGVzdHJveXMgdGhlIGluc3RhbmNlIG9mIHRoZSBudWxsIGRlY29kZXIKLSAqIEBub3RlICAgICBBZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgICBNNEFEX05VTExfZGVzdHJveShNNEFEX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNEFEX051bGxDb250ZXh0KiBwQyA9IChNNEFEX051bGxDb250ZXh0Kiljb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChjb250ZXh0ID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsICJNNEFEX05VTExfZGVzdHJveTogaW52YWxpZCBjb250ZXh0Iik7Ci0KLSAgICBmcmVlKHBDKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFNpbXBseSBvdXRwdXQgdGhlIGdpdmVuIGF1ZGlvIGRhdGEKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICBwSW5wdXRCdWZmZXI6ICAgICAoSU4vT1VUKUlucHV0IERhdGEgYnVmZmVyLiBJdCBjb250YWlucyBhdCBsZWFzdCBvbmUgYXVkaW8gZnJhbWUuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgbXVzdCBiZSB1cGRhdGVkIGluc2lkZSB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVmbGVjdCB0aGUgc2l6ZSBvZiB0aGUgYWN0dWFsbHkgZGVjb2RlZCBkYXRhLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiB0aGUgZmlyc3QgZnJhbWUgaW4gcElucHV0QnVmZmVyKQotICogQHBhcmFtICAgcERlY29kZWRQQ01CdWZmZXI6IChPVVQpICBPdXRwdXQgUENNIGJ1ZmZlciAoZGVjb2RlZCBkYXRhKS4KLSAqIEBwYXJhbSAgIGp1bXBpbmc6ICAgICAgICAgICAoSU4pICAgTTRPU0FfVFJVRSBpZiBhIGp1bXAgd2FzIGp1c3QgZG9uZSwgTTRPU0FfRkFMU0Ugb3RoZXJ3aXNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICAgTTRBRF9OVUxMX3N0ZXAoTTRBRF9Db250ZXh0IGNvbnRleHQsIE00QURfQnVmZmVyICpwSW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9CdWZmZXIgKnBEZWNvZGVkUENNQnVmZmVyLCBNNE9TQV9Cb29sIGp1bXBpbmcpCi17Ci0gICAgTTRBRF9OdWxsQ29udGV4dCogcEMgPSAoTTRBRF9OdWxsQ29udGV4dCopY29udGV4dDsKLQotICAgIC8qVGhlIFZQUyBzZW5kcyBhIHplcm8gYnVmZmVyIGF0IHRoZSBlbmQqLwotICAgIGlmICgwID09IHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotCi0gICAgaWYgKHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID4gcERlY29kZWRQQ01CdWZmZXItPm1fYnVmZmVyU2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotI2lmZGVmIE00QURfRk9SQ0VfMTZCSVRTCi0gICAgLyppZiByZWFkIHNhbXBsZXMgYXJlIDggYml0cywgY29tcGxldGUgdGhlbSB0byAxNiBiaXRzKi8KLSAgICBpZiAocEMtPm1fcEF1ZGlvU3RyZWFtaGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSA9PSAxKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgIE00T1NBX0ludDE2ICB2YWw7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbCA9IChNNE9TQV9JbnQxNikoKE00T1NBX1VJbnQ4KShwSW5wdXRCdWZmZXItPm1fZGF0YUFkZHJlc3NbaV0pIC0gMTI4KTsKLQotICAgICAgICAgICAgcERlY29kZWRQQ01CdWZmZXItPm1fZGF0YUFkZHJlc3NbaSoyXSAgID0gKE00T1NBX0ludDgpKHZhbD4+OCk7Ci0gICAgICAgICAgICBwRGVjb2RlZFBDTUJ1ZmZlci0+bV9kYXRhQWRkcmVzc1tpKjIrMV0gPSAoTTRPU0FfSW50OCkodmFsJjB4MDBmZik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcERlY29kZWRQQ01CdWZmZXItPm1fZGF0YUFkZHJlc3MsICh2b2lkICopcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSApOwotICAgIH0KLSNlbHNlIC8qTTRBRF9GT1JDRV8xNkJJVFMqLwotICAgIG1lbWNweSgodm9pZCAqKXBEZWNvZGVkUENNQnVmZmVyLT5tX2RhdGFBZGRyZXNzLCAodm9pZCAqKXBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgKTsKLSNlbmRpZiAvKk00QURfRk9SQ0VfMTZCSVRTKi8KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldHMgdGhlIGRlY29kZXIgdmVyc2lvbgotICogQG5vdGUgICAgVGhlIHZlcnNpb24gaXMgZ2l2ZW4gaW4gYSBNNF9WZXJzaW9uSW5mbyBzdHJ1Y3R1cmUKLSAqCi0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoT1VUKSAgICAgICBQb2ludGVyIHRvIHRoZSB2ZXJzaW9uIHN0cnVjdHVyZQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBwVmVyc2lvbkluZm8gcG9pbnRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgICBNNEFEX05VTExfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFZlcnNpb25JbmZvID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNEFEX05VTExfZ2V0VmVyc2lvbjogaW52YWxpZCBwb2ludGVyIHBWZXJzaW9uSW5mbyIpOwotCi0gICAgLyogVXAgdW50aWwgbm93LCB0aGUgbnVsbCBkZWNvZGVyIHZlcnNpb24gaXMgbm90IGF2YWlsYWJsZSAqLwotCi0gICAgLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciAgICAgICAgPSBNNEFEX05VTExfTUFKT1I7ICAgICAgLyptYWpvciB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciAgICAgICAgPSBNNEFEX05VTExfTUlOT1I7ICAgICAgLyptaW5vciB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIHBWZXJzaW9uSW5mby0+bV9yZXZpc2lvbiAgICA9IE00QURfTlVMTF9SRVZJU0lPTjsgICAgLypyZXZpc2lvbiB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIHBWZXJzaW9uSW5mby0+bV9zdHJ1Y3RTaXplPXNpemVvZihNNF9WZXJzaW9uSW5mbyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZ2V0SW50ZXJmYWNlIGZ1bmN0aW9uIGRlZmluaXRpb25zIG9mIE5YUCBNUDMgZGVjb2RlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlclR5cGUgICAgICAgIDogcG9pbnRlciBvbiBhbiBNNEFEX1R5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGRlY29kZXIgdHlwZSBzdXBwb3J0ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBkZWNvZGVyCi0gKiBAcGFyYW0gcERlY29kZXJJbnRlcmZhY2UgICA6IGFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIGRlY29kZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlci4KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgIGlmIE9LCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DIGlmIGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QURfTlVMTF9nZXRJbnRlcmZhY2UoIE00QURfVHlwZSAqcERlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSAqKnBEZWNvZGVySW50ZXJmYWNlKQotewotICAgICpwRGVjb2RlckludGVyZmFjZSA9ICggIE00QURfSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNEFEX0ludGVyZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX0FVRElPLCAoTTRPU0FfQ2hhciAqKSJNNEFEX0ludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcERlY29kZXJJbnRlcmZhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBEZWNvZGVyVHlwZSA9IE00QURfa1R5cGVQQ007Ci0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgICAgICAgPSBNNEFEX05VTExfY3JlYXRlOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95QXVkaW9EZWMgICAgICA9IE00QURfTlVMTF9kZXN0cm95OwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTdGVwQXVkaW9EZWMgICAgICAgICA9IE00QURfTlVMTF9zdGVwOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RHZXRWZXJzaW9uQXVkaW9EZWMgICA9IE00QURfTlVMTF9nZXRWZXJzaW9uOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTdGFydEF1ZGlvRGVjICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFJlc2V0QXVkaW9EZWMgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyAgICA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFJUl9BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBSVJfQVBJLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyODk3YjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFJUl9BUEkuYworKysgL2Rldi9udWxsCkBAIC0xLDk2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRBSVJfQVBJLmMKLSAqIEBicmllZiAgQXJlYSBvZiBJbnRlcmVzdCBSZXNpemVyICBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2RlZmluZSBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotI2RlZmluZSBNNEFJUl9ZVVY0MjBBX0ZPUk1BVF9TVVBQT1JURUQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUElMQVRJT04gQ0hFQ0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfSlBHX0ZPUk1BVF9TVVBQT1JURUQKLQotI2Vycm9yICJQbGVhc2UgZGVmaW5lIGF0IGxlYXN0IG9uZSBpbnB1dCBmb3JtYXQgZm9yIHRoZSBBSVIgY29tcG9uZW50IgotCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBJTlRFUk5BTCBUWVBFUyBERUZJTklUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgTTRBSVJfU3RhdGVzCi0gKiBAYnJpZWYgICAgICAgVGhlIGZvbGxvd2luZyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIEFJUi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRBSVJfa0NyZWF0ZWQsICAgICAgICAvKio8IFN0YXRlIGFmdGVyIE00QUlSX2NyZWF0ZSBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNEFJUl9rQ29uZmlndXJlZCAgICAgIC8qKjwgU3RhdGUgYWZ0ZXIgTTRBSVJfY29uZmlndXJlIGhhcyBiZWVuIGNhbGxlZCAqLwotfU00QUlSX1N0YXRlczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICAgIE00QUlSX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgICAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgdGhlIEFJUi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNEFJUl9TdGF0ZXMgICAgICAgICAgICBtX3N0YXRlOyAgICAgICAgLyoqPCBJbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00QUlSX0lucHV0Rm9ybWF0VHlwZSAgIG1faW5wdXRGb3JtYXQ7ICAvKio8IElucHV0IGZvcm1hdCBsaWtlIFlVVjQyMFBsYW5hciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0I1NjUsIEpQRywgZXRjIC4uLiAqLwotICAgIE00QUlSX1BhcmFtcyAgICAgICAgICAgIG1fcGFyYW1zOyAgICAgICAvKio8IEN1cnJlbnQgaW5wdXQgUGFyYW1ldGVyIG9mICB0aGUgcHJvY2Vzc2luZyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2luY1s0XTsgICAvKio8IHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91cHV0IHdpZHRoIGZvciBZVVYgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9pbmNbNF07ICAgLyoqPCByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXB1dCBoZWlnaHQgZm9yIFlVViAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0WzRdOyAgICAvKio8IGhvcml6b250YWwgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0WzRdOyAgICAvKio8IFZlcnRpY2FsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9hY2N1bVs0XTsgLyoqPCBzYXZlIG9mIGhvcml6b250YWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9hY2N1bVs0XTsgLyoqPCBzYXZlIG9mIHZlcnRpY2FsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDgqICAgICAgICAgICAgcHU4X2RhdGFfaW5bNF07IC8qKjwgU2F2ZSBvZiBpbnB1dCBwbGFuZSBwb2ludGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3Byb2NSb3dzOyAgICAgLyoqPCBOdW1iZXIgb2YgcHJvY2Vzc2VkIHJvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gc3RyaXBlIG1vZGUgb25seSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iT25seUNvcHk7ICAvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBqdXN0IHBlcmZvcm0gYSBjb3B5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iRmxpcFg7ICAgICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRvIHJldmVydCBwcm9jZXNzaW5nIG9yZGVyIGluIFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JGbGlwWTsgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIG1fYlJldmVydFhZOyAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0byByZXZlcnQgWCBhbmQgWSBwcm9jZXNzaW5nIG9yZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCstOTCwIHJvdGF0aW9uKSAqLwotfU00QUlSX0ludGVybmFsQ29udGV4dDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNQUNST1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUocmV0dmFsLCBwb2ludGVyKVwKLSAgICAgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKSByZXR1cm4gKChNNE9TQV9FUlIpKHJldHZhbCkpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIE00QUlSIFBVQkxJQyBBUEkgSU1QTEVNRU5UQVRJT04gKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQsTTRBSVJfSW5wdXRGb3JtYXRUeXBlIGlucHV0Rm9ybWF0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgQUlSLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgIChJTi9PVVQpIEFkZHJlc3Mgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICAgaW5wdXRGb3JtYXQ6ICAgKElOKSBpbnB1dCBmb3JtYXQgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4gSW52YWxpZCBmb3JtYXRUeXBlCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBpcyBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IgOwotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMIDsKLQotICAgIC8qIENoZWNrIHRoYXQgdGhlIGFkZHJlc3Mgb24gdGhlIGNvbnRleHQgaXMgbm90IE5VTEwgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKLQotICAgIC8qIEludGVybmFsIENvbnRleHQgY3JlYXRpb24gKi8KLSAgICBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRBSVJfSW50ZXJuYWxDb250ZXh0KSwKLSAgICAgICAgIE00QUlSLChNNE9TQV9DaGFyICopIkFJUiBpbnRlcm5hbCBjb250ZXh0IikgOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBwQykgOwotCi0KLSAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgZm9ybWF0IGlzIHN1cHBvcnRlZCAqLwotICAgIHN3aXRjaChpbnB1dEZvcm1hdCkKLSAgICB7Ci0jaWZkZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNEFJUl9rWVVWNDIwUDoKLSAgICAgICAgYnJlYWsgOwotI2VuZGlmCi0jaWZkZWYgTTRBSVJfWVVWNDIwQV9GT1JNQVRfU1VQUE9SVEVECi0gICAgICAgIGNhc2UgTTRBSVJfa1lVVjQyMEFQOgotICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgIGdvdG8gTTRBSVJfY3JlYXRlX2NsZWFudXAgOwotICAgIH0KLQotICAgIC8qKjwgU2F2ZSBpbnB1dCBmb3JtYXQgYW5kIHVwZGF0ZSBzdGF0ZSAqLwotICAgIHBDLT5tX2lucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7Ci0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ3JlYXRlZDsKLQotICAgIC8qIFJldHVybiB0aGUgY29udGV4dCB0byB0aGUgY2FsbGVyICovCi0gICAgKnBDb250ZXh0ID0gcEMgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi1NNEFJUl9jcmVhdGVfY2xlYW51cDoKLSAgICAvKiBFcnJvciBtYW5hZ2VtZW50IDogd2UgZGVzdHJveSB0aGUgY29udGV4dCBpZiBuZWVkZWQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDKQotICAgIHsKLSAgICAgICAgZnJlZShwQykgOwotICAgIH0KLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgcmV0dXJuIGVyciA7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBkZXN0cm95cyBhbiBpbnN0YW5jZSBvZiB0aGUgQUlSIGNvbXBvbmVudAotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlIHRvIGRlc3Ryb3kKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6IEludGVybmFsIHN0YXRlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZnVuY3Rpb24gY2FsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotICAgIGZyZWUocEMpIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgY29uZmlndXJlIHRoZSBBSVIuCi0gKiBAbm90ZSAgICBJdCB3aWxsIHNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBjb29yZGluYXRlcyBhbmQgc2l6ZXMsCi0gKiAgICAgICAgICBhbmQgaW5kaWNhdGVzIGlmIHdlIHdpbGwgcHJvY2VlZCBpbiBzdHJpcGUgb3Igbm90LgotICogICAgICAgICAgSW4gY2FzZSBhIE00QUlSX2dldCBpbiBzdHJpcGUgbW9kZSB3YXMgb24gZ29pbmcsIGl0IHdpbGwgY2FuY2VsIHRoaXMgcHJldmlvdXMKLSAqICAgICAgICAgIHByb2Nlc3NpbmcgYW5kIHJlc2V0IHRoZSBnZXQgcHJvY2Vzcy4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAgICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQotICogQHBhcmFtICAgIHBQYXJhbXMtPm1fYk91dHB1dFN0cmlwZTooSU4pIFN0cmlwZSBtb2RlLgotICogQHBhcmFtICAgIHBQYXJhbXMtPm1faW5wdXRDb29yZDogICAgKElOKSBYLFkgY29vcmRpbmF0ZXMgb2YgdGhlIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0LgotICogQHBhcmFtICAgIHBQYXJhbXMtPm1faW5wdXRTaXplOiAgICAoSU4pIGlucHV0IFJPSSBzaXplLgotICogQHBhcmFtICAgIHBQYXJhbXMtPm1fb3V0cHV0U2l6ZTogICAgKElOKSBvdXRwdXQgc2l6ZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICAgIE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDogdGhlIHJlcXVlc3RlZCBpbnB1dCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi17Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0IDsKLSAgICBNNE9TQV9VSW50MzIgICAgaSx1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00T1NBX1VJbnQzMiAgICBuYl9wbGFuZXM7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICBpZihNNEFJUl9rWVVWNDIwQVAgPT0gcEMtPm1faW5wdXRGb3JtYXQpCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSAzOwotICAgIH0KLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZigoTTRBSVJfa0NyZWF0ZWQgIT0gcEMtPm1fc3RhdGUpJiYoTTRBSVJfa0NvbmZpZ3VyZWQgIT0gcEMtPm1fc3RhdGUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKiBTYXZlIHBhcmFtZXRlcnMgKi8KLSAgICBwQy0+bV9wYXJhbXMgPSAqcFBhcmFtczsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgaW5wdXQmb3V0cHV0IHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICAgICAgaWYoICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpICAgIHx8Ci0gICAgICAgICAgICAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkmMHgxKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FJUl9JTExFR0FMX0ZSQU1FX1NJWkU7Ci0gICAgICAgIH0KLQotICAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkmMHgxKSAgICB8fAotICAgICAgICAgICAgKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkmMHgxKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FJUl9JTExFR0FMX0ZSQU1FX1NJWkU7Ci0gICAgICAgIH0KLSAgICBpZigoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSA9PSAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgJiYoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkgPT0gKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpKSkKLSAgICB7Ci0gICAgICAgIC8qKjwgTm8gcmVzaXplIGluIHRoaXMgY2FzZSwgd2Ugd2lsbCBqdXN0IGNvcHkgaW5wdXQgaW4gb3V0cHV0ICovCi0gICAgICAgIHBDLT5tX2JPbmx5Q29weSA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5tX2JPbmx5Q29weSA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qKjwgSW5pdGlhbGl6ZSBpbnRlcm5hbCB2YXJpYWJsZXMgdXNlZCBmb3IgcmVzaXplIGZpbHRlciAqLwotICAgICAgICBmb3IoaT0wO2k8bmJfcGxhbmVzO2krKykKLSAgICAgICAgewotCi0gICAgICAgICAgICB1MzJfd2lkdGhfaW4gPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOlwKLSAgICAgICAgICAgICAgICAocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ6XAotICAgICAgICAgICAgICAgIChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfd2lkdGhfb3V0ID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg6XAotICAgICAgICAgICAgICAgIChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X291dCA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDpcCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQrMSk+PjE7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2luY1tpXSAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiAweDEwMDAwKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAodTMyX3dpZHRoX2luICogMHgxMDAwMCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0LiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIDB4MTAwMDApIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldID0gKHUzMl9oZWlnaHRfaW4gKiAweDEwMDAwKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfaW5jW2ldID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IHBDLT51MzJfeV9pbmNbaV0gJiAweGZmZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPj49IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKjwgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBZIGNvb3JkaW5hdGUgY2FuIGJlIG9kZAotICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgYSAwLjUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgIGZvciBVIGFuZCBWIHBsYW5lIGFzIHRoZXJlIGEgMiB0aW1lcyBzdWItc2FtcGxlZCB2cyBZKi8KLSAgICAgICAgICAgICAgICBpZigocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3kmMHgxKSYmKChpPT0xKXx8KGk9PTIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSArPSAweDgwMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuCi0gICAgICAgICAgICAgICAgICAgIDAgYW5kIDAuNQotICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl94X2luY1tpXSA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl94X2luY1tpXSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA+Pj0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBUYWtlIGludG8gYWNjb3VudCB0aGF0IFggY29vcmRpbmF0ZSBjYW4gYmUgb2RkCi0gICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBhIDAuNSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwotICAgICAgICAgICAgICAgIGlmKChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feCYweDEpJiYoKGk9PTEpfHwoaT09MikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFJlc2V0IHZhcmlhYmxlIHVzZWQgZm9yIHN0cmlwZSBtb2RlICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotCi0gICAgLyoqPCBJbml0aWFsaXplIHZhciBmb3IgWC9ZIHByb2Nlc3Npbmcgb3JkZXIgYWNjb3JkaW5nIHRvIG9yaWVudGF0aW9uICovCi0gICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfRkFMU0U7Ci0gICAgc3dpdGNoKHBQYXJhbXMtPm1fb3V0cHV0T3JpZW50YXRpb24pCi0gICAgewotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbToKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICAvKio8IFVwZGF0ZSBzdGF0ZSAqLwotICAgIHBDLT5tX3N0YXRlID0gTTRBSVJfa0NvbmZpZ3VyZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfZ2V0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0KQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgdGhlIHJlcXVlc3RlZCByZXNpemVkIGFyZWEgb2YgaW50ZXJlc3QgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICBzZXR0aW5ncyAgcHJvdmlkZWQgaW4gTTRBSVJfY29uZmlndXJlLgotICogQG5vdGUgICAgSW4gY2FzZSB0aGUgaW5wdXQgZm9ybWF0IHR5cGUgaXMgSlBFRywgaW5wdXQgcGxhbmUocykKLSAqICAgICAgICAgIGluIHBJbiBpcyBub3QgdXNlZC4gSW4gbm9ybWFsIG1vZGUsIGRpbWVuc2lvbiBzcGVjaWZpZWQgaW4gb3V0cHV0IHBsYW5lKHMpIHN0cnVjdHVyZQotICogICAgICAgICAgbXVzdCBiZSB0aGUgc2FtZSB0aGFuIHRoZSBvbmUgc3BlY2lmaWVkIGluIE00QUlSX2NvbmZpZ3VyZS4gSW4gc3RyaXBlIG1vZGUsIG9ubHkgdGhlCi0gKiAgICAgICAgICB3aWR0aCB3aWxsIGJlIHRoZSBzYW1lLCBoZWlnaHQgd2lsbCBiZSB0YWtlbiBhcyB0aGUgc3RyaXBlIGhlaWdodCAodHlwaWNhbGx5IDE2KS4KLSAqICAgICAgICAgIEluIG5vcm1hbCBtb2RlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGwgb25jZSB0byBnZXQgdGhlIGZ1bGwgb3V0cHV0IHBpY3R1cmUuCi0gKiAgICAgICAgICBJbiBzdHJpcGUgbW9kZSwgaXQgaXMgY2FsbGVkIGZvciBlYWNoIHN0cmlwZSB0aWxsIHRoZSB3aG9sZSBwaWN0dXJlIGhhcyBiZWVuCi0gKiAgICAgICAgICByZXRyaWV2ZWQsYW5kICB0aGUgcG9zaXRpb24gb2YgdGhlIG91dHB1dCBzdHJpcGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlCi0gKiAgICAgICAgICBpcyBpbnRlcm5hbGx5IGluY3JlbWVudGVkIGF0IGVhY2ggc3RlcC4KLSAqICAgICAgICAgIEFueSBjYWxsIHRvIE00QUlSX2NvbmZpZ3VyZSBkdXJpbmcgc3RyaXBlIHByb2Nlc3Mgd2lsbCByZXNldCB0aGlzIG9uZSB0byB0aGUKLSAqICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBpY3R1cmUuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgICBwSW46ICAgICAgICAgICAgKElOKSBQbGFuZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbnB1dCBQbGFuZShzKS4KLSAqIEBwYXJhbSAgICBwT3V0OiAgICAgICAgKElOL09VVCkgIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIG91dHB1dCBQbGFuZShzKS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi17Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0IDsKLSAgICBNNE9TQV9VSW50MzIgaSxqLGssdTMyX3hfZnJhYyx1MzJfeV9mcmFjLHUzMl94X2FjY3VtLHUzMl95X2FjY3VtLHUzMl9zaGlmdDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9kYXRhX2luLCAqcHU4X2RhdGFfaW5fb3JnLCAqcHU4X2RhdGFfaW5fdG1wLCAqcHU4X2RhdGFfb3V0OwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X3NyY190b3A7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbTsKLSAgICBNNE9TQV9VSW50MzIgICAgdTMyX3RlbXBfdmFsdWU7Ci0gICAgTTRPU0FfSW50MzIgICAgaTMyX3RtcF9vZmZzZXQ7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKLQotCi0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICAvKio8IENoZWNrIHN0YXRlICovCi0gICAgaWYoTTRBSVJfa0NvbmZpZ3VyZWQgIT0gcEMtPm1fc3RhdGUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgaWYoTTRBSVJfa1lVVjQyMEFQID09IHBDLT5tX2lucHV0Rm9ybWF0KQotICAgIHsKLSAgICAgICAgbmJfcGxhbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbmJfcGxhbmVzID0gMzsKLSAgICB9Ci0KLSAgICAvKio8IExvb3Agb24gZWFjaCBQbGFuZSAqLwotICAgIGZvcihpPTA7aTxuYl9wbGFuZXM7aSsrKQotICAgIHsKLQotICAgICAgICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0KLSAgICAgICAgdTMyX3NoaWZ0ID0gKChpPT0wKXx8KGk9PTMpKT8wOjE7IC8qKjwgRGVwZW5kIG9uIEx1bWEgb3IgQ2hyb21hICovCi0KLSAgICAgICAgaWYoKE00T1NBX0ZBTFNFID09IHBDLT5tX3BhcmFtcy5tX2JPdXRwdXRTdHJpcGUpXAotICAgICAgICAgICAgfHwoKE00T1NBX1RSVUUgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSkmJigwID09IHBDLT5tX3Byb2NSb3dzKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgRm9yIGlucHV0LCB0YWtlIGNhcmUgYWJvdXQgUk9JICovCi0gICAgICAgICAgICBwdThfZGF0YV9pbiAgICAgPSBwSW5baV0ucGFjX2RhdGEgKyBwSW5baV0udV90b3BsZWZ0IFwKLSAgICAgICAgICAgICAgICArIChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feD4+dTMyX3NoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgKyAocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPj4gdTMyX3NoaWZ0KSAqIHBJbltpXS51X3N0cmlkZTsKLQotICAgICAgICAgICAgLyoqIEdvIGF0IGVuZCBvZiBsaW5lL2NvbHVtbiBpbiBjYXNlIFgvWSBzY2FubmluZyBpcyBmbGlwcGVkICovCi0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+dTMyX3NoaWZ0KSAtMSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+dTMyX3NoaWZ0KSAtMSlcCi0gICAgICAgICAgICAgICAgICAgICAqIHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqPCBJbml0aWFsaXplIGFjY3VtdWxhdG9ycyBpbiBjYXNlIHdlIGFyZSB1c2luZyBpdCAoYmlsaW5lYXIgaW50ZXJwb2xhdGlvbikgKi8KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+bV9iT25seUNvcHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldID0gcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldOwotICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBJbiBjYXNlIG9mIHN0cmlwZSBtb2RlIGZvciBvdGhlciB0aGFuIGZpcnN0IHN0cmlwZSwgd2UgbmVlZCB0byByZWNvdmVyIGlucHV0Ci0gICAgICAgICAgICAgICAgIHBvaW50ZXIgZnJvbSBpbnRlcm5hbCBjb250ZXh0ICovCi0gICAgICAgICAgICBwdThfZGF0YV9pbiA9IHBDLT5wdThfZGF0YV9pbltpXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgSW4gZXZlcnkgbW9kZSwgb3V0cHV0IGRhdGEgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBwbGFuZSAqLwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSBwT3V0W2ldLnBhY19kYXRhICsgcE91dFtpXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgLyoqPCBJbml0aWFsaXplIGlucHV0IG9mZnNldCBhcHBsaWVkIGFmdGVyIGVhY2ggcGl4ZWwgKi8KLSAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBZKQotICAgICAgICB7Ci0gICAgICAgICAgICBpMzJfdG1wX29mZnNldCA9IHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkzMl90bXBfb2Zmc2V0ID0gLXBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgSW4gdGhpcyBjYXNlLCBubyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGlzIG5lZWRlZCBhcyBpbnB1dCBhbmQgb3V0cHV0IGRpbWVuc2lvbnMKLSAgICAgICAgICAgIGFyZSB0aGUgc2FtZSAqLwotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+bV9iT25seUNvcHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgTm8gKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKio8IE5vIGZsaXAgb24gWCBhYnNjaXNzYSAqLwotICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29weSBvbmUgd2hvbGUgbGluZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcHU4X2RhdGFfb3V0LCAodm9pZCAqKXB1OF9kYXRhX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0W2ldLnVfd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC09IHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gKHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBwT3V0W2ldLnVfd2lkdGggKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqPCBIZXJlIHdlIGhhdmUgYSArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wID0gcHU4X2RhdGFfaW47Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcGl4ZWwgb2YgMSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9ICpwdThfZGF0YV9pbl90bXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIGlucHV0IHBvaW50ZXIgaW4gb3JkZXIgdG8gZ28gdG8gbmV4dC9wYXN0IGxpbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX3RtcCArPSBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSAocE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiAtLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKio8IEJpbGluZWFyIGludGVycG9sYXRpb24gKi8KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgaWYoMyAhPSBpKSAgICAvKio8IG90aGVyIHRoYW4gYWxwaGEgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqTm8gKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9IChwQy0+dTMyX3lfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtID0gcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldOwotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl95X2FjY3VtW2ldID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAvKiogKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbl9vcmc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LyoqIDMgIT0gaSAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgLyoqTm8gKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9IChwQy0+dTMyX3lfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtID0gcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldOwotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHUzMl94X2FjY3VtID4+IDE2KSkgLTEgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfYWNjdW1baV0+PjE2KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeV9hY2N1bVtpXSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSAvKio8IE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSAqLwotICAgICAgICAgICAgLyoqICstOTCwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fb3JnID0gcHU4X2RhdGFfaW47Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAocEMtPnUzMl94X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KSkgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bVtpXSArPSBwQy0+dTMyX3hfaW5jW2ldOwotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW5fb3JnOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gLyoqPCBNNE9TQV9UUlVFID09IHBDLT5tX2JSZXZlcnRYWSAqLwotICAgICAgICB9LyoqIDMgPT0gaSAqLwotICAgICAgICAgICAgfQotICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUsIHNhdmUgY3VycmVudCBpbnB1dCBwb2ludGVyICovCi0gICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnB1OF9kYXRhX2luW2ldID0gcHU4X2RhdGFfaW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFVwZGF0ZSBudW1iZXIgb2YgcHJvY2Vzc2VkIHJvd3MsIHJlc2V0IGl0IGlmIHdlIGhhdmUgZmluaXNoZWQKLSAgICAgICAgIHdpdGggdGhlIHdob2xlIHByb2Nlc3NpbmcgKi8KLSAgICBwQy0+bV9wcm9jUm93cyArPSBwT3V0WzBdLnVfaGVpZ2h0OwotICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICB7Ci0gICAgICAgIGlmKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPD0gcEMtPm1fcHJvY1Jvd3MpICAgIHBDLT5tX3Byb2NSb3dzID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoIDw9IHBDLT5tX3Byb2NSb3dzKSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi19Ci0KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QU1SUl9Db3JlUmVhZGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QU1SUl9Db3JlUmVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzMGY5ZGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFNUlJfQ29yZVJlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNEFNUlJfQ29yZVJlYWRlci5jCi0gKiBAYnJpZWYgICAgICAgSW1wbGVtZW50YXRpb24gb2YgQU1SIHBhcnNlcgotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQVBJIEltcGxlbWVudGF0aW9uIGZvcgotICogICAgICAgICAgICAgIEFNUiBQYXJzZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2luY2x1ZGUgIk00QU1SUl9Db3JlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNYXhpbXVtIGJpdHJhdGUgcGVyIGFtciB0eXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNEFNUlJfTkJfTUFYX0JJVF9SQVRFICAgIDEyMjAwCi0jZGVmaW5lIE00QU1SUl9XQl9NQVhfQklUX1JBVEUgICAgMjM4NTAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBTVIgcmVhZGVyIGNvbnRleHQgSUQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00QU1SUl9DT05URVhUSUQgICAgMHg0MTRkNTI1MgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFuIEFNUiBmcmFtZSBpcyAyMG1zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNEFNUlJfRlJBTUVfTEVOR1RIICAgICAyMAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZvciB0aGUgc2VlaywgdGhlIGZpbGUgaXMgc3BsaXR0ZWQgaW4gNDAgc2VnbWVudHMgZm9yIGZhc3RlciBzZWFyY2gKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lICAgIE00QU1SUl9OVU1fU0VFS19FTlRSSUVTIDQwCi0KLSNkZWZpbmUgTTRBTVJSX05CX1NBTVBMRV9GUkVRVUVOQ1kgODAwMCAgICAgICAgLyoqPCBOYXJyb3cgYmFuZCBzYW1wbGluZyByYXRlICovCi0jZGVmaW5lIE00QU1SUl9XQl9TQU1QTEVfRlJFUVVFTkNZIDE2MDAwICAgIC8qKjwgV2lkZSBiYW5kIHNhbXBsaW5nIHJhdGUgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBTVIgcmVhZGVyIHZlcnNpb24gbnVtYmVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSNkZWZpbmUgTTRBTVJSX1ZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBNNEFNUlJfVkVSU0lPTl9NSU5PUiAxMQotI2RlZmluZSBNNEFNUlJfVkVSU0lPTl9SRVZJU0lPTiAzCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X0FNUlJfQ29udGV4dAotICogQGJyaWVmICAgICAgICBJbnRlcm5hbCBBTVIgcmVhZGVyIGNvbnRleHQgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgbV9jb250ZXh0SWQgOyAgICAgIC8qIEZpeGVkIElkLiB0byBjaGVjayBmb3IgdmFsaWQgQ29udGV4dCovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgIG1fcE9zYUZpbGVQdHJGY3Q7ICAvKiBGaWxlIGZ1bmN0aW9uIHBvaW50ZXIgKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogbV9wU3RyZWFtSGFuZGxlcjsgIC8qIFN0cmVhbSBEZXNjcmlwdGlvbiAqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgICBtX3BTZWVrSW5kZXg7ICAgICAgLyogU2VlayBJbmRleCBUYWJsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICBtX3NlZWtJbnRlcnZhbDsgICAgLyogU3RvcmVzIHRoZSBzZWVrIEludGVydmFsIHN0b3JlZCBpbiB0aGUgSW5kZXggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgbV9tYXhBdVNpemU7ICAgICAgIC8qIFN0b3JlcyB0aGUgbWF4IEF1IFNpemUgKi8KLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgICAgICAgbV9wZGF0YUFkZHJlc3M7ICAgIC8qIFBvaW50ZXIgdG8gc3RvcmUgQVUgZGF0YSAqLwotICAgIE00U1lTX1N0cmVhbVR5cGUgICAgICAgICBtX3N0cmVhbVR5cGU7ICAgICAgLyogU3RvcmVzIHRoZSBzdHJlYW0gdHlwZSBBTVIgTkIgb3IgV0IgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgbV9wQU1SRmlsZTsgICAgICAgIC8qIERhdGEgc3RvcmFnZSAqLwotICAgIE00QU1SUl9TdGF0ZSAgICAgICAgICAgICBtX3N0YXR1czsgICAgICAgICAgLyogQU1SIFJlYWRlciBTdGF0dXMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgIC8qIHNpemUgb2Ygc3RydWN0dXJlKi8KLX0gTTRfQU1SUl9Db250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFBhcnNlciBpbnRlcm5hbCBmdW5jdGlvbnMsIG5vdCB1c2FibGUgZnJvbSBvdXRzaWRlIHRoZSByZWFkZXIgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1VJbnQzMiAgICBNNEFNUlJfZ2V0QXVTaXplKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpOwotTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRCaXRyYXRlKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiAgICBNNEFNUlJfZ2V0QXVTaXplKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgZnVuY3Rpb24gdG8gdGhlIEFNUiBQYXJzZXIsIHJldHVybnMgdGhlIEFVIHNpemUgb2YgdGhlIEZyYW1lCi0gKiBAbm90ZSAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgc3RyZWFtIHR5cGUgYW5kIHRoZSBmcmFtZXR5cGUgYW5kIHJldHVybnMgdGhlCi0gKiAgICAgICAgICAgZnJhbWUgbGVuZ2h0Ci0gKiBAcGFyYW0gICAgZnJhbWVUeXBlKElOKSAgICA6IEFNUiBmcmFtZSB0eXBlCi0gKiBAcGFyYW0gICAgc3RyZWFtVHlwZShJTikgICAgOiBBTVIgc3RyZWFtIHR5cGUgTkIgb3IgV0IKLSAqIEByZXR1cm5zICBUaGUgZnJhbWUgc2l6ZSBiYXNlZCBvbiB0aGUgZnJhbWUgdHlwZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRBdVNpemUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLXsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX05CX0FVU0laRVtdPXsxMywxNCwxNiwxOCwyMCwyMSwyNywzMiw2LDYsNn07Ci0gICAgY29uc3QgTTRPU0FfVUludDMyICAgIE00QU1SUl9XQl9BVVNJWkVbXT17MTgsMjQsMzMsMzcsNDEsNDcsNTEsNTksNjEsNn07Ci0KLSAgICBpZiAoIHN0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00QU1SUl9OQl9BVVNJWkVbZnJhbWVUeXBlXTsKLSAgICB9Ci0gICAgZWxzZSAvKiBNNFNZU19rQU1SX1dCICovCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00QU1SUl9XQl9BVVNJWkVbZnJhbWVUeXBlXTsKLSAgICB9Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRCaXRyYXRlKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgZnVuY3Rpb24gdG8gdGhlIEFNUiBQYXJzZXIsIHJldHVybnMgdGhlIEJpdCByYXRlIG9mIHRoZSBGcmFtZQotICogQG5vdGUgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHN0cmVhbSB0eXBlIGFuZCB0aGUgZnJhbWV0eXBlIGFuZCByZXR1cm5zIHRoZQotICogICAgICAgICAgIGJpdCByYXRlIGZvciB0aGUgZ2l2ZW4gZnJhbWUuCi0gKiBAcGFyYW0gICAgZnJhbWVUeXBlKElOKSAgICA6IEFNUiBmcmFtZSB0eXBlCi0gKiBAcGFyYW0gICAgc3RyZWFtVHlwZShJTikgICAgOiBBTVIgc3RyZWFtIHR5cGUgTkIgb3IgV0IKLSAqIEByZXR1cm5zICBUaGUgZnJhbWUncyBiaXQgcmF0ZSBiYXNlZCBvbiB0aGUgZnJhbWUgdHlwZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRCaXRyYXRlKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpCi17Ci0gICAgY29uc3QgTTRPU0FfVUludDMyICAgIE00QU1SUl9OQl9CSVRSQVRFW109Ci0gICAgICAgIHs0NzUwLDUxNTAsNTkwMCw2NzAwLDc0MDAsNzk1MCwxMDIwMCwxMjIwMCwxMjIwMCwxMjIwMCwxMjIwMH07Ci0gICAgY29uc3QgTTRPU0FfVUludDMyICAgIE00QU1SUl9XQl9CSVRSQVRFW109Ci0gICAgICAgIHs2NjAwLDg4NTAsMTI2NTAsMTQyNTAsMTU4NTAsMTgyNTAsMTk4NTAsMjMwNTAsMjM4NTAsMTIyMDB9OwotCi0gICAgaWYgKCBzdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKQotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEFNUlJfTkJfQklUUkFURVtmcmFtZVR5cGVdOwotICAgIH0KLSAgICBlbHNlIC8qIE00U1lTX2tBTVJfV0IgKi8KLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRBTVJSX1dCX0JJVFJBVEVbZnJhbWVUeXBlXTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogICAgcFN0cmVhbUNvbnRleHQ7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlUG9zOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00RVJSX0ZJTEVfTk9UX0ZPVU5EIDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZSA7Ci0gICAgTTRPU0FfVUludDMyIGRhdGEgOwotICAgIE00T1NBX0NoYXIgKk00X1Rva2VuOwotICAgIE00T1NBX1VJbnQzMiAqdG9rZW5QdHI7Ci0KLSAgICAvKiBIZWFkZXIgZm9yIEFNUiBOQiAqLwotICAgIE00T1NBX1VJbnQzMiBNNF9BTVJfMSAgICAgICA9IDB4NGQ0MTIxMjM7Ci0gICAgTTRPU0FfVUludDMyIE00X0FNUl9OQl8yICAgID0gMHgwMDAwMGE1MjsKLQotICAgIC8qIEhlYWRlciBmb3IgQU1SIFdCICovCi0gICAgTTRPU0FfVUludDMyIE00X0FNUl9XQl8yICAgID0gMHg0MjU3MmQ1MjsKLSAgICBNNE9TQV9VSW50MzIgTTRfQU1SX1dCXzMgICAgPSAweDAwMDAwMDBhOwotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLE00RVJSX1BBUkFNRVRFUiwiRmlsZSBEZXNjLiBNNE9TQV9OVUxMIik7Ci0KLSAgICBNNF9Ub2tlbiA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX01lbUFkZHIzMikqMywgTTRBTVJfUkVBREVSLAotICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSgiTTRfVG9rZW4iKSk7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSBNNF9Ub2tlbikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMygoTTRPU0FfTlVMTCA9PSBNNF9Ub2tlbiksTTRFUlJfQUxMT0MsIk1lbSBBbGxvYyBmYWlsZWQgLSBNNF9Ub2tlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0MgOwotICAgIH0KLQotICAgIHBTdHJlYW1Db250ZXh0PSAoTTRfQU1SUl9Db250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0FNUlJfQ29udGV4dCksIE00QU1SX1JFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopKCJwU3RyZWFtQ29udGV4dCIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0KQotICAgIHsKLSAgICAgICAgZnJlZShNNF9Ub2tlbik7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0MgOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbnRleHQgKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgPSBNNEFNUlJfQ09OVEVYVElEOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cnVjdFNpemU9c2l6ZW9mKE00X0FNUlJfQ29udGV4dCk7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3Q9cEZpbGVGdW5jdGlvbiA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSA9IE00T1NBX05VTEwgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rT3BlbmluZyA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCA9IE00T1NBX05VTEwgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCA9IDA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplID0gMCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBlcnI9cFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPm9wZW5SZWFkKCZwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgKE00T1NBX0NoYXIqKXBGaWxlRGVzY3JpcHRvcixNNE9TQV9rRmlsZVJlYWQgKTsKLSAgICBpZiAoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICB7Ci0gICAgICAgIC8qIE00T1NBX0RFQlVHX0lGMygoZXJyICE9IE00Tk9fRVJST1IpLGVyciwiRmlsZSBvcGVuIGZhaWxlZCIpOyAqLwotICAgICAgICBmcmVlKHBTdHJlYW1Db250ZXh0KTsKLSAgICAgICAgZnJlZShNNF9Ub2tlbik7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotICAgICAgICByZXR1cm4gZXJyIDsKLSAgICB9Ci0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa09wZW5pbmcgOwotCi0gICAgc2l6ZSA9IDY7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNF9Ub2tlbiwgJnNpemUpOwotICAgIGlmKHNpemUgIT0gNikKLSAgICB7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICB0b2tlblB0ciA9IChNNE9TQV9VSW50MzIqKU00X1Rva2VuIDsKLSAgICAvKiBDaGVjayBmb3IgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGhlYWRlciBjb21tb24gdG8gV0IgYW5kIE5CKi8KLSAgICBpZiAoKnRva2VuUHRyICE9IE00X0FNUl8xKQotICAgIHsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIHRva2VuUHRyKys7Ci0gICAgZGF0YSA9ICp0b2tlblB0ciAmIDB4MDAwMEZGRkYgOwotICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHBhcnQgaXMgTmFycm93IGJhbmQgaGVhZGVyICovCi0gICAgaWYgKGRhdGEhPSBNNF9BTVJfTkJfMikKLSAgICB7Ci0gICAgICAgIC8qIFN0cmVhbSBpcyBBTVIgV2lkZSBCYW5kICovCi0gICAgICAgIGZpbGVQb3MgPSA0OwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zKTsKLSAgICAgICAgc2l6ZSA9IDU7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRfVG9rZW4sICZzaXplKTsKLSAgICAgICAgaWYoc2l6ZSAhPSA1KQotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB0b2tlblB0cj0oTTRPU0FfVUludDMyKilNNF9Ub2tlbjsKLSAgICAgICAgLyogQ2hlY2sgZm9yIHRoZSBXaWRlIGJhbmQgaGFkZXIgKi8KLSAgICAgICAgaWYoKnRva2VuUHRyIT0gTTRfQU1SX1dCXzIpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIHRva2VuUHRyKys7Ci0gICAgICAgIGRhdGEgPSAqdG9rZW5QdHIgJiAweDAwMDAwMEZGIDsKLSAgICAgICAgaWYoZGF0YSE9IE00X0FNUl9XQl8zKQotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID0gTTRTWVNfa0FNUl9XQiA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFN0cmVhbSBpcyBhIE5hcnJvdyBiYW5kIHN0cmVhbSAqLwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID0gTTRTWVNfa0FNUiA7Ci0gICAgfQotICAgIC8qICBObyBQcm9maWxlIGxldmVsIGRlZmluZWQgKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa09wZW5lZDsKLQotICAgIGZyZWUoTTRfVG9rZW4pOwotICAgICpwQ29udGV4dCA9IHBTdHJlYW1Db250ZXh0IDsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLQotY2xlYW51cDoKLQotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUpCi0gICAgewotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+Y2xvc2VSZWFkKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlKTsKLSAgICB9Ci0KLSAgICBmcmVlKE00X1Rva2VuKTsKLSAgICBmcmVlKHBTdHJlYW1Db250ZXh0KTsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX05PVF9DT01QTElBTlQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYyApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogICAgcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9DaGFyICAgICAgICAgICAgZnJhbWVIZWFkZXIsIGZyYW1lVHlwZSA7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBzaXplLCBhdUNvdW50PTA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlUG9zOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJlYW1EZXNjKSxNNEVSUl9QQVJBTUVURVIsIlN0cmVhbSBEZXNjLiBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tPcGVuZWQpLCBNNEVSUl9TVEFURSwgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNIDsKLSAgICB9Ci0KLSAgICBzaXplID0gMTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAoTTRPU0FfTWVtQWRkcjgpJmZyYW1lSGVhZGVyLCAmc2l6ZSk7Ci0KLSAgICAvKiBYRkZGIEZYWFggLT4gRiBpcyB0aGUgRnJhbWUgdHlwZSAqLwotICAgIGZyYW1lVHlwZSA9ICggZnJhbWVIZWFkZXIgJiAweDc4ICkgPj4gMyA7Ci0KLSAgICBpZiAoIGZyYW1lVHlwZSA9PSAxNSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fREFUQV9ZRVQgOwotICAgIH0KLQotICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApICYmICggZnJhbWVUeXBlID4gMTEgKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgfQotCi0gICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkgJiYgKCBmcmFtZVR5cGUgPiA5ICkpCi0gICAgewotICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgIH0KLQotICAgIC8qIEF2ZXJhZ2UgYml0IHJhdGUgaXMgYXNzaWduZWQgdGhlIGJpdHJhdGUgb2YgdGhlIGZpcnN0IGZyYW1lICovCi0gICAgcFN0cmVhbURlc2MtPmF2ZXJhZ2VCaXRyYXRlID0gTTRBTVJSX2dldEJpdHJhdGUoZnJhbWVUeXBlLHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUpOwotCi0gICAgZmlsZVBvcyA9IC0xOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLCBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LAotICAgICAgICAgJmZpbGVQb3MpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwU3RyZWFtRGVzYyAqLwotICAgIHBTdHJlYW1EZXNjLT5wcm9maWxlTGV2ZWwgPSAweEZGIDsKLSAgICBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwIDsKLSAgICBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEwgOwotICAgIHBTdHJlYW1EZXNjLT5tYXhCaXRyYXRlID0gKHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0KLSAgICAgICAgTTRTWVNfa0FNUiApP000QU1SUl9OQl9NQVhfQklUX1JBVEU6TTRBTVJSX1dCX01BWF9CSVRfUkFURTsKLSAgICBwU3RyZWFtRGVzYy0+cHJvZmlsZUxldmVsID0gMHhGRiA7Ci0gICAgcFN0cmVhbURlc2MtPnN0cmVhbUlEID0gMTsKLSAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGU7Ci0KLSAgICAvKiBUaW1lc2NhbGUgZXF1YWxzIFNhbXBsaW5nIEZyZXF1ZW5jeTogTkItODAwMCBIeiwgV0ItMTYwMDAgSHogKi8KLSAgICBwU3RyZWFtRGVzYy0+dGltZVNjYWxlID0gKHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApPzgwMDA6MTYwMDA7Ci0gICAgcFN0cmVhbURlc2MtPmR1cmF0aW9uID0gTTRPU0FfVElNRV9VTktOT1dOOwotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIgPQotICAgICAgICAgKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKSwKLSAgICAgICAgICAgICBNNEFNUl9SRUFERVIsIChNNE9TQV9DaGFyICopKCJwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlciIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIENvcHkgdGhlIFN0cmVhbSBEZXNjLiBpbnRvIHRoZSBDb250ZXh0ICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmF2ZXJhZ2VCaXRyYXRlID0gcFN0cmVhbURlc2MtPmF2ZXJhZ2VCaXRyYXRlOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmR1cmF0aW9uID0gTTRPU0FfVElNRV9VTktOT1dOOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5wcm9maWxlTGV2ZWwgPSAweEZGIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+c3RyZWFtSUQgPSAxOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5zdHJlYW1UeXBlID0gcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT50aW1lU2NhbGUgPSBwU3RyZWFtRGVzYy0+dGltZVNjYWxlIDsKLQotICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgQWNjZXNzIFVuaXQgaW4gdGhlIEZpbGUgdG8gZ2V0IHRoZSAqLwotICAgIC8qIGR1cmF0aW9uIG9mIHRoZSBzdHJlYW0gPSAyMCBtcyAqIG51bWJlciBvZiBhY2Nlc3MgdW5pdCAqLwotICAgIHdoaWxlKDEpCi0gICAgewotICAgICAgICBzaXplID0gMTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmZnJhbWVIZWFkZXIsICZzaXplKTsKLSAgICAgICAgaWYgKCBzaXplID09IDApCi0gICAgICAgICAgICBicmVhayA7Ci0gICAgICAgIGZyYW1lVHlwZSA9IChmcmFtZUhlYWRlciAmIDB4NzgpID4+IDMgOwotICAgICAgICAvKiBHZXQgdGhlIGZyYW1lIHNpemUgYW5kIHNraXAgc28gbWFueSBieXRlcyAqLwotICAgICAgICBpZihmcmFtZVR5cGUgIT0gMTUpewotICAgICAgICAgICAgLyogR0xBIDIwMDUwNjI4IHdoZW4gZnJhbWV0eXBlIGlzID4xMCB3ZSByZWFkIG92ZXIgYSB0YWJsZSAqLwotICAgICAgICAgICAgaWYoZnJhbWVUeXBlID4gMTApCi0gICAgICAgICAgICAgICAgY29udGludWUgOwotCi0gICAgICAgICAgICBzaXplID0gTTRBTVJSX2dldEF1U2l6ZShmcmFtZVR5cGUsIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgaWYoc2l6ZSA+IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplID0gc2l6ZSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWxlUG9zID0gc2l6ZS0xOwotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZmaWxlUG9zKTsKLSAgICAgICAgICAgIGF1Q291bnQrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEVhY2ggRnJhbWUgaXMgMjAgbSBTZWMuICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmR1cmF0aW9uID0gYXVDb3VudCAqIE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgIHBTdHJlYW1EZXNjLT5kdXJhdGlvbiA9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kdXJhdGlvbiA7Ci0KLSAgICAvKiBQdXQgdGhlIGZpbGUgcG9pbnRlciBiYWNrIGF0IHRoZSBmaXJzdCBBY2Nlc3MgdW5pdCAqLwotICAgIGlmKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKQotICAgIHsKLSAgICAgICAgZmlsZVBvcyA9IDY7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MpOwotICAgIH0KLSAgICBpZiAoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUl9XQiApCi0gICAgewotICAgICAgICBmaWxlUG9zID0gOTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgc2l6ZSA9IDAgOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJlYW1JRHMpLE00RVJSX1BBUkFNRVRFUiwiU3RyZWFtIElkcy4gTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkICE9IE00QU1SUl9DT05URVhUSUQpLE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgIkJhZCBDb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rT3BlbmVkKSwgTTRFUlJfU1RBVEUsICJJbnZhbGlkIFN0YXRlIik7Ci0KLSAgICB3aGlsZSggcFN0cmVhbUlEc1tzaXplXSAhPSAwICkKLSAgICB7Ci0gICAgICAgIGlmKCBwU3RyZWFtSURzW3NpemUrK10gIT0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEIDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZGF0YSBBZGRyZXNzIGZvciB1c2UgaW4gTmV4dEFVKCkgKi8KLSAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcykKLSAgICB7Ci0gICAgICAgIHNpemUgPSBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUgOwotICAgICAgICAvKiBkYXRhQWRkcmVzcyBpcyBvd25lZCBieSBQYXJzZXIsIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgZGVsZXRlIG9yIGZyZWUgaXQgKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzID0oTTRPU0FfTWVtQWRkcjMyKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplICsgKDQgLSBzaXplICUgNCksCi0gICAgICAgICAgICBNNEFNUl9SRUFERVIsIChNNE9TQV9DaGFyICopKCJwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MiKSk7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYzKChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyksTTRFUlJfQUxMT0MsCi0gICAgICAgICAgICAgICAgICAgICJNZW0gQWxsb2MgZmFpbGVkIC0gZGF0YUFkZHJlc3MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHN0YXRlIG9mIGNvbnRleHQgdG8gUmVhZGluZyAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rUmVhZGluZyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfbmV4dEFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0NoYXIgICAgICAgIGZyYW1lSGVhZGVyIDsKLSAgICBNNE9TQV9DaGFyICAgICAgICBmcmFtZVR5cGUgOwotICAgIE00T1NBX0ludDMyICAgICAgICBhdVNpemU7Ci0gICAgTTRPU0FfVUludDMyICAgIHNpemUgOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgZmlsZVBvczsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQXUpLE00RVJSX1BBUkFNRVRFUiwiQWNjZXNzIFVuaXQgLiBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tSZWFkaW5nKSwgTTRFUlJfU1RBVEUsICJJbnZhbGlkIFN0YXRlIik7Ci0KLSAgICBpZiAoIFN0cmVhbUlEICE9IDEgKQotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgIC8qIFJlYWQgdGhlIGZyYW1lIGhlYWRlciBieXRlICovCi0gICAgc2l6ZSA9IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzLCAmc2l6ZSk7Ci0gICAgaWYoc2l6ZSAhPSBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9Ci0KLSAgICBmcmFtZUhlYWRlciA9ICgoTTRPU0FfTWVtQWRkcjgpcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKVswXTsKLQotICAgIGZyYW1lVHlwZSA9ICggZnJhbWVIZWFkZXIgJiAweDc4ICkgPj4gMyA7Ci0KLSAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKSAmJgotICAgICAgICAoIGZyYW1lVHlwZSA+IDExICkgJiYgKCBmcmFtZVR5cGUgIT0gMTUgKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgfQotCi0gICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkgJiYKLSAgICAgICAgKCBmcmFtZVR5cGUgPiA5ICkgJiYgKCBmcmFtZVR5cGUgIT0gMTUgKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgfQotCi0gICAgLyogR2V0IHRoZSBmcmFtZSBzaXplICovCi0gICAgaWYoZnJhbWVUeXBlID09IDE1KQotICAgIHsKLSAgICAgICAgYXVTaXplID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYXVTaXplID0gTTRBTVJSX2dldEF1U2l6ZShmcmFtZVR5cGUsIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUpOwotICAgIH0KLQotICAgIHNpemUgLT0gYXVTaXplIDsKLSAgICBpZihzaXplICE9IDApCi0gICAgewotICAgICAgICBmaWxlUG9zID0gLSgoTTRPU0FfRmlsZVBvc2l0aW9uKXNpemUpOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZmlsZVBvcyk7Ci0gICAgfQotCi0gICAgcEF1LT5zaXplID0gYXVTaXplIDsKLQotICAgIC8qIGV2ZW4gd2hlbiBmcmFtZVR5cGUgPT0gMTUgKG5vIGRhdGEgZnJhbWUpLCBBUk0gY29yZSBkZWNvZGVyIG91dHB1dHMgZnVsbCBQQ00gYnVmZmVyICovCi0gICAgLyppZihmcmFtZVR5cGUgPT0gMTUgKQotICAgIHsKLSAgICAgICAgcEF1LT5DVFMgKz0gMDsKLSAgICB9Ki8KLSAgICAvKmVsc2UqLwotICAgIHsKLSAgICAgICAgcEF1LT5DVFMgKz0gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgfQotCi0KLSAgICBwQXUtPkRUUyA9IHBBdS0+Q1RTIDsKLSAgICBwQXUtPmF0dHJpYnV0ZSA9IE00U1lTX2tGcmFnQXR0ck9rOwotCi0gICAgcEF1LT5zdHJlYW0gPSBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcjsKLSAgICBwQXUtPmRhdGFBZGRyZXNzID0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzIDsKLQotICAgIGlmKGZyYW1lSGVhZGVyICYgMHg4MCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIC8qIENoYW5nZSB0aGUgc3RhdGUgdG8gaW1wbGVtZW50IE5leHRBdS0+ZnJlZUF1LT5OZXh0QXUgRlNNICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tSZWFkaW5nX25leHRBVSA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX2ZyZWVBVShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEIFN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQXUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEF1KSxNNEVSUl9QQVJBTUVURVIsIkFjY2VzcyBVbml0IC4gTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkICE9IE00QU1SUl9DT05URVhUSUQpLE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgIkJhZCBDb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rUmVhZGluZ19uZXh0QVUpLCBNNEVSUl9TVEFURSwKLSAgICAgICAgICJJbnZhbGlkIFN0YXRlIik7Ci0KLSAgICBpZiAoKCBTdHJlYW1JRCAhPSAxICkgJiYgKCBTdHJlYW1JRCAhPSAwKSkKLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICB9Ci0KLSAgICAvKiBDaGFuZ2UgdGhlIHN0YXRlIHRvIFJlYWRpbmcgc28gYXMgdG8gYWxsb3cgYWNjZXNzIHRvIG5leHQgQVUgKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa1JlYWRpbmcgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9zZWVrKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwgTTRPU0FfVGltZSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1NlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLCBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyIGNvdW50LCBwcmV2QVUsIG5leHRBVSA7Ci0gICAgTTRPU0FfVUludDMyIHNpemUgOwotICAgIE00T1NBX1VJbnQzMiBhdVNpemUgOwotICAgIE00T1NBX1VJbnQzMiBwb3NpdGlvbiwgcGFydFNlZWtUaW1lOwotICAgIE00T1NBX1VJbnQzMiBhdUNvdW50ID0gMCwgc2tpcEF1Q291bnQgPSAwIDsKLSAgICBNNE9TQV9DaGFyICAgIGZyYW1lSGVhZGVyIDsKLSAgICBNNE9TQV9DaGFyICAgIGZyYW1lVHlwZSA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlUG9zOwotICAgIE00T1NBX0RvdWJsZSB0aW1lX2RvdWJsZTsKLQotICAgIC8qTWFrZSBleHBsaWNpdCB0aW1lIGNhc3QsIGJ1dCB0YWtlIGNhcmUgdGhhdCB0aW1lc2NhbGUgaXMgbm90IHVzZWQgISEhKi8KLSAgICBNNE9TQV9USU1FX1RPX01TKHRpbWVfZG91YmxlLCB0aW1lLCAxMDAwKTsKLQotICAgICpwT2J0YWluQ1RTID0gMDsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkICE9IE00QU1SUl9DT05URVhUSUQpLE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgIkJhZCBDb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rUmVhZGluZykgJiYgXAotICAgICAgICAoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa09wZW5lZCksIE00RVJSX1NUQVRFLCAiSW52YWxpZCBTdGF0ZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgodGltZV9kb3VibGUgPCAwKSxNNEVSUl9QQVJBTUVURVIsIm5lZ2F0aXZlIHRpbWUiKTsKLQotICAgIC8qIENvbWluZyB0byBzZWVrIGZvciB0aGUgZmlyc3QgdGltZSwgbmVlZCB0byBidWlsZCB0aGUgc2Vla0luZGV4IFRhYmxlICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KQotICAgIHsKLSAgICAgICAgTTRPU0FfRG91YmxlIGR1cmF0aW9uX2RvdWJsZTsKLQotICAgICAgICBjb3VudCA9IDAgOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4ID0KLSAgICAgICAgICAgICAoTTRPU0FfVUludDMyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRBTVJSX05VTV9TRUVLX0VOVFJJRVMgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgTTRBTVJfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSgicFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCIpKTsKLQotICAgICAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMygoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KSxNNEVSUl9BTExPQywKLSAgICAgICAgICAgICAgICAiTWVtIEFsbG9jIEZhaWxlZCAtIFNlZWtJbmRleCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DIDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHBvaW50IHRvIHRoZSBmaXJzdCBBVSAqLwotICAgICAgICBpZiggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZVBvcyA9IDY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKmlmICggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkqLwotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlUG9zID0gOTsKLSAgICAgICAgfQotCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MpOwotCi0gICAgICAgIC8qIFNldCB0aGUgcG9zdGlvbiB0byBiZWdpbmluZyBvZiBmaXJzdCBBVSAqLwotICAgICAgICBwb3NpdGlvbiA9IChwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlICE9IE00U1lTX2tBTVIpPzk6NjsKLQotICAgICAgICAvKk1ha2UgZXhwbGljaXQgdGltZSBjYXN0LCBidXQgdGFrZSBjYXJlIHRoYXQgdGltZXNjYWxlIGlzIG5vdCB1c2VkICEhISovCi0gICAgICAgIE00T1NBX1RJTUVfVE9fTVMoZHVyYXRpb25fZG91YmxlLCBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZHVyYXRpb24sIDEwMDApOwotCi0gICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgc2VlayBJbnRlcnZhbCBkdXJhdGlvbiBiYXNlZCBvbiB0b3RhbCBkdXRhdGlvbiAqLwotICAgICAgICAvKiBJbnRlcnZhbCA9IChkdXJhdGlvbiAvIEVOVFJJRVMpIGluIG11bHRpcGxlcyBvZiBBVSBmcmFtZSBsZW5ndGggKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsID0KLSAgICAgICAgICAgICAoTTRPU0FfVUludDMyKShkdXJhdGlvbl9kb3VibGUgLyBNNEFNUlJfTlVNX1NFRUtfRU5UUklFUykgOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwgLz0gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCAqPSBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgc2tpcEF1Q291bnQgPSBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwgLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLQotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4W2NvdW50KytdPXBvc2l0aW9uOwotICAgICAgICB3aGlsZShjb3VudCA8IE00QU1SUl9OVU1fU0VFS19FTlRSSUVTICkKLSAgICAgICAgewotICAgICAgICAgICAgc2l6ZSA9IDE7Ci0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmZnJhbWVIZWFkZXIsICZzaXplKTsKLSAgICAgICAgICAgIGlmICggc2l6ZSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyYW1lVHlwZSA9IChmcmFtZUhlYWRlciAmIDB4NzgpID4+IDMgOwotICAgICAgICAgICAgaWYoZnJhbWVUeXBlICE9IDE1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgYnVnZml4IFJvbmFuIENvdXN5biAwNS8wNC8yMDA2OiBJbiB0aGUgY29yZSByZWFkZXIgQU1SLCB0aGUKLSAgICAgICAgICAgICAgICAgKiBmdW5jdGlvbiBNNEFNUlJfc2VlayBkb2Vzbid0IGNoZWNrIHRoZSBmcmFtZVR5cGUgKi8KLSAgICAgICAgICAgICAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKSAmJiAoIGZyYW1lVHlwZSA+IDEwICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkgJiYgKCBmcmFtZVR5cGUgPiA5ICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXVTaXplID0gTTRBTVJSX2dldEF1U2l6ZShmcmFtZVR5cGUsIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IGF1U2l6ZSA7Ci0gICAgICAgICAgICAgICAgZmlsZVBvcyA9IGF1U2l6ZS0xOwotICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmZpbGVQb3MpOwotICAgICAgICAgICAgICAgIGF1Q291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFNraXAgdGhlIG51bWJlciBvZiBBVSdzIGFzIHBlciBpbnRlcnZhbCBhbmQgc3RvcmUgaW4gdGhlIEluZGV4IHRhYmxlICovCi0gICAgICAgICAgICBpZiAoIChza2lwQXVDb3VudCAhPSAwKSAmJiAhKGF1Q291bnQgJSBza2lwQXVDb3VudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleFtjb3VudCsrXSA9IHBvc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfS8qIEVuZCBvZiBCdWlsZGluZyB0aGUgc2VlayB0YWJsZSAqLwotCi0gICAgLyogVXNlIHRoZSBzZWVrIHRhYmxlIHRvIHNlZWsgdGhlIHJlcXVpcmVkIHRpbWUgaW4gdGhlIHN0cmVhbSAqLwotCi0gICAgLyogSWYgd2UgYXJlIHNlZWtpbmcgdGhlIGJlZ2luaW5nIG9mIHRoZSBmaWxlIHBvaW50IHRvIGZpcnN0IEFVICovCi0gICAgaWYgKCBzZWVrTW9kZSA9PSBNNFNZU19rQmVnaW5uaW5nICkKLSAgICB7Ci0gICAgICAgIGlmKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlUG9zID0gNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qaWYgKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVQb3MgPSA5OwotICAgICAgICB9Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MgKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1IgOwotICAgIH0KLQotICAgIC8qIEdldCB0aGUgTmVhcmVzdCBTZWNvbmQgKi8KLSAgICBpZiAoMCAhPSBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwpCi0gICAgewotICAgICAgICBwb3NpdGlvbiA9IChNNE9TQV9VSW50MzIpKHRpbWVfZG91YmxlIC8gcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyphdm9pZCBkaXZpc2lvbiBieSAwKi8KLSAgICAgICAgcG9zaXRpb24gPSAwOwotICAgIH0KLQotICAgIC8qIFdlIGhhdmUgb25seSA0MCBzZWVrIEluZGV4LiAqLwotICAgIHBvc2l0aW9uPShwb3NpdGlvbiA+PSBNNEFNUlJfTlVNX1NFRUtfRU5UUklFUyk/TTRBTVJSX05VTV9TRUVLX0VOVFJJRVMtMTpwb3NpdGlvbjsKLQotICAgIC8qIFNlZWtJbmRleCB3aWxsIHBvaW50IHRvIG5lYXJlc3QgQXUsIHdlIG5lZWQgdG8gc2VhcmNoIGZvciB0aGUKLSAgICByZXF1aXJlZCB0aW1lIGZvcm0gdGhhdCBwb3NpdGlvbiAqLwotICAgIHBhcnRTZWVrVGltZSA9IChNNE9TQV9VSW50MzIpdGltZV9kb3VibGUgLSBwb3NpdGlvbiAqIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbDsKLQotICAgIHBvc2l0aW9uID0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleFtwb3NpdGlvbl07Ci0KLSAgICBpZighcG9zaXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfSU5WQUxJRF9USU1FIDsKLSAgICB9Ci0KLSAgICAvKiBwb2ludCB0aGUgZmlsZSBwb2ludGVyIHRvIG5lYXJlc3QgQVUgKi8KLSAgICBmaWxlUG9zID0gcG9zaXRpb247Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICZmaWxlUG9zICk7Ci0KLSAgICBpZiAoIHBhcnRTZWVrVGltZSA9PSAwKQotICAgIHsKLSAgICAgICAgKnBPYnRhaW5DVFMgPSB0aW1lOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAqcE9idGFpbkNUUyA9IChNNE9TQV9UaW1lKSh0aW1lX2RvdWJsZSAtIChNNE9TQV9Eb3VibGUpcGFydFNlZWtUaW1lKTsKLQotICAgIHN3aXRjaChzZWVrTW9kZSkKLSAgICB7Ci0gICAgICAgIC8qIEdldCB0aGUgQVUgYmVmb3JlIHRoZSB0YXJnZXQgdGltZSAqLwotICAgICAgICBjYXNlIE00U1lTX2tQcmV2aW91c1JBUDoKLSAgICAgICAgY2FzZSBNNFNZU19rTm9SQVBwcmV2aW91czoKLSAgICAgICAgICAgIHBvc2l0aW9uID0gcGFydFNlZWtUaW1lIC8gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgICAgICAgICBpZiAoICEocGFydFNlZWtUaW1lICUgTTRBTVJSX0ZSQU1FX0xFTkdUSCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uIC0tIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qIEdldCB0aGUgQ2xvc2VzdCBBVSBmb2xsb3dpbmcgdGhlIHRhcmdldCB0aW1lICovCi0gICAgICAgIGNhc2UgTTRTWVNfa05leHRSQVA6Ci0gICAgICAgIGNhc2UgTTRTWVNfa05vUkFQbmV4dDoKLSAgICAgICAgICAgIHBvc2l0aW9uID0gKHBhcnRTZWVrVGltZSArIE00QU1SUl9GUkFNRV9MRU5HVEggKS8gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAvKiAgR2V0IHRoZSBjbG9zZXN0IEFVIHRvIHRhcmdldCB0aW1lICovCi0gICAgICAgIGNhc2UgTTRTWVNfa0Nsb3Nlc3RSQVA6Ci0gICAgICAgIGNhc2UgTTRTWVNfa05vUkFQY2xvc2VzdDoKLSAgICAgICAgICAgIHByZXZBVSA9IHBhcnRTZWVrVGltZS0ocGFydFNlZWtUaW1lL000QU1SUl9GUkFNRV9MRU5HVEgpKk00QU1SUl9GUkFNRV9MRU5HVEg7Ci0gICAgICAgICAgICBuZXh0QVUgPQotICAgICAgICAgICAgICAgICAoKHBhcnRTZWVrVGltZStNNEFNUlJfRlJBTUVfTEVOR1RIKS9NNEFNUlJfRlJBTUVfTEVOR1RIKSpNNEFNUlJfRlJBTUVfTEVOR1RIIC1cCi0gICAgICAgICAgICAgICAgICAgICBwYXJ0U2Vla1RpbWUgOwotICAgICAgICAgICAgaWYocHJldkFVIDwgbmV4dEFVKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcGFydFNlZWtUaW1lIC8gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gPSAocGFydFNlZWtUaW1lICsgTTRBTVJSX0ZSQU1FX0xFTkdUSCApLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0JlZ2lubmluZzoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY291bnQgPSAwIDsKLSAgICAvKiBTa2lwIHRoZSBBY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtIHRvIHNraXAgdGhlIHBhcnQgc2VlayB0aW1lLAotICAgICAgIHRvIHJlYWNoIHRoZSByZXF1aXJlZCB0YXJnZXQgdGltZSAqLwotICAgIHdoaWxlKGNvdW50IDwgcG9zaXRpb24gKQotICAgIHsKLSAgICAgICAgc2l6ZSA9IDE7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpJmZyYW1lSGVhZGVyLCAmc2l6ZSk7Ci0gICAgICAgIGlmICggc2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB0aGUgdGFyZ2V0IHRpbWUgaXMgaW52YWxpZCwgcG9pbnQgdG8gYmVnaW5pbmcgYW5kIHJldHVybiAqLwotICAgICAgICAgICAgKnBPYnRhaW5DVFMgPSAwOwotICAgICAgICAgICAgZmlsZVBvcyA9IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXhbMF07Ci0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfSU5WQUxJRF9USU1FIDsKLSAgICAgICAgfQotICAgICAgICAqcE9idGFpbkNUUyArPSBNNEFNUlJfRlJBTUVfTEVOR1RIOyAvKlNob3VsZCB1c2UgTTRPU0FfSU5UNjRfQUREICEhKi8KLSAgICAgICAgY291bnQrKzsKLSAgICAgICAgZnJhbWVUeXBlID0gKGZyYW1lSGVhZGVyICYgMHg3OCkgPj4gMyA7Ci0gICAgICAgIGlmKGZyYW1lVHlwZSA9PSAxNSkKLSAgICAgICAgewotICAgICAgICAgICAgYXVTaXplID0gMSA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhdVNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaWxlUG9zID0gYXVTaXplLTE7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZmaWxlUG9zKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotCi0gICAgLyogQ2xvc2UgdGhlIEFNUiBzdHJlYW0gKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+Y2xvc2VSZWFkKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlKTsKLQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cz1NNEFNUlJfa0Nsb3NlZCA7Ci0KLSAgICAvKiBDaGVjayBpZiBBVSBkYXRhIEFkZHJlc3MgaXMgYWxsb2NhdGVkIG1lbW9yeSBhbmQgZnJlZSBpdCAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKQotICAgIHsKLSAgICAgICAgZnJlZShwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBzdHJlYW0gaGFuZGxlciBpcyBhbGxvY2F0ZWQgbWVtb3J5ICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcikKLSAgICB7Ci0gICAgICAgIGZyZWUocFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIpOwotICAgIH0KLQotICAgIC8qIFNlZWsgdGFibGUgaXMgY3JlYXRlZCBvbmx5IHdoZW4gc2VlayBpcyB1c2VkLCBzbyBjaGVjayBpZiBtZW1vcnkgaXMgYWxsb2NhdGVkICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KQotICAgIHsKLSAgICAgICAgZnJlZShwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KTsKLSAgICB9Ci0KLSAgICAvKiBGcmVlIHRoZSBjb250ZXh0ICovCi0gICAgZnJlZShwU3RyZWFtQ29udGV4dCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX2dldFN0YXRlKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRBTVJSX1N0YXRlKiBwU3RhdGUsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLQotICAgIGlmICgoIHN0cmVhbUlkICE9IDEgKSAmJiAoIHN0cmVhbUlkICE9IDApKQotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgICpwU3RhdGUgPSBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX2dldFZlcnNpb24gICAgKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00QU1SUl9nZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uOiAweCV4XG4iLCBwVmVyc2lvbik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCgoTTRPU0FfVUludDMyKSBwVmVyc2lvbiA9PSAwKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicFZlcnNpb24gaXMgTlVMTCBpbiBNNEFNUlJfZ2V0VmVyc2lvbiIpOwotCi0gICAgcFZlcnNpb24tPm1fbWFqb3IgPSBNNEFNUlJfVkVSU0lPTl9NQUpPUjsKLSAgICBwVmVyc2lvbi0+bV9taW5vciA9IE00QU1SUl9WRVJTSU9OX01JTk9SOwotICAgIHBWZXJzaW9uLT5tX3JldmlzaW9uID0gTTRBTVJSX1ZFUlNJT05fUkVWSVNJT047Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0bWF4QVVzaXplKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRPU0FfVUludDMyICpwTWF4QXVTaXplKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IENvbnRleHQpLCAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNEFNUlJfZ2V0bWF4QVVzaXplOiBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcE1heEF1U2l6ZSksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNEFNUlJfZ2V0bWF4QVVzaXplOiBwTWF4QXVTaXplIGlzIE00T1NBX05VTEwiKTsKLQotICAgICpwTWF4QXVTaXplID0gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRDaGFubmVsQ29udmVydGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000Q2hhbm5lbENvbnZlcnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmY2E1NTUwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRDaGFubmVsQ29udmVydGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRDaGFubmVsQ292ZXJ0ZXIuYwotICogQGJyaWVmCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLXZvaWQgTW9ub1RvMklfMTYoIGNvbnN0IHNob3J0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgbikKLXsKLSAgICBzaG9ydCBpaTsKLSAgICBzcmMgKz0gbi0xOwotICAgIGRzdCArPSAobioyKS0xOwotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pewotICAgICAgICAqZHN0LS0gPSAqc3JjOwotICAgICAgICAqZHN0LS0gPSAqc3JjLS07Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi12b2lkIEZyb20yaVRvTW9ub18xNiggY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IG4pCi17Ci0gICAgc2hvcnQgaWk7Ci0gICAgbG9uZyBUZW1wOwotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgVGVtcCA9IChsb25nKSooc3JjKyspOwotICAgICAgICBUZW1wICs9IChsb25nKSooc3JjKyspOwotICAgICAgICAqKGRzdCsrKSA9IChzaG9ydCkoVGVtcCA+PjEpOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNERFQ09ERVJfTnVsbC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNERFQ09ERVJfTnVsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTI2MGU1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRERUNPREVSX051bGwuYworKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLS8qKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBNNERFQ09ERVJfTnVsbC5jDQotICogQGJyaWVmICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIE51bGwgZGVjb2RlciBwdWJsaWMgaW50ZXJmYWNlDQotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgYSAibnVsbCIgdmlkZW8gZGVjb2RlciwgaS5lLiBhIGRlY29kZXINCi0gKiAgICAgICAgICB0aGF0IGRvZXMgbm90aGluZw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiDQotDQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiDQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiDQotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIg0KLSNpbmNsdWRlICJNNERBX1R5cGVzLmgiDQotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCINCi0jaW5jbHVkZSAiTTRERUNPREVSX051bGwuaCINCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogTlVMTCBWaWRlbyBEZWNvZGVyIHZlcnNpb24gaW5mb3JtYXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovDQotI2RlZmluZSBNNERFQ09ERVJfTlVMTF9NQUpPUiAgICAxDQotI2RlZmluZSBNNERFQ09ERVJfTlVMTF9NSU5PUiAgICAwDQotI2RlZmluZSBNNERFQ09ERVJfTlVMTF9SRVZJU0lPTiAwDQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIHN0cnVjdHVyZSAgICBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dA0KLSAqIEBicmllZiAgICAgICBEZWZpbmVzIHRoZSBpbnRlcm5hbCBjb250ZXh0IG9mIGEgdmlkZW8gZGVjb2RlciBpbnN0YW5jZQ0KLSAqIEBub3RlICAgICAgICBUaGUgY29udGV4dCBpcyBhbGxvY2F0ZWQgYW5kIGZyZWVkIGJ5IHRoZSB2aWRlbyBkZWNvZGVyDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgbV9wTGlicmFyeTsgICAgICAgICAgICAvLyBDb3JlIGxpYnJhcnkgaWRlbnRpZmllcg0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9EZWNvZGVySWQ7ICAgICAgICAgICAvLyBDb3JlIGRlY29kZXIgaWRlbnRpZmllcg0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9SZW5kZXJlcklkOyAgICAgICAgICAvLyBDb3JlIHJlbmRlcmVyIGlkZW50aWZpZXINCi0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiAgIG1fcFZpZGVvU3RyZWFtaGFuZGxlcjsgLy8gVmlkZW8gc3RyZWFtIGRlc2NyaXB0aW9uDQotICAgIE00X0FjY2Vzc1VuaXQqICAgICAgICAgICBtX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlOyAvLyBBY2Nlc3MgdW5pdCB1c2VkIHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGFuZCBkZWNvZGUgb25lIGZyYW1lDQotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BVc2VyRGF0YTsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gYW55IHVzZXIgZGF0YQ0KLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgbV9wUmVhZGVyOyAgICAgICAgICAgICAvLyBSZWFkZXIgZGF0YSBpbnRlcmZhY2UNCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIG1fYkRvUmVuZGVyaW5nOyAgICAgICAgLy8gRGVjaWRlcyBpZiByZW5kZXIgcmVxdWlyZWQNCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgc3RydWN0dXJlDQotDQotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIqIG1fcFZpZGVvRmlsdGVyOyAgICAgICAgIC8vIENvbG9yIGNvbnZlcnNpb24gZmlsdGVyDQotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICpwRGVjWXV2RGF0YTsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gWXV2IGRhdGEgcGxhbmUNCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgKnBEZWNZdXZXaXRoRWZmZWN0OyAgICAgLy8gUG9pbnRlciB0byBZdXYgcGxhbmUgd2l0aCBjb2xvciBlZmZlY3QNCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIGJZdXZXaXRoRWZmZWN0U2V0OyAgICAgLy8gT3JpZ2luYWwgWXV2IGRhdGEgT1IgWXV2IHdpdGggY29sb3IgZWZmZWN0DQotDQotfSBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dDsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIEFsbG9jYXRlcyB0aGUgY29udGV4dA0KLSAqDQotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgIChPVVQpICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pICAgIFBvaW50ZXIgdG8gYSB2aWRlbyBzdHJlYW0gZGVzY3JpcHRpb24NCi0gKiBAcGFyYW0gICBwU3JjSW50ZXJmYWNlOiAgKElOKSAgICBQb2ludGVyIHRvIHRoZSBNNFJFQURFUl9EYXRhSW50ZXJmYWNlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHRoYXQgbXVzdCBiZSB1c2VkIGJ5IHRoZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbQ0KLSAqIEBwYXJhbSAgIHBBY2Nlc3NVbml0ICAgICAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpIHdoZXJlIGRlY29kZWQgZGF0YQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBzdG9yZWQNCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkDQotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgQSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgQXQgbGVhc3Qgb25lIGlucHV0IHBhcmFtZXRlciBpcyBub3QgcHJvcGVyDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmVhZGVyRGF0YUludGVyZmFjZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQqIHBBY2Nlc3NVbml0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7DQotDQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IE00T1NBX05VTEw7DQotDQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0ID0gKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCksIE00REVDT0RFUl9NUEVHNCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCIpOw0KLSAgICBpZiAocFN0cmVhbUNvbnRleHQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOw0KLSAgICB9DQotDQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQpOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZSA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BMaWJyYXJ5ICAgICAgICAgICAgICA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIgICA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX0RlY29kZXJJZCAgICAgICAgICAgICA9IC0xOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9SZW5kZXJlcklkICAgICAgICAgICAgPSAtMTsNCi0NCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFVzZXJEYXRhID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fYkRvUmVuZGVyaW5nID0gTTRPU0FfVFJVRTsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFZpZGVvRmlsdGVyID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPmJZdXZXaXRoRWZmZWN0U2V0ID0gTTRPU0FfRkFMU0U7DQotDQotICAgICpwQ29udGV4dD1wU3RyZWFtQ29udGV4dDsNCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBEZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIEFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkDQotICoNCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7DQotDQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IChNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCopcENvbnRleHQ7DQotDQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dCksDQotICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNERFQ09ERVJfTlVMTF9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOw0KLQ0KLSAgICBmcmVlKHBTdHJlYW1Db250ZXh0KTsNCi0NCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBHZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIGRlY29kZXINCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6DQotICoNCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyDQotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0DQotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOL09VVCkgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgd2hlcmUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gaXMgc3RvcmVkDQotICoNCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpDQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgV2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQ0KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZA0KLSAqIEByZXR1cm4gIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgIEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICBwVmFsdWUpIHsNCi0NCi0gICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIFNldCBhbiBvcHRpb24gdmFsdWUgb2YgdGhlIGRlY29kZXINCi0gKiBAbm90ZSAgICBBbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToNCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIG9wdGlvbiB0byBzZXQNCi0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQNCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUNCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgb3B0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7DQotDQotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIgKnBGaWx0ZXJPcHRpb247DQotDQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0ICpwU3RyZWFtQ29udGV4dCA9DQotICAgICAgICAoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqKWNvbnRleHQ7DQotDQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOw0KLSAgICBNNE9TQV9VSW50MzIgaGVpZ2h0ID0gMDsNCi0gICAgTTRPU0FfVUludDggKnBfc3JjLCpwX2RlczsNCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBUZW1wRGVjWXV2RGF0YSA9IE00T1NBX05VTEw7DQotDQotICAgIHN3aXRjaCAob3B0aW9uSWQpIHsNCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9EZWNZdXZEYXRhOg0KLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YSA9IChNNFZJRklfSW1hZ2VQbGFuZSAqKXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91czoNCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3QgPSAoTTRWSUZJX0ltYWdlUGxhbmUgKilwVmFsdWU7DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdDoNCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+Yll1dldpdGhFZmZlY3RTZXQgPSAoTTRPU0FfQm9vbCkoaW50cHRyX3QpcFZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzOg0KLSAgICAgICAgICAgIHBUZW1wRGVjWXV2RGF0YSA9ICAoTTRWSUZJX0ltYWdlUGxhbmUgKilwVmFsdWU7DQotDQotICAgICAgICAgICAgcF9kZXMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfdG9wbGVmdDsNCi0gICAgICAgICAgICBwX3NyYyA9IHBUZW1wRGVjWXV2RGF0YVswXS5wYWNfZGF0YSArDQotICAgICAgICAgICAgICAgICBwVGVtcERlY1l1dkRhdGFbMF0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodDsNCi0gICAgICAgICAgICAgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsDQotICAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV93aWR0aCk7DQotDQotICAgICAgICAgICAgICAgIHBfZGVzICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZTsNCi0gICAgICAgICAgICAgICAgcF9zcmMgKz0gcFRlbXBEZWNZdXZEYXRhWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwX2RlcyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS5wYWNfZGF0YSArDQotICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3RvcGxlZnQ7DQotICAgICAgICAgICAgcF9zcmMgPSBwVGVtcERlY1l1dkRhdGFbMV0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwVGVtcERlY1l1dkRhdGFbMV0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodDsNCi0gICAgICAgICAgICAgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsDQotICAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV93aWR0aCk7DQotDQotICAgICAgICAgICAgICAgIHBfZGVzICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZTsNCi0gICAgICAgICAgICAgICAgcF9zcmMgKz0gcFRlbXBEZWNZdXZEYXRhWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwX2RlcyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS5wYWNfZGF0YSArDQotICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3RvcGxlZnQ7DQotICAgICAgICAgICAgcF9zcmMgPSBwVGVtcERlY1l1dkRhdGFbMl0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwVGVtcERlY1l1dkRhdGFbMl0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X2hlaWdodDsNCi0gICAgICAgICAgICAgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsDQotICAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV93aWR0aCk7DQotDQotICAgICAgICAgICAgICAgIHBfZGVzICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICAgICAgcF9zcmMgKz0gcFRlbXBEZWNZdXZEYXRhWzJdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXI6DQotICAgICAgICAgICAgcEZpbHRlck9wdGlvbiA9IChNNERFQ09ERVJfT3V0cHV0RmlsdGVyKilwVmFsdWU7DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfRGVibG9ja2luZ0ZpbHRlcjoNCi0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBlcnI7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBEZWNvZGUgdmlkZW8gQWNjZXNzIFVuaXRzIHVwIHRvIGEgdGFyZ2V0IHRpbWUNCi0gKiBAbm90ZSAgICBQYXJzZSBhbmQgZGVjb2RlIHRoZSB2aWRlbyB1bnRpbCBpdCBjYW4gb3V0cHV0IGEgZGVjb2RlZCBpbWFnZQ0KLSAqICAgICAgICAgIGZvciB3aGljaCB0aGUgY29tcG9zaXRpb24gdGltZSBpcyBlcXVhbCBvciBncmVhdGVyIHRvIHRoZQ0KLSAqICAgICAgICAgIHBhc3NlZCB0YXJnZXRlZCB0aW1lLg0KLSAqICAgICAgICAgIFRoZSBkYXRhIGFyZSByZWFkIGZyb20gdGhlIHJlYWRlciBkYXRhIGludGVyZmFjZSBwYXNzZWQgdG8NCi0gKiAgICAgICAgICBNNERFQ09ERVJfTVBFRzRfY3JlYXRlLg0KLSAqDQotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIHBUaW1lOiAgICAgIChJTi9PVVQpICAgIElOOiBUaW1lIHRvIGRlY29kZSB1cCB0byAoaW4gbXNlYykNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6VGltZSBvZiB0aGUgbGFzdCBkZWNvZGVkIGZyYW1lIChpbiBtc2VjKQ0KLSAqIEBwYXJhbSAgIGJKdW1wOiAgICAgIChJTikgICAgICAgIDAgaWYgbm8ganVtcCBvY2N1cmVkIGp1c3QgYmVmb3JlIHRoaXMgY2FsbA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgYSBhIGp1bXAgaGFzIGp1c3QgYmVlbiBtYWRlDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQNCi0gKiBAcmV0dXJuICBNNFdBUl9OT19NT1JFX0FVICAgICAgICB0aGVyZSBpcyBubyBtb3JlIGFjY2VzcyB1bml0IHRvIGRlY29kZSAoRU9TKQ0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9kZWNvZGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lKiBwVGltZSwgTTRPU0FfQm9vbCBiSnVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRvbGVyYW5jZSkgewotDQotICAgIC8vIERvIG5vdGhpbmc7IGlucHV0IHRpbWUgc3RhbXAgaXRzZWxmIHJldHVybmVkDQotICAgIHJldHVybiBNNE5PX0VSUk9SOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgUmVuZGVycyB0aGUgdmlkZW8gYXQgdGhlIHNwZWNpZmllZCB0aW1lLg0KLSAqIEBub3RlDQotICogQHBhcmFtICAgY29udGV4dDogICAgIChJTikgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIHBUaW1lOiAgICAgICAoSU4vT1VUKSAgIElOOiBUaW1lIHRvIHJlbmRlciB0byAoaW4gbXNlY3MpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIHJlbmRlcmVkIGZyYW1lIChpbiBtcykNCi0gKiBAcGFyYW0gICBwT3V0cHV0UGxhbmU6KE9VVCkgICAgICBPdXRwdXQgcGxhbmUgZmlsbGVkIHdpdGggZGVjb2RlZCBkYXRhDQotICogQHBhcmFtICAgYkZvcmNlUmVuZGVyOihJTikgICAgICAgMSBpZiB0aGUgaW1hZ2UgbXVzdCBiZSByZW5kZXJlZCBldmVuIGl0DQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gcmVuZGVyZWQgYWxyZWFkeQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgaWYgbm90DQotICoNCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldA0KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZA0KLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQ0KLSAqIEByZXR1cm4gIE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICAgIElmIHRoZSBmcmFtZSBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX3JlbmRlcihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X01lZGlhVGltZSogcFRpbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHB1dFBsYW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiRm9yY2VSZW5kZXIpIHsNCi0NCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7DQotICAgIE00T1NBX1VJbnQzMiBoZWlnaHQ7DQotICAgIE00T1NBX1VJbnQ4ICpwX3NyYywqcF9kZXM7DQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KiAgICBwU3RyZWFtQ29udGV4dCA9DQotICAgICAgICAoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqKWNvbnRleHQ7DQotDQotICAgIGlmIChwU3RyZWFtQ29udGV4dC0+Yll1dldpdGhFZmZlY3RTZXQgPT0gTTRPU0FfVFJVRSkgew0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMF0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMF0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsIHBPdXRwdXRQbGFuZVswXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMF0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMV0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMV0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMV0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsIHBPdXRwdXRQbGFuZVsxXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMV0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMl0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMl0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsIHBPdXRwdXRQbGFuZVsyXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMl0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMF0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMF0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVswXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMF0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsIHBPdXRwdXRQbGFuZVswXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMF0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMV0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMV0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMV0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsxXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMV0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsIHBPdXRwdXRQbGFuZVsxXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMV0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMl0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMl0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsyXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMl0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsKHZvaWQgKilwX3NyYyxwT3V0cHV0UGxhbmVbMl0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzJdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsyXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gZXJyOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBkZWNvZGVyDQotICogQHBhcmFtIHBEZWNvZGVyVHlwZSAgICAgICAgOiBQb2ludGVyIHRvIGEgTTRERUNPREVSX1ZpZGVvVHlwZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgZGVjb2RlciB0eXBlDQotICogQHBhcmFtIHBEZWNvZGVySW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZGVjb2Rlci4NCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5DQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuDQotICoNCi0gKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgIGlmIE9LDQotICogICAgICAgICAgICBNNEVSUl9BTExPQyBpZiBhbGxvY2F0aW9uIGZhaWxlZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9nZXRJbnRlcmZhY2UgKE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpIHsNCi0NCi0gICAgKnBEZWNvZGVySW50ZXJmYWNlID0NCi0gICAgICAgIChNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygNCi0gICAgICAgICBzaXplb2YoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKSwNCi0gICAgICAgICBNNERFQ09ERVJfTVBFRzQsIChNNE9TQV9DaGFyICopIk00REVDT0RFUl9WaWRlb0ludGVyZmFjZSIpOw0KLQ0KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcERlY29kZXJJbnRlcmZhY2UpIHsNCi0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsNCi0gICAgfQ0KLQ0KLSAgICAqcERlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVZVVY0MjBQOw0KLQ0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlICAgID0gTTRERUNPREVSX05VTExfY3JlYXRlOw0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0RGVzdHJveSAgID0gTTRERUNPREVSX05VTExfZGVzdHJveTsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbiA9IE00REVDT0RFUl9OVUxMX2dldE9wdGlvbjsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiA9IE00REVDT0RFUl9OVUxMX3NldE9wdGlvbjsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlY29kZSAgICA9IE00REVDT0RFUl9OVUxMX2RlY29kZTsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFJlbmRlciAgICA9IE00REVDT0RFUl9OVUxMX3JlbmRlcjsNCi0NCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7DQotfQ0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQQ01SX0NvcmVSZWFkZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQQ01SX0NvcmVSZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTlmMDdkZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UENNX1BDTVJlYWRlci5jCi0gKiBAYnJpZWYgICBQQ00gcmVhZGVyIGltcGxlbWVudGF0aW9uCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgb2YgdGhlIFBDTSByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0jaW5jbHVkZSAiTTRQQ01SX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFBDTSByZWFkZXIgdmVyc2lvbiBudW1iZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSNkZWZpbmUgTTRQQ01SX1ZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBNNFBDTVJfVkVSU0lPTl9NSU5PUiAwCi0jZGVmaW5lIE00UENNUl9WRVJTSU9OX1JFVklTSU9OIDAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBvcGVucyBhIFBDTSBmaWxlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gb3BlbnMgYSBQQ00gZmlsZQotICogICAgICAgICAgLSBpbml0aWFsaXplcyBQQ00gY29udGV4dCwKLSAqICAgICAgICAgIC0gdmVyaWZpZXMgUENNIGZpbGUgZm9ybWF0Ci0gKiAgICAgICAgICAtIEZpbGwgZGVjb2RlciBjb25maWcgc3RydWN0dXJlCi0gKiAgICAgICAgICAtIENoYW5nZXMgc3RhdGUgb2YgdGhlIHJlYWRlciBpbiAnT3BlbmluZycKLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAoT1VUKSBQb2ludGVyIG9uIHRoZSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBVcmw6IChJTikgTmFtZSBvZiB0aGUgUENNIGZpbGUKLSAqIEBwYXJhbSAgIHBGaWxlRnVuY3Rpb25zOiAoSU4pIFBvaW50ZXIgb24gdGhlIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucwotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvciBkdXJpbmcgdGhlIG9wZW5pbmcKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICAgcENvbnRleHQgYW5kL29yIHBVcmwgYW5kL29yIHBGaWxlRnVuY3Rpb24gaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgICAgdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kCi0gKiBAcmV0dXJuICBNNFBDTUNfRVJSX1BDTV9OT1RfQ09NUExJQU5UICAgIHRoZSBmaWxlIGRvZXMgbm90IHNlZW0gdG8gYmUgY29tcGxpYW50LCBubyBSSUZGLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBsYWNrIG9mIGFueSBtYW5kYXRvcnkgY2h1bmsuCi0gKiBAcmV0dXJuICBNNFBDTUNfRVJSX1BDTV9OT1RfU1VQUE9SVEVEICAgIHRoZSBQQ00gZm9ybWF0IG9mIHRoaXMgZmlsZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyCi0gKiBAcmV0dXJuICBBbnkgTTRPU0FfRklMRSBlcnJvcnMgICAgICAgICAgIHNlZSBPU0FMIEZpbGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlsZWQgZXJyb3JzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfb3BlblJlYWQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVGdW5jdGlvbikKLXsKLSAgICBNNE9TQV9FUlIgICAgICAgZXJyOwotICAgIE00UENNUl9Db250ZXh0ICpjb250ZXh0OwotICAgIE00T1NBX0NoYXIqICAgICAgICBwVGVtcFVSTDsKLSAgICBNNE9TQV9DaGFyICAgICAgICB2YWx1ZVs2XTsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCl8fCAoTTRPU0FfTlVMTCA9PSBwVXJsKSB8fChNNE9TQV9OVUxMID09IHBGaWxlRnVuY3Rpb24pKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBBbGxvY2F0ZXMgdGhlIGNvbnRleHQgKi8KLSAgICBjb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBjb250ZXh0ID0gKE00UENNUl9Db250ZXh0ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFBDTVJfQ29udGV4dCksIE00V0FWX1JFQURFUiwKLSAgICAgICAgIChNNE9TQV9DaGFyICopIk00UENNUl9vcGVuUmVhZCIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgICpwQ29udGV4dCA9IChNNE9TQV9Db250ZXh0KWNvbnRleHQ7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBjb250ZXh0ICovCi0gICAgY29udGV4dC0+bV9vZmZzZXQgPSAwOwotCi0gICAgY29udGV4dC0+bV9zdGF0ZSAgICAgICAgICAgID0gTTRQQ01SX2tJbml0OwotICAgIGNvbnRleHQtPm1fbWljcm9TdGF0ZSAgICAgICA9IE00UENNUl9rSW5pdDsKLSAgICBjb250ZXh0LT5tX3BGaWxlUmVhZEZ1bmMgICAgPSBNNE9TQV9OVUxMOwotICAgIGNvbnRleHQtPm1fZmlsZUNvbnRleHQgICAgICA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dC0+bV9wQXVCdWZmZXIgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBjb250ZXh0LT5tX3BEZWNvZGVyU3BlY0luZm8gPSBNNE9TQV9OVUxMOwotCi0gICAgLyogU2V0IHNhbXBsZSBmcmVxdWVuY3kgKi8KLSAgICBwVGVtcFVSTCA9IChNNE9TQV9DaGFyKilwVXJsICsgKHN0cmxlbigoY29uc3QgY2hhciAqKXBVcmwpLTExKTsKLSAgICBNNE9TQV9jaHJOQ29weSh2YWx1ZSwgcFRlbXBVUkwsIDUpOwotICAgIE00T1NBX2NockdldFVJbnQzMihwVGVtcFVSTCwgJihjb250ZXh0LT5tX2RlY29kZXJDb25maWcuU2FtcGxlRnJlcXVlbmN5KSwKLSAgICAgICAgIE00T1NBX05VTEwsIE00T1NBX2tjaHJEZWMpOwotCi0gICAgLyogU2V0IG51bWJlciBvZiBjaGFubmVscyAqLwotICAgIHBUZW1wVVJMICs9IDY7Ci0gICAgTTRPU0FfY2hyTkNvcHkodmFsdWUsIHBUZW1wVVJMLCAxKTsKLSAgICBNNE9TQV9jaHJHZXRVSW50MTYocFRlbXBVUkwsICYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMpLAotICAgICAgICAgTTRPU0FfTlVMTCwgTTRPU0Ffa2NockRlYyk7Ci0KLSAgICBNNE9TQV9jaHJOQ29weShwVXJsLHBVcmwsIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKS0xMikpOwotICAgIC8qIE9wZW4gdGhlIGZpbGUgKi8KLSAgICBjb250ZXh0LT5tX2ZpbGVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBlcnIgPSBwRmlsZUZ1bmN0aW9uLT5vcGVuUmVhZCgmKGNvbnRleHQtPm1fZmlsZUNvbnRleHQpLCBwVXJsLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLkJpdHNQZXJTYW1wbGUgPSAxNjsKLSAgICBjb250ZXh0LT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMgPSBjb250ZXh0LT5tX2RlY29kZXJDb25maWcuU2FtcGxlRnJlcXVlbmN5ICogMiBcCi0gICAgICAgICogY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHM7Ci0gICAgZXJyID0gcEZpbGVGdW5jdGlvbi0+Z2V0T3B0aW9uKGNvbnRleHQtPm1fZmlsZUNvbnRleHQsIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplLAotICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGgpKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGNvbnRleHQtPm1fYmxvY2tTaXplID0gMjA0OCAqIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzOyAgLy8gUmF3IFBDTS4gIEhlbmNlLCBnZXQgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2h1bmsgb2YgZGF0YQotCi0gICAgaWYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSA9PSA4MDAwKQotICAgIHsKLSAgICAgICAgLyogQU1SIGNhc2UsIG5vIHBiICovCi0gICAgICAgIGNvbnRleHQtPm1fYmxvY2tTaXplID0gY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMgKlwKLSAgICAgICAgICAgICAoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSAvIDUwKSAqIFwKLSAgICAgICAgICAgICAgICAoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLkJpdHNQZXJTYW1wbGUgLyA4KTsKLSAgICB9Ci0gICAgaWYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSA9PSAxNjAwMCkKLSAgICB7Ci0gICAgICAgIC8qIEFBQyBjYXNlLCB3ZSBjYW4ndCByZWFkIG9ubHkgMjAgbXMgYmxvY2tzICovCi0gICAgICAgIGNvbnRleHQtPm1fYmxvY2tTaXplID0gMjA0OCAqIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzOwotICAgIH0KLSAgICBjb250ZXh0LT5tX2RhdGFTdGFydE9mZnNldCA9IDA7Ci0gICAgY29udGV4dC0+bV9wRmlsZVJlYWRGdW5jID0gcEZpbGVGdW5jdGlvbjsKLQotICAgIGNvbnRleHQtPm1fcEF1QnVmZmVyID0gKE00T1NBX01lbUFkZHIzMilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoY29udGV4dC0+bV9ibG9ja1NpemUsIE00V0FWX1JFQURFUiwKLSAgICAgICAgIChNNE9TQV9DaGFyICopIkNvcmUgUENNIHJlYWRlciBBY2Nlc3MgVW5pdCIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IGNvbnRleHQtPm1fcEF1QnVmZmVyKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICBjb250ZXh0LT5tX3N0YXRlID0gTTRQQ01SX2tPcGVuaW5nOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLWNsZWFudXA6Ci0KLSAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLwotICAgIGlmKGNvbnRleHQtPm1fcEZpbGVSZWFkRnVuYyAhPSBNNE9TQV9OVUxMKQotICAgICAgICBjb250ZXh0LT5tX3BGaWxlUmVhZEZ1bmMtPmNsb3NlUmVhZChjb250ZXh0LT5tX2ZpbGVDb250ZXh0KTsKLQotICAgIC8qIEZyZWUgaW50ZXJuYWwgY29udGV4dCAqLwotICAgIGZyZWUoY29udGV4dCk7Ci0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlICh1bmlxdWUpIHN0cmVhbSBvZiBhIFBDTSBmaWxlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gQWxsb2NhdGVzIGFuZCBmaWxscyB0aGUgZGVjb2RlciBzcGVjaWZpYyBpbmZvIHN0cnVjdHVyZQotICogICAgICAgICAgLSBGaWxscyBkZWNvZGVyIHNwZWNpZmljIGluZm9zIHN0cnVjdHVyZQotICogICAgICAgICAgLSBGaWxscyBwU3RyZWFtRGVzYyBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgcFN0cmVhbURlc2M6IChJTikgU3RyZWFtIERlc2NyaXB0aW9uIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICBBbnkgTTRPU0FfRklMRSAgICAgIGVycm9ycyBzZWUgT1NBTCBGaWxlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbGVkIGVycm9ycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogcFN0cmVhbURlc2MpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IGNvbnRleHQpfHwgKE00T1NBX05VTEwgPT0gcFN0cmVhbURlc2MpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoYy0+bV9zdGF0ZSA9PSBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNOwotICAgIH0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBtX3N0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmcpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogT25seSBvbmUgc3RyZWFtIGlzIGNvbnRhaW5lZCBpbiBQQ00gZmlsZSAqLwotICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1JRCA9IDE7Ci0gICAgLyogTm90IHVzZWQgKi8KLSAgICBwU3RyZWFtRGVzYy0+cHJvZmlsZUxldmVsID0gMDsKLSAgICBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzaXplb2YoTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8pOwotCi0gICAgLyogQWxsb2NhdGVzIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBzdHJ1Y3R1cmUgKi8KLSAgICBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKSwgTTRXQVZfUkVBREVSLAotICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00UENNUl9nZXROZXh0U3RyZWFtIik7Ci0gICAgaWYocFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8gPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgLyogRmlsbCBkZWNvZGVyU3BlY2lmaWNJbmZvIHN0cnVjdHVyZSwgd2l0aCBkZWNvZGVyIGNvbmZpZyBzdHJ1Y3R1cmUgZmlsbGVkIGluICdvcGVucmVhZCcKLSAgICAgICAgIGZ1bmN0aW9uICovCi0gICAgbWVtY3B5KCh2b2lkICopcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAodm9pZCAqKSZjLT5tX2RlY29kZXJDb25maWcsIHNpemVvZihNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbykpOwotCi0gICAgLyogRmlsbCBvdGhlciBmaWVsZHMgb2YgcFN0cmVhbURlc2Mgc3RydWN0dXJlICovCi0gICAgcFN0cmVhbURlc2MtPnRpbWVTY2FsZSA9IDEwMDA7Ci0gICAgcFN0cmVhbURlc2MtPmR1cmF0aW9uID0gKE00T1NBX1RpbWUpKCgoTTRPU0FfRG91YmxlKShjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aClcCi0gICAgICAgICAvIChNNE9TQV9Eb3VibGUpKGMtPm1fZGVjb2RlckNvbmZpZy5BdmdCeXRlc1BlclNlYykpKnBTdHJlYW1EZXNjLT50aW1lU2NhbGUpOwotICAgIHBTdHJlYW1EZXNjLT5hdmVyYWdlQml0cmF0ZSA9IGMtPm1fZGVjb2RlckNvbmZpZy5BdmdCeXRlc1BlclNlYyAqIDg7LyogaW4gYml0cywgbXVsdGlwbHkgYnkgOCovCi0gICAgcFN0cmVhbURlc2MtPm1heEJpdHJhdGUgPSBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGU7IC8qIFBDTSBzdHJlYW0gaGFzIGNvbnN0YW50IGJpdHJhdGUgKi8KLQotICAgIC8qIERldGVybWluZXMgU3RyZWFtIHR5cGUgKi8KLSAgICBzd2l0Y2goYy0+bV9kZWNvZGVyQ29uZmlnLkJpdHNQZXJTYW1wbGUpCi0gICAgewotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICBzd2l0Y2goYy0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tQQ01fOGJpdHNVOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgICAgICAgIGNhc2UgMjoKLS8vICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tQQ01fOGJpdHNTOyAvKiA/Pz8gOGJpdHMgc3RlcmVvIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBkZWZpbmVkID8gKi8KLS8vICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgc3dpdGNoKGMtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rUENNXzE2Yml0c1U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rUENNXzE2Yml0c1M7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgfQotCi0gICAgYy0+bV9wRGVjb2RlclNwZWNJbmZvID0gcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm87Ci0KLSAgICBjLT5tX3N0YXRlID0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyByZWFkaW5nIHRoZSB1bmlxdWUgc3RyZWFtIG9mIGEgUENNIGZpbGUKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byBzdGFydCByZWFkaW5nIGEgc3RyZWFtCi0gKiAgICAgICAgICAtIENoZWNrIHRoYXQgcHJvdmlkZWQgU3RyZWFtSWQgaXMgY29ycmVjdCAoYWx3YXlzIHRydWUsIG9ubHkgb25lIHN0cmVhbS4uLikKLSAqICAgICAgICAgICAgSW4gdGhlIHBsYXllciBhcHBsaWNhdGlvbiwgYSBTdHJlYW1JZCB0YWJsZSBpcyBpbml0aWFsaXplZCBhcyBmb2xsb3c6Ci0gKiAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgcFN0cmVhbUlEWzJdPXsxLDB9OwotICogICAgICAgICAgLSBDaGFuZ2Ugc3RhdGUgb2YgdGhlIHJlYWRlciBpbiAnUmVhZGluZycKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgc3RyZWFtSUQ6IChJTikgU3RyZWFtIHNlbGVjdGlvbgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgTTRFUlJfQkFEX1NUUkVBTV9JRCBhdCBsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKiAgICAgICAgICAoc2hvdWxkIG5ldmVyIGhhcHBlbiBpZiB0YWJsZSBwU3RyZWFtSUQgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkIGFzIGFib3ZlKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBjb250ZXh0KSB8fCAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtSURzKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgUmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcFN0cmVhbUlEIGFuZCBpZiB0aGV5J3JlIE9LLCBjaGFuZ2UgcmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihwU3RyZWFtSURzWzBdID09IDEgfHwgcFN0cmVhbUlEc1swXSA9PSAwKQotICAgIC8qIEZpcnN0IGFuZCB1bmlxdWUgc3RyZWFtIGNvbnRhaW5lZCBpbiBQQ00gZmlsZSAqLwotICAgIHsKLSAgICAgICAgYy0+bV9zdGF0ZSA9IE00UENNUl9rUmVhZGluZzsKLSAgICAgICAgYy0+bV9taWNyb1N0YXRlID0gTTRQQ01SX2tSZWFkaW5nOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX25leHRBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBuZXh0IEFVIGNvbnRhaW5lZCBpbiB0aGUgUENNIGZpbGUKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byByZWFkIGFuIEFVCi0gKiAgICAgICAgICAtIEFsbG9jYXRlcyBtZW1vcnkgdG8gc3RvcmUgcmVhZCBBVQotICogICAgICAgICAgLSBSZWFkIGRhdGEgZnJvbSBmaWxlIGFuZCBzdG9yZSB0aGVtIGludG8gcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5Ci0gKiAgICAgICAgICAtIEZpbGwgQVUgc3RydWN0dXJlIGZpbGVkcyAoQ1RTLi4uKQotICogICAgICAgICAgLSBDaGFuZ2Ugc3RhdGUgb2YgdGhlIHJlYWRlciBpbiAnUmVhZGluZycgKG5vdCB1c2VmdWwuLi4pCi0gKiAgICAgICAgICAtIENoYW5nZSBNaWNybyBzdGF0ZSAnUmVhZGluZycgaW4gTTRQQ01SX2tSZWFkaW5nX25leHRBVQotICogICAgICAgICAgICAoQVUgaXMgcmVhZCBhbmQgY2FuIGJlIGRlbGV0ZWQpCi0gKiAgICAgICAgICAtIENoZWNrIGlmIHRoZSBsYXN0IEFVIGhhcyBiZWVuIHJlYWQgb3IgaWYgd2UncmUgYWJvdXQgdG8gcmVhZCBpdAotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBzdHJlYW1JRDogKElOKSBTdHJlYW0gc2VsZWN0aW9uCi0gKiBAcGFyYW0gICBwQVU6IChJTi9PVVQpIEFjY2VzIFVuaXQgU3RydWN0dXJlCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgTTRNNFdBUl9OT19EQVRBX1lFVCB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSBpbiB0aGUgZmlsZSB0byBwcm92aWRlIGEgbmV3IGFjY2VzcyB1bml0LgotICogQHJldHVybiAgTTRXQVJfRU5EX09GX1NUUkVBTSBUaGVyZSBpcyBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRoZSBzYW1wbGUgbnVtYmVyIGlzIGJpZ2dlciB0aGUgbWF4aW11bSBvbmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfbmV4dEFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIHNpemVfcmVhZDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBjb250ZXh0KSB8fCAoTTRPU0FfTlVMTCA9PSBwQVUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nICYmIGMtPm1fbWljcm9TdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGVzIEFVIGRhdGFBZHJlc3MgKi8KLSAgICBwQVUtPmRhdGFBZGRyZXNzID0gYy0+bV9wQXVCdWZmZXI7Ci0gICAgc2l6ZV9yZWFkICAgICAgICA9IGMtPm1fYmxvY2tTaXplOwotCi0gICAgaWYoKGMtPm1fb2Zmc2V0ICsgc2l6ZV9yZWFkKSA+PSBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCkKLSAgICB7Ci0gICAgICAgIHNpemVfcmVhZCA9IGMtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoIC0gYy0+bV9vZmZzZXQ7Ci0gICAgfQotCi0gICAgLyogUmVhZCBkYXRhIGluIGZpbGUsIGFuZCBjb3B5IGl0IHRvIEFVIFN0cnVjdHVyZSAqLwotICAgIGVyciA9IGMtPm1fcEZpbGVSZWFkRnVuYy0+cmVhZERhdGEoYy0+bV9maWxlQ29udGV4dCwgKE00T1NBX01lbUFkZHI4KXBBVS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAoTTRPU0FfVUludDMyICopJnNpemVfcmVhZCk7Ci0gICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIENhbGN1bGF0ZXMgdGhlIG5ldyBtX29mZnNldCwgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSdyZSBhdCBlbmQgb2YgcmVhZGluZyBvciBub3QgKi8KLSAgICBjLT5tX29mZnNldCA9IGMtPm1fb2Zmc2V0ICsgc2l6ZV9yZWFkOwotCi0gICAgLyogRmlsbCBvdGhlcnMgcGFyYW1ldGVycyBvZiBBVSBzdHJ1Y3R1cmUgKi8KLSAgICBwQVUtPkNUUyA9Ci0gICAgICAgICAoTTRPU0FfVGltZSkoKChNNE9TQV9Eb3VibGUpYy0+bV9vZmZzZXQvKE00T1NBX0RvdWJsZSljLT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMpXAotICAgICAgICAgICAgKjEwMDApOwotICAgIHBBVS0+RFRTID0gcEFVLT5DVFM7Ci0KLSAgICBwQVUtPmF0dHJpYnV0ZSAgPSAwOwotICAgIHBBVS0+ZnJhZyAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgcEFVLT5uYkZyYWcgICAgID0gMDsKLSAgICBwQVUtPnN0cmVhbSAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBBVS0+c2l6ZSAgICAgICA9IHNpemVfcmVhZDsKLQotICAgIC8qIENoYW5nZSBzdGF0ZXMgKi8KLSAgICBjLT5tX3N0YXRlID0gTTRQQ01SX2tSZWFkaW5nOyAvKiBOb3QgY2hhbmdlZCAuLi4gKi8KLSAgICBjLT5tX21pY3JvU3RhdGUgPSBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVOyAvKiBBVSBpcyByZWFkIGFuZCBjYW4gYmUgZGVsZXRlZCAqLwotCi0gICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciBBVSB0byByZWFkICovCi0gICAgLyogaWU6IGlmIGRlY29kZWQgbmIgb2YgYnl0ZXMgPSBuYiBvZiBieXRlcyB0byBkZWNvZGUsCi0gICAgICAgICBpdCBtZWFucyB0aGVyZSBpcyBubyBtb3JlIEFVIHRvIGRlY29kZSAqLwotICAgIGlmKGMtPm1fb2Zmc2V0ID49IGMtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9mcmVlQVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgQVUgcHJvdmlkZWQgaW4gcGFyYW1ldGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gZnJlZSBhbiBBVQotICogICAgICAgICAgLSBGcmVlIGRhdGFBZGRyZXNzIGZpZWxkIG9mIEFVIHN0cnVjdHVyZQotICogICAgICAgICAgLSBDaGFuZ2Ugc3RhdGUgb2YgdGhlIHJlYWRlciBpbiAnUmVhZGluZycgKG5vdCB1c2VmdWwuLi4pCi0gKiAgICAgICAgICAtIENoYW5nZSBNaWNybyBzdGF0ZSAnUmVhZGluZycgaW4gTTRQQ01SX2tSZWFkaW5nIChhbm90aGVyIEFVIGNhbiBiZSByZWFkKQotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBzdHJlYW1JRDogKElOKSBTdHJlYW0gc2VsZWN0aW9uCi0gKiBAcGFyYW0gICBwQVU6IChJTikgQWNjZXMgVW5pdCBTdHJ1Y3R1cmUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfZnJlZUFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCApIHx8IChNNE9TQV9OVUxMID09IHBBVSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIFJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcgJiYgYy0+bV9taWNyb1N0YXRlICE9IE00UENNUl9rUmVhZGluZ19uZXh0QVUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgcEFVLT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBDaGFuZ2Ugc3RhdGVzICovCi0gICAgYy0+bV9zdGF0ZSA9IE00UENNUl9rUmVhZGluZzsgLyogTm90IGNoYW5nZWQgLi4uICovCi0gICAgYy0+bV9taWNyb1N0YXRlID0gTTRQQ01SX2tSZWFkaW5nOyAvKiBBVSBpcyBkZWxldGVkLCBhbm90aGVyIEFVIGNhbiBiZSByZWFkICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX3NlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgdGltZSwgTTRTWVNfc2Vla0FjY2Vzc01vZGUgc2Vla0FjY2Vzc01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSogcE9idGFpbkNUU1tdKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBpbnRvIHRoZSBQQ00gZmlsZSBhdCB0aGUgcHJvdmlkZWQgdGltZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIHNlZWsKLSAqICAgICAgICAgIC0gRGV0ZXJtaW5lcyBmcm9tIHByb3ZpZGVkIHRpbWUgbV9vZmZzZXQgdG8gc2VlayBpbiBmaWxlCi0gKiAgICAgICAgICAtIElmIG1fb2Zmc2V0IGlzIGNvcnJlY3QsIHNlZWsgaW4gZmlsZQotICogICAgICAgICAgLSBVcGRhdGUgbmV3IG1fb2Zmc2V0IGluIFBDTSByZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBwU3RyZWFtSUQ6IChJTikgU3RyZWFtIHNlbGVjdGlvbiAobm90IHVzZWQsIG9ubHkgMSBzdHJlYW0pCi0gKiBAcGFyYW0gICB0aW1lOiAoSU4pIFRhcmdldGVkIHRpbWUKLSAqIEBwYXJhbSAgIHNlZWtNb2RlOiAoSU4pIFNlbGVjdHMgdGhlIHNlZWsgYWNjZXNzIG1vZGUKLSAqIEBwYXJhbSAgIHBPYnRhaW5DVFNbXTogKE9VVCkgUmV0dXJuZWQgVGltZSAobm90IHVzZWQpCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gIE00V0FSX0lOVkFMSURfVElNRSAgICAgIFNwZWNpZmllZCB0aW1lIGlzIG5vdCByZWFjaGFibGUKLSAqIEBwYXJhbSAgIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgIFRoaXMgc2VlayBtb2RlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9zZWVrKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwgTTRPU0FfVGltZSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1NlZWtBY2Nlc3NNb2RlIHNlZWtBY2Nlc3NNb2RlLCBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgb2Zmc2V0OwotICAgIE00T1NBX1VJbnQzMiBhbGlnbm1lbnQ7Ci0gICAgTTRPU0FfVUludDMyIHNpemVfcmVhZDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBjb250ZXh0KSB8fCAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZCAmJiBjLT5tX3N0YXRlICE9IE00UENNUl9rUmVhZGluZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBzd2l0Y2goc2Vla0FjY2Vzc01vZGUpCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tCZWdpbm5pbmc6Ci0gICAgICAgICAgICAvKiBEZXRlcm1pbmUgbV9vZmZzZXQgZnJvbSB0aW1lKi8KLSAgICAgICAgICAgIG9mZnNldCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikodGltZSAqICgoTTRPU0FfRG91YmxlKShjLT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMpIC8gMTAwMCkpOwotICAgICAgICAgICAgLyoqIGNoZWNrIHRoZSBhbGlnbm1lbnQgb24gc2FtcGxlIGJvdW5kYXJ5ICovCi0gICAgICAgICAgICBhbGlnbm1lbnQgPSBjLT5tX2RlY29kZXJDb25maWcubmJDaGFubmVscypjLT5tX2RlY29kZXJDb25maWcuQml0c1BlclNhbXBsZS84OwotICAgICAgICAgICAgaWYgKG9mZnNldCVhbGlnbm1lbnQgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgLT0gb2Zmc2V0JWFsaWdubWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qYWRkIHRoZSBoZWFkZXIgb2Zmc2V0Ki8KLSAgICAgICAgICAgIG9mZnNldCArPSBjLT5tX2RhdGFTdGFydE9mZnNldDsKLSAgICAgICAgICAgIC8qIElmIG1fb2Zmc2V0IGlzIG92ZXIgZmlsZSBzaXplIC0+IEludmFsaWQgdGltZSAqLwotICAgICAgICAgICAgaWYgKG9mZnNldCA+IChjLT5tX2RhdGFTdGFydE9mZnNldCArIGMtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfSU5WQUxJRF9USU1FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFNlZWsgZmlsZSAqLwotICAgICAgICAgICAgICAgIHNpemVfcmVhZCA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICBlcnIgPSBjLT5tX3BGaWxlUmVhZEZ1bmMtPnNlZWsoYy0+bV9maWxlQ29udGV4dCwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZVBvc2l0aW9uICopICZzaXplX3JlYWQpOwotICAgICAgICAgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIG1fb2Zmc2V0IGluIE00UENNUl9jb250ZXh0ICovCi0gICAgICAgICAgICAgICAgYy0+bV9vZmZzZXQgPSBvZmZzZXQgLSBjLT5tX2RhdGFTdGFydE9mZnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgY29udGV4dCkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIFBDTSBmaWxlLCBhbmQgZnJlZXMgY29udGV4dAotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIGNsb3NlIHRoZSBQQ00gZmlsZQotICogICAgICAgICAgLSBDbG9zZXMgdGhlIGZpbGUKLSAqICAgICAgICAgIC0gRnJlZSBzdHJ1Y3R1cmVzCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZihNNE9TQV9OVUxMID09IGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKGMtPm1fcERlY29kZXJTcGVjSW5mbyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZShjLT5tX3BEZWNvZGVyU3BlY0luZm8pOwotICAgIH0KLQotICAgIC8qIENoZWNrIFJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotICAgIGVsc2UgaWYoYy0+bV9taWNyb1N0YXRlID09IE00UENNUl9rUmVhZGluZ19uZXh0QVUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gYy0+bV9wQXVCdWZmZXIpCi0gICAgewotICAgICAgICBmcmVlKGMtPm1fcEF1QnVmZmVyKTsKLSAgICB9Ci0KLSAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IGMtPm1fcEZpbGVSZWFkRnVuYykKLSAgICB7Ci0gICAgICAgIGVyciA9IGMtPm1fcEZpbGVSZWFkRnVuYy0+Y2xvc2VSZWFkKGMtPm1fZmlsZUNvbnRleHQpOwotICAgIH0KLQotICAgIC8qIEZyZWUgaW50ZXJuYWwgY29udGV4dCAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IGMpCi0gICAgewotICAgICAgICBmcmVlKGMpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcFZhbHVlKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBnZXQgb3B0aW9uIG9mIHRoZSBQQ00gUmVhZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gZ2V0IGFuIG9wdGlvbgotICogICAgICAgICAgLSBSZXR1cm4gY29ycmVzcG9uZGluZyBvcHRpb24gdmFsdWUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgIHBWYWx1ZTogKE9VVCkgVmFyaWFibGUgd2hlcmUgdGhlIG9wdGlvbiB2YWx1ZSBpcyByZXR1cm5lZAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwuCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lLgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgdGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSBub3cuCi0gKiBAcmV0dXJuICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgICB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBWYWx1ZSkKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9KE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZihNNE9TQV9OVUxMID09IGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIHJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nKSAmJiAoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkKVwKLSAgICAgICAgICYmIChjLT5tX3N0YXRlICE9IE00UENNUl9rUmVhZGluZykpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRGVwZW5kIG9mIHRoZSBPcHRpb25JRCwgdGhlIHZhbHVlIHRvIHJldHVybiBpcyBkaWZmZXJlbnQgKi8KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotICAgICAgICBjYXNlIE00UENNUl9rUENNYmxvY2tTaXplOgotICAgICAgICAgICAgKnBWYWx1ZSA9ICZjLT5tX2Jsb2NrU2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UENNUl9PcHRpb25JRCBvcHRpb25JRCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBWYWx1ZSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gc2V0IG9wdGlvbiBvZiB0aGUgUENNIFJlYWRlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIHNldCBhbiBvcHRpb24KLSAqICAgICAgICAgIC0gU2V0IGNvcnJlc3BvbmRpbmcgb3B0aW9uIHZhbHVlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICBWYWx1ZTogKElOKSBWYXJpYWJsZSB3aGVyZSB0aGUgb3B0aW9uIHZhbHVlIGlzIHN0b3JlZAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwuCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lLgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgdGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSBub3cuCi0gKiBAcmV0dXJuICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgICB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gVmFsdWUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPShNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoY29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayByZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKChjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZykgJiYgKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZClcCi0gICAgICAgICAmJiAoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIERlcGVuZCBvZiB0aGUgT3B0aW9uSUQsIHRoZSB2YWx1ZSB0byBzZXQgaXMgZGlmZmVyZW50ICovCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFBDTVJfa1BDTWJsb2NrU2l6ZToKLSAgICAgICAgICAgIGMtPm1fYmxvY2tTaXplID0gKE00T1NBX1VJbnQzMikodWludHB0cl90KVZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UENNUl9nZXRWZXJzaW9uIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1RSQUNFMV8xKCJNNFBDTVJfZ2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbjogMHgleCIsIHBWZXJzaW9uKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKChNNE9TQV9VSW50MzIpIHBWZXJzaW9uID09IDApLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJwVmVyc2lvbiBpcyBOVUxMIGluIE00UENNUl9nZXRWZXJzaW9uIik7Ci0KLSAgICBwVmVyc2lvbi0+bV9tYWpvciA9IE00UENNUl9WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uLT5tX21pbm9yID0gTTRQQ01SX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb24tPm1fcmV2aXNpb24gPSBNNFBDTVJfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfQVBJLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9BUEkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQyZmZiNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9BUEkuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UFRPM0dQUF9BUEkuYwotICogQGJyaWVmICAgUGljdHVyZSB0byAzZ3BwIFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoxNiBieXRlcyBzaWduYXR1cmUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgZ2VuZXJhdGVkIDNncCBmaWxlcyAqLwotI2RlZmluZSBNNFBUTzNHUFBfU0lHTkFUVVJFICAgICAiTlhQLVNXIDogUFRPM0dQUCIKLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0vKioKLSAqICBPdXIgaGVhZGVyICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFBUTzNHUFBfQVBJLmgiCi0KLS8qKgotICogIE91ciBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNFBUTzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLSNlbmRpZgotCi0KLS8qKgotICogIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAgICAgICAvKiBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgIC8qIE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqIFZhcmlvdXMgTWFnaWNhbHMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIE00UFRPM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTTRQVE8zR1BQX1FVQU5USVpFUl9TVEVQICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAvKio8IFF1YW50aXplciBzdGVwICovCi0jZGVmaW5lIE00UFRPM0dQUF9XUklURVJfQVVESU9fUFJPRklMRV9MRVZFTCAgICAgICAgICAgIDB4RkYgICAgLyoqPCBObyBzcGVjaWZpYyBwcm9maWxlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19BTVJfVElNRV9TQ0FMRSAgICAgICAgICAgODAwMCAgICAvKio8IEFNUiAqLwotI2RlZmluZSBNNFBUTzNHUFBfQklUUkFURV9SRUdVTEFUSU9OX0NUU19QRVJJT0RfSU5fTVMgICA1MDAgICAgIC8qKjwgTUFHSUNBTCAqLwotI2RlZmluZSBNNFBUTzNHUFBfTUFSR0VfT0ZfRklMRV9TSVpFICAgICAgICAgICAgICAgICAgICAyNTAwMCAgIC8qKjwgTUFHSUNBTCAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkZWZpbmUgICBBTVIgMTIuMiBrYnBzIHNpbGVuY2UgZnJhbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfU0laRSAgICAgMzIKLSNkZWZpbmUgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9EVVJBVElPTiAyMAotY29uc3QgTTRPU0FfVUludDggTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFXzEyMl9GUkFNRVtNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX1NJWkVdPQoteyAweDNDLCAweDkxLCAweDE3LCAweDE2LCAweEJFLCAweDY2LCAweDc4LCAweDAwLCAweDAwLCAweDAxLCAweEU3LCAweEFGLAotICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07Ci0KLSNkZWZpbmUgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFICAgICAxMwotI2RlZmluZSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OIDIwCi1jb25zdCBNNE9TQV9VSW50OCBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfMDQ4X0ZSQU1FW000UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV0gPQoteyAweDA0LCAweEZGLCAweDE4LCAweEM3LCAweEYwLCAweDBELCAweDA0LCAweDMzLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwIH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqICJQcml2YXRlIiBmdW5jdGlvbnMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCogcEMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiogIkV4dGVybmFsIiBmdW5jdGlvbnMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBwVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci1leHRlcm4gTTRPU0FfRVJSIE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLWV4dGVybiBNNE9TQV9FUlIgTTRSRUFERVJfM0dQX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiogIlN0YXRpYyIgZnVuY3Rpb25zICoqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQqIHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lIG10SW5jQ3RzKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTA0OEZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lIG10SW5jQ3RzKTsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotICogQGJyaWVmICAgR2V0IHRoZSBNNFBUTzNHUFAgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICBwVmVyc2lvbkluZm8gICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0dldFZlcnNpb24gY2FsbGVkIHdpdGggcFZlcnNpb25JbmZvPTB4JXgiLCBwVmVyc2lvbkluZm8pOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBWZXJzaW9uSW5mbyksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIk00UFRPM0dQUF9HZXRWZXJzaW9uOiBwVmVyc2lvbkluZm8gaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgcFZlcnNpb25JbmZvLT5tX21ham9yICAgICAgID0gTTRQVE8zR1BQX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yICAgICAgID0gTTRQVE8zR1BQX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uICAgID0gTTRQVE8zR1BQX1ZFUlNJT05fUkVWSVNJT047Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0luaXQoTTRQVE8zR1BQX0NvbnRleHQqIHBDb250ZXh0KTsKLSAqIEBicmllZiAgIEluaXRpYWxpemVzIHRoZSBNNFBUTzNHUFAgKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBNNFBUTzNHUFAgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgcEZpbGVSZWFkUHRyRmN0ICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdCggICBNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9Jbml0IGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFBUTzNHUFBfSW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogIEFsbG9jYXRlIHRoZSBNNFBUTzNHUFAgY29udGV4dCBhbmQgcmV0dXJuIGl0IHRvIHRoZSB1c2VyICovCi0gICAgcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KSwgTTRQVE8zR1BQLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0Iik7Ci0gICAgKnBDb250ZXh0ID0gcEM7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1N0ZXAoKTogdW5hYmxlIHRvIGFsbG9jYXRlIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQsXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbml0IHRoZSBjb250ZXh0LiBBbGwgcG9pbnRlcnMgbXVzdCBiZSBpbml0aWFsaXplZCB0byBNNE9TQV9OVUxMIGJlY2F1c2UgQ2xlYW5VcCgpCi0gICAgICAgIGNhbiBiZSBjYWxsZWQganVzdCBhZnRlciBJbml0KCkuICovCi0gICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX0NSRUFURUQ7Ci0gICAgcEMtPm1fVmlkZW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPm1fQXVkaW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0KLSAgICAvKioKLSAgICAgKiAgUmVhZGVyIHN0dWZmICovCi0gICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0gICAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogIFdyaXRlciBzdHVmZiAqLwotICAgIHBDLT5tX3BFbmNvZGVySGVhZGVyICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0gICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm89IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbz0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICAqICBDb250ZXh0cyBvZiB0aGUgdXNlZCBtb2R1bGVzICAqLwotICAgIHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0ICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcE1wNEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tOb0VuY29kZXI7Ci0KLSAgICAvKioKLSAgICAgKiAgSW50ZXJmYWNlcyBvZiB0aGUgdXNlZCBtb2R1bGVzICovCi0gICAgcEMtPm1fcFJlYWRlckdsb2JJbnQgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSW50ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyR2xvYkludCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlckRhdGFJbnQgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BFbmNvZGVySW50ICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wRW5jb2RlckV4dGVybmFsQVBJID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wRW5jb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICAqIEZpbGwgdGhlIE9TQUwgZmlsZSBmdW5jdGlvbiBzZXQgKi8KLSAgICBwQy0+cE9zYWxGaWxlUmVhZCA9IHBGaWxlUmVhZFB0ckZjdDsKLSAgICBwQy0+cE9zYWxGaWxlV3JpdGUgPSBwRmlsZVdyaXRlUHRyRmN0OwotCi0gICAgLyoqCi0gICAgICogIFZpZGVvIHJhdGUgY29udHJvbCBzdHVmZiAqLwotICAgIHBDLT5tX210Q3RzICAgICAgICAgICAgID0gMC4wRjsKLSAgICBwQy0+bV9tdE5leHRDdHMgICAgICAgICA9IDAuMEY7Ci0gICAgcEMtPm1fbXRBdWRpb0N0cyAgICAgICAgPSAwLjBGOwotICAgIHBDLT5tX0F1ZGlvT2ZmU2V0ICAgICAgID0gMC4wRjsKLSAgICBwQy0+bV9kTGFzdFZpZGVvUmVndWxDdHM9IDAuMEY7Ci0gICAgcEMtPm1fUHJldkF1ZGlvQ3RzICAgICAgPSAwLjBGOwotICAgIHBDLT5tX0RlbHRhQXVkaW9DdHMgICAgID0gMC4wRjsKLQotICAgIHBDLT5tX01heEZpbGVTaXplICAgICAgID0gMDsKLSAgICBwQy0+bV9DdXJyZW50RmlsZVNpemUgICA9IDA7Ci0KLSAgICBwQy0+bV9Jc0xhc3RQaWN0dXJlICAgICAgICAgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iQXVkaW9QYWRkaW5nU2lsZW5jZSAgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iTGFzdEludGVybmFsQ2FsbEJhY2sgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9OYkN1cnJlbnRGcmFtZSAgICAgICAgPSAwOwotCi0gICAgcEMtPnBTYXZlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+dWlTYXZlZER1cmF0aW9uID0gMDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfSW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfT3BlbihNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCwgTTRQVE8zR1BQX1BhcmFtcyogcFBhcmFtcyk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE00UFRPM0dQUCBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBjcmVhdGVkIHlldC4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHBhcmFtICAgcFBhcmFtcyAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBQVE8zR1BQLgotICogQG5vdGUgICAgVGhlIHBvaW50ZWQgc3RydWN0dXJlIGNhbiBiZSBkZS1hbGxvY2F0ZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGJlY2F1c2UKLSAqICAgICAgICAgIGl0IGlzIGludGVybmFsbHkgY29waWVkIGJ5IHRoZSBQVE8zR1BQCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgVGhlIG91dHB1dCB2aWRlbyBmcmFtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFICAgICAgVGhlIG91dHB1dCB2aWRlbyBiaXQtcmF0ZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFICAgVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0ZJTEVfU0laRSAgICAgICAgICBUaGUgb3V0cHV0IGZpbGUgc2l6ZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX0FVRElPX1BBRERJTkcgICAgICAgICAgICAgVGhlIG91dHB1dCBhdWRpbyBwYWRkaW5nIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkhBTkRMRURfQVVESU9fVFJBQ0tfSU5QVVRfRklMRSAgICBUaGUgaW5wdXQgYXVkaW8gZmlsZSBjb250YWlucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSB0cmFjayBmb3JtYXQgbm90IGhhbmRsZWQgYnkgUFRPM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX09wZW4oTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQsIE00UFRPM0dQUF9QYXJhbXMqIHBQYXJhbXMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgICAqcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00UkVBREVSX01lZGlhRmFtaWx5ICAgIG1lZGlhRmFtaWx5OwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgIHBTdHJlYW1IYW5kbGVyOwotICAgIE00UkVBREVSX01lZGlhVHlwZSAgICAgIHJlYWRlck1lZGlhVHlwZTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNFBUTzNHUFBfT3BlbiBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwUGFyYW1zPTB4JXgiLCBwQ29udGV4dCwgcFBhcmFtcyk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwgXAotICAgICAgICAgICAgICAgICAgICAiTTRQVE8zR1BQX09wZW46IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcyksICBNNEVSUl9QQVJBTUVURVIsIFwKLSAgICAgICAgICAgICAgICAgICAgIk00UFRPM0dQUF9PcGVuOiBwUGFyYW1zIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBwYXJhbWV0ZXJzIGNvcnJlY3RuZXNzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMtPnBQaWN0dXJlQ2FsbGJhY2tGY3QpLAotICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrRmN0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcy0+cFBpY3R1cmVDYWxsYmFja0N0eHQpLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgIk00UFRPM0dQUF9PcGVuOiBwQy0+bV9QYXJhbXMucFBpY3R1cmVDYWxsYmFja0N0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zLT5wT3V0cHV0M2dwcEZpbGUpLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00UFRPM0dQUF9PcGVuOiBwQy0+bV9QYXJhbXMucE91dHB1dDNncHBGaWxlIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcy0+cFRlbXBvcmFyeUZpbGUpLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00UFRPM0dQUF9PcGVuOiBwQy0+bV9QYXJhbXMucFRlbXBvcmFyeUZpbGUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gRm9ybWF0ICovCi0gICAgaWYoIChNNFZJREVPRURJVElOR19rSDI2MyAhPSBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCkgJiYKLSAgICAgICAgKE00VklERU9FRElUSU5HX2tNUEVHNCAhPSBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCkgJiYKLSAgICAgICAgKE00VklERU9FRElUSU5HX2tIMjY0ICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW46IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZm9ybWF0Iik7Ci0gICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgfQotCi0gICAgIC8qKgotICAgICAqIFZpZGVvIEJpdHJhdGUgKi8KLSAgICBpZighKChNNFZJREVPRURJVElOR19rMTZfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazI0X0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2szMl9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rNDhfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazY0X0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s5Nl9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMTI4X0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2syNTZfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMjg4X0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazM4NF9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s1MTJfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rODAwX0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAvKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMl9NQlBTICAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazVfTUJQUyAgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s4X01CUFMgICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rVkFSSUFCTEVfS0JQUyA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpKSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW46IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gYml0cmF0ZSIpOwotICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGZyYW1lIHNpemUgKi8KLSAgICBpZiAoISgoTTRWSURFT0VESVRJTkdfa1NRQ0lGID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rUVFWR0EgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tRQ0lGID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rUVZHQSA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa0NJRiAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tWR0EgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotCi0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tOVFNDID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rV1ZHQSA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLQotICAgICAgICAgIChNNFZJREVPRURJVElOR19rNjQwXzM2MCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazg1NF80ODAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2sxMjgwXzcyMCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazEwODBfNzIwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rOTYwXzcyMCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIik7Ci0gICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWF4aW11bSBzaXplIG9mIHRoZSBvdXRwdXQgM0dQUCBmaWxlICovCi0gICAgaWYgKCEoKE00UFRPM0dQUF9rNTBfS0IgICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazc1X0tCICAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2sxMDBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rMTUwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazIwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2szMDBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rNDAwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazUwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2tVTkxJTUlURUQgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpKSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW46IFVuZGVmaW5lZCBvdXRwdXQgM0dQUCBmaWxlIHNpemUiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfRklMRV9TSVpFOwotICAgIH0KLQotICAgIC8qIEF1ZGlvIHBhZGRpbmcgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwUGFyYW1zLT5wSW5wdXRBdWRpb1RyYWNrRmlsZSkgewotICAgICAgICBpZiAoKCEoIChNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTm9uZSAgID09IHBQYXJhbXMtPkF1ZGlvUGFkZGluZ01vZGUpIHx8Ci0gICAgICAgICAgICAgICAgKE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9TaWxlbmNlPT0gcFBhcmFtcy0+QXVkaW9QYWRkaW5nTW9kZSkgfHwKLSAgICAgICAgICAgICAgICAoTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX0xvb3AgICA9PSBwUGFyYW1zLT5BdWRpb1BhZGRpbmdNb2RlKSkpKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW46IFVuZGVmaW5lZCBhdWRpbyBwYWRkaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX0FVRElPX1BBRERJTkc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFNpemUgY2hlY2sgZm9yIEgyNjMgKG9ubHkgdmFsaWQgc2l6ZXMgYXJlIENJRiwgUUNJRiBhbmQgU1FDSUYpICovCi0gICAgaWYgKChNNFZJREVPRURJVElOR19rSDI2MyA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCkgJiYKLSAgICAgICAgKE00VklERU9FRElUSU5HX2tTUUNJRiAhPSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgJiYKLSAgICAgICAgKE00VklERU9FRElUSU5HX2tRQ0lGICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa0NJRiAhPSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuKCk6XAotICAgICAgICAgICAgIHJldHVybmluZyBFUlJfUFRPM0dQUF9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RhdGVfQ1JFQVRFRCAhPSBwQy0+bV9TdGF0ZSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwgcEMtPm1fU3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSB0aGUgTTRQVE8zR1BQX1BhcmFtcyBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKikoJnBDLT5tX1BhcmFtcyksCi0gICAgICAgICAgICAgICAgKHZvaWQgKilwUGFyYW1zLCBzaXplb2YoTTRQVE8zR1BQX1BhcmFtcykpOwotICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3Blbjogb3V0cHV0VmlkZW9CaXRyYXRlID0gJWQiLCBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKTsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBPcGVuIGlucHV0IGZpbGUgd2l0aCB0aGUgcmVhZGVyICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX1BhcmFtcy5wSW5wdXRBdWRpb1RyYWNrRmlsZSkgewotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSByZWFkZXIgaW50ZXJmYWNlIGFjY29yZGluZyB0byB0aGUgaW5wdXQgYXVkaW8gZmlsZSB0eXBlICovCi0gICAgICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuQXVkaW9GaWxlRm9ybWF0KQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjoKLSAgICAgICAgZXJyID0gTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwQy0+bV9wUmVhZGVyR2xvYkludCwKLSAgICAgICAgICAgICAgICAmcEMtPm1fcFJlYWRlckRhdGFJbnQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEFBQ19TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgICAgIGVyciA9IE00UkVBREVSXzNHUF9nZXRJbnRlcmZhY2VzKCAmcmVhZGVyTWVkaWFUeXBlLCAmcEMtPm1fcFJlYWRlckdsb2JJbnQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+bV9wUmVhZGVyRGF0YUludCk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IE00UkVBREVSXzNHUF9nZXRJbnRlcmZhY2VzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkhBTkRMRURfQVVESU9fVFJBQ0tfSU5QVVRfRklMRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgSW5pdGlhbGl6ZXMgdGhlIHJlYWRlciBzaGVsbCAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0Q3JlYXRlKCZwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogcFJlYWRlckdsb2JJbnQtPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSW50LT5tX3JlYWRlckNvbnRleHQgPSBwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0OwotICAgICAgICAvKio8IExpbmsgdGhlIHJlYWRlciBpbnRlcmZhY2UgdG8gdGhlIHJlYWRlciBjb250ZXh0ICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBTZXQgdGhlIHJlYWRlciBzaGVsbCBmaWxlIGFjY2VzcyBmdW5jdGlvbnMgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdFNldE9wdGlvbihwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyLCAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnBPc2FsRmlsZVJlYWQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBwUmVhZGVyR2xvYkludC0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBPcGVuIHRoZSBpbnB1dCBhdWRpbyBmaWxlICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RPcGVuKHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICBwQy0+bV9QYXJhbXMucElucHV0QXVkaW9UcmFja0ZpbGUpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBwUmVhZGVyR2xvYkludC0+bV9wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdERlc3Ryb3kocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgICAgICBwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIEdldCB0aGUgYXVkaW8gc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlICovCi0gICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdEdldE5leHRTdHJlYW0ocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAmbWVkaWFGYW1pbHksICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgIGlmKChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKSB8fAotICAgICAgICAgICAgICAgICAgIChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRXQVJfVE9PX01VQ0hfU1RSRUFNUykpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgLyoqPCBPbmUgc3RyZWFtIGZvdW5kICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBGb3VuZCBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICBpZiAoKE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9PcGVuKCk6IEZvdW5kIGFuIGF1ZGlvIHN0cmVhbSBpbiBpbnB1dCIpOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqICBBbGxvY2F0ZSBhdWRpbyBBVSB1c2VkIGZvciByZWFkIG9wZXJhdGlvbnMgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUgPSAoTTRfQWNjZXNzVW5pdCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BY2Nlc3NVbml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UFRPM0dQUCwoTTRPU0FfQ2hhciAqKSJwUmVhZGVyQXVkaW9BVSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wUmVhZGVyQXVkaW9BVSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUmVhZGVyQXVkaW9BVSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlciwgcEMtPm1fcFJlYWRlckF1ZGlvQVUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyR2xvYkludC0+bV9wRmN0RmlsbEF1U3RydWN0KGF1ZGlvKXJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoTTRXQVJfTk9fTU9SRV9TVFJFQU0gIT0gZXJyKSAvKio8IFVuZXhwZWN0ZWQgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iSW50LT5tX3BGY3RHZXROZXh0U3RyZWFtIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvKiB3aGlsZSovCi0gICAgfSAvKmlmIChNNE9TQV9OVUxMICE9IHBDLT5tX1BhcmFtcy5wSW5wdXRBdWRpb1RyYWNrRmlsZSkqLwotCi0gICAgcEMtPm1fVmlkZW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgIC8qKgotICAgICAqIEluaXQgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX0F1ZGlvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQ7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RSZXNldChwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IHBSZWFkZXJEYXRhSW50LT5tX3BGY3RSZXNldChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX09QRU5FRDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWF4IEZpbGUgc2l6ZSAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0RmlsZU1heFNpemUpCi0gICAgewotICAgIGNhc2UgTTRQVE8zR1BQX2s1MF9LQjogIHBDLT5tX01heEZpbGVTaXplID0gNTAwMDA7ICBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rNzVfS0I6ICBwQy0+bV9NYXhGaWxlU2l6ZSA9IDc1MDAwOyAgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazEwMF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSAxMDAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2sxNTBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gMTUwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rMjAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDIwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazMwMF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSAzMDAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2s0MDBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gNDAwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rNTAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDUwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfa1VOTElNSVRFRDoKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9PcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9TdGVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdHJhbmNvZGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HIEVuY29kaW5nIGNvbXBsZXRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGxfdWlBdWRpb1N0ZXBDb3VudCA9IDA7Ci0gICAgTTRPU0FfSW50MzIgIEp1bXBUb1RpbWUgPSAwOwotICAgIE00T1NBX1RpbWUgIG10SW5jQ3RzOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNFBUTzNHUFBfU3RlcDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmICggISgoTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQgPT0gcEMtPm1fU3RhdGUpIHx8IChNNFBUTzNHUFBfa1N0YXRlX1JFQURZID09IHBDLT5tX1N0YXRlKSkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsIHBDLT5tX1N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqCi0gICAgICogIEluIGNhc2UgdGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCwgd2UgcHJlcGFyZSB0aGUgZGVjb2RlciwgdGhlIGVuY29kZXIgYW5kIHRoZSB3cml0ZXIgKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQgPT0gcEMtPm1fU3RhdGUpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRQVE8zR1BQX1N0ZXAoKTogVGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCwgXAotICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nIik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBQcmVwYXJlIHRoZSByZWFkZXIsIHRoZSBkZWNvZGVyLCB0aGUgZW5jb2RlciwgdGhlIHdyaXRlci4uLiAqLwotICAgICAgICBlcnIgPSBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyhwQyk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKCkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICAgICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX1JFQURZOwotCi0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfU3RlcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiAoYSkiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7IC8qKjwgd2Ugb25seSBkbyB0aGF0IGluIHRoZSBmaXJzdCBzdGVwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBSRUFMIHN0ZXAgd2lsbCBiZSB0aGUgbmV4dCBvbmUgKi8KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgdGFyZ2V0ZWQgZmlsZSBzaXplLgotICAgICAqIFdlIGRvIHRoYXQgYmVmb3JlIHRoZSBlbmNvZGluZywgYmVjYXVzZSB0aGUgY29yZSBlbmNvZGVyIGhhcyB0byBrbm93IGlmIHRoaXMgaXMKLSAgICAgKiB0aGUgbGFzdCBmcmFtZSB0byBlbmNvZGUgKi8KLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdEdldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0ZpbGVTaXplQXVkaW9Fc3RpbWF0ZWQsIChNNE9TQV9EYXRhT3B0aW9uKSAmcEMtPm1fQ3VycmVudEZpbGVTaXplKTsKLSAgICBpZiAoKDAgIT0gcEMtPm1fTWF4RmlsZVNpemUpICYmCi0gICAgICAgIC8qKjwgQWRkIGEgbWFyZ2UgdG8gdGhlIGZpbGUgc2l6ZSBpbiBvcmRlciB0byBuZXZlciBleGNlZWQgdGhlIG1heCBmaWxlIHNpemUgKi8KLSAgICAgICAoKHBDLT5tX0N1cnJlbnRGaWxlU2l6ZSArIE00UFRPM0dQUF9NQVJHRV9PRl9GSUxFX1NJWkUpID49IHBDLT5tX01heEZpbGVTaXplKSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX0lzTGFzdFBpY3R1cmUgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqICBBdCB0aGF0IHBvaW50IHdlIGFyZSBpbiBNNFBUTzNHUFBfa1N0YXRlX1JFQURZIHN0YXRlCi0gICAgKiAgV2UgcGVyZm9ybSBvbmUgc3RlcCBvZiB2aWRlbyBlbmNvZGluZwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qKioqKioqKioqKioqIFZJREVPIEVOQ09ESU5HICoqKioqKioqKioqKioqKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5tX1ZpZGVvU3RhdGUpIC8qKjxJZiB0aGUgdmlkZW8gZW5jb2RpbmcgaXMgZ29pbmcgb24qLwotICAgIHsgICAvKioKLSAgICAgICAgICogQ2FsbCB0aGUgZW5jb2RlciAgKi8KLSAgICAgICAgcEMtPm1fTmJDdXJyZW50RnJhbWUrKzsKLQotICAgICAgICAvKiBDaGVjayBpZiBpdCBpcyB0aGUgbGFzdCBmcmFtZSB0aGUgdG8gZW5jb2RlICovCi0gICAgICAgIGlmKChwQy0+bV9QYXJhbXMuTmJWaWRlb0ZyYW1lcyA+IDApIFwKLSAgICAgICAgICAgICYmIChwQy0+bV9OYkN1cnJlbnRGcmFtZSA+PSBwQy0+bV9QYXJhbXMuTmJWaWRlb0ZyYW1lcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5tX0lzTGFzdFBpY3R1cmUgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk00UFRPM0dQUF9TdGVwKCk6IENhbGxpbmcgcEVuY29kZXJJbnQtPnBGY3RFbmNvZGUgd2l0aCB2aWRlb0N0cyA9ICUuMmZcCi0gICAgICAgICAgICAgICAgICAgICAgIG5iID0gJWx1IiwgcEMtPm1fbXRDdHMsIHBDLT5tX05iQ3VycmVudEZyYW1lKTsKLQotICAgICAgICBlcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdEVuY29kZShwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQsIE00T1NBX05VTEwsCi0gICAgICAgICAgICAvKio8IFRoZSBpbnB1dCBwbGFuZSBpcyBudWxsIGJlY2F1c2UgdGhlIGlucHV0IFBpY3R1cmUgd2lsbCBiZSBvYnRhaW5lZCBieSB0aGVcCi0gICAgICAgICAgICBWUFAgZmlsdGVyIGZyb20gdGhlIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9tdEN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1fSXNMYXN0UGljdHVyZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tMYXN0RnJhbWUgOiBNNEVOQ09ERVJfa05vcm1hbEZyYW1lKSApOwotICAgICAgICAvKio8IExhc3QgcGFyYW0gc2V0IHRvIE00T1NBX1RSVUUgc2lnbmFscyB0aGF0IHRoaXMgaXMgdGhlIGxhc3QgZnJhbWUgdG8gYmUgZW5jb2RlZCxcCi0gICAgICAgIE00T1NBX0ZBTFNFIGVsc2UgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMigiTTRQVE8zR1BQX1N0ZXAoKTogcEVuY29kZXJJbnQtPnBGY3RFbmNvZGUgcmV0dXJucyAweCV4LCB2aWRGb3JtYXQgPTB4JXgiLAotICAgICAgICAgICAgZXJyLCBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICBpZigoTTROT19FUlJPUiA9PSBlcnIpICYmIChNNFZJREVPRURJVElOR19rSDI2NCA9PSBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBsYXN0IGZyYW1lLioKLSAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9Jc0xhc3RQaWN0dXJlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfU3RlcCgpOiBMYXN0IHBpY3R1cmUiKTsKLSAgICAgICAgICAgICAgICBwQy0+bV9WaWRlb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSAvKio8IFRoZSB2aWRlbyBlbmNvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX1N0ZXAoKTogcEVuY29kZXJJbnQtPnBGY3RFbmNvZGUgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICBwQy0+bV9WaWRlb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE5PX0VSUk9SICE9IGVycikgICAgIC8qKjwgVW5leHBlY3RlZCBlcnJvciBjb2RlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoKChNNE9TQV9VSW50MzIpTTRXQVJfV1JJVEVSX1NUT1BfUkVRKSA9PSBlcnIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICgoKE00T1NBX1VJbnQzMilNNEVSUl9BTExPQykgPT0gZXJyKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9TdGVwOiByZXR1cm5pbmcgRVJSX1BUTzNHUFBfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogcEVuY29kZXJJbnQtPnBGY3RFbmNvZGUobGFzdCkgKGEpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLyoqPCBFbmQgb2YgdmlkZW8gZW5jb2RpbmcgKi8KLQotCi0gICAgLyoqKioqKiBBVURJTyBUUkFOU0NPRElORyAocmVhZCArIG51bGwgZW5jb2RpbmcgKyB3cml0ZSkgKioqKioqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQgPT0gcEMtPm1fQXVkaW9TdGF0ZSkKLSAgICB7Ci0gICAgICAgIHdoaWxlICggKE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRCA9PSBwQy0+bV9BdWRpb1N0YXRlKSAmJgotICAgICAgICAgICAgICAgIChwQy0+bV9tdEF1ZGlvQ3RzIDwgcEMtPm1fbXROZXh0Q3RzKSkKLQotICAgICAgICB7Ci0gICAgICAgICAgICBsX3VpQXVkaW9TdGVwQ291bnQrKzsKLSAgICAgICAgICAgIGlmIChNNE9TQV9GQUxTRSA9PSBwQy0+bV9iQXVkaW9QYWRkaW5nU2lsZW5jZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKio8IFJlYWQgdGhlIG5leHQgYXVkaW8gQVUgaW4gdGhlIGlucHV0IEF1ZGlvIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUludC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0sIHBDLT5tX3BSZWFkZXJBdWRpb0FVKTsKLSAgICAgICAgICAgICAgICBwQy0+bV9tdEF1ZGlvQ3RzID0gcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fQ1RTICsgcEMtPm1fQXVkaW9PZmZTZXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UFRPM0dQUF9TdGVwKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJEYXRhSW50LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLkF1ZGlvUGFkZGluZ01vZGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX05vbmU6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfU2lsZW5jZToKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRG8gbm90aGluZyBpZiB0aGUgaW5wdXQgYXVkaW8gZmlsZSBmb3JtYXQgaXMgbm90IEFNUiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fQXVkaW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2JBdWRpb1BhZGRpbmdTaWxlbmNlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX0xvb3A6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEp1bXAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXVkaW8gZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RKdW1wKHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0sICZKdW1wVG9UaW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnQtPm1fcEZjdFJlc2V0KGF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX210QXVkaW9DdHMgKz0gMjA7IC8qPCBTRU1DIGJ1ZyBmaXhlZCBhdCBMdW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvT2ZmU2V0ID0gcEMtPm1fbXRBdWRpb0N0czsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogJ0JaWlonIGJ1ZyBmaXg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFkZCBhIHNpbGVuY2UgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRJbmNDdHMgPSAoTTRPU0FfVGltZSkoKHBDLT5tX210QXVkaW9DdHMpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnRpbWVTY2FsZSAvIDEwMDAuMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWUocEMtPm1fcFdyaXRlckRhdGFJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgJnBDLT5tX1dyaXRlckF1ZGlvQVUsIG10SW5jQ3RzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFBUTzNHUFBfQWRkQW1yU2lsZW5jZVNpZCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS8qKjwgQWRkID0+IG5vIGF1ZGlvIGN0cyBpbmNyZW1lbnQuLi4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9BdWRpb09mZlNldCA9IHBDLT5tX210QXVkaW9DdHMgKyBwQy0+bV9EZWx0YUF1ZGlvQ3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2Y6IHN3aXRjaCAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBwUmVhZGVyRGF0YUludC0+bV9wRmN0R2V0TmV4dEF1KEF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFNhdmUgdGhlIGRlbHRhIEN0cyAoQUFDIG9ubHkpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX0RlbHRhQXVkaW9DdHMgPSBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9DVFMgLSBwQy0+bV9QcmV2QXVkaW9DdHM7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX1ByZXZBdWRpb0N0cyAgPSBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9DVFM7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqICBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFdyaXRlckRhdGFJbnQtPnBTdGFydEFVKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5tX1dyaXRlckF1ZGlvQVUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBwV3JpdGVyRGF0YUludC0+cFN0YXJ0QVUoQXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIENvcHkgYXVkaW8gZGF0YSBmcm9tIHJlYWRlciBBVSB0byB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00UFRPM0dQUF9TdGVwKCk6IENvcHlpbmcgYXVkaW8gQVU6IHNpemU9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX1dyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX3NpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqICBDb252ZXJ0IENUUyB1bml0IGZyb20gbWlsbGlzZWNvbmRzIHRvIHRpbWVzY2FsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5DVFMgID0gKE00T1NBX1RpbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+bV9BdWRpb09mZlNldCArIHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuQ1RTID0gKE00T1NBX1RpbWUpKHBDLT5tX210QXVkaW9DdHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnRpbWVTY2FsZSAvIDEwMDAuMCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUubmJGcmFnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00UFRPM0dQUF9TdGVwKCk6IGF1ZGlvIEFVOiBDVFM9JWQgbXMiLCBwQy0+bV9tdEF1ZGlvQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUyovKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIFdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyRGF0YUludC0+cFByb2Nlc3NBVShwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+bV9Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBwV3JpdGVyRGF0YUludC0+cFByb2Nlc3NBVShBdWRpbylcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyoqPCBNNE9TQV9UUlVFID09IHBDLT5tX2JBdWRpb1BhZGRpbmdTaWxlbmNlICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZCA9PQotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBGaWxsIGluIGF1ZGlvIGF1IHdpdGggc2lsZW5jZSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9tdEF1ZGlvQ3RzICs9IDIwOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBQYWRkIHdpdGggc2lsZW5jZSAqLwotICAgICAgICAgICAgICAgICAgICBtdEluY0N0cyA9IChNNE9TQV9UaW1lKShwQy0+bV9tdEF1ZGlvQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAqIChwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnRpbWVTY2FsZSAvIDEwMDAuMCkpOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWUocEMtPm1fcFdyaXRlckRhdGFJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgJnBDLT5tX1dyaXRlckF1ZGlvQVUsIG10SW5jQ3RzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBNNFBUTzNHUFBfQWRkQW1yU2lsZW5jZVNpZCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgLyoqPCBEbyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhdWRpbyBmaWxlIGZvcm1hdCBpcyBub3QgQU1SICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvKio8IHdoaWxlICovCi0gICAgfSAvKio8IEVuZCBvZiBhdWRpbyBlbmNvZGluZyAqLwotCi0gICAgcEMtPm1fbXRDdHMgPSBwQy0+bV9tdE5leHRDdHM7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkIHdoZW4gbm8gc3RyZWFtIGlzIGJlaW5nIGVuY29kZWQgYW55bW9yZSAqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEID09IHBDLT5tX1ZpZGVvU3RhdGUpCi0gICAgewotICAgICAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFBUTzNHUFBfU3RlcCgpOiB0cmFuc2NvZGluZyBmaW5pc2hlZCwgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgcmV0dXJuIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkc7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9TdGVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIChiKSIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgRmluaXNoIHRoZSBNNFBUTzNHUFAgdHJhbnNjb2RpbmcuCi0gKiBAbm90ZSAgICBUaGUgb3V0cHV0IDNHUFAgZmlsZSBpcyByZWFkeSB0byBiZSBwbGF5ZWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0Nsb3NlKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiAgICBvc2FFcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotICAgIE00RU5DT0RFUl9IZWFkZXIqIGVuY0hlYWRlcjsKLSAgICBNNFNZU19TdHJlYW1JRG1lbUFkZHIgc3RyZWFtSGVhZGVyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9DbG9zZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX0Nsb3NlOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiAoKHBDLT5tX1N0YXRlICE9IE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEKSAmJgotICAgICAgICAocEMtPm1fU3RhdGUgIT0gTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSkgJiYKLSAgICAgICAgKHBDLT5tX1N0YXRlICE9IE00UFRPM0dQUF9rU3RhdGVfRklOSVNIRUQpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbG9zZSgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLCBwQy0+bV9TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogRmluaXNoIHRoZSBlbmNvZGluZyAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSA9PSBwQy0+bV9TdGF0ZSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRDsKLSAgICB9Ci0KLSAgICBpZiAoTTRQVE8zR1BQX2tFbmNvZGVyUnVubmluZyA9PSBwQy0+bV9lRW5jb2RlclN0YXRlKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5tX3BFbmNvZGVySW50LT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBvc2FFcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdFN0b3AocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX2Nsb3NlOiBtX3BFbmNvZGVySW50LT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLCBvc2FFcnIpOwotICAgICAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgIH0KLQotICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tFbmNvZGVyU3RvcHBlZCA9PSBwQy0+bV9lRW5jb2RlclN0YXRlKQotICAgIHsKLSAgICAgICAgb3NhRXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RDbG9zZShwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBvc2FFcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfY2xvc2U6IG1fcEVuY29kZXJJbnQtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLCBvc2FFcnIpOwotICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogQ2xvc2UgM0dQIG91dCAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0KSAgLyogaGFwcGVucyBpbiBzdGF0ZSBfU0VUICovCi0gICAgewotICAgICAgICAvKiBIVyBlbmNvZGVyOiBmZXRjaCB0aGUgRFNJIGZyb20gdGhlIHNoZWxsIHZpZGVvIGVuY29kZXIsIGFuZCBmZWVkIGl0IHRvIHRoZSB3cml0ZXIgYmVmb3JlCi0gICAgICAgIGNsb3NpbmcgaXQuICovCi0gICAgICAgIGlmICgoTTRWSURFT0VESVRJTkdfa01QRUc0ID09IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkKLSAgICAgICAgICAgIHx8IChNNFZJREVPRURJVElOR19rSDI2NCA9PSBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBvc2FFcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdEdldE9wdGlvbihwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pJmVuY0hlYWRlcik7Ci0gICAgICAgICAgICBpZiAoIChNNE5PX0VSUk9SICE9IG9zYUVycikgfHwgKE00T1NBX05VTEwgPT0gZW5jSGVhZGVyLT5wQnVmKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9jbG9zZTogZmFpbGVkIHRvIGdldCB0aGUgZW5jb2RlciBoZWFkZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgIG9zYUVycik7Ci0gICAgICAgICAgICAgICAgLyoqPCBubyByZXR1cm4gaGVyZSwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBkZWFsbG9jYXRlIGFmdGVyIGNsb3NlLCBldmVuIGlmIFwKLSAgICAgICAgICAgICAgICBpdCBmYWlscy4gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBzZXQgdGhpcyBoZWFkZXIgaW4gdGhlIHdyaXRlciAqLwotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5zdHJlYW1JRCA9IE00UFRPM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5zaXplID0gZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5hZGRyID0gKE00T1NBX01lbUFkZHIzMillbmNIZWFkZXItPnBCdWY7Ci0gICAgICAgICAgICAgICAgb3NhRXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tEU0ksICZzdHJlYW1IZWFkZXIpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfY2xvc2U6IGZhaWxlZCB0byBzZXQgdGhlIERTSSBpbiB0aGUgd3JpdGVyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVyciAweCV4KSAgICIsIG9zYUVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogVXBkYXRlIGxhc3QgVmlkZW8gQ1RTICovCi0gICAgICAgIGxhc3RDVFMgPSAoTTRPU0FfVUludDMyKXBDLT5tX210Q3RzOwotCi0gICAgICAgIG9zYUVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uLCAmbGFzdENUUyk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbG9zZTogU2V0T3B0aW9uKE00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgb3NhRXJyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFdyaXRlIGFuZCBjbG9zZSB0aGUgM0dQIG91dHB1dCBmaWxlICovCi0gICAgICAgIG9zYUVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0Q2xvc2VXcml0ZShwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbG9zZTogcFdyaXRlckdsb2JJbnQtPnBGY3RDbG9zZVdyaXRlIHJldHVybnMgMHgleCIsIG9zYUVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiB5ZXQsIHdlIGhhdmUgdG8gY2xvc2Ugb3RoZXIgdGhpbmdzICovCi0gICAgICAgIH0KLSAgICAgICAgcEMtPm1fcDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXRlIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfQ0xPU0VEOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9DbG9zZSgpOiByZXR1cm5pbmcgMHgleCIsIG9zYUVycik7Ci0gICAgcmV0dXJuIG9zYUVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTTRQVE8zR1BQLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0NsZWFuVXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0NsZWFuVXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX0NsZWFuVXA6IHBDb250ZXh0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICBGaXJzdCBjYWxsIENsb3NlLCBpZiBuZWVkZWQsIHRvIGNsZWFuIHRoZSB2aWRlbyBlbmNvZGVyICovCi0KLSAgICBpZiAoKE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEID09IHBDLT5tX1N0YXRlKSB8fCAoTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSA9PSBwQy0+bV9TdGF0ZSkKLSAgICAgICAgfHwgKE00UFRPM0dQUF9rU3RhdGVfRklOSVNIRUQgPT0gcEMtPm1fU3RhdGUpKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQVE8zR1BQX0Nsb3NlKHBDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXA6IE00UFRPM0dQUF9DbG9zZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIGhhdmUgdG8gZnJlZSBvdGhlciBjb21wb25lbnRzICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRnJlZSBBdWRpbyByZWFkZXIgc3R1ZmYsIGlmIG5lZWRlZCAqLwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCkgLyoqPCBtYXkgYmUgTTRPU0FfTlVMTCBpZiBNNFBUTzNHUFBfT3BlbiB3YXMgbm90XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCAqLwotICAgIHsKLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0Q2xvc2UocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbGVhblVwOiBwUmVhZGVyR2xvYkludC0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBoYXZlIHRvIGZyZWUgb3RoZXIgY29tcG9uZW50cyAqLwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3REZXN0cm95KHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQpOwotICAgICAgICBwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXA6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3REZXN0cm95IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2UgaGF2ZSB0byBmcmVlIG90aGVyIGNvbXBvbmVudHMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb0FVKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyQXVkaW9BVSk7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb0FVID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRnJlZSB2aWRlbyBlbmNvZGVyIHN0dWZmLCBpZiBuZWVkZWQgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdENsZWFudXAocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgcEMtPm1fcE1wNEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXA6IHBFbmNvZGVySW50LT5wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIGhhdmUgdG8gZnJlZSBvdGhlciBjb21wb25lbnRzICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbykKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyk7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8gPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvKTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyR2xvYkludCkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckdsb2JJbnQpOwotICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYkludCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJEYXRhSW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyRGF0YUludCk7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BFbmNvZGVySW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wRW5jb2RlckludCk7Ci0gICAgICAgIHBDLT5tX3BFbmNvZGVySW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyR2xvYkludCkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlckdsb2JJbnQpOwotICAgICAgICBwQy0+bV9wV3JpdGVyR2xvYkludCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlckRhdGFJbnQpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJEYXRhSW50KTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckRhdGFJbnQgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKio8IERvIG5vdCBmcmVlIHBDLT5wT3NhTWVtb3J5UHRyRmN0IGFuZCBwQy0+cE9zYU1lbW9yeVB0ckZjdCwgYmVjYXVzZSBpdCdzIG93bmVkIGJ5IHRoZSBcCi0gICAgYXBwbGljYXRpb24gKi8KLQotICAgIC8qKgotICAgICAqICBGcmVlIHRoZSBjb250ZXh0IGl0c2VsZiAqLwotICAgIGZyZWUocEMpOwotICAgIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfQ2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqIElOVEVSTkFMIEZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgIFByZXBhcmUgYWxsIHJlc291cmNlcyBhbmQgaW50ZXJmYWNlcyBmb3IgdGhlIHRyYW5zY29kaW5nLgotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBmaXJzdCBNNE9TQV9TdGVwKCkgY2FsbAotICogQHBhcmFtICAgcEMgICAgICAgICAgKElOKSBNNFBUTzNHUFAgcHJpdmF0ZSBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICogQHJldHVybiAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCogcEMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgb3V0cHV0RmlsZVR5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlWZXJzaW9uOwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIGVuY0Zvcm1hdDsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgICBFbmNQYXJhbXM7ICAgIC8qKjwgRW5jb2RlciBhZHZhbmNlZCBwYXJhbWV0ZXJzICovCi0gICAgTTRTWVNfU3RyZWFtSURWYWx1ZSAgICAgb3B0aW9uVmFsdWU7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcgY2FsbGVkIHdpdGggcEM9MHgleCIsIHBDKTsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKiovCi0gICAgLyoqKioqKioqIFZpZGVvIEVuY29kZXIgUGFyYW1lcyBpbml0ICoqKioqKioqLwotICAgIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKioKLSAgICAgKiAgR2V0IHRoZSBjb3JyZWN0IGVuY29kZXIgaW50ZXJmYWNlICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgmZW5jRm9ybWF0LCAmcEMtPm1fcEVuY29kZXJJbnQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKLSNlbHNlIC8qIHNvZnR3YXJlIE1QRUc0IGVuY29kZXIgbm90IGF2YWlsYWJsZSEgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gTVBFRzQgZW5jb2RlciBhdmFpbGFibGUhIERpZCB5b3UgZm9yZ2V0IHRvIHJlZ2lzdGVyIG9uZT8iKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSNlbmRpZiAvKiBzb2Z0d2FyZSBNUEVHNCBlbmNvZGVyIGF2YWlsYWJsZT8gKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKCZlbmNGb3JtYXQsICZwQy0+bV9wRW5jb2RlckludCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotI2Vsc2UgLyogc29mdHdhcmUgSDI2MyBlbmNvZGVyIG5vdCBhdmFpbGFibGUhICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5vIEgyNjMgZW5jb2RlciBhdmFpbGFibGUhIERpZCB5b3UgZm9yZ2V0IHRvIHJlZ2lzdGVyIG9uZT8iKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSNlbmRpZiAvKiBzb2Z0d2FyZSBIMjYzIGVuY29kZXIgYXZhaWxhYmxlPyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQwotICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjY0KCZlbmNGb3JtYXQsICZwQy0+bV9wRW5jb2RlckludCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotI2Vsc2UgLyogc29mdHdhcmUgSDI2NCBlbmNvZGVyIG5vdCBhdmFpbGFibGUhICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBObyBIMjY0IGVuY29kZXIgYXZhaWxhYmxlIVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWQgeW91IGZvcmdldCB0byByZWdpc3RlciBvbmU/Iik7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7Ci0jZW5kaWYgLyogc29mdHdhcmUgSDI2NCBlbmNvZGVyIGF2YWlsYWJsZT8gKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgfQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KTogZ2V0SW50ZXJmYWNlcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBGaWxsIGVuY29kZXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gTTRQVE8zR1BQIHNldHRpbmdzICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmcmFtZSBzaXplICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9TUUNJRl9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfU1FDSUZfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0EgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1FRVkdBX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9RUVZHQV9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9RQ0lGX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9RQ0lGX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0EgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1FWR0FfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1FWR0FfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQ0lGIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9DSUZfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX0NJRl9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0EgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1ZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfVkdBX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0vKiArUFIgTFY1ODA3ICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0EgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1dWR0FfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1dWR0FfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9OVFNDX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9OVFNDX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0vKiAtUFIgTFY1ODA3ICovCi0vKiArQ1IgR29vZ2xlICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfNjQwXzM2MF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfNjQwXzM2MF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfODU0XzQ4MF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSXzEyODBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl8xMjgwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSXzEwODBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfOTYwXzcyMF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfOTYwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl8xOTIwXzEwODBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzE5MjBfMTA4MF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotLyogLUNSIEdvb2dsZSAqLwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5rbm93biBmb3JtYXQgMHgleCByZXR1cm5pbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX000UFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkU7Ci0gICAgfQotCi0gICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gYml0cmF0ZSAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjg4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1MTJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwX0tCUFM6Ci0vKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMl9NQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1X01CUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazhfTUJQUzoKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkFSSUFCTEVfS0JQUzoKLS8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5rbm93biBmb3JtYXQgMHgleCByZXR1cm5pbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZm9ybWF0ICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0IDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgICAgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjMgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCAgICA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCAgICA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5rbm93biBmb3JtYXQgMHgleCByZXR1cm5pbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZnJhbWUgcmF0ZSAoc2V0IGl0IHRvIG1heCA9IDMwIGZwcykgKi8KLSAgICBFbmNQYXJhbXMudWlUaW1lU2NhbGUgPSAzMDsKLSAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsKLQotICAgIEVuY1BhcmFtcy5GcmFtZVJhdGUgPSBNNEVOQ09ERVJfazMwX0ZQUzsKLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogM0dQIG91dCBpbml0ICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBHZXQgdGhlIDNHUFAgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIGVyciA9IE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKCZvdXRwdXRGaWxlVHlwZSwgJnBDLT5tX3BXcml0ZXJHbG9iSW50LCAmcEMtPm1fcFdyaXRlckRhdGFJbnQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlczogTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBJbml0IHRoZSAzR1BQIHdyaXRlciAqLwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0T3BlbigmcEMtPm1fcDNncFdyaXRlckNvbnRleHQsIHBDLT5tX1BhcmFtcy5wT3V0cHV0M2dwcEZpbGUsCi0gICAgICAgIHBDLT5wT3NhbEZpbGVXcml0ZSwgcEMtPm1fUGFyYW1zLnBUZW1wb3JhcnlGaWxlLCBwQy0+cE9zYWxGaWxlUmVhZCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgTGluayB0byB0aGUgd3JpdGVyIGNvbnRleHQgaW4gdGhlIHdyaXRlciBpbnRlcmZhY2UgKi8KLSAgICBwQy0+bV9wV3JpdGVyRGF0YUludC0+cFdyaXRlckNvbnRleHQgPSBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqICBTZXQgdGhlIHByb2R1Y3QgZGVzY3JpcHRpb24gc3RyaW5nIGluIHRoZSB3cml0dGVuIGZpbGUgKi8KLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilNNFBUTzNHUFBfU0lHTkFUVVJFKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXQgdGhlIHByb2R1Y3QgdmVyc2lvbiBpbiB0aGUgd3JpdHRlbiBmaWxlICovCi0gICAgdWlWZXJzaW9uID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUioxMDAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SKjEwCi0gICAgICAgICsgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbiwKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pJnVpVmVyc2lvbik7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBcCi0gICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEFsbG9jYXRlIGFuZCBmaWxsIHRoZSB2aWRlbyBzdHJlYW0gc3RydWN0dXJlcyBmb3IgdGhlIHdyaXRlciAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSA9Ci0gICAgICAgIChNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiksIE00UFRPM0dQUCwKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlclZpZGVvU3RyZWFtIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBwV3JpdGVyVmlkZW9TdHJlYW0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyA9Ci0gICAgICAgIChNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MpLCBNNFBUTzNHUFAsCi0gICAgICAgIChNNE9TQV9DaGFyICopInBXcml0ZXJWaWRlb1N0cmVhbUluZm8iKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBwV3JpdGVyVmlkZW9TdHJlYW1JbmZvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIFZpZGVvIHByb3BlcnRpZXMgc3RydWN0dXJlIGZvciB0aGUgQWRkU3RyZWFtIG1ldGhvZCAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPmhlaWdodCAgICAgICAgPSBFbmNQYXJhbXMuRnJhbWVIZWlnaHQ7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+d2lkdGggICAgICAgICA9IEVuY1BhcmFtcy5GcmFtZVdpZHRoOwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPmZwcyAgICAgICAgICAgPSAwOyAgICAgICAgLyoqPCBOb3QgdXNlZCBieSB0aGUgY29yZSB3cml0ZXIgKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT5IZWFkZXIucEJ1ZiAgID0gTTRPU0FfTlVMTDsKLSAgICAvKiogTm8gaGVhZGVyLCB3aWxsIGJlIHNldCBieSBzZXRPcHRpb24gKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT5IZWFkZXIuU2l6ZSAgID0gMDsKLQotICAgIC8qKgotICAgICAqICBGaWxsIFZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5zdHJlYW1JRCA9IE00UFRPM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZm9ybWF0ICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+c3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOyAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5rbm93biBmb3JtYXQgMHgleCByZXR1cm5pbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX000UFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGJpdHJhdGUgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMyX0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyOF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjU2X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI4OF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szODRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNTEyX0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMF9LQlBTOgotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazJfTUJQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9NQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4X01CUFM6Ci0vKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGUgPSBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkFSSUFCTEVfS0JQUyA6Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPmF2ZXJhZ2VCaXRyYXRlID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZ1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURTsKLSAgICB9Ci0KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPmR1cmF0aW9uICAgICAgICAgICAgICAgICAgPSAwOyAgICAgICAgLyoqPCBEdXJhdGlvbiBpcyBub3Qga25vd24gKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnRpbWVTY2FsZSAgICAgICAgICAgICAgICAgPSAwOyAgICAvKio8IE5vdCB1c2VkIGJ5IHRoZSBjb3JlIHdyaXRlciAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+bWF4Qml0cmF0ZSAgICAgICAgICAgICAgICA9IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5wcm9maWxlTGV2ZWwgICAgICAgICAgICAgID0gMDsgICAgLyoqPCBOb3QgdXNlZCBieSB0aGUgY29yZSB3cml0ZXIgKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPmRlY29kZXJTcGVjaWZpY0luZm8gICAgICAgPSAoTTRPU0FfTWVtQWRkcjMyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgICA9IHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSBBVSBwcm9wZXJ0aWVzIGZvciB2aWRlbyBzdHJlYW0gKi8KLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLkNUUyAgICAgICAgID0gcEMtPm1fV3JpdGVyVmlkZW9BVS5EVFMgPSAwOyAgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLnNpemUgICAgICAgID0gMDsKLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLmZyYWcgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLm5iRnJhZyAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgcEMtPm1fV3JpdGVyVmlkZW9BVS5zdHJlYW0gICAgICA9IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbTsKLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSAgID0gQVVfUkFQOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogIElmIHRoZXJlIGlzIGFuIGF1ZGlvIGlucHV0LCBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgYXVkaW8gc3RyZWFtIHN0cnVjdHVyZXMgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSA9Ci0gICAgICAgICAgICAoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24pLCBNNFBUTzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwV3JpdGVyQXVkaW9TdHJlYW0iKTsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBXcml0ZXJBdWRpb1N0cmVhbSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbyA9Ci0gICAgICAgICAgICAoTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zKSwgTTRQVE8zR1BQLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlckF1ZGlvU3RyZWFtSW5mbyIpOwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKTogdW5hYmxlIHRvIGFsbG9jYXRlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJBdWRpb1N0cmVhbUluZm8sIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+bmJTYW1wbGVzUGVyU2VjID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5uYkJpdHNQZXJTYW1wbGUgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPm5iQ2hhbm5lbHMgPSAxOyAgICAgIC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLQotICAgICAgICBpZiggKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKSAmJiAvKiBhdWRpbyBjb3VsZCBoYXZlIGJlZW4gZGlzY2FyZGVkICovCi0gICAgICAgICAgICAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5IZWFkZXIucEJ1ZiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdyaXRlciB3aWxsIHB1dCBhIGRlZmF1bHQgRFNJICovCi0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5IZWFkZXIucEJ1ZiA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgc3dpdGNoIChwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjOgotICAgICAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+c3RyZWFtVHlwZSA9IE00U1lTX2tFVlJDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVuaGFuZGxlZCBhdWRpbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRmlsbCBBdWRpbyBzdHJlYW0gZGVzY3JpcHRpb24gc3RydWN0dXJlIGZvciB0aGUgQWRkU3RyZWFtIG1ldGhvZCAqLwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnN0cmVhbUlEICAgICAgICAgICAgICAgICAgPSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRDsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5kdXJhdGlvbiAgICAgICAgICAgICAgICAgID0gMDsvKio8IER1cmF0aW9uIGlzIG5vdCBrbm93biB5ZXQgKi8KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT50aW1lU2NhbGUgICAgICAgICAgICAgICAgID0gTTRQVE8zR1BQX1dSSVRFUl9BVURJT19BTVJfVElNRV9TQ0FMRTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5wcm9maWxlTGV2ZWwgICAgICAgICAgICAgID0gTTRQVE8zR1BQX1dSSVRFUl9BVURJT19QUk9GSUxFX0xFVkVMOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPmF2ZXJhZ2VCaXRyYXRlICAgICAgICAgICAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+bWF4Qml0cmF0ZSAgICAgICAgICAgICAgICA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE91ciB3cml0ZXIgc2hlbGwgaW50ZXJmYWNlIGlzIGEgbGl0dGxlIHRyaWNreTogd2UgcHV0IE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MgXAotICAgICAgICAgICAgaW4gdGhlIERTSSBwb2ludGVyLi4uICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+ZGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbzsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVXBkYXRlIEFVIHByb3BlcnRpZXMgZm9yIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLkNUUyAgICAgICAgID0gcEMtPm1fV3JpdGVyQXVkaW9BVS5EVFMgPSAwOyAgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5zaXplICAgICAgICA9IDA7Ci0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuZnJhZyAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLm5iRnJhZyAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuc3RyZWFtICAgICAgPSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW07Ci0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuYXR0cmlidXRlICAgPSBBVV9SQVA7Ci0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIFZpZGVvIEVuY29kZXIgSW5pdCAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyoqCi0gICAgICogUFRPIHVzZXMgaXRzIG93biBiaXRyYXRlIHJlZ3VsYXRpb24sIG5vdCB0aGUgInRydWUiIGNvcmUgcmVndWxhdGlvbiAqLwotICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfVFJVRTsgLy9NNE9TQV9GQUxTRTsKLSAgICBFbmNQYXJhbXMudWlTdGFydGluZ1F1YW50aXplclZhbHVlID0gTTRQVE8zR1BQX1FVQU5USVpFUl9TVEVQOwotCi0gICAgRW5jUGFyYW1zLnZpZGVvUHJvZmlsZSA9IHBDLT5tX1BhcmFtcy52aWRlb1Byb2ZpbGU7Ci0gICAgRW5jUGFyYW1zLnZpZGVvTGV2ZWwgPSBwQy0+bV9QYXJhbXMudmlkZW9MZXZlbDsKLQotICAgIC8qKgotICAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKi8KLQotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSAgPSAwOyAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgICAgPSAwOyAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlICAgICAgICAgPSBNNE9TQV9GQUxTRTsgICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCAgICAgICAgICAgICA9IDE1OyAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyAgPSAwOyAgICAgICAgICAgICAvKiBNNFZfTU9USU9OX0VTVF9UT09MU19BTEwgKi8KLSAgICBFbmNQYXJhbXMuYkFjUHJlZGljdGlvbiAgICAgICAgICAgID0gTTRPU0FfVFJVRTsgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgICAgICAgID0gTTRPU0FfRkFMU0U7ICAgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHZpZGVvIGVuY29kZXIgKi8KLSAgICBlcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdEluaXQoJnBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCwgcEMtPm1fcFdyaXRlckRhdGFJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFBUTzNHUFBfYXBwbHlWUFAsIHBDLCBwQy0+bV9wRW5jb2RlckV4dGVybmFsQVBJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEVuY29kZXJVc2VyRGF0YSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBFbmNvZGVySW50LT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa0VuY29kZXJDbG9zZWQ7Ci0KLSAgICBlcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdE9wZW4ocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0LCAmcEMtPm1fV3JpdGVyVmlkZW9BVSwgJkVuY1BhcmFtcyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBFbmNvZGVySW50LT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa0VuY29kZXJTdG9wcGVkOwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RTdGFydCkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0U3RhcnQocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0KTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogRW5jb2RlckludC0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlclJ1bm5pbmc7Ci0KLSAgICAvKioKLSAgICAgKiBObyBtb3JlICBzZXRvcHRpb24gb24gIk00RU5DT0RFUl9rVmlkZW9GcmFnbWVudFNpemUiIGhlcmUuCi0gICAgICogSXQgaXMgbm93IGF1dG9tYXRpY2x5IGFuZCAic21hcnRseSIgc2V0IGluIHRoZSBlbmNvZGVyIHNoZWxsLiAqLwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiAzR1Agb3V0IGFkZCBzdHJlYW1zICAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdEFkZFN0cmVhbShwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0QWRkU3RyZWFtKHZpZGVvKSByZXR1cm5zXAotICAgICAgICAgICAgICAgICAgICAgICAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdmlkZW8gbWF4IGF1IHNpemUgKi8KLSAgICBvcHRpb25WYWx1ZS5zdHJlYW1JRCAgICA9IE00UFRPM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgIG9wdGlvblZhbHVlLnZhbHVlID0gKE00T1NBX1VJbnQzMikoMS41RiAqIChNNE9TQV9GbG9hdCkocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+d2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+aGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBNNFBUTzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcsTTRXUklURVJfa01heEFVU2l6ZTogJXUiLG9wdGlvblZhbHVlLnZhbHVlKTsKLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4QVVTaXplLChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24odmlkZW8sXAotICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4QVVTaXplKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB2aWRlbyBtYXggY2h1bmNrIHNpemUgKi8KLSAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IChNNE9TQV9VSW50MzIpKChNNE9TQV9GbG9hdClvcHRpb25WYWx1ZS52YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgKiBNNFBUTzNHUFBfVklERU9fQVVfU0laRV9UT19DSFVOQ0tfU0laRV9SQVRJTyk7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nLE00V1JJVEVSX2tNYXhDaHVuY2tTaXplOiAldSIsb3B0aW9uVmFsdWUudmFsdWUpOwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHZpZGVvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa01heENodW5ja1NpemUpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RBZGRTdHJlYW0ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdEFkZFN0cmVhbShhdWRpbykgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IGF1ZGlvIG1heCBhdSBzaXplICovCi0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlICAgICAgID0gTTRQVE8zR1BQX0FVRElPX01BWF9BVV9TSVpFOwotICAgICAgICBvcHRpb25WYWx1ZS5zdHJlYW1JRCAgICA9IE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhBVVNpemUpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCBhdWRpbyBtYXggY2h1bmNrIHNpemUgKi8KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBNNFBUTzNHUFBfQVVESU9fTUFYX0NIVU5LX1NJWkU7IC8qKjwgTWFnaWNhbCAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihhdWRpbyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENsb3NlIHRoZSBzdHJlYW0gcmVnaXN0ZXJpbmcgaW4gb3JkZXIgdG8gYmUgcmVhZHkgdG8gd3JpdGUgZGF0YSAqLwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U3RhcnRXcml0aW5nKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0U3RhcnRXcml0aW5nIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTEyMkZyYW1lKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQqIHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwV3JpdGVyQXVkaW9BVSwgTTRPU0FfVGltZSBtdEluY0N0cykKLSAqIEBicmllZiAgIFdyaXRlIGFuIEFNUiAxMi4ya2JwcyBzaWxlbmNlIEZSQU1FIGludG8gdGhlIHdyaXRlcgotICogQG5vdGUgICAgTWFpbmx5IHVzZWQgdG8gZml4IHRoZSAnYnp6JyBidWcuLi4KLSAqIEBwYXJhbSAgIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlIChJTikgICAgd3JpdGVyIGRhdGEgaW50ZXJmYWNlcwotICogICAgICAgICAgcFdyaXRlckNvbnRleHQgICAgICAgICAgKElOL09VVCl3cml0ZXIgY29udGV4dAotICogICAgICAgICAgcFdyaXRlckF1ZGlvQVUgICAgICAgICAgKE9VVCkgICB3cml0ZXIgYXVkaW8gYWNjZXNzIHVuaXQKLSAqICAgICAgICAgIG10SW5jQ3RzICAgICAgICAgICAgICAgIChJTikgICAgd3JpdGVyIENUUwotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZShNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQqIHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgbXRJbmNDdHMpCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLT5wU3RhcnRBVShwV3JpdGVyQ29udGV4dCwgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckF1ZGlvQVUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWU6IHBXcml0ZXJEYXRhSW50LT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqKXBXcml0ZXJBdWRpb0FVLT5kYXRhQWRkcmVzcywKLSAgICAgKHZvaWQgKilNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfMTIyX0ZSQU1FLCBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX1NJWkUpOwotICAgIHBXcml0ZXJBdWRpb0FVLT5zaXplICAgID0gTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9TSVpFOwotICAgIHBXcml0ZXJBdWRpb0FVLT5DVFMgICAgID0gbXRJbmNDdHM7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPm5iRnJhZyAgPSAwOwotCi0gICAgZXJyID0gcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UtPnBQcm9jZXNzQVUocFdyaXRlckNvbnRleHQsIE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckF1ZGlvQVUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWU6IHBXcml0ZXJEYXRhSW50LT5wUHJvY2Vzc0FVKHNpbGVuY2UpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWUoTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLCBNNE9TQV9UaW1lIG10SW5jQ3RzKQotICogQGJyaWVmICAgV3JpdGUgYW4gQU1SIDEyLjJrYnBzIHNpbGVuY2UgRlJBTUUgaW50byB0aGUgd3JpdGVyCi0gKiBAbm90ZSAgICBNYWlubHkgdXNlZCB0byBmaXggdGhlICdienonIGJ1Zy4uLgotICogQHBhcmFtICAgcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UgKElOKSAgICB3cml0ZXIgZGF0YSBpbnRlcmZhY2VzCi0gKiAgICAgICAgICBwV3JpdGVyQ29udGV4dCAgICAgICAgICAoSU4vT1VUKXdyaXRlciBjb250ZXh0Ci0gKiAgICAgICAgICBwV3JpdGVyQXVkaW9BVSAgICAgICAgICAoT1VUKSAgIHdyaXRlciBhdWRpbyBhY2Nlc3MgdW5pdAotICogICAgICAgICAgbXRJbmNDdHMgICAgICAgICAgICAgICAgKElOKSAgICB3cml0ZXIgQ1RTCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTA0OEZyYW1lKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwV3JpdGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgbXRJbmNDdHMpCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLT5wU3RhcnRBVShwV3JpdGVyQ29udGV4dCwgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJBdWRpb0FVKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTA0OEZyYW1lOiBwV3JpdGVyRGF0YUludC0+cFN0YXJ0QVUoYXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtZW1jcHkoKHZvaWQgKilwV3JpdGVyQXVkaW9BVS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfMDQ4X0ZSQU1FLAotICAgICAgICAgICAgICAgIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRSk7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPnNpemUgICAgPSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPkNUUyAgICAgPSBtdEluY0N0czsKLSAgICBwV3JpdGVyQXVkaW9BVS0+bmJGcmFnICA9IDA7Ci0KLSAgICBlcnIgPSBwV3JpdGVyRGF0YUludEludGVyZmFjZS0+cFByb2Nlc3NBVShwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsIHBXcml0ZXJBdWRpb0FVKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTA0OEZyYW1lOiBcCi0gICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhSW50LT5wUHJvY2Vzc0FVKHNpbGVuY2UpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfVmlkZW9QcmVQcm9jZXNzaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2YTY0OTguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfVmlkZW9QcmVQcm9jZXNzaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYwotICogQGJyaWVmICAgUGljdHVyZSB0byAzZ3BwIFNlcnZpY2UgdmlkZW8gcHJlcHJvY2Vzc2luZyBtYW5hZ2VtZW50LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICogICAgT1NBTCBEZWJ1ZyB1dGlsaXRpZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0vKioKLSAqICAgIE9TQUwgTWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotLyoqCi0gKiAgICBEZWZpbml0aW9uIG9mIHRoZSBNNFBUTzNHUFAgaW50ZXJuYWwgY29udGV4dCAqLwotI2luY2x1ZGUgIk00UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0KLS8qKgotICogICAgRGVmaW5pdGlvbiBvZiB0aGUgTTRQVE8zR1BQIGVycm9ycyAqLwotI2luY2x1ZGUgIk00UFRPM0dQUF9FcnJvckNvZGVzLmgiCi0KLS8qIElmIHRpbWUgaW5jcmVtZW50IGlzIHRvbyBsb3cgdGhlbiB3ZSBoYXZlIGFuIGluZmluaXRlIGFsbG9jIGxvb3AgaW50byBNNFZpRW5jQ2FwdHVyZUZyYW1lKCkgKi8KLS8qIFRpbWUgaW5jcmVtZW50IHNob3VsZCBtYXRjaCAzMCBmcHMgbWF4aW11bSAqLwotI2RlZmluZSBNNFBUTzNHUFBfTUlOX1RJTUVfSU5DUkVNRU5UIDMzLjMzMzMzMzQKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfYXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotICogQGJyaWVmICAgIENhbGwgYW4gZXh0ZXJuYWwgY2FsbGJhY2sgdG8gZ2V0IHRoZSBwaWN0dXJlIHRvIGVuY29kZQotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIE00UFRPM0dQUCBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHBQbGFuZUluICAgIChJTikgQ29udGFpbnMgdGhlIGltYWdlCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBZVVY0MjAgaW1hZ2UgcmVhZCB3aXRoIHRoZSBtX3BQaWN0dXJlQ2FsbGJhY2tGY3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9hcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiAgICBlcnI7Ci0gICAgTTRPU0FfRG91YmxlIG10RHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioqIE5PVEUgKioqLwotICAgIC8qIEl0J3MgT0sgdG8gZ2V0IHBQbGFuZUluID09IE00T1NBX05VTEwgaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogc2luY2UgaXQgaGFzIGJlZW4gZ2l2ZW4gTlVMTCBpbiB0aGUgcEZjdEVuY29kZSgpIGNhbGwuICAgICAgICAgICAgKi8KLSAgICAvKiBJdCdzIGJlY2F1c2Ugd2UgdXNlIHRoZSBNNFBUTzNHUFAgaW50ZXJuYWwgY29udGV4dCB0byAgICAgICAgICAgICovCi0gICAgLyogdHJhbnNtaXQgdGhlIGVuY29kZXIgaW5wdXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRoZSBpbnB1dCBkYXRhIGlzIHRoZSBpbWFnZSByZWFkIGZyb20gdGhlIG1fcFBpY3R1cmVDYWxsYmFja0ZjdCAgICAqLwotCi0gICAgLyoqCi0gICAgICogICAgVGhlIFZQUCBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBNNFBUTzNHUFAgY29udGV4dCEgKi8KLSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgR2V0IHRoZSBwaWN0dXJlIHRvIGVuY29kZSAqLwotICAgIGlmIChNNE9TQV9GQUxTRSA9PSBwQy0+bV9iTGFzdEludGVybmFsQ2FsbEJhY2spCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9QYXJhbXMucFBpY3R1cmVDYWxsYmFja0ZjdChwQy0+bV9QYXJhbXMucFBpY3R1cmVDYWxsYmFja0N0eHQsIHBQbGFuZU91dCwKLSAgICAgICAgICAgICAmbXREdXJhdGlvbik7Ci0KLSAgICAgICAgLyogSW4gY2FzZSBvZiBlcnJvciB3aGVuIGdldHRpbmcgWVVWIHRvIGVuY29kZSAoZXg6IGVycm9yIHdoZW4gZGVjb2RpbmcgYSBKUEVHKSAqLwotICAgICAgICBpZigoTTROT19FUlJPUiAhPSBlcnIpICYmICgoKE00T1NBX1VJbnQzMilNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRSkgIT0gZXJyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiBlbmQgb2YgZW5jb2RpbmcgaXMgYXNrZWQgYnkgdGhlIHNpemUgbGltaXRhdGlvbiBzeXN0ZW0sCi0gICAgICAgICAqIHdlIG11c3QgZW5kIHRoZSBlbmNvZGluZyB0aGUgc2FtZSB3YXkgdGhhdCB3aGVuIGl0IGlzIGFza2VkIGJ5IHRoZQotICAgICAgICAgKiBwaWN0dXJlIGNhbGxiYWNrIChhLmsuYS4gdGhlIGludGVncmF0b3IpLgotICAgICAgICAgKiBUaHVzIHdlIHNpbXVsYXRlIHRoZSBMYXN0UGljdHVyZSBjb2RlIHJldHVybjogKi8KLSAgICAgICAgaWYgKE00T1NBX1RSVUUgPT0gcEMtPm1fSXNMYXN0UGljdHVyZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZigoKE00T1NBX1VJbnQzMilNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRSkgPT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bV9iTGFzdEludGVybmFsQ2FsbEJhY2sgPSBNNE9TQV9UUlVFOyAvKiBUb2dnbGUgZmxhZyBmb3IgdGhlIGZpbmFsIGNhbGwgb2YgdGhlIENCKi8KLSAgICAgICAgICAgIHBDLT5tX0lzTGFzdFBpY3R1cmUgICAgICAgICA9IE00T1NBX1RSVUU7IC8qIFRvIHN0b3AgdGhlIGVuY29kZXIgKi8KLSAgICAgICAgICAgIHBDLT5wU2F2ZWRQbGFuZSAgICAgICAgICAgICA9IHBQbGFuZU91dDsgIC8qIFNhdmUgdGhlIGxhc3QgWVVWIHBsYW5lIHB0ciAqLwotICAgICAgICAgICAgcEMtPnVpU2F2ZWREdXJhdGlvbiAgICAgICAgID0gKE00T1NBX1VJbnQzMiltdER1cmF0aW9uOyAvKiBTYXZlIHRoZSBsYXN0IGR1cmF0aW9uICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqPCBOb3QgbmVjZXNzYXJ5IGhlcmUgYmVjYXVzZSB0aGUgbGFzdCBmcmFtZSBkdXJhdGlvbiBpcyBzZXQgdG8gdGhlLWxhc3QtYnV0LW9uZSBieQotICAgICAgICAgICAgICAgIHRoZSBsaWdodCB3cml0ZXIgKi8KLSAgICAgICAgLyoqPCBPbmx5IG5lY2Vzc2FyeSBmb3IgcEMtPm1fbXROZXh0Q3RzIGJlbG93Li4uKi8KLSAgICAgICAgbXREdXJhdGlvbiA9IHBDLT51aVNhdmVkRHVyYXRpb247Ci0KLQotICAgICAgICAvKiogQ29weSB0aGUgbGFzdCBZVVYgcGxhbmUgaW50byB0aGUgY3VycmVudCBvbmUKLSAgICAgICAgICogKHRoZSBsYXN0IHBpYyBpcyBzcGxpdGVkIGR1ZSB0byB0aGUgY2FsbGJhY2sgZXh0cmEtY2FsbC4uLiAqLwotICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFtpXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cFNhdmVkUGxhbmVbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbaV0udV9zdHJpZGUgKiBwUGxhbmVPdXRbaV0udV9oZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVGltZUluY3JlbWVudCBzaG91bGQgYmUgMzAgZnBzIG1heGltdW0gKi8KLSAgICBpZihtdER1cmF0aW9uIDwgTTRQVE8zR1BQX01JTl9USU1FX0lOQ1JFTUVOVCkKLSAgICB7Ci0gICAgICAgIG10RHVyYXRpb24gPSBNNFBUTzNHUFBfTUlOX1RJTUVfSU5DUkVNRU5UOwotICAgIH0KLQotICAgIHBDLT5tX210TmV4dEN0cyArPSBtdER1cmF0aW9uOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9hcHBseVZQUDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9BbXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfQW1yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxZjBlMjguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9BbXIuYworKysgL2Rldi9udWxsCkBAIC0xLDc5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00UkVBREVSX0Ftci5jCi0gKiBAYnJpZWYgIEdlbmVyaWMgZW5jYXBzdWxhdGlvbiBvZiB0aGUgY29yZSBhbXIgcmVhZGVyCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBnZW5lcmljIE00UkVBREVSIGludGVyZmFjZQotICogICAgICAgICBvbiB0b3Agb2YgdGhlIEFNUiByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNpbmNsdWRlICJNNF9VdGlscy5oIgotCi0jaW5jbHVkZSAiTTRBTVJSX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9BbXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfQU1SX0NvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBpbnRlcm5hbCBjb250ZXh0IG9mIGEgYW1yIHJlYWRlciBpbnN0YW5jZQotICogQG5vdGUgICAgICAgIFRoZSBjb250ZXh0IGlzIGFsbG9jYXRlZCBhbmQgZGUtYWxsb2NhdGVkIGJ5IHRoZSByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfQU1SX0NvbnRleHQKLXsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICBtX3BDb3JlQ29udGV4dDsgICAgIC8qKjwgY29yZSBhbXIgcmVhZGVyIGNvbnRleHQgKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICBtX3BBdWRpb1N0cmVhbTsgICAgIC8qKjwgcG9pbnRlciBvbiB0aGUgYXVkaW8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gcmV0dXJuZWQgYnkgdGhlIGNvcmUgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICBtX2F1ZGlvQXU7ICAgICAgICAgIC8qKjwgYXVkaW8gYWNjZXNzIHVuaXQgdG8gYmUgZmlsbGVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgbV9tYXhEdXJhdGlvbjsgICAgICAvKio8IGR1cmF0aW9uIG9mIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgIG1fcE9zYUZpbGVSZWFkZXJGY3RzOyAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucyAqLwotCi19IE00UkVBREVSX0FNUl9Db250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogcFJlYWRlckNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9jcmVhdGU6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBwUmVhZGVyQ29udGV4dCA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFJFQURFUl9BTVJfQ29udGV4dCksCi0gICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00UkVBREVSX0FNUl9Db250ZXh0Iik7Ci0gICAgaWYgKHBSZWFkZXJDb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1fcEF1ZGlvU3RyZWFtICA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fYXVkaW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fbWF4RHVyYXRpb24gPSAwOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BDb3JlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fcE9zYUZpbGVSZWFkZXJGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgICpwQ29udGV4dCA9IHBSZWFkZXJDb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGRlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgICBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZGVzdHJveShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEM9KE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2Rlc3Ryb3koKTogTTRSRUFERVJfQU1SX2Rlc3Ryb3k6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCxcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX1BBUkFNRVRFUiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGZyZWUocEMpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgb3BlbiB0aGUgcmVhZGVyIGFuZCBpbml0aWFsaXplcyBpdHMgY3JlYXRlZCBpbnN0YW5jZQotICogQG5vdGUgICAgIHRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIEFNUiBmaWxlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBGaWxlRGVzY3JpcHRvcjogICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX29wZW4oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICBlcnI7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9vcGVuOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX29wZW46IGludmFsaWQgcG9pbnRlciBwRmlsZURlc2NyaXB0b3IiKTsKLQotICAgIGVyciA9IE00QU1SUl9vcGVuUmVhZCggJnBDLT5tX3BDb3JlQ29udGV4dCwgcEZpbGVEZXNjcmlwdG9yLCBwQy0+bV9wT3NhRmlsZVJlYWRlckZjdHMpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNsb3NlIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRSRUFERVJfQU1SX2Nsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgIGVycjsKLSAgICBNNEFNUlJfU3RhdGUgU3RhdGU7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2Nsb3NlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2Nsb3NlKCk6IE00UkVBREVSX0FNUl9jbG9zZTogY29udGV4dCBpcyBNNE9TQV9OVUxMLFwKLSAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLAotICAgICAgICAgICAgICAgICgoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKS0+bV9zdHJlYW1JZCk7Ci0gICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2Nsb3NlOiBlcnJvciB3aGVuIGNhbGxpbmcgTTRBTVJSX2dldFN0YXRlXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoTTRBTVJSX2tSZWFkaW5nX25leHRBVSA9PSBTdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pLT5tX3N0cmVhbUlkLCAgJnBDLT5tX2F1ZGlvQXUpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfY2xvc2U6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIERlbGV0ZSB0aGUgRFNJIGlmIG5lZWRlZCAqLwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShcCi0gICAgICAgICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLQotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQ29yZUNvbnRleHQpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfY2xvc2VSZWFkKHBDLT5tX3BDb3JlQ29udGV4dCk7Ci0gICAgICAgIHBDLT5tX3BDb3JlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgbWVkaWEKLSAqIEBub3RlICAgIGN1cnJlbnQgdmVyc2lvbiBuZWVkcyB0byB0cmFuc2xhdGUgTTRTWVNfU3RyZWFtIHRvIE00X1N0cmVhbUhhbmRsZXIKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwTWVkaWFGYW1pbHk6ICAgKE9VVCkgIHBvaW50ZXIgdG8gYSB1c2VyIGFsbG9jYXRlZCBNNFJFQURFUl9NZWRpYUZhbWlseQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoT1VUKSAgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGFuZCBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gIG5vIG1vcmUgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgbWVkaWEgKGFsbCBzdHJlYW1zIGZvdW5kKQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBtb2RlIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRSRUFERVJfTWVkaWFGYW1pbHkgKnBNZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXJQYXJhbSkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQz0oTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gc3RyZWFtRGVzYzsKLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgIHBTdHJlYW1IYW5kbGVyOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBNZWRpYUZhbWlseSA9PSAwKSwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBNZWRpYUZhbWlseSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXJQYXJhbSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIGVyciA9IE00QU1SUl9nZXROZXh0U3RyZWFtKCBwQy0+bV9wQ29yZUNvbnRleHQsICZzdHJlYW1EZXNjKTsKLSAgICBpZiAoZXJyID09IE00V0FSX05PX01PUkVfU1RSRUFNKQotICAgIHsKLSAgICAgICAgc3RyZWFtSWRBcnJheVswXSA9IDA7Ci0gICAgICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotICAgICAgICBlcnIgPSBNNEFNUlJfc3RhcnRSZWFkaW5nKHBDLT5tX3BDb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSk7Ci0gICAgICAgIGlmICgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DID09IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOiBNNEFNUlJfc3RhcnRSZWFkaW5nIHJldHVybnMgTTRFUlJfQUxMT0MhIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbzsKLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXIgPSAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00X0F1ZGlvU3RyZWFtSGFuZGxlciIpOwotICAgIGlmIChwQXVkaW9TdHJlYW1IYW5kbGVyID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyID0oTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICpwU3RyZWFtSGFuZGxlclBhcmFtID0gcFN0cmVhbUhhbmRsZXI7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gcEF1ZGlvU3RyZWFtSGFuZGxlcjsKLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgLyoKLSAgICAgKiBBdWRpbyBzdHJlYW0gaGFuZGxlciBmaWVsZHMgYXJlIGluaXRpYWxpc2VkIHdpdGggMCB2YWx1ZS4KLSAgICAgKiBUaGV5IHdpbGwgYmUgcHJvcGVybHkgc2V0IGJ5IHRoZSBBTVIgZGVjb2RlcgotICAgICAqLwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICAgPSAwOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgICAgPSAwOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyAgICAgICAgPSAwOwotCi0gICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gICAgPSAoTTRPU0FfVUludDgqKShzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8pOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCAgICAgICAgICAgICAgICA9IHN0cmVhbURlc2Muc3RyZWFtSUQ7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24gICAgICAgICAgICAgICAgPSBzdHJlYW1EZXNjLmR1cmF0aW9uOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSAgICAgICAgICAgICAgID0gKHZvaWQqKShpbnRwdHJfdClzdHJlYW1EZXNjLnRpbWVTY2FsZTsgLyp0cmljayB0byBjaGFuZ2UqLwotCi0gICAgaWYgKHN0cmVhbURlc2MuZHVyYXRpb24gPiBwQy0+bV9tYXhEdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIHBDLT5tX21heER1cmF0aW9uID0gc3RyZWFtRGVzYy5kdXJhdGlvbjsKLSAgICB9Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fYXZlcmFnZUJpdFJhdGUgICAgICAgICAgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotCi0gICAgTTRBTVJSX2dldG1heEFVc2l6ZShwQy0+bV9wQ29yZUNvbnRleHQsICZwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemUpOwotCi0gICAgc3dpdGNoIChzdHJlYW1EZXNjLnN0cmVhbVR5cGUpCi0gICAgewotICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFNZU19rQU1SX1dCOgotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJXaWRlQmFuZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGFjY2VzcyB1bml0IHdpbGwgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0OiAgICAoSU4vT1VUKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5pdGlhbGl6ZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2ZpbGxBdVN0cnVjdDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQXUtPnNpemUgICAgICAgID0gMDsKLSAgICAvKiBKQzogYnVnIGZpeCAxMTk3IChzZXQgQ1RTIHRvIC0yMCBpbiBvcmRlciB0aGUgZmlyc3QgQVUgQ1RTIGlzIDApICovCi0gICAgcEF1LT5DVFMgICAgICAgICA9IC0yMDsKLSAgICBwQXUtPkRUUyAgICAgICAgID0gLTIwOwotICAgIHBBdS0+YXR0cmlidXRlICAgPSAwOwotICAgIHBBdS0+bmJGcmFnICAgICAgPSAwOwotCi0gICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSAgICAgICAgID0gMDsKLSAgICAvKiBKQzogYnVnIGZpeCAxMTk3IChzZXQgQ1RTIHRvIC0yMCBpbiBvcmRlciB0aGUgZmlyc3QgQVUgQ1RTIGlzIDApICovCi0gICAgcEFjY2Vzc1VuaXQtPm1fQ1RTICAgICAgICAgID0gLTIwOwotICAgIHBBY2Nlc3NVbml0LT5tX0RUUyAgICAgICAgICA9IC0yMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzICA9IE00T1NBX05VTEw7LypwQnVmZmVyOyovCi0gICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSAgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cnVjdFNpemUgICA9IHNpemVvZihNNF9BY2Nlc3NVbml0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIHJlYWRlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLSB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3Qgc3RyZWFtIG9mIHRoZSBtZWRpYQotICogICAgICAgICAgLSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHJlYWRlciAobm90IGltcGxlbWVudGVkIHlldCkKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIGdldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoT1VUKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKQotCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb24gOgotICAgICAgICB7Ci0gICAgICAgICAgICAqKE00T1NBX1RpbWUqKXBWYWx1ZSA9IHBDLT5tX21heER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwQml0cmF0ZSA9IChNNE9TQV9VSW50MzIqKXBWYWx1ZTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcEJpdHJhdGUgPSBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEJpdHJhdGUgPSAwOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1ZlcnNpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QU1SUl9nZXRWZXJzaW9uKChNNF9WZXJzaW9uSW5mbyopcFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIHNldCBlbiBvcHRpb24gdmFsdWUgb2YgdGhlIHJlYWRkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKiAgICAgICAgICAtIHRoZSBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChJTikgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgICAgIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKQotICAgIHsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5tX3BPc2FGaWxlUmVhZGVyRmN0cyA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKXBWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgcmVzZXQgdGhlIHN0cmVhbSwgdGhhdCBpcyBzZWVrIGl0IHRvIGJlZ2lubmluZyBhbmQgbWFrZSBpdCByZWFkeSB0byBiZSByZWFkCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGlzIHRvIGJlIGRlcHJlY2F0ZWQgaW4gbmV4dCB2ZXJzaW9ucwotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICogQHJldHVybiAgICBNNEVSUl9TVEFURSAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNFdBUl9JTlZBTElEX1RJTUUgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtIGNhbiBub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19TdHJlYW1JRCAgICAgICAgICBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVycjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgdGltZTY0ID0gMDsKLSAgICBNNEFNUlJfU3RhdGUgICAgICAgICAgICBTdGF0ZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSX0FNUl9yZXNldDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9yZXNldDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfcmVzZXQ6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCk7Ci0gICAgaWYgKE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPT0gU3RhdGUpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9yZXNldDogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0XG4iKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIGZvciByZXNldCBkdXJpbmcgcGxheWJhY2sgKi8KLSAgICAvKiAoc2V0IENUUyB0byAtMjAgaW4gb3JkZXIgdGhlIGZpcnN0IEFVIENUUyBpcyAwKSAqLwotICAgIHBBdS0+Q1RTID0gLTIwOwotICAgIHBBdS0+RFRTID0gLTIwOwotCi0gICAgZXJyID0gTTRBTVJSX3NlZWsocEMtPm1fcENvcmVDb250ZXh0LCBzdHJlYW1JZEFycmF5LCB0aW1lNjQsIE00U1lTX2tCZWdpbm5pbmcsICZ0aW1lNjQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfcmVzZXQ6IGVycm9yIHdoZW4gY2FsbGluZyBNNEFNUlJfc2VlaygpXG4iKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBqdW1wIGludG8gdGhlIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIHRpbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgIHRoZSBzdHJlYW0gZGVzY3JpcHRpb24gb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwVGltZSAgICAgICAgICAgIChJTi9PVVQpIElOOiAgdGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IHRoZSB0aW1lIHRvIHdoaWNoIHRoZSBzdHJlYW0gcmVhbGx5IGp1bXBlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNFdBUl9JTlZBTElEX1RJTUUgICAgICAgIHRoZSB0aW1lIGNhbiBub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcFRpbWUpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZTsKLSAgICBNNEFNUlJfU3RhdGUgICAgICAgICAgICBTdGF0ZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSX0FNUl9yZXNldDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9yZXNldDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBUaW1lID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl8zR1BfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfanVtcDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNEFNUlJfZ2V0U3RhdGUocEMtPm1fcENvcmVDb250ZXh0LCAmU3RhdGUsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkKTsKLSAgICBpZiAoTTRBTVJSX2tSZWFkaW5nX25leHRBVSA9PSBTdGF0ZSkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00QU1SUl9mcmVlQVUocEMtPm1fcENvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2p1bXA6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotICAgIGVyciA9IE00QU1SUl9zZWVrKHBDLT5tX3BDb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSwgdGltZTY0LCBNNFNZU19rTm9SQVBwcmV2aW91cywgJnRpbWU2NCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9qdW1wOiBlcnJvciB3aGVuIGNhbGxpbmcgTTRBTVJSX3NlZWsoKVxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKXRpbWU2NDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0cyBhbiBhY2Nlc3MgdW5pdCAoQVUpIGZyb20gdGhlIHN0cmVhbSBoYW5kbGVyIHNvdXJjZS4KLSAqIEBub3RlICAgIEFuIEFVIGlzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhbW91bnQgb2YgZGF0YSB0byBiZSBkZWNvZGVkIGJ5IGEgZGVjb2RlciAoYXVkaW8vdmlkZW8pLgotICogICAgICAgICAgSW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgd2UgbmVlZCB0byB0cmFuc2xhdGUgTTRPU0FfQWNjZXNzVW5pdCB0byBNNF9BY2Nlc3NVbml0Ci0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgKElOKSAgICAgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgIChJTi9PVVQpICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YSAodGhlIGF1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIsIGFuZCBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCBhZnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0gKiBAcmV0dXJuICAgIE00V0FSX05PX01PUkVfQVUgICAgICAgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0gKGVuZCBvZiBzdHJlYW0pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9nZXROZXh0QXUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgdGltZVNjYWxlOwotICAgIE00QU1SUl9TdGF0ZSAgICAgICAgICAgIFN0YXRlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0QXU6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgLyoga2VlcCB0cmFjZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gQVUgdG8gYmUgYWJsZSB0byBmcmVlIHRoZW0gYXQgZGVzdHJveSgpCi0gICAgICAgYnV0IGJlIGF3YXJlIHRoYXQgc3lzdGVtIGlzIHJpc2t5IGFuZCB3b3VsZCBuZWVkIHVwZ3JhZGUgaWYgbW9yZSB0aGFuCi0gICAgICAgb25lIHZpZGVvIGFuZCBvbmUgYXVkaW8gQVUgaXMgbmVlZGVkICovCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9nZXROZXh0QXU6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCk7Ci0gICAgaWYgKE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPT0gU3RhdGUpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FWSV9nZXROZXh0QXU6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHBBdS0+bmJGcmFnID0gMDsKLSAgICBlcnIgPSBNNEFNUlJfbmV4dEFVKHBDLT5tX3BDb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0KLSAgICBpZiAoZXJyID09IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICB0aW1lU2NhbGUgPSAoTTRPU0FfRmxvYXQpKE00T1NBX0ludDMyKShpbnRwdHJfdCkocFN0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhKS8xMDAwOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOClwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgID0gKE00X01lZGlhVGltZSlwQXUtPkNUUy8qL3RpbWVTY2FsZSovOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgID0gKE00X01lZGlhVGltZSlwQXUtPkRUUy8qL3RpbWVTY2FsZSovOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPSBwQXUtPmF0dHJpYnV0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZT0wOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgRVJSX0FMTE9DICAgICAgaWYgYW4gYWxsb2NhdGlvbiBmYWlsZWQKLSogICAgICAgICAgICBFUlJfUEFSQU1FVEVSICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFUeXBlID09IDApLCAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNZWRpYVR5cGUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJHbG9iYWxJbnRlcmZhY2UgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJkckRhdGFJbnRlcmZhY2UgPT0gMCksICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfRGF0YUludGVyZmFjZSIpOwotCi0gICAgKnBSZHJHbG9iYWxJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKSwKLSAgICAgICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00UkVBREVSX0dsb2JhbEludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckdsb2JhbEludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgICpwUmRyRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgKnBSZHJEYXRhSW50ZXJmYWNlID0gKE00UkVBREVSX0RhdGFJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0RhdGFJbnRlcmZhY2UpLAotICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9EYXRhSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJEYXRhSW50ZXJmYWNlKQotICAgIHsKLSAgICAgICAgZnJlZSgqcFJkckdsb2JhbEludGVyZmFjZSk7Ci0gICAgICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZUFNUjsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICAgICAgPSBNNFJFQURFUl9BTVJfZGVzdHJveTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RPcGVuICAgICAgICAgICAgID0gTTRSRUFERVJfQU1SX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfQU1SX2dldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfQU1SX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtICAgID0gTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW07Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ICAgICA9IE00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RhcnQgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgICA9IE00T1NBX05VTEw7IC8qYWxsIEFVcyBhcmUgUkFQKi8KLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0QXUgICAgICAgICAgPSBNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfUGNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5MjM2N2YuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYworKysgL2Rldi9udWxsCkBAIC0xLDcyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFJFQURFUl9XYXYuYwotICogQGJyaWVmICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgcGNtIHJlYWRlcgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZ2VuZXJpYyBNNFJFQURFUiBpbnRlcmZhY2UKLSAqICAgICAgICAgb24gdG9wIG9mIHRoZSBQQ00gcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0jaW5jbHVkZSAiTTRQQ01SX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9QY20uaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX1dBVl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiBhIHdhdiByZWFkZXIgaW5zdGFuY2UKLSAqIEBub3RlICAgICAgICBUaGUgY29udGV4dCBpcyBhbGxvY2F0ZWQgYW5kIGRlLWFsbG9jYXRlZCBieSB0aGUgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9QQ01fQ29udGV4dAotewotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fY29yZUNvbnRleHQ7ICAgICAgICAvKio8IGNvcmUgd2F2IHJlYWRlciBjb250ZXh0ICovCi0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgbV9wQXVkaW9TdHJlYW07ICAgICAgIC8qKjwgcG9pbnRlciBvbiB0aGUgYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgbV9hdWRpb0F1OyAgICAgICAgICAgIC8qKjwgYXVkaW8gYWNjZXNzIHVuaXQgdG8gYmUgZmlsbGVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgbV9wT3NhRmlsZVJlYWRlckZjdHM7IC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0KLX0gTTRSRUFERVJfUENNX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDcmVhdGVzIGEgd2F2IHJlYWRlciBpbnN0YW5jZQotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAoT1VUKSAgUG9pbnRlciB0byBhIHdhdiByZWFkZXIgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwUmVhZGVyQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocENvbnRleHQgPT0gMCksICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fY3JlYXRlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcFJlYWRlckNvbnRleHQgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRSRUFERVJfUENNX0NvbnRleHQpLAotICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9QQ01fQ29udGV4dCIpOwotICAgIGlmIChwUmVhZGVyQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tX2NvcmVDb250ZXh0ICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BBdWRpb1N0cmVhbSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX2F1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BPc2FGaWxlUmVhZGVyRmN0cyAgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0gcFJlYWRlckNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBEZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGUgY29udGV4dCBpcyB1bi1hbGxvY2F0ZWQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmcmVlKHBDKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEluaXRpYWxpemVzIHRoZSByZWFkZXIgaW5zdGFuY2UKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgICAoSU4pICAgIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwRmlsZURlc2NyaXB0b3I6ICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcikKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9vcGVuOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgZXJyID0gTTRQQ01SX29wZW5SZWFkKCYocEMtPm1fY29yZUNvbnRleHQpLCAoTTRPU0FfQ2hhciopcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBGcmVlIGF1ZGlvIEFVIGFuZCBhdWRpbyBzdHJlYW0gKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9hdWRpb0F1LmRhdGFBZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFBDTVJfZnJlZUFVKHBDLT5tX2NvcmVDb250ZXh0LCBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgICZwQy0+bV9hdWRpb0F1KTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2Nsb3NlOiBFcnJvciB3aGVuIGZyZWVpbmcgYXVkaW8gYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX2NvcmVDb250ZXh0KQotICAgIHsKLSAgICAgICAgLyogQ2xvc2UgdGhhIFBDTSBmaWxlICovCi0gICAgICAgZXJyID0gTTRQQ01SX2Nsb3NlUmVhZChwQy0+bV9jb3JlQ29udGV4dCk7Ci0gICAgICAgcEMtPm1fY29yZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIHZvaWQqIHBWYWx1ZSkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fc2V0T3B0aW9uOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX3NldE9wdGlvbjogaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyIDoKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopcFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJldHJpZXZlcyB0aGUgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIHJlYWRlciwgZ2l2ZW4gYW4gb3B0aW9uIElELgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBvcHRpb25JZDogKElOKSBvcHRpb24gaWRlbnRpZmljYXRvciB3aG9zZSBvcHRpb24gdmFsdWUgaXMgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtICAgcFZhbHVlOiAgKE9VVCkgb3B0aW9uIHZhbHVlIHJldHJpZXZlZC4KLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIHJlcXVpcmVkIG9wdGlvbiBpZGVudGlmaWNhdG9yIGlzIHVua25vd24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgdm9pZCogcFZhbHVlKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDb250ZXh0ID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciAgICAgID0gTTROT19FUlJPUjsKLQotICAgIC8qIG5vIGNoZWNrIG9mIGNvbnRleHQgYXQgdGhpcyBsZXZlbCBiZWNhdXNlIHNvbWUgb3B0aW9uIGRvZXMgbm90IG5lZWQgaXQgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBWYWx1ZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRPcHRpb246IGludmFsaWQgcG9pbnRlciBvbiB2YWx1ZSIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb246Ci0gICAgICAgICooKE00T1NBX1VJbnQzMiopcFZhbHVlKSA9IHBDb250ZXh0LT5tX3BBdWRpb1N0cmVhbS0+bV9kdXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICBlcnIgPSBNNFBDTVJfZ2V0VmVyc2lvbigoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0OgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcENvbnRleHQtPm1fcEF1ZGlvU3RyZWFtLT5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYQotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEBwYXJhbSAgIHBNZWRpYUZhbWlseTogICAoT1VUKSBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKE9VVCkgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgYW5kIGZpbGxlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGZvdW5kIHN0cmVhbSBkZXNjcmlwdGlvbgotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDPShNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0vKiAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICBwU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ki8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgZkR1cmF0aW9uOwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8qIHBEc2k7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ID09IDApLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhRmFtaWx5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotCi0gICAgZXJyID0gTTRQQ01SX2dldE5leHRTdHJlYW0oIHBDLT5tX2NvcmVDb250ZXh0LCAmc3RyZWFtRGVzYyk7Ci0gICAgaWYgKGVyciA9PSBNNFdBUl9OT19NT1JFX1NUUkVBTSkKLSAgICB7Ci0gICAgICAgIHN0cmVhbUlkQXJyYXlbMF0gPSAwOwotICAgICAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLSAgICAgICAgZXJyID0gTTRQQ01SX3N0YXJ0UmVhZGluZyhwQy0+bV9jb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSk7IC8qdG8gcHV0IGluIG9wZW4gZnVuY3Rpb24qLwotCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOyAvKmFsc28gcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNKi8KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbURlc2Muc3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0F1ZGlvVW5rbm93bjoKLSAgICAgICAgY2FzZSBNNFNZU19rUENNXzE2Yml0c1M6Ci0gICAgICAgIGNhc2UgTTRTWVNfa1BDTV8xNmJpdHNVOgotICAgICAgICBjYXNlIE00U1lTX2tQQ01fOGJpdHNVOgotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBmb3VuZCBhdWRpbyBzdHJlYW0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseVVua25vd247Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGZvdW5kIFVOS05PV04gc3RyZWFtIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLAotICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLSAgICBpZiAocEF1ZGlvU3RyZWFtSGFuZGxlciA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSAoTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgcERzaSA9IChNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwRHNpID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgZGVjb2RlciBzcGVjaWZpYyBpbmZvIGluIHN0cmVhbSIpOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IHBEc2ktPlNhbXBsZUZyZXF1ZW5jeTsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplICAgID0gKE00T1NBX1VJbnQzMikocERzaS0+Qml0c1BlclNhbXBsZS84KTsKLSAgICAvKiBtX2J5dGVGcmFtZUxlbmd0aCBpcyBiYWRseSBuYW1lZDogaXQgaXMgbm90IGluIGJ5dGVzIGJ1dCBpbiBzYW1wbGVzIG51bWJlciAqLwotICAgIGlmKHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPT0gODAwMCkKLSAgICB7Ci0gICAgICAgIC8qIEFNUiBjYXNlICovCi0gICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICAgPQotICAgICAgICAgICAgICgoKHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGUvOCkvNTApL3BEc2ktPm5iQ2hhbm5lbHMpXAotICAgICAgICAgICAgICAgIC9wQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplOy8qLzUwIHRvIGdldCBhcm91bmQgMjAgbXMgb2YgYXVkaW8qLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBBQUMgQ2FzZSAqLwotICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9Ci0gICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKChzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlLzgpLzE1LjYyNSkvcERzaS0+bmJDaGFubmVscylcCi0gICAgICAgICAgICAgICAgL3BBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemU7Ci0gICAgfQotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgICA9IHBEc2ktPm5iQ2hhbm5lbHM7Ci0KLSAgICBNNE9TQV9USU1FX1RPX01TKCBmRHVyYXRpb24sIHN0cmVhbURlc2MuZHVyYXRpb24sIHN0cmVhbURlc2MudGltZVNjYWxlKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fZHVyYXRpb24gICAgICAgICAgICAgICAgPSAoTTRPU0FfSW50MzIpZkR1cmF0aW9uOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyAgICA9IChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtSWQgICAgICAgICAgICAgICAgPSBzdHJlYW1EZXNjLnN0cmVhbUlEOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9wVXNlckRhdGEgICAgICAgICAgICAgICA9Ci0gICAgICAgICh2b2lkKikoaW50cHRyX3Qpc3RyZWFtRGVzYy50aW1lU2NhbGU7IC8qdHJpY2sgdG8gY2hhbmdlKi8KLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYXZlcmFnZUJpdFJhdGUgICAgICAgICAgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9tYXhBVVNpemUgICAgICAgICAgICAgICA9Ci0gICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCpwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplXAotICAgICAgICAgICAgKnBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVsczsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtVHlwZSAgICAgICAgICAgICAgPSBNNERBX1N0cmVhbVR5cGVBdWRpb1BjbTsKLQotICAgICpwU3RyZWFtSGFuZGxlciA9IHBDLT5tX3BBdWRpb1N0cmVhbTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6IChJTikgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2ggdGhlIGFjY2VzcyB1bml0IHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQ6ICAgIChJTikgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQXUtPnNpemUgICAgICAgID0gMDsKLSAgICBwQXUtPkNUUyAgICAgICAgID0gMDsKLSAgICBwQXUtPkRUUyAgICAgICAgID0gMDsKLSAgICBwQXUtPmF0dHJpYnV0ZSAgID0gMDsKLSAgICBwQXUtPm5iRnJhZyAgICAgID0gMDsKLQotICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fQ1RTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9EVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgID0gTTRPU0FfTlVMTDsvKnBCdWZmZXI7Ki8KLSAgICBwQWNjZXNzVW5pdC0+bV9tYXhzaXplICAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemU7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RyZWFtSUQgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RydWN0U2l6ZSAgID0gc2l6ZW9mKE00X0FjY2Vzc1VuaXQpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgcmVzZXQgdGhlIHN0cmVhbSwgdGhhdCBpczogc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYmUgcmVhZAotICogQG5vdGUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19TdHJlYW1JRCAgICAgICAgICBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVycjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICB0aW1lNjQgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfUENNX3Jlc2V0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9yZXNldDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00UENNUl9mcmVlQVUocEMtPm1fY29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fcmVzZXQ6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0KLSAgICBwQXUtPkNUUyA9IDA7Ci0gICAgcEF1LT5EVFMgPSAwOwotCi0gICAgLyogVGhpcyBjYWxsIGlzIG5lZWRlZCBvbmx5IHdoZW4gcmVwbGF5IGR1cmluZyBwbGF5YmFjayAqLwotICAgIGVyciA9IE00UENNUl9zZWVrKHBDLT5tX2NvcmVDb250ZXh0LCBzdHJlYW1JZEFycmF5LCB0aW1lNjQsIE00U1lTX2tCZWdpbm5pbmcsICZ0aW1lNjQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgdGhlIG5leHQgYWNjZXNzIHVuaXQgb2YgdGhlIHNwZWNpZmllZCBzdHJlYW0KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlciAgKElOKSAgICAgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdCAgICAgKElOL09VVCkgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBhdSBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBjYWxsaW5nIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QgYWZ0ZXIgY3JlYXRpb24pCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybnMgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybnMgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSAqIEByZXR1cm5zIE00V0FSX05PX0RBVEFfWUVUICAgICAgICAgICB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSBvbiB0aGUgc3RyZWFtIGZvciBuZXcgYWNjZXNzIHVuaXQKLSAqIEByZXR1cm5zIE00V0FSX05PX01PUkVfQVUgICAgICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRBdTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICAvKiBrZWVwIHRyYWNlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVycyBpbiBBVSB0byBiZSBhYmxlIHRvIGZyZWUgdGhlbSBhdCBkZXN0cm95KCkKLSAgICAgICBidXQgYmUgYXdhcmUgdGhhdCBzeXN0ZW0gaXMgcmlza3kgYW5kIHdvdWxkIG5lZWQgdXBncmFkZSBpZiBtb3JlIHRoYW4KLSAgICAgICBvbmUgdmlkZW8gYW5kIG9uZSBhdWRpbyBBVSBpcyBuZWVkZWQgKi8KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2dldE5leHRBdTogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00UENNUl9mcmVlQVUocEMtPm1fY29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgZXJyID0gTTRQQ01SX25leHRBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0KLSAgICBpZiAoZXJyID09IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOClwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgID0gKE00T1NBX0RvdWJsZSlwQXUtPkNUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fRFRTICA9IChNNE9TQV9Eb3VibGUpcEF1LT5EVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9IHBBdS0+YXR0cmlidXRlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplPTA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgICB0aGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgIHBUaW1lICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXQgaW4gdGhpcyByZWFkZXIsIHdlIGRvIG5vdCBtb2RpZnkgdGhlIHRpbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2p1bXAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgIHRpbWU2NDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSX1BDTV9qdW1wOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfUENNX2p1bXA6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0KLSAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fanVtcDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00UENNUl9mcmVlQVUocEMtPm1fY29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fanVtcDogRXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgZXJyID0gTTRQQ01SX3NlZWsocEMtPm1fY29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa0JlZ2lubmluZywgJnRpbWU2NCk7Ci0KLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgZ2VuZXJpYyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSByZWFkZXIKLSAqCi0gKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyCi0gKiBAcGFyYW0gcFJkckdsb2JhbEludGVyZmFjZSA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGdsb2JhbCBpbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSAqIEBwYXJhbSBwUmRyRGF0YUludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZGF0YSBpbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSAqCi0gKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0gKiAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0gKiAgICAgICAgICAgIEVSUl9QQVJBTUVURVIgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhVHlwZSA9PSAwKSwgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFUeXBlIHBhc3NlZCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJkckdsb2JhbEludGVyZmFjZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmRyRGF0YUludGVyZmFjZSA9PSAwKSwgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNNFJFQURFUl9EYXRhSW50ZXJmYWNlIik7Ci0KLSAgICAqcFJkckdsb2JhbEludGVyZmFjZSA9Ci0gICAgICAgICAoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UpLCBNNFJFQURFUl9XQVYsCi0gICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRSRUFERVJfUENNIEdsb2JhbEludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwUmRyR2xvYmFsSW50ZXJmYWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAqcFJkckRhdGFJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0RhdGFJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0RhdGFJbnRlcmZhY2UpLCBNNFJFQURFUl9XQVYsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSAiTTRSRUFERVJfUENNIERhdGFJbnRlcmZhY2UiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckRhdGFJbnRlcmZhY2UpCi0gICAgewotICAgICAgICBmcmVlKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZVBDTTsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICAgICAgPSBNNFJFQURFUl9QQ01fZGVzdHJveTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RPcGVuICAgICAgICAgICAgID0gTTRSRUFERVJfUENNX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgICAgICA9IE00UkVBREVSX1BDTV9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdGFydCAgICAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdG9wICAgICAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfUENNX2dldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfUENNX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtICAgID0gTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW07Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ICAgICA9IE00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgICAgICA9IE00UkVBREVSX1BDTV9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgICA9IE00T1NBX05VTEw7IC8qYWxsIEFVcyBhcmUgUkFQKi8KLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0QXUgICAgICAgICAgPSBNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiODM5NTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk00VkRfVG9vbHMuaCIKLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLSNpbmNsdWRlICJPTVhfVmlkZW8uaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jCi0gKiBAYnJpZWYKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZXh0ZXJuYWwgQml0c3RyZWFtIHBhcnNlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50OCBjb2RlOwotICAgIE00T1NBX0ludDMyIHByb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgbGV2ZWw7Ci19IGNvZGVQcm9maWxlTGV2ZWw7Ci0KLXN0YXRpYyBjb2RlUHJvZmlsZUxldmVsIG1wZWc0UHJvZmlsZUxldmVsVGFibGVbXSA9IHsKLSAgICB7MHgwMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHgwMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHgwMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHgwNCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0YX0sCi0gICAgezB4MDUsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNX0sCi0gICAgezB4MDgsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMH0sCi0gICAgezB4MTEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSxPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDEyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHgyMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4MjIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDMyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHgzMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4sIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4MzQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAotICAgIHsweDQyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlTmJpdCwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHg1MSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNjYWxhYmxlVGV4dHVyZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHg2MSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZhY2UsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4NjIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDcxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHg3MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4ODEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVIeWJyaWQsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4ODIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVIeWJyaWQsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4OTEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDkyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHg5MywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4OTQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAotICAgIHsweGExLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGEyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGEzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweGIxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4YjIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHhiMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweGI0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsIE9NWF9WSURFT19NUEVHNExldmVsNH0sCi0gICAgezB4YzEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4YzIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4ZDEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGQyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHhkMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4ZjAsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwfSwKLSAgICB7MHhmMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGYyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4ZjMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhmNCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAotICAgIHsweGY1LCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNX0KLX07Ci0KLU00T1NBX1VJbnQzMiBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KE00VlNfQml0c3RyZWFtX2N0eHQqIHBhcnNpbmdDdHh0LAotICAgICBNNE9TQV9VSW50MzIgbmJfYml0cykKLXsKLSAgICAgICAgcmV0dXJuKE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkocGFyc2luZ0N0eHQsbmJfYml0cykpOwotfQotCi1NNE9TQV9FUlIgTTRWRF9FWFRFUk5BTF9Xcml0ZUJpdHNUb01lbW9yeShNNE9TQV9VSW50MzIgYml0c1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjMyIGRlc3RfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBvZmZzZXQsIE00T1NBX1VJbnQ4IG5iX2JpdHMpCi17Ci0gICAgICAgIHJldHVybiAoTTRWRF9Ub29sc19Xcml0ZUJpdHNUb01lbW9yeSggYml0c1RvV3JpdGUsZGVzdF9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCAgbmJfYml0cykpOwotfQotCi1NNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0koTTRPU0FfVUludDgqIHBWb2wsIE00T1NBX0ludDMyIGFWb2xTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKiBwRGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvU2l6ZSogcFZpZGVvU2l6ZSkKLXsKLSAgICBNNFZTX0JpdHN0cmVhbV9jdHh0IHBhcnNpbmdDdHh0OwotICAgIE00T1NBX1VJbnQzMiBjb2RlLCBqOwotICAgIE00T1NBX01lbUFkZHI4IHN0YXJ0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0gICAgTTRPU0FfVUludDMyIHRpbWVfaW5jcl9sZW5ndGg7Ci0gICAgTTRPU0FfVUludDggdm9sX3ZlcmlkPTAsIGJfaGllcmFyY2h5X3R5cGU7Ci0KLSAgICAvKiBQYXJzaW5nIHZhcmlhYmxlcyAqLwotICAgIE00T1NBX1VJbnQ4IHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2VuYWJsZSA9IDA7Ci0gICAgTTRPU0FfVUludDggcmVkdWNlZF9yZXNvbHV0aW9uX3ZvcF9lbmFibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNjYWxhYmlsaXR5ID0gMDsKLSAgICBNNE9TQV9VSW50OCBlbmhhbmNlbWVudF90eXBlID0gMDsKLSAgICBNNE9TQV9VSW50OCBjb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSA9IDA7Ci0gICAgTTRPU0FfVUludDggaW50ZXJsYWNlZCA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX3dhcnBpbmdfcG9pbnRzID0gMDsKLSAgICBNNE9TQV9VSW50OCBzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSAwOwotICAgIE00T1NBX1VJbnQ4IHF1YW50X3ByZWNpc2lvbiA9IDA7Ci0KLSAgICAvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KLSAgICBwVmlkZW9TaXplLT5tX3VpV2lkdGggICAgICAgICAgICAgID0gMDsKLSAgICBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0ICAgICAgICAgICAgID0gMDsKLQotICAgIHBEY2ktPnVpVGltZVNjYWxlICAgICAgICAgID0gMDsKLSAgICBwRGNpLT51aVByb2ZpbGUgICAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAwOwotICAgIHBEY2ktPmJEYXRhUGFydGl0aW9uICAgICAgID0gTTRPU0FfRkFMU0U7Ci0gICAgcERjaS0+YlVzZU9mUlZMQyAgICAgICAgICAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIFJlc2V0IHRoZSBiaXRzdHJlYW0gY29udGV4dCAqLwotICAgIHBhcnNpbmdDdHh0LnN0cmVhbV9ieXRlID0gMDsKLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXggPSA4OwotICAgIHBhcnNpbmdDdHh0LmluID0gKE00T1NBX0ludDggKilwVm9sOwotCi0gICAgc3RhcnQgPSAoTTRPU0FfSW50OCAqKXBWb2w7Ci0KLSAgICAvKiBTdGFydCBwYXJzaW5nICovCi0gICAgd2hpbGUgKHBhcnNpbmdDdHh0LmluIC0gc3RhcnQgPCBhVm9sU2l6ZSkKLSAgICB7Ci0gICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGNvZGUgZm91bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweDIwLi4weDJGIDogdmlkZW9fb2JqZWN0X2xheWVyX3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPiAweDFGKSAmJiAoY29kZSA8IDB4MzApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiByYW5kb20gYWNjZXNzaWJsZSB2b2wgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOy8qIHZpZGVvIG9iamVjdCB0eXBlIGluZGljYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGlzIG9iamVjdCBsYXllciBpZGVudGlmaWVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsgLyogdmlkZW8gb2JqZWN0IGxheWVyIHZlcmlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpOyAvKiB2aWRlbyBvYmplY3QgbGF5ZXIgcHJpb3JpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOy8qIGFzcGVjdCByYXRpbyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMTUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsgLyogcGFyX3dpZHRoIGFuZCBwYXJfaGVpZ2h0ICg4KzgpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiB2b2wgY29udHJvbCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsvKiBjaHJvbWEgZm9ybWF0ICsgbG93IGRlbGF5ICgzKzEpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHZidiBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpOy8qIGZpcnN0IGFuZCBsYXR0ZXIgaGFsZiBiaXRyYXRlICsgMiBtYXJrZXIgYml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTUgKyAxICsgMTUgKyAxKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxKTsvKiBmaXJzdCBhbmQgbGF0dGVyIGhhbGYgdmJ2IGJ1ZmZlciBzaXplICsgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbGYgdmJ2IG9jY3VwYW5jeSArIG1hcmtlciBiaXRzICgxNSsxKzMrMTErMSkqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsvKiBmaXJzdCBoYWxmIHZidiBvY2N1cGFuY3kgKyBtYXJrZXIgYml0cyAoMTUrMSkqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOyAvKiB2aWRlbyBvYmplY3QgbGF5ZXIgc2hhcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gc2F2ZSBpdCBmb3Igdm9wIHBhcnNpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IChNNE9TQV9VSW50OCljb2RlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAwKSByZXR1cm4gMDsgLyogb25seSByZWN0YW5ndWxhciBjYXNlIHN1cHBvcnRlZCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsgLyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOyAvKiBWT1AgdGltZSBpbmNyZW1lbnQgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlUaW1lU2NhbGUgPSBjb2RlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wdXRlcyB0aW1lIGluY3JlbWVudCBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGogICAgPSBjb2RlIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgMzIpICYmIChqICE9IDApOyBqID4+PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9pbmNyX2xlbmd0aCA9IChpID09IDApID8gMSA6IGk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIEZpeGVkIFZPUCByYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2luY3JfbGVuZ3RoKTsvKiBGaXhlZCBWT1AgdGltZSBpbmNyZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlICE9IDEpIC8qIDEgPSBCaW5hcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMCkgLyogMCA9IHJlY3Rhbmd1bGFyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyk7LyogV2lkdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIEhlaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0ID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBpbnRlcmxhY2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxhY2VkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBPQk1DIGRpc2FibGUgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodm9sX3ZlcmlkID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHNwcml0ZSBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOy8qIHNwcml0ZSBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNwcml0ZV9lbmFibGUgPT0gMSkgfHwgKHNwcml0ZV9lbmFibGUgPT0gMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTcHJpdGUgc3RhdGljID0gMSBhbmQgU3ByaXRlIEdNQyA9IDIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgd2lkdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIHNwcml0ZSBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIHNwcml0ZSBsIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIHNwcml0ZSB0b3AgY29vcmRpbmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNik7Lyogc3ByaXRlIHdhcnBpbmcgcG9pbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX3dhcnBpbmdfcG9pbnRzID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOy8qIHNwcml0ZSB3YXJwaW5nIGFjY3VyYWN5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHNwcml0ZSBicmlnaHRuZXNzIGNoYW5nZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcHJpdGVfZW5hYmxlICE9IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBsb3cgbGF0ZW5jeSBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2b2xfdmVyaWQgIT0gMSkgJiYgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHNhZGN0IGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsgLyogbm90IDggYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOy8qIHF1YW50IHByZWNpc2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50X3ByZWNpc2lvbiA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCk7LyogYml0cyBwZXIgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JleXNjYWxlIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsgLyogbm9ncmF5IHF1YW50IHVwZGF0ZSArIGNvbXBvc2l0aW9uIG1ldGhvZCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVhciBjb21wb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcXVhbnQgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBsb2FkIGludHJhIHF1YW50IG1hdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsvKiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBsb2FkIG5vbiBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7LyogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbF92ZXJpZCAhPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBxdWFydGVyIHNhbXBsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogY29tcGxleGl0eSBlc3RpbWF0aW9uIGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcmVzeW5jIG1hcmtlciBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT51aVVzZU9mUmVzeW5jaE1hcmtlciA9IChjb2RlKSA/IDAgOiAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogZGF0YSBwYXJ0aXRpb25uZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPmJEYXRhUGFydGl0aW9uID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV2ZXJzaWJsZSBWTEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPmJVc2VPZlJWTEMgPSAoY29kZSkgPyBNNE9TQV9UUlVFIDogTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2xfdmVyaWQgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIG5ld3ByZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVkdWNlZCByZXNvbHV0aW9uIHZvcCBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Lyogc2NhbGFiaWxpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmlsaXR5ID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaWVyYXJjaHkgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYl9oaWVyYXJjaHlfdHlwZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZiBsYXllciBpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVmIHNhbXBsaW5nIGRpcmVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaG9yIHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBob3Igc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuaGFuY2VtZW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VtZW50X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFiX2hpZXJhcmNoeV90eXBlKSAmJiAodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHJlZiBzaGFwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgcmVmIHRleHR1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcGUgaG9yIHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXBlIGhvciBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXBlIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4QjAgOiB2aXN1YWxfb2JqZWN0X3NlcXVlbmNlX3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvZGUgPT0gMHhCMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpUHJvZmlsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHhCNSA6IHZpc3VhbF9vYmplY3Rfc3RhcnRfY29kZSAtLS0tLSAqLwotCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoY29kZSA9PSAweEI1KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyBvYmplY3QgbGF5ZXIgaWRlbnRpZmllciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpc3VhbCBvYmplY3QgdmVyaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aXN1YWwgb2JqZWN0IGxheWVyIHByaW9yaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhbGlnbiBvbiBieXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gZW5kIC0tLS0tICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoY29kZSA+PiAyKSA9PSAweDIwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBIMjYzIC4uLi0+IHdyb25nKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBnZXRBVkNQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDgqIHBEU0ksIE00T1NBX0ludDMyIERTSVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKSB7Ci0KLSAgICBNNE9TQV9VSW50MTYgaW5kZXggPSAyODsgLyogdGhlIDI5dGggYnl0ZSBpcyBTUFMgc3RhcnQgKi8KLSAgICBNNE9TQV9Cb29sIGNvbnN0cmFpbnRTZXQzOwotCi0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKChEU0lTaXplIDw9IGluZGV4KSB8fCAocERTSSA9PSBNNE9TQV9OVUxMKSkgewotICAgICAgICBBTE9HRSgiZ2V0QVZDUHJvZmlsZUFuZExldmVsOiBEU0kgaXMgaW52YWxpZCIpOwotICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgICAgICpwTGV2ZWwgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGNvbnN0cmFpbnRTZXQzID0gKHBEU0lbaW5kZXgrMl0gJiAweDEwKTsKLSAgICBBTE9HVigiZ2V0QVZDUHJvZmlsZUFuZExldmVsIHByb2ZpbGVfYnl0ZSAlZCwgbGV2ZWxfYnl0ZTogJWQgY29uc3RyYWluM2ZsYWc6ICVkIiwKLSAgICAgICAgICBwRFNJW2luZGV4KzFdLCBwRFNJW2luZGV4KzNdLCBjb25zdHJhaW50U2V0Myk7Ci0KLSAgICBzd2l0Y2ggKHBEU0lbaW5kZXgrMV0pIHsKLSAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVFeHRlbmRlZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIyOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDQ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwRFNJW2luZGV4KzNdKSB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRTZXQzKQotICAgICAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxYjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDEzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDIxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0MTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDUxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICB9Ci0gICAgQUxPR1YoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlICUiIFBSSWQzMiAiIGxldmVsICUiIFBSSWQzMiwKLSAgICAgICAgICAqcFByb2ZpbGUsICpwTGV2ZWwpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCogcERTSSwgTTRPU0FfSW50MzIgRFNJU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpIHsKLQotICAgIE00T1NBX1VJbnQxNiBpbmRleCA9IDc7IC8qIHRoZSA1dGggYW5kIDZ0aCBieXRlcyBjb250YWluIHRoZSBsZXZlbCBhbmQgcHJvZmlsZSAqLwotCi0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIGludmFsaWQgcG9pbnRlciBmb3IgcFByb2ZpbGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoKERTSVNpemUgPCBpbmRleCkgfHwgKHBEU0kgPT0gTTRPU0FfTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImdldEgyNjNQcm9maWxlQW5kTGV2ZWw6IERTSSBpcyBpbnZhbGlkIik7Ci0gICAgICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAgICAgKnBMZXZlbCA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIHByb2ZpbGVfYnl0ZSAlZCwgbGV2ZWxfYnl0ZSAlZCIsCi0gICAgICAgICAgcERTSVs2XSwgcERTSVs1XSk7Ci0gICAgLyogZ2V0IHRoZSBIMjYzIGxldmVsICovCi0gICAgc3dpdGNoIChwRFNJWzVdKSB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDMwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQ1OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDUwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDcwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICpwTGV2ZWwgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIH0KLQotICAgIC8qIGdldCBIMjYzIHByb2ZpbGUgKi8KLSAgICBzd2l0Y2ggKHBEU0lbNl0pIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSDMyMENvZGluZzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybmV0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybGFjZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIHByb2ZpbGUgJSIgUFJJZDMyICIgbGV2ZWwgJSIgUFJJZDMyLAotICAgICAgICAgICpwUHJvZmlsZSwgKnBMZXZlbCk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCBwcm9maWxlQW5kTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKSB7Ci0KLSAgICBNNE9TQV9VSW50MzIgaSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCBwcm9maWxlQW5kTGV2ZWwgJWQiLCBwcm9maWxlQW5kTGV2ZWwpOwotICAgIGxlbmd0aCA9IHNpemVvZihtcGVnNFByb2ZpbGVMZXZlbFRhYmxlKSAvc2l6ZW9mKG1wZWc0UHJvZmlsZUxldmVsVGFibGVbMF0pOwotICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKG1wZWc0UHJvZmlsZUxldmVsVGFibGVbaV0uY29kZSA9PSBwcm9maWxlQW5kTGV2ZWwpIHsKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IG1wZWc0UHJvZmlsZUxldmVsVGFibGVbaV0ucHJvZmlsZTsKLSAgICAgICAgICAgICpwTGV2ZWwgPSBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW2ldLmxldmVsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoImdldE1QRUc0UHJvZmlsZUFuZExldmVsIHByb2ZpbGUgJSIgUFJJZDMyICIgbGV2ZWwgJSIgUFJJZDMyLAotICAgICAgICAgICpwUHJvZmlsZSwgKnBMZXZlbCk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfVG9vbHMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZGI0YjQxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFZEX1Rvb2xzLmMKLSAqIEBicmllZgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBoZWxwZXIgZnVuY3Rpb25zIGZvciBCaXRzdHJlYW0gcGFyc2VyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfVUludDMyIE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkoTTRWU19CaXRzdHJlYW1fY3R4dCogcGFyc2luZ0N0eHQsCi0gICAgIE00T1NBX1VJbnQzMiBuYl9iaXRzKQotewotICAgIE00T1NBX1VJbnQzMiAgICBjb2RlOwotICAgIE00T1NBX1VJbnQzMiAgICBpOwotICAgIGNvZGUgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9iaXRzOyBpKyspCi0gICAgewotICAgICAgICBpZiAocGFyc2luZ0N0eHQtPnN0cmVhbV9pbmRleCA9PSA4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL000T1NBX21lbWNweSggKE00T1NBX01lbUFkZHI4KSYocGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlKSwgcGFyc2luZ0N0eHQtPmluLAotICAgICAgICAgICAgLy8gICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7Ci0gICAgICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPSAodW5zaWduZWQgY2hhcikocGFyc2luZ0N0eHQtPmluKVswXTsKLSAgICAgICAgICAgIHBhcnNpbmdDdHh0LT5pbisrOwotICAgICAgICAgICAgLy9mcmVhZCgmc3RyZWFtX2J5dGUsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwxLGluKTsKLSAgICAgICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGNvZGUgPSAoY29kZSA8PCAxKTsKLSAgICAgICAgY29kZSB8PSAoKHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSAmIDB4ODApID4+IDcpOwotCi0gICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSA9IChwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPDwgMSk7Ci0gICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXgrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29kZTsKLX0KLQotTTRPU0FfRVJSIE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoTTRPU0FfVUludDMyIGJpdHNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKQotewotICAgIE00T1NBX1VJbnQ4IGksajsKLSAgICBNNE9TQV9VSW50MzIgdGVtcF9kZXN0ID0gMCwgbWFzayA9IDAsIHRlbXAgPSAxOwotICAgIE00T1NBX1VJbnQzMiBpbnB1dCA9IGJpdHNUb1dyaXRlOwotICAgIGlucHV0ID0gKGlucHV0IDw8ICgzMiAtIG5iX2JpdHMgLSBvZmZzZXQpKTsKLQotICAgIC8qIFB1dCBkZXN0aW5hdGlvbiBidWZmZXIgdG8gMCAqLwotICAgIGZvcihqPTA7ajwzO2orKykKLSAgICB7Ci0gICAgICAgIGZvcihpPTA7aTw4O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKGoqOCkraSA+PSBvZmZzZXQgJiYgKGoqOCkraSA8IG5iX2JpdHMgKyBvZmZzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWFzayB8PSAodGVtcCA8PCAoKDcqKGorMSkpLWkraikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1hc2sgPSB+bWFzazsKLSAgICAqZGVzdF9iaXRzICY9IG1hc2s7Ci0KLSAgICAvKiBQYXJzZSBpbnB1dCBiaXRzLCBhbmQgZmlsbCBvdXRwdXQgYnVmZmVyICovCi0gICAgZm9yKGo9MDtqPDM7aisrKQotICAgIHsKLSAgICAgICAgZm9yKGk9MDtpPDg7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoaio4KStpID49IG9mZnNldCAmJiAoaio4KStpIDwgbmJfYml0cyArIG9mZnNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKChpbnB1dCAmICgweDgwMDAwMDAwID4+IG9mZnNldCkpID4+ICgzMS1vZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAvLypkZXN0X2JpdHMgfD0gKHRlbXAgPDwgKDMxIC0gaSkpOwotICAgICAgICAgICAgICAgICpkZXN0X2JpdHMgfD0gKHRlbXAgPDwgKCg3KihqKzEpKS1pK2opKTsKLSAgICAgICAgICAgICAgICBpbnB1dCA9IChpbnB1dCA8PCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmJiNDZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMC5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgQ29sb3IgQ29udmVyc2lvbiBGaWx0ZXIKLSAqICAgICAgICAgICAtIyBDb250YWlucyB0aGUgZm9ybWF0IGNvbnZlcnNpb24gZmlsdGVycyBmcm9tIFJHQjU2NSB0byBZVVY0MjAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgdHJhbnNmb3JtIFJHQjU2NSBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBub3RlICAgIENvbnZlcnQgUkdCNTY1IHRvIFlVVjQyMCwKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICogICAgICAgICAgICAgICAgICBHZXQgNCBSR0Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICogICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICogICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBTcGVjaWZpYyBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFJHQjU2NSBQbGFuZQotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvICBZVVY0MjAgYnVmZmVyIFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IFlVViBQbGFuZSBoZWlnaHQgaXMgT0RECi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIFlVViBQbGFuZSB3aWR0aCBpcyBPREQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotICAgIE00VklGSV9VSW50OCBjb3VudF9udWxsPTA7Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgaGVpZ2h0IGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfaGVpZ2h0ICE9IHBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0PDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBsYW5lcyB3aWR0aCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X3dpZHRoICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsyXS51X3dpZHRoPDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfeV9kYXRhID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfcmdibl9kYXRhICAgPSBwUGxhbmVJbi0+cGFjX2RhdGEgKyBwUGxhbmVJbi0+dV90b3BsZWZ0OwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlMl9ZID0gdTMyX3N0cmlkZV9ZIDw8IDE7Ci0gICAgdTMyX3N0cmlkZV9VID0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IHBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlXzJyZ2IgPSB1MzJfc3RyaWRlX3JnYiA8PCAxOwotCi0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X3JnYm4gPSBwdThfcmdibl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBSR0IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9yZ2JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0KLSAgICAgICAgICAgIC8qIFVucGFjayBSR0I1NjUgdG8gOGJpdCBSLCBHLCBCICovCi0gICAgICAgICAgICAvKiAoeCx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCx1MTZfcGl4MSk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTAsaTMyX2cxMCxpMzJfcjEwLHUxNl9waXgyKTsKLSAgICAgICAgICAgIC8qICh4LHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsdTE2X3BpeDMpOwotICAgICAgICAgICAgLyogKHgrMSx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTEsaTMyX2cxMSxpMzJfcjExLHUxNl9waXg0KTsKLSAgICAgICAgICAgIC8qIElmIFJHQiBpcyB0cmFuc3BhcmVudCBjb2xvciAoMCwgNjMsIDApLCB3ZSB0cmFuc2Zvcm0gaXQgdG8gd2hpdGUgKDMxLDYzLDMxKSAqLwotICAgICAgICAgICAgaWYoaTMyX2IwMCA9PSAwICYmIGkzMl9nMDAgPT0gNjMgJiYgaTMyX3IwMCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDAgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAwID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjEwID09IDAgJiYgaTMyX2cxMCA9PSA2MyAmJiBpMzJfcjEwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IxMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMTAgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMDEgPT0gMCAmJiBpMzJfZzAxID09IDYzICYmIGkzMl9yMDEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMSA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IxMSA9PSAwICYmIGkzMl9nMTEgPT0gNjMgJiYgaTMyX3IxMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMTEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjExID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiB2YWx1ZSB0byBZVVYgKi8KLSAgICAgICAgICAgIGkzMl91MDAgPSBVMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfdjAwID0gVjE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAwID0gWTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMCA9IFkxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDEgPSBZMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTExID0gWTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotCi0gICAgICAgICAgICAvKiBTdG9yZSBsdW1pbmFuY2UgZGF0YSAqLwotICAgICAgICAgICAgcHU4X3luWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAwOwotICAgICAgICAgICAgcHU4X3luWzFdID0gKE00VklGSV9VSW50OClpMzJfeTEwOwotICAgICAgICAgICAgcHU4X3lzWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAxOwotICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotICAgICAgICAgICAgKnB1OF91ID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICpwdThfdiA9IChNNFZJRklfVUludDgpKChpMzJfdjAwICsgaTMyX3YwMSArIGkzMl92MTAgKyBpMzJfdjExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IGNvbHVtbiAqLwotICAgICAgICAgICAgcHU4X3JnYm4gKz0gKENTVF9SR0JfMTZfU0laRTw8MSk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgY3VycmVudCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeW4gKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95cyArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIFUgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgLyogVXBkYXRlIFYgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF92ICsrOwotICAgICAgICB9IC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgLyogUHJlcGFyZSBwb2ludGVycyBmb3IgdGhlIG5leHQgcm93ICovCi0gICAgICAgIHB1OF95X2RhdGEgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgKz0gdTMyX3N0cmlkZV9WOwotICAgICAgICBwdThfcmdibl9kYXRhICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0vKiBFbmQgb2YgZmlsZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQXVkaW9NaXhpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmYwYmMwNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGF1ZGlvIG1peGluZyBpbXBsZW1lbnRhdGlvbi4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0KLS8qIFB1dCB0aGUgZGVmaW5pdGlvbiBvZiBzaWxlbmNlIGZyYW1lcyBoZXJlICovCi0jZGVmaW5lIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIgotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFN0YXRpYyBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbiggTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKnBTZXR0aW5ncyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfQm9vbCBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCggTTRPU0FfSW50MzIgKmF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSApOwotLyoqCi0gKiAgICBJbnRlcm5hbCB3YXJuaW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMzApCi0KLS8qIEEgZGVmaW5lIHVzZWQgd2l0aCBTU1JDIDEuMDQgYW5kIGFib3ZlIHRvIGF2b2lkIHRha2luZwotYmxvY2tzIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1hbCBibG9jayBzaXplICovCi0jZGVmaW5lIE00VlNTX1NTUkNfTUlOQkxPQ0tTSVpFICAgICAgICA2MDAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKnBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEM7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwU2V0dGluZ3M9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcEZpbGVXcml0ZVB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggcFNldHRpbmdzLT51aUJlZ2luTG9vcCA+IHBTZXR0aW5ncy0+dWlFbmRMb29wICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQ6IEJlZ2luIGxvb3AgdGltZSBpcyBoaWdoZXIgdGhhbiBlbmQgbG9vcCB0aW1lISIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSJNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoKTogdW5hYmxlIHRvIGFsbG9jYXRlIFwKLSAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCxyZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcEMgLDAsCi0gICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQpKTsKLSAgICAvKioKLSAgICAqIENvcHkgdGhpcyBzZXR0aW5nIGluIGNvbnRleHQgKi8KLSAgICBwQy0+aUFkZEN0cyA9IHBTZXR0aW5ncy0+dWlBZGRDdHM7Ci0gICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IHBTZXR0aW5ncy0+YlJlbW92ZU9yaWdpbmFsOwotICAgIHBDLT5iX0R1Y2tpbmdOZWVkZWVkID0gcFNldHRpbmdzLT5iX0R1Y2tpbmdOZWVkZWVkOwotICAgIHBDLT5JbkR1Y2tpbmdfdGhyZXNob2xkID0gcFNldHRpbmdzLT5JbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIHBDLT5mQlRWb2xMZXZlbCA9IHBTZXR0aW5ncy0+ZkJUVm9sTGV2ZWw7Ci0gICAgcEMtPmZQVFZvbExldmVsID0gcFNldHRpbmdzLT5mUFRWb2xMZXZlbDsKLSAgICBwQy0+SW5EdWNraW5nX2xvd1ZvbHVtZSA9IHBTZXR0aW5ncy0+SW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBwQy0+YkRvRHVja2luZyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iTG9vcCA9IHBTZXR0aW5ncy0+Ykxvb3A7Ci0gICAgcEMtPmJOb0xvb3BpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+Ymp1bXBmbGFnID0gTTRPU0FfVFJVRTsKLSAgICAvKioKLSAgICAqIEluaXQgc29tZSBjb250ZXh0IHZhcmlhYmxlcyAqLwotCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFkZGVkQ2xpcEN0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5mT3JpZ0ZhY3RvciA9IDEuMEY7Ci0gICAgcEMtPmZBZGRlZEZhY3RvciA9IDAuMEY7Ci0gICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iSGFzQXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEluaXQgUEMtPmV3YyBtZW1iZXJzICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9IDE7Ci0gICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5wQXVkaW9FbmNEU0kucEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEVuY0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucER1bW15QXVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBTZXQgdGhlIE9TQUwgZmlsZXN5c3RlbSBmdW5jdGlvbiBzZXQgKi8KLSAgICBwQy0+cE9zYUZpbGVSZWFkUHRyID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIgPSBwRmlsZVdyaXRlUHRyRmN0OwotCi0gICAgLyoqCi0gICAgKiBTc3JjIHN0dWZmICovCi0gICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVGVtcEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+U3NyY1NjcmF0Y2ggPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aUJlZ2luTG9vcCA9IHBTZXR0aW5ncy0+dWlCZWdpbkxvb3A7Ci0gICAgcEMtPnVpRW5kTG9vcCA9IHBTZXR0aW5ncy0+dWlFbmRMb29wOwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIE9wZW4gaW5wdXQgY2xpcCwgYWRkZWQgY2xpcCBhbmQgb3V0cHV0IGNsaXAgYW5kIHByb2NlZWQgd2l0aCB0aGUgc2V0dGluZ3MgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKHBDLCBwU2V0dGluZ3MpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgbWFpbiBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTzsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOwotCi0gICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gPSAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICBDbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAvKmdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50Ki8KLSAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKDE2LAotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzLAotICAgICAgICAvKiBnSW5wdXRQYXJhbXMubHZPdXRTYW1wbGVSYXRlKi8oTTRPU0FfSW50MzIpcFNldHRpbmdzLT5vdXRwdXRBU0YsIDEpOwotICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cExWQXVkaW9SZXNhbXBsZXIgKQotICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgIH0KLSAgICAgICAgTFZBdWRpb3NldFNhbXBsZVJhdGUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAotICAgICAgICAvKmdJbnB1dFBhcmFtcy5sdkluU2FtcGxlUmF0ZSovCi0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgIExWQXVkaW9zZXRWb2x1bWUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMCApLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMCApKTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpbyBtaXhpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dCAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHBhcmFtICAgICBwUHJvZ3Jlc3MgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGZpbmFsaXphdGlvbiBvcGVyYXRpb24KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOiBBdWRpbyBtaXhpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93IGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwKLSAgICAgICAgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyhwQyk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBwcm9ncmVzcyBwZXJjZW50YWdlCi0gICAgICAgICAgICAqIE5vdGU6IGF1ZGlvIGFuZCB2aWRlbyBDVFMgYXJlIG5vdCBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgICAgICogdGhlIGNhbGwgb2YgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvICovCi0KLSAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogRmlyc3QgMC01MCUgc2VnbWVudCBpcyBkZWRpY2F0ZWQgdG8gc3RhdGUgOgotICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX1ZJREVPICovCi0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSg1MCAqIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuQ1RTKQotICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlcmUgbWF5IGJlIG5vIGF1ZGlvIHRyYWNrIChSZW1vdmUgYXVkaW8gdHJhY2sgZmVhdHVyZSkuCi0gICAgICAgICAgICAqIEluIHRoYXQgY2FzZSB3ZSBkb3VibGUgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSAqLwotICAgICAgICAgICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gPT0gcEMtPmV3Yy5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoICpwUHJvZ3Jlc3MpIDw8PSAxOyAvKio8IHgyICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAqcFByb2dyZXNzID49IDUwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgNDk7IC8qKjwgVmlkZW8gcHJvY2Vzc2luZyBpcyBub3QgZ3JlYXRlciB0aGFuIDUwJSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFZpZGVvIGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gYXVkaW8gYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmlBZGRDdHMgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogTm8gYXVkaW8sIHN0YXRlIHRyYW5zaXRpb24gdG8gRklOSVNIRUQgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDoKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgIT0gLXBDLT5wQWRkZWRDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgJiYgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLSAwLjUpCi0gICAgICAgICAgICAgICAgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvID4gcEMtPnVpRW5kTG9vcAotICAgICAgICAgICAgICAgICYmIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBDLT5iTG9vcCA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+Yk5vTG9vcGluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIganVtcENUUyA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbSwgJmp1bXBDVFMpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IGVycm9yIHdoZW4ganVtcGluZyBpbiBhZGRlZCBhdWRpbyBjbGlwOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVXNlIG9mZnNldCB0byBnaXZlIGEgY29ycmVjdCBDVFMgLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iUmVtb3ZlT3JpZ2luYWwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peChwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZShwQyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBwcm9ncmVzcyBwZXJjZW50YWdlCi0gICAgICAgICAgICAqIE5vdGU6IGF1ZGlvIGFuZCB2aWRlbyBDVFMgYXJlIG5vdCBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgICAgICogdGhlIGNhbGwgb2YgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvICovCi0gICAgICAgICAgICBpZiggMCAhPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBTZWNvbmQgNTAtMTAwJSBzZWdtZW50IGlzIGRlZGljYXRlZCB0byBzdGF0ZXMgOgotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJTy4uLiAqLwotICAgICAgICAgICAgICAgIC8qIEZvciBBdWRpbyB0aGUgcHJvZ3Jlc3MgY29tcHV0YXRpb24gaXMgYmFzZWQgb24gZEF0byBhbmQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIGl0IGlzIG1vcmUgYWNjdXJhdGUgKi8KLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSg1MAotICAgICAgICAgICAgICAgICAgICArICg1MCAqIHBDLT5ld2MuZEFUbyAtIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIC8gKHBDLT5ld2MuaU91dHB1dER1cmF0aW9uKSk7IC8qKjwgNTAgZm9yIDEwMC8yICoqLwotCi0gICAgICAgICAgICAgICAgaWYoICpwUHJvZ3Jlc3MgPj0gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgOTk7IC8qKjwgSXQncyBub3QgcmVhbGx5IGZpbmlzaGVkLCBJIHByZWZlciB0byByZXR1cm4gbGVzcyB0aGFuIDEwMCUgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDk5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXVkaW8gaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byBGSU5JU0hFRCAqLwotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpbyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQ6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBQcm9ncmVzcyBwZXJjZW50YWdlOiBmaW5hbGl6ZSBmaW5pc2hlZCAtPiAxMDAlICovCi0gICAgICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQXVkaW8gbWl4aW5nIGlzIGZpbmlzaGVkLCByZXR1cm4gY29ycmVjdCB3YXJuaW5nICovCi0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogU3RhdGUgZXJyb3IgKDB4JXgpISBSZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCggTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsCi0gICAgICAgIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENvbnRleHQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpOiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQ29udGV4dCBpc1wKLSAgICAgICAgICAgICBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBJbnB1dCAzR1BQIGZpbGUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBBZGRlZCAzR1BQIGZpbGUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEFkZGVkQ2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgM0dQIHdyaXRlci4gSW4gbm9ybWFsIHVzZSBjYXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLAotICAgICAgYnV0IG5vdCBpbiBhYm9ydCB1c2UgY2FzZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgKQotICAgIHsKLSAgICAgICAgLyogVXBkYXRlIGxhc3QgVmlkZW8gQ1RTICovCi0gICAgICAgIGxhc3RDVFMgPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uLCAmbGFzdENUUyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKAotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4gdGhlIGVycm9yIGJlY2F1c2Ugd2UgaGF2ZSBvdGhlciB0aGluZ3MgdG8gZnJlZSEgKi8KLSAgICAgICAgfQotICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIEF1ZGlvIGVuY29kZXIgY29udGV4dCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc3NyYyBzdHVmZiAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNzcmNTY3JhdGNoICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPlNzcmNTY3JhdGNoKTsKLSAgICAgICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJJbiApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlckluKTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAmJiAoTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBTc3JjQnVmZmVyT3V0KTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFRlbXBCdWZmZXIgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFRlbXBCdWZmZXIpOwotICAgICAgICBwQy0+cFRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChwQy0+cExWQXVkaW9SZXNhbXBsZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIExWRGVzdHJveShwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygmcEMtPlNoZWxsQVBJKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY29udGV4dCAqLwotICAgIGZyZWUocENvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKiogICAgICAgICAgICAgICAgICBTVEFUSUMgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dEFTRiA9IDA7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBTZXR0aW5ncz0weCV4IiwKLSAgICAgICAgcEMsIHBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqIFRoZSBBZGQgVm9sdW1lIG11c3QgYmUgKHN0cmljdGx5KSBzdXBlcmlvciB0aGFuIHplcm8gKi8KLSAgICBpZiggcFNldHRpbmdzLT51aUFkZFZvbHVtZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogQWRkVm9sdW1lIGlzIHplcm8sXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQUREVk9MVU1FX0VRVUFMU19aRVJPIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTzsKLSAgICB9Ci0gICAgLyoKLSAgICBlbHNlIGlmKHBTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPj0gMTAwKSAvLyBJZiB2b2x1bWUgaXMgc2V0IHRvIDEwMCwgbm8gbW9yZSBvcmlnaW5hbCBhdWRpbyAuLi4KLSAgICB7Ci0gICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgICovCi0gICAgLyoqCi0gICAgKiBCdWlsZCB0aGUgaW5wdXQgY2xpcCBzZXR0aW5ncyAqLwotICAgIHBDLT5JbnB1dENsaXBTZXR0aW5ncy5wRmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+cE9yaWdpbmFsQ2xpcEZpbGU7IC8qKjwgSW5wdXQgM0dQUCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MuRmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MudWlCZWdpbkN1dFRpbWUgPQotICAgICAgICAwOyAvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotICAgIHBDLT5JbnB1dENsaXBTZXR0aW5ncy51aUVuZEN1dFRpbWUgPQotICAgICAgICAwOyAvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBvcmlnaW5hbCBBdWRpby9WaWRlbyAzR1BQIGNsaXAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoJnBDLT5wSW5wdXRDbGlwQ3R4dCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q2xpcEluaXQob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDLT5wSW5wdXRDbGlwQ3R4dCwgJnBDLT5JbnB1dENsaXBTZXR0aW5ncywKLSAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX0ZBTFNFLCBNNE9TQV9UUlVFKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDbGlwT3BlbihvcmlnKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgICAgIHsKLSAgICAgICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIG5vIHZpZGVvLCBpdCdzIGFuIGVycm9yICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBubyB2aWRlbyBzdHJlYW0gaW4gY2xpcCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcyhwQy0+cElucHV0Q2xpcEN0eHQsCi0gICAgICAgICZwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBCdWlsZCB0aGUgYWRkZWQgY2xpcCBzZXR0aW5ncyAqLwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5wRmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+cEFkZGVkQXVkaW9UcmFja0ZpbGU7IC8qKjwgQWRkZWQgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gcFNldHRpbmdzLT5BZGRlZEF1ZGlvRmlsZVR5cGU7Ci0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgMDsgLyoqPCBObyBub3Rpb24gb2YgY3V0IGZvciB0aGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgKi8KLSAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lICAgPSAwOy8qKjwgTm8gbm90aW9uIG9mIGN1dCBmb3IgdGhlIGF1ZGlvIG1peGluZyBmZWF0dXJlICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscz0KLSAgICAgICAgcFNldHRpbmdzLT51aU51bUNoYW5uZWxzOwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5PSAgICBwU2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+QWRkZWRDbGlwU2V0dGluZ3MucEZpbGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogT3BlbiB0aGUgYWRkZWQgQXVkaW8gY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoJnBDLT5wQWRkZWRDbGlwQ3R4dCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBJbml0KGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDLT5wQWRkZWRDbGlwQ3R4dCwgJnBDLT5BZGRlZENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBPcGVuKGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8sIGl0J3MgYW4gZXJyb3IgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBubyBhdWRpbyBub3IgdmlkZW8gc3RyZWFtIGluIGNsaXAsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMocEMtPnBBZGRlZENsaXBDdHh0LAotICAgICAgICAgICAgJnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2goIHBTZXR0aW5ncy0+b3V0cHV0QVNGICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gMjIwNTA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSAyNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gNDQxMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSA0ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIHBhcmFtZXRlciBpbiBvdXRwdXQgQVNGICIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICAgICAmJiAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QMyB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa1BDTQotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IG91dHB1dEFTRgotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMpICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dEFTRiA9IE00VklERU9FRElUSU5HX2s4MDAwX0FTRjsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMzIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDIwNDggKiBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICBvdXRwdXRBU0Y7Ci0KLSAgICAgICAgICAgIGlmKCBvdXRwdXRBU0YgIT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gY2FsbCBTU1JDIGluIG9yZGVyIHRvIGFsaWduIEFTRiBhbmQvb3IgbmIgb2YgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgICAgICAvKiBNb3Jlb3ZlciwgYXVkaW8gZW5jb2RlciBtYXkgYmUgbmVlZGVkIGluIGNhc2Ugb2YgYXVkaW8gcmVwbGFjaW5nLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICA8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyB0byBNb25vICovCi0gICAgICAgICAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscwotICAgICAgICAgICAgICAgID4gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTW9ubyB0byBTdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPSAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0KLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkocEMsCi0gICAgICAgICAgICAmcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgJnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgbG9vcCBwYXJhbWV0ZXJzICovCi0gICAgICAgIGlmKCBwQy0+dWlCZWdpbkxvb3AgPiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgYmVnaW4gbG9vcCB0aW1lIGlzIGhpZ2hlciB0aGFuIGFkZGVkIGNsaXAgYXVkaW8gZHVyYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIE9rLCBsZXQncyBnbyB3aXRoIHRoaXMgYXVkaW8gdHJhY2sgKi8KLSAgICAgICAgcEMtPmJIYXNBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5vIGFkZGVkIGZpbGUsIGZvcmNlIHJlbW92ZSBvcmlnaW5hbCAqLwotICAgICAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MuRmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7Ci0gICAgICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQy0+Ykhhc0F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSB2aWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSBpbnB1dCBjbGlwIHRvIHRoZSBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoOwotICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0OwotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgIHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRkYXRhUGFydGl0aW9uOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvTGV2ZWw7Ci0gICAgc3dpdGNoKCBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBBZGQgYSBsaW5rIHRvIHZpZGVvIGRzaSAqLwotICAgIGlmKCBNNFNZU19rSDI2NCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotCi0gICAgICAgIC8qIEZvciBILjI2NCBlbmNvZGVyIGNhc2UKLSAgICAgICAgKiBGZXRjaCB0aGUgRFNJIGZyb20gdGhlIHNoZWxsIHZpZGVvIGVuY29kZXIsIGFuZCBmZWVkIGl0IHRvIHRoZSB3cml0ZXIgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogZ2V0IERTSSBmb3IgSDI2NCBzdHJlYW0iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IHBDLT5ld2MucEVuY0NvbnRleHQgaXMgTlVMTCIpOwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQsIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogZW5jSGVhZGVyLT5wQnVmPTB4JXgsIHNpemU9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+cEJ1ZiwgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IHNlbmQgRFNJIGZvciBIMjY0IHN0cmVhbSB0byAzR1Agd3JpdGVyIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGVuY0hlYWRlci0+U2l6ZSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQy0+ZXdjLnBWaWRlb091dHB1dERzaSAoSDI2NCkiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFZpZGVvT3V0cHV0RHNpIChIMjY0KSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlciByZXR1cm5lZCBlcnJvciAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwsIGNhbm5vdCBnZXQgdGhlIERTSSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGlucHV0IGNsaXAgdmlkZW8gc3RyZWFtIHR5cGUgPSAweCV4IiwKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBhdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSBhZGRlZCBjbGlwIHRvIHRoZSBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+YlJlbW92ZU9yaWdpbmFsID09IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgIC8qIGlmIG91dHB1dCBzZXR0aW5ncyBhcmUgZGlmZmVyZW50cyBmcm9tIGFkZGVkIGNsaXAgc2V0dGluZ3MsCi0gICAgICAgICAgICB3ZSBuZWVkIHRvIHJlZW5jb2RlIEJHTSAqLwotICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gb3V0cHV0QVNGCi0gICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscwotICAgICAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2V0IHJlYWRlciBEU0kgdG8gTlVMTCAodW5rbm93biksIHdlIHdpbGwgdXNlIGVuY29kZXIgRFNJIGxhdGVyICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4OwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPSAxMjIwMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gODAwMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0gMzIwOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYml0cmF0ZSBoYXZlIHRvIGJlIGRvdWJsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlICs9IHBDLT5ld2MudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gcFNldHRpbmdzLT5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPT0gMSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05POwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAxMDI0OyAvKiBBQUMgaXMgYWx3YXlzIDEwMjQvRnJlcSBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAxNjA7IC8qIEVWUkMgZnJhbWVzIGFyZSAyMCBtcyBhdCA4MDAwIEh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWtlcyBpdCBlYXNpZXIgdG8gZmFjdG9yaXplIGFtciBhbmQgZXZyYyBjb2RlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUENNOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHJlYWRlciBEU0kgdG8gTlVMTCAodW5rbm93biksIHdlIHdpbGwgdXNlIGVuY29kZXIgRFNJIGxhdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDgwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05POwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0OyAvKiBBQUMgaXMgYWx3YXlzIDEwMjQvRnJlcSBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFkZCBhIGxpbmsgdG8gYXVkaW8gZHNpICovCi0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBObyBhdWRpbyB0cmFjayBpbiBpbnB1dCBmaWxlLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBZGQgYSBsaW5rIHRvIGF1ZGlvIGRzaSAqLwotICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YSA9IHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgIC1wQy0+cElucHV0Q2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgLyogUmVzZXQgdGltZSAqLwotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBpZiggcEMtPmJIYXNBdWRpbyApCi0gICAgewotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEgPSBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbyA9IHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAtcEMtPnBBZGRlZENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIEFkZEN0cyBpcyBsb3dlciB0aGFuIG9yaWdpbmFsIGNsaXAgZHVyYXRpb24gKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtKQotICAgICAgICAmJiAocEMtPmlBZGRDdHMgPiAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IHVpQWRkQ3RzIGlzIGxhcmdlciB0aGFuIHZpZGVvIGR1cmF0aW9uLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTiIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BRERDVFNfSElHSEVSX1RIQU5fVklERU9fRFVSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGUgYXVkaW8gdHJhY2tzIGFyZSBub3QgY29tcGF0aWJsZSwgcmVwbGFjZSBpbnB1dCB0cmFjayBieSBzaWxlbmNlICovCi0gICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBhdWRpbyBtaXhpbmcgaXMgcmVxdWlyZWQgKi8KLSAgICBpZiggKCAoIHBDLT5iSGFzQXVkaW8pICYmIChNNE9TQV9GQUxTRQotICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSkpCi0gICAgICAgIHx8IChNNE9TQV9UUlVFID09IHBDLT5iUmVtb3ZlT3JpZ2luYWwpICkgLyp8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU2V0dGluZ3MtPnVpQWRkVm9sdW1lID49IDEwMCkpICovCi0gICAgewotICAgICAgICBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIG91dHB1dCBhdWRpbyBjYW4gc3VwcG9ydCBzaWxlbmNlIGZyYW1lcwotICAgIFRyaWNrIGkgdXNlIGJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwIGZpbGVkIHRvIHN0b3JlIHRoYXQgICovCi0gICAgaWYoIHBDLT5iSGFzQXVkaW8gKQotICAgIHsKLSAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwOwotCi0gICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5pQWRkQ3RzID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICBpQWRkQ3RzIHNob3VsZCBiZSBzZXQgdG8gMCB3aXRoIHRoaXMgYXVkaW8gdHJhY2sgISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIDAgPCBwQy0+dWlFbmRMb29wICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kTG9vcCBzaG91bGQgYmUgc2V0IHRvIDAgd2l0aCB0aGlzIGF1ZGlvIHRyYWNrICEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoIHBDLT5iX0R1Y2tpbmdOZWVkZWVkID09IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgZmFjdG9yIHRvIGFwcGx5IHRvIHNhbXBsZSB0byBkbyB0aGUgbWl4aW5nICovCi0gICAgICAgIHBDLT5mQWRkZWRGYWN0b3IgPSAwLjUwRjsKLSAgICAgICAgcEMtPmZPcmlnRmFjdG9yID0gMC41MEY7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIFNTUkMgaXMgbmVlZGVkICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgbnVtZXJhdG9yLCBkZW5vbWluYXRvciwgcmF0aW8sIHJhdGlvQnVmZmVyOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluaXQgdGhlIFNTUkMgbW9kdWxlICovCi0gICAgICAgIFNTUkNfUmV0dXJuU3RhdHVzX2VuCi0gICAgICAgICAgICBSZXR1cm5TdGF0dXM7IC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNiBOclNhbXBsZXNNaW4gPQotICAgICAgICAgICAgMDsgLyogTWluaW1hbCBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgaW5wdXQgb3Igb24gdGhlIG91dHB1dCAqLwotICAgICAgICBMVk1fSU5UMzIKLSAgICAgICAgICAgIFNjcmF0Y2hTaXplOyAvKiBUaGUgc2l6ZSBvZiB0aGUgc2NyYXRjaCBtZW1vcnkgICAgICAgICAgICAgICAqLwotICAgICAgICBMVk1fSU5UMTYKLSAgICAgICAgICAgICpwSW5wdXRJblNjcmF0Y2g7IC8qIFBvaW50ZXIgdG8gaW5wdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNgotICAgICAgICAgICAgKgotICAgICAgICAgICAgcE91dHB1dEluU2NyYXRjaDsgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgKi8KLSAgICAgICAgU1NSQ19QYXJhbXNfdCBzc3JjUGFyYW1zOyAgICAgICAgICAvKiBNZW1vcnkgZm9yIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBzd2l0Y2goIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzExMDI1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEyMDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzIyMDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18yNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzQ0MTAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGludmFsaWQgYWRkZWQgY2xpcCBzYW1wbGluZyBmcmVxdWVuY3kgKCVkIEh6KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfQURERURfQVVESU9fU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIDEgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fTU9OTzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fU1RFUkVPOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKCBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogaW52YWxpZCBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICglZCBIeiksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBSZXR1cm5TdGF0dXMgPSAwOwotCi0gICAgICAgIHN3aXRjaCAoc3NyY1BhcmFtcy5TU1JDX0ZzX0luKXsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID00NDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzE2MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9ICAgIDY0MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18yMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAgICA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzMyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDEyODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180ODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSZXR1cm5TdGF0dXMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzc3JjUGFyYW1zLlNTUkNfRnNfT3V0KXsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9NDQxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAgICA2NDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gICAgODgyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDk2MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAxNzY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSZXR1cm5TdGF0dXMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKCBSZXR1cm5TdGF0dXMgIT0gU1NSQ19PSyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICBFcnJvciBjb2RlICVkIHJldHVybmVkIGJ5IHRoZSBTU1JDX0dldE5yU2FtcGxlcyBmdW5jdGlvbiIsCi0gICAgICAgICAgICAgICAgUmV0dXJuU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDsKLSAgICAgICAgfQotCi0gICAgICAgIE5yU2FtcGxlc01pbiA9Ci0gICAgICAgICAgICAoTFZNX0lOVDE2KSgoc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA+IHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0KQotICAgICAgICAgICAgPyBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA6IHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4pOwotCi0gICAgICAgIHdoaWxlKCBOclNhbXBsZXNNaW4gPCBNNFZTU19TU1JDX01JTkJMT0NLU0laRSApCi0gICAgICAgIHsgLyogRG9uJ3QgdGFrZSBibG9ja3Mgc21hbGxlciB0aGF0IHRoZSBtaW5pbWFsIGJsb2NrIHNpemUgKi8KLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc0luIDw8IDEpOwotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA8PCAxKTsKLSAgICAgICAgICAgIE5yU2FtcGxlc01pbiA9IChMVk1fSU5UMTYpKE5yU2FtcGxlc01pbiA8PCAxKTsKLSAgICAgICAgfQotICAgICAgICBwQy0+aVNzcmNOYlNhbXBsSW4gPSAoTFZNX0lOVDE2KSgKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuCi0gICAgICAgICAgICBOclNhbXBsZXNJbik7IC8qIG11bHRpcGxpY2F0aW9uIGJ5IE5yT2ZDaGFubmVscyBpcyBkb25lIGJlbG93ICovCi0gICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCk7Ci0KLSAgICAgICAgbnVtZXJhdG9yID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgIGRlbm9taW5hdG9yID0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAqIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgaWYoIG51bWVyYXRvciAlIGRlbm9taW5hdG9yID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpb0J1ZmZlciA9IChNNE9TQV9VSW50MzIpKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJhdGlvQnVmZmVyID0gKE00T1NBX1VJbnQzMikobnVtZXJhdG9yIC8gZGVub21pbmF0b3IpICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJhdGlvID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICogcmF0aW9CdWZmZXIpIC8gKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgaWYoIHJhdGlvID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IHRoZSBpbnB1dCBzaXplIG9mIFNTUkMgYnVmZmVySW4gaXMgYmlnZ2VyIHRoYW4gdGhlIGFza2VkIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpbysrOyAvKiBXZSB1c2UgdGhlIGltbWVkaWF0ZSBzdXBlcmlvciBpbnRlZ2VyICovCi0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gcmF0aW8gKiAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBpbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJJbiA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5taW5pbXVtQnVmZmVySW4KLSAgICAgICAgICAgICsgcEMtPnBBZGRlZENsaXBDdHh0LT4KLSAgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVyT3V0LgotICAgICAgICAgICAgbV9idWZmZXJTaXplLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlckluIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbiwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzICogcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICogcEMtPmV3Yy51aU5iQ2hhbm5lbHMsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJPdXQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXIgbmVlZGVkIGluIGNhc2Ugb2YgY2hhbm5lbCBjb252ZXJzaW9uICovCi0gICAgICAgIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICAgICAgcEMtPnBUZW1wQnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMgKiBwQy0+aVNzcmNOYlNhbXBsT3V0Ci0gICAgICAgICAgICAgICAgKiBzaXplb2Yoc2hvcnQpICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscywgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlck91dCIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFRlbXBCdWZmZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBUZW1wQnVmZmVyLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cFBvc0luVGVtcEJ1ZmZlciA9IHBDLT5wVGVtcEJ1ZmZlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5taW5pbXVtQnVmZmVySW4gPQotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bWluaW11bUJ1ZmZlckluCi0gICAgICAgICAgICArIHBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC4KLSAgICAgICAgICAgIG1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogXAotICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwU3NyY0J1ZmZlckluLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gKE00T1NBX01lbUFkZHI4KXBDLT5wU3NyY0J1ZmZlckluOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgICAgICAvKiBUaGUgIjMiIHZhbHVlIGJlbG93IHNob3VsZCBiZSBvcHRpbWl6ZWQgLi4uIG9uZSBkYXkgLi4uICovCi0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJPdXQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgIH0KLSAgICBlbHNlIGlmKCAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVAzKXx8Ci0gICAgICAgICAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rUENNKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBtaW5idWZmZXIgPSAwOwotCi0gICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gMjA0OCAqIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgbWluYnVmZmVyID0gcEMtPm1pbmltdW1CdWZmZXJJbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gMzIwOwotCi0gICAgICAgICAgICBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPiAzMjAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5taW5pbXVtQnVmZmVySW47IC8qIE5vdCByZWFsbHkgcG9zc2libGUgLi4uKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCwgaW4gY2FzZSBvZiBNUDMgcmVwbGFjaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygyICogbWluYnVmZmVyLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlckluIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbixcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wUG9zSW5Tc3JjQnVmZmVySW47Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IHBDLT5wU3NyY0J1ZmZlckluOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgYXVkaW8gZW5jb2RlciBpcyBuZWVkZWQgdG8gZG8gYXVkaW8gbWl4aW5nIG9yIGF1ZGlvIHJlc2FtcGxpbmcgKi8KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgfHwgTTRWSURFT0VESVRJTkdfa1BDTQotICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgIHx8IE00VklERU9FRElUSU5HX2tNUDMKLSAgICAgICAgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgIT0gb3V0cHV0QVNGCi0gICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXQgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW4gY2FzZSBvZiBQQ00sIE1QMyBvciBhdWRpbyByZXBsYWNlIHdpdGggcmVlbmNvZGluZywgdXNlIGVuY29kZXIgRFNJICovCi0gICAgICAgIGlmKCBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID09IDAgJiYgKE00VklERU9FRElUSU5HX2tQQ00KLSAgICAgICAgICAgID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgIHx8IE00VklERU9FRElUSU5HX2tNUDMgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gb3V0cHV0QVNGCi0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscykgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5ld2MucEF1ZGlvRW5jRFNJLmluZm9TaXplOwotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5wSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgb3V0cHV0IDNHUFAgZmlsZSAqLwotICAgIC8qMTEvMTIvMjAwOCBDUjMyODMgYWRkIHRoZSBtYXggb3V0cHV0IGZpbGUgc2l6ZSBmb3IgdGhlIE1NUyB1c2UgY2FzZSBpbiBWaWRlb0FydGlzdCovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwU2V0dGluZ3MtPnBPdXRwdXRDbGlwRmlsZSwKLSAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwgMCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKCkKLSAqIEBicmllZiAgICBXcml0ZSBhbiBhdWRpbyBzaWxlbmNlIGZyYW1lIGludG8gdGhlIHdyaXRlcgotICogQG5vdGUgICAgTWFpbmx5IHVzZWQgd2hlbiBwYWRkaW5nIHdpdGggc2lsZW5jZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlOlwKLSAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8wKCJBICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKLQotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgIChNNE9TQV9UaW1lKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8pLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2U6XAotICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHNpbGVuY2UpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyhNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdmlkZW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MTYgb2Zmc2V0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIiAgVklERU8gc3RlcCA6IGRWVG8gPSAlZiAgc3RhdGUgPSAlZCAgb2Zmc2V0ID0gJWxkIiwKLSAgICAgICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzLCBwQy0+U3RhdGUsIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQpOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIHRoZSBpbnB1dCB2aWRlbyBBVSAqLwotICAgIGVyciA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0sCi0gICAgICAgICZwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbygpOiBtX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICVsZCBbIDB4JXggXSIsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX0NUUywgcEMtPnBJbnB1dENsaXBDdHh0LT5pVm9mZnNldCwKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSk7Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgb2Zmc2V0ID0gMDsKLSAgICAvKiBmb3IgaC4yNjQgc3RyZWFtIGRvIG5vdCByZWFkIHRoZSAxc3QgNCBieXRlcyBhcyB0aGV5IGFyZSBoZWFkZXIgaW5kaWNhdG9ycyAqLwotICAgIGlmKCBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlCi0gICAgICAgID09IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKCk6IGlucHV0IHN0cmVhbSB0eXBlIEgyNjQiKTsKLSAgICAgICAgb2Zmc2V0ID0gNDsKLSAgICB9Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSAgLT0gIG9mZnNldDsKLSAgICAvKioKLSAgICAqIENoZWNrIHRoYXQgdGhlIHZpZGVvIEFVIGlzIG5vdCBsYXJnZXIgdGhhbiBleHBlY3RlZCAqLwotICAgIGlmKCBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9zaXplID4gcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbzogQVUgc2l6ZSBncmVhdGVyIHRoYW4gTWF4QXVTaXplICglZD4lZCkhXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUsIHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSk7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIGlucHV0IEFVIHBheWxvYWQgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKikocEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fZGF0YUFkZHJlc3MgKyBvZmZzZXQpLAotICAgICAgICAocEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSkpOwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSBwYXJhbWV0ZXJzIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUyA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX0NUUyArIDAuNSk7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX2F0dHJpYnV0ZTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkQgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbHUgWyAweCV4IF0iLAotICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuQ1RTLCBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW86IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgYXVkaW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIEFVRElPIG1peCAgOiBkQVRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZEFUbywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0KTsKLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgQWRkQ3RzICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+aUFkZEN0cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBGaXJzdCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gc2Vjb25kIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1NFQ09ORF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSByZWFkaW5nIHN0YXRlIHRvIGVuY29kaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKDEtPjIpIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgKSAvKio8IE1peCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgYWRkZWQgYXVkaW8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgfHwgcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGNhc2Ugb2Ygc2FtcGxpbmcgZnJlcSBjb252ZXJzaW9uIGFuZC9vciBjaGFubmVsIGNvbnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVhZCBuZXh0IEFVIHdpbGwgYmUgICAgY2FsbGVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkUgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSBlbmNvZGluZyBzdGF0ZSB0byByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykgYSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgb3JpZ2luYWwgYXVkaW8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiRiAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUFvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5iX1NTUkNuZWVkZWQgPT0gTTRPU0FfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUGVyZm9ybSB0aGUgYXVkaW8gbWl4aW5nICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm8gbWl4LCBqdXN0IGNvcHkgYWRkZWQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY2lkZSB3aGF0IHRvIGRvIHdoZW4gYXVkaW8gaXMgb3ZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgYXVkaW8gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAobG9vcCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIHRvIGJlZ2luIGN1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2Vjb25kIHNlZ21lbnQgaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byB0aGlyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykgYiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygyKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogVmlkZW8gZHVyYXRpb24gcmVhY2hlZCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZyhwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDMpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdmlkZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5kQVRvID49IHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGR1cmF0aW9uIHJlYWNoZWQsIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOyAvKio8IFNpbXVsYXRlIGVuZCBvZiBmaWxlIGVycm9yICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpby4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIEFVRElPIHJlcGwgOiBkQVRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZEFUbywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0KTsKLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVwbGFjZSB0aGUgU0lEIChzaWxlbmNlKSBwYXlsb2FkIGluIHRoZSB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIEFkZEN0cyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmlBZGRDdHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRmlyc3Qgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHNlY29uZCBhbmQgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDEtPjIpIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RKdW1wKGF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgKiBhZGQgYSBzaWxlbmNlIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBhdWRpbyBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAobG9vcCkiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSB0aGlyZCBzZWdtZW50IChzaWxlbmNlKSBpcyBvbmx5IGRvbmUgaWYgc3VwcG9ydGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgKiBJbiBvdGhlciBjYXNlLCB3ZSBmaW5pc2ggaGVyZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SICgyLT5GKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjbGlwICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6IENsaXAgZHVyYXRpb24gcmVhY2hlZCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlcGxhY2UgdGhlIFNJRCAoc2lsZW5jZSkgcGF5bG9hZCBpbiB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW8gZHVyYXRpb24gcmVhY2hlZCwgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7IC8qKjwgU2ltdWxhdGUgZW5kIG9mIGZpbGUgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcm9tIHRoZSBvcmlnaW5hbCBhdWRpbyBmaWxlIGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogUmVhZCB0aGUgaW5wdXQgb3JpZ2luYWwgYXVkaW8gQVUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cElucHV0Q2xpcEN0eHQpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIkcgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cElucHV0Q2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0IC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygpOiBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZzogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgaW5wdXQgQVUgcHJvcGVydGllcyB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+cElucHV0Q2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBBVSBpdHNlbGYgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICh2b2lkICopcEMtPnBJbnB1dENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciwgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICBNNE9TQV9UUkFDRTJfMigiSCAtLS0tIHdyaXRlIDogY3RzICA9ICVsZCBbIDB4JXggXSIsCi0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZzogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgdGhlIGF1ZGlvIENUUyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5ld2MuZEFUbyArPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFJlYWQgb25lIEFVIGZyb20gdGhlIGFkZGVkIGF1ZGlvIGZpbGUgYW5kIHdyaXRlIGl0IHRvIHRoZSBvdXRwdXQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyB8fAotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tQQ00gfHwKLSAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFIHx8Ci0gICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApCi0gICAgewotICAgICAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyCi0gICAgICAgICAgICBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgICAgIE00T1NBX1RpbWUKLSAgICAgICAgICAgIGZyYW1lVGltZURlbHRhOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLSAgICAgICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KHBDKTsKLQotICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCBlbmQgb2YgYWRkZWQgZmlsZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0IHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiSyAqKioqIGJsZW5kIEFVcyIpOwotICAgICAgICAvKioKLSAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoKTpcCi0gICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0KLSAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIuCi0gICAgICAgICAgICBwVGFibGVCdWZmZXJTaXplWzBdOyAvKio8IEdldCB0aGUgc2l6ZSBvZiBlbmNvZGVkIGRhdGEgKi8KLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAvKiBVcGRhdGUgZGVjb2RlZCBidWZmZXIgaGVyZSAqLwotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgKyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLT0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbiArIHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkogLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvICs9IGZyYW1lVGltZURlbHRhIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVhZCB0aGUgYWRkZWQgYXVkaW8gQVUgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygiSSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKCk6IG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHByb3BlcnRpZXMgdG8gdGhlIG91dHB1dCBBVSAqLwotCi0gICAgICAgIC8qKiBUSEUgQ0hFQ0sgQkVMT1cgSVMgQURERUQgVE8gUFJFVkVOVCBJU1NVRVMgTElOS0VEIFRPIFBSRS1BTExPQ0FURUQgTUFYIEFVIFNJWkUKLSAgICAgICAgbWF4IEFVIHNpemUgaXMgc2V0IGJhc2VkIG9uIE00VlNTM0dQUF9BVURJT19NQVhfQVVfU0laRSBkZWZpbmVkIGluIGZpbGUKLSAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgsIElmIHRoaXMgZXJyb3Igb2NjdXJzIGluY3JlYXNlIHRoZSBsaW1pdCBzZXQgaW4gdGhpcyBmaWxlCi0gICAgICAgICovCi0gICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPiBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICJFUlJPUjogYXVkaW8gQVUgc2l6ZSAoJWQpIHRvIGNvcHkgbGFyZ2VyIHRoYW4gYWxsb2NhdGVkIG9uZSAoJWQpID0+IGFib3J0IiwKLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIlBMRUFTRSBDT05UQUNUIFNVUFBPUlQgVE8gRVhURU5EIE1BWCBBVSBTSVpFIElOIFRIRSBQUk9EVUNUIExJQlJBUlkiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvcHkgdGhlIEFVIGl0c2VsZiAqLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIsIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkogLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvICs9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIENvbnZlcnQgUENNIG9mIGFkZGVkIHRyYWNrIHRvIHRoZSByaWdodCBBU0YgLyBuYiBvZiBDaGFubmVscwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBpbnQgc3NyY0VycjsgLyoqPCBFcnJvciB3aGlsZSBzc3JjIHByb2Nlc3NpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICBNNE9TQV9NZW1BZGRyOCB0ZW1wUG9zQnVmZmVyOwotCi0gICAgTTRPU0FfVUludDMyIG91dEZyYW1lQ291bnQgPSB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXM7Ci0gICAgLyogRG8gd2UgbmVlZCB0byBmZWVkIFNTUkMgYnVmZmVyIEluID8gKi8KLSAgICAvKioKLSAgICAqIFJDOiBUaGlzIGlzIG5vdCByZWFsbHkgb3B0aW11bSAobWVtbW92ZSkuIFdlIHNob3VsZCBoYW5kbGUgdGhpcyB3aXRoIGxpbmtlZCBsaXN0LiAqLwotICAgIHdoaWxlKCBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gcEMtPnBTc3JjQnVmZmVySW4gPCAoTTRPU0FfSW50MzIpcEMtPm1pbmltdW1CdWZmZXJJbiApCi0gICAgewotICAgICAgICAvKiBXZSBuZWVkIHRvIGdldCBtb3JlIFBDTSBkYXRhICovCi0gICAgICAgIGlmIChwQy0+Yk5vTG9vcGluZyA9PSBNNE9TQV9UUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEFkZGVkQ2xpcEN0eHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBDLT5ianVtcGZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgTTRPU0FfSW50MzIgdGltZSA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcFwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICZ0aW1lKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+Ymp1bXBmbGFnID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkUgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLSAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEMtPmJOb0xvb3BpbmcgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dWlFbmRMb29wID0wOyAvKiBWYWx1ZSAwIG1lYW5zIG5vIGxvb3BpbmcgaXMgcmVxdWlyZWQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+dWlFbmRMb29wID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBKdW1wIGF0IHRoZSBCZWdpbiBsb29wIHRpbWUgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBBZGRlZENsaXBDdHh0LT4KLSAgICAgICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtLCAmdGltZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiBmcm9tIGVuY29kaW5nIHN0YXRlIHRvIHJlYWRpbmcgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTZWNvbmQgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoaXJkIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoKTpcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyAoMi0+MykgYSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KCk6IG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgZGVjb2RlZCBkYXRhIGludG8gU1NSQyBidWZmZXIgaW4gKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICh2b2lkICopcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotICAgICAgICAvKiBVcGRhdGUgcG9zaXRpb24gcG9pbnRlciBpbnRvIFNTUkMgYnVmZmVyIEluICovCi0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiArPQotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgfQotCi0gICAgLyogRG8gdGhlIHJlc2FtcGxpbmcgLyBjaGFubmVsIGNvbnZlcnNpb24gaWYgbmVlZGVkICg9ZmVlZCBidWZmZXIgb3V0KSAqLwotICAgIGlmKCBwQy0+Yl9TU1JDbmVlZGVkID09IE00T1NBX1RSVUUgKQotICAgIHsKLSAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMDsKLSAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSggcEMtPnBQb3NJblRlbXBCdWZmZXIgLSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMikocEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICAgICAqcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscykKLSAgICAgICAgICAgICAgICAvIHBDLT5DaGFubmVsQ29udmVyc2lvbiApCi0gICAgICAgICAgICAgICAgLyogV2UgdXNlIENoYW5uZWxDb252ZXJzaW9uIHZhcmlhYmxlIGJlY2F1c2UgaW4gY2FzZSAyLCB3ZSBuZWVkIHR3aWNlIGxlc3MgZGF0YSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzcmNFcnIgPSAwOwotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLDAsCi0gICAgICAgICAgICAgICAgICAgIChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAoc2hvcnQqKXBDLT5wU3NyY0J1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICAgICAgICAgIGlmKCAwICE9IHNzcmNFcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydDogU1NSQ19Qcm9jZXNzIHJldHVybnMgMHgleCwgcmV0dXJuaW5nICIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzc3JjRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNzcmNFcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgKz0gcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBTU1JDIGJ1ZmZlckluICovCi0gICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wU3NyY0J1ZmZlckluICsgKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc3JjRXJyID0gMDsKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwwLAotICAgICAgICAgICAgICAgICAgICAocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiBwQy0+ZXdjLnVpTmJDaGFubmVscykpOwotCi0gICAgICAgICAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0KilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgKHNob3J0KilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmlTc3JjTmJTYW1wbE91dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICAgICAgICAgICAgICBpZiggMCAhPSBzc3JjRXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQ6IFNTUkNfUHJvY2VzcyByZXR1cm5zIDB4JXgsIHJldHVybmluZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3NyY0Vycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzc3JjRXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIFNTUkMgYnVmZmVySW4gKi8KLSAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gKyAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0gcEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29udmVydCBTdGVyZW88LT5Nb25vICovCi0gICAgICAgIHN3aXRjaCggcEMtPkNoYW5uZWxDb252ZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOiAvKiBObyBjaGFubmVsIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvKiBzdGVyZW8gdG8gbW9ubyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopcEMtPnBUZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KSh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHBUZW1wQnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHMpOyAvKiBCdWZmZXIgaXMgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcEMtPnBUZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KXVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICAvL000T1NBX1VJbnQzMiB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAvLyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSAvIHNpemVvZihzaG9ydCkgLwotICAgICAgICAvLyBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAvKiBDb252ZXJ0IFN0ZXJlbzwtPk1vbm8gKi8KLSAgICAgICAgc3dpdGNoKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIE5vIGNoYW5uZWwgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6IC8qIHN0ZXJlbyB0byBtb25vICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub18xNigoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBwVGVtcEJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVySW4KLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHMpOyAvKiBCdWZmZXIgaXMgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcEMtPnBTc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQpdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9IHBDLT5wU3NyY0J1ZmZlckluCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5vIGNoYW5uZWwgY29udmVyc2lvbiBub3Igc2FtcGwuIGZyZXEuIGNvbnZlcnNpb24gbmVlZGVkLCBqdXN0IGJ1ZmZlciBtYW5hZ2VtZW50ICovCi0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBQb3NJblNzcmNCdWZmZXJJbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgTTRWU1MzR1BQX2dldERlY2liZWxTb3VuZCggTTRPU0FfVUludDMyIHZhbHVlICkKLSAgICB7Ci0gICAgaW50IGRiU291bmQgPSAxOwotCi0gICAgaWYoIHZhbHVlID09IDAgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmKCB2YWx1ZSA+IDB4NDAwMCAmJiB2YWx1ZSA8PSAweDgwMDAgKSAgICAgIC8vIDMyNzY4Ci0gICAgICAgIGRiU291bmQgPSA5MDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgyMDAwICYmIHZhbHVlIDw9IDB4NDAwMCApIC8vIDE2Mzg0Ci0gICAgICAgIGRiU291bmQgPSA4NDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgxMDAwICYmIHZhbHVlIDw9IDB4MjAwMCApIC8vIDgxOTIKLSAgICAgICAgZGJTb3VuZCA9IDc4OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDA4MDAgJiYgdmFsdWUgPD0gMHgxMDAwICkgLy8gNDAyOAotICAgICAgICBkYlNvdW5kID0gNzI7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDQwMCAmJiB2YWx1ZSA8PSAweDA4MDAgKSAvLyAyMDQ4Ci0gICAgICAgIGRiU291bmQgPSA2NjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMjAwICYmIHZhbHVlIDw9IDB4MDQwMCApIC8vIDEwMjQKLSAgICAgICAgZGJTb3VuZCA9IDYwOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAxMDAgJiYgdmFsdWUgPD0gMHgwMjAwICkgLy8gNTEyCi0gICAgICAgIGRiU291bmQgPSA1NDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDgwICYmIHZhbHVlIDw9IDB4MDEwMCApIC8vIDI1NgotICAgICAgICBkYlNvdW5kID0gNDg7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDA0MCAmJiB2YWx1ZSA8PSAweDAwODAgKSAvLyAxMjgKLSAgICAgICAgZGJTb3VuZCA9IDQyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMjAgJiYgdmFsdWUgPD0gMHgwMDQwICkgLy8gNjQKLSAgICAgICAgZGJTb3VuZCA9IDM2OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMTAgJiYgdmFsdWUgPD0gMHgwMDIwICkgLy8gMzIKLSAgICAgICAgZGJTb3VuZCA9IDMwOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDggJiYgdmFsdWUgPD0gMHgwMDEwICkgLy8xNgotICAgICAgICBkYlNvdW5kID0gMjQ7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDAwNyAmJiB2YWx1ZSA8PSAweDAwMDggKSAvLzgKLSAgICAgICAgZGJTb3VuZCA9IDI0OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDMgJiYgdmFsdWUgPD0gMHgwMDA3ICkgLy8gNAotICAgICAgICBkYlNvdW5kID0gMTg7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDAwMSAmJiB2YWx1ZSA8PSAweDAwMDMgKSAvLzIKLSAgICAgICAgZGJTb3VuZCA9IDEyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMCAmJiB2YWx1ZSA8PSAweDAwMDEgKSAgLy8gMQotICAgICAgICBkYlNvdW5kID0gNjsKLQotICAgIGVsc2UKLSAgICAgICAgZGJTb3VuZCA9IDA7Ci0KLSAgICByZXR1cm4gZGJTb3VuZDsKLSAgICB9Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBNaXggdGhlIGN1cnJlbnQgYXVkaW8gQVVzIChkZWNvZGVyLCBtaXgsIGVuY29kZSkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZygKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTE7Ci0gICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhMjsKLSAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLSAgICAvKiBkdWNraW5nIHZhcmlhYmxlICovCi0gICAgTTRPU0FfVUludDE2IGxvb3BJbmRleCA9IDA7Ci0gICAgTTRPU0FfSW50MTYgKnBQQ00xNlNhbXBsZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50MzIgcGVha0RiVmFsdWUgPSAwOwotICAgIE00T1NBX0ludDMyIHByZXZpb3VzRGJWYWx1ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioKLSAgICAqIERlY29kZSBvcmlnaW5hbCBhdWRpbyB0cmFjayBBVSAqLwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cElucHV0Q2xpcEN0eHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQocEMpOwotCi0gICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQURERURfQVVESU8gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0IHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVEX1BDTV9TSVpFX0lTU1VFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcFBDTWRhdGEyID0gKE00T1NBX0ludDE2ICopcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBEZWNvZGUgYWRkZWQgYXVkaW8gdHJhY2sgQVUgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cEFkZGVkQ2xpcEN0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShhZGRlZCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBkZWNvZGVkIHRoZSBzYW1lIGFtb3VudCBvZiBQQ00gc2FtcGxlcyAqLwotICAgICAgICBpZiggcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICE9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgICAgICBib3RoIGNsaXBzIEFVIG11c3QgaGF2ZSB0aGUgc2FtZSBkZWNvZGVkIFBDTSBzaXplISIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFRF9QQ01fU0laRV9JU1NVRTsKLSAgICAgICAgfQotICAgICAgICBwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBNaXggdGhlIHR3byBkZWNvZGVkIFBDTSBhdWRpb3MgKi8KLSAgICBwUENNZGF0YTEgPQotICAgICAgICAoTTRPU0FfSW50MTYgKilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgdWlQQ01zaXplID0gcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgLyAyOyAvKmJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpKi8KLQotICAgIGlmKCBwQy0+Yl9EdWNraW5nTmVlZGVlZCApCi0gICAgewotICAgICAgICBsb29wSW5kZXggPSAwOwotICAgICAgICBwZWFrRGJWYWx1ZSA9IDA7Ci0gICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotCi0gICAgICAgIHBQQ00xNlNhbXBsZSA9IChNNE9TQV9JbnQxNiAqKXBDLT5wSW5wdXRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotCi0gICAgICAgIC8vQ2FsY3VsYXRlIHRoZSBwZWFrIHZhbHVlCi0gICAgICAgICB3aGlsZSggbG9vcEluZGV4Ci0gICAgICAgICAgICAgPCBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgLyBzaXplb2YoTTRPU0FfSW50MTYpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID49IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gcFBDTTE2U2FtcGxlW2xvb3BJbmRleF0KLSAgICAgICAgICAgICAgICA/IHByZXZpb3VzRGJWYWx1ZSA6IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gLXBQQ00xNlNhbXBsZVtsb29wSW5kZXhdCi0gICAgICAgICAgICAgICAgPyBwcmV2aW91c0RiVmFsdWUgOiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF07Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb29wSW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5hdWRpb1ZvbHVtZUFycmF5W3BDLT5hdWRWb2xBcnJJbmRleF0gPQotICAgICAgICAgICAgTTRWU1MzR1BQX2dldERlY2liZWxTb3VuZChwZWFrRGJWYWx1ZSk7Ci0KLSAgICAgICAgLyogV0lORE9XX1NJWkUgaXMgMTAgYnkgZGVmYXVsdCBhbmQgY2hlY2sgZm9yIHRocmVzaG9sZCBpcyBkb25lIGFmdGVyIDEwIGN5Y2xlcyAqLwotICAgICAgICBpZiggcEMtPmF1ZFZvbEFyckluZGV4ID49IFdJTkRPV19TSVpFIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5iRG9EdWNraW5nID0KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCgoTTRPU0FfSW50MzIgKikmKHBDLT5hdWRpb1ZvbHVtZUFycmF5KSwKLSAgICAgICAgICAgICAgICBwQy0+YXVkVm9sQXJySW5kZXgsIHBDLT5JbkR1Y2tpbmdfdGhyZXNob2xkKTsKLQotICAgICAgICAgICAgcEMtPmF1ZFZvbEFyckluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5hdWRWb2xBcnJJbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKkJlbG93IGxvZ2ljIGNvbnRyb2xzIHRoZSBtaXhpbmcgd2VpZ2h0YWdlIGZvciBCYWNrZ3JvdW5kIFRyYWNrIGFuZCBQcmltYXJ5IFRyYWNrCi0gICAgICAgICpmb3IgdGhlIGR1cmF0aW9uIG9mIHdpbmRvdyB1bmRlciBhbmFseXNpcyB0byBnaXZlIGZhZGUtb3V0IGZvciBCYWNrZ3JvdW5kIGFuZCBmYWRlLWluCi0gICAgICAgICpmb3IgcHJpbWFyeQotICAgICAgICAqCi0gICAgICAgICpDdXJyZW50IGZhZGluZyBmYWN0b3IgaXMgZGlzdHJpYnV0ZWQgaW4gZXF1YWwgcmFuZ2Ugb3ZlciB0aGUgZGVmaW5lZCB3aW5kb3cgc2l6ZS4KLSAgICAgICAgKgotICAgICAgICAqRm9yIGEgd2luZG93IHNpemUgPSAyNSAoNTAwIG1zICh3aW5kb3cgdW5kZXIgYW5hbHlzaXMpIC8gMjAgbXMgKHNhbXBsZSBkdXJhdGlvbikpCi0gICAgICAgICoKLSAgICAgICAgKi8KLQotICAgICAgICBpZiggcEMtPmJEb0R1Y2tpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPmR1Y2tpbmdGYWN0b3IKLSAgICAgICAgICAgICAgICA+IHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lICkgLy8gRkFERSBPVVQgQkcgVHJhY2sKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIGluIGZhY3RvciBvZiBsb3cgdm9sdW1lIHN0ZXBzIHRvIHJlYWNoCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvdyB2b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciAtPSAocEMtPkluRHVja2luZ19sb3dWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5kdWNraW5nRmFjdG9yID0gcEMtPkluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPmR1Y2tpbmdGYWN0b3IgPCAxLjAgKSAvLyBGQURFIElOIEJHIFRyYWNrCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIG9mIGxvdyB2b2x1bWUgZmFjdG9yIHRvIHJlYWNoCi0gICAgICAgICAgICAgICAgLy8gb3JpZy52b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciArPSAocEMtPkluRHVja2luZ19sb3dWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciA9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBlbmRpZiAtIGR1Y2tpbmdfZW5hYmxlICovCi0KLSAgICAgICAgLyogTWl4aW5nIExvZ2ljICovCi0KLSAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ludDMyIHRlbXA7Ci0KLSAgICAgICAgICAgLyogc2V0IHZvbCBmYWN0b3IgZm9yIEJUIGFuZCBQVCAqLwotICAgICAgICAgICAgKnBQQ01kYXRhMiA9IChNNE9TQV9JbnQxNikoKnBQQ01kYXRhMiAqIHBDLT5mQlRWb2xMZXZlbCk7Ci0KLSAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTEgKiBwQy0+ZlBUVm9sTGV2ZWwpOwotCi0gICAgICAgICAgICAvKiBtaXggdGhlIHR3byBzYW1wbGVzICovCi0KLSAgICAgICAgICAgICpwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCggKnBQQ01kYXRhMikgKiAocEMtPmR1Y2tpbmdGYWN0b3IpKTsKLSAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTIgLyAyICsgKnBQQ01kYXRhMSAvIDIpOwotCi0KLSAgICAgICAgICAgIGlmKCAqcFBDTWRhdGExIDwgMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IC0oICpwUENNZGF0YTEpCi0gICAgICAgICAgICAgICAgICAgICogMjsgLy8gYnJpbmcgdG8gc2FtZSBBbXBsaXR1ZGUgbGV2ZWwgYXMgaXQgd2FzIG9yaWdpbmFsCi0KLSAgICAgICAgICAgICAgICBpZiggdGVtcCA+IDMyNzY3ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAtMzI3NjY7IC8vIGxlc3MgdGhlbiBtYXggYWxsb3dlZCB2YWx1ZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgtdGVtcCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wID0gKCAqcFBDTWRhdGExKQotICAgICAgICAgICAgICAgICogMjsgLy8gYnJpbmcgdG8gc2FtZSBBbXBsaXR1ZGUgbGV2ZWwgYXMgaXQgd2FzIG9yaWdpbmFsCi0KLSAgICAgICAgICAgIGlmKCB0ZW1wID4gMzI3NjggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAzMjc2NzsgLy8gbGVzcyB0aGFuIG1heCBhbGxvd2VkIHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhMSA9IChNNE9TQV9JbnQxNil0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBQQ01kYXRhMisrOwotICAgICAgICAgICAgcFBDTWRhdGExKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApCi0gICAgICAgewotICAgICAgICAvKiBtaXggdGhlIHR3byBzYW1wbGVzICovCi0gICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgqcFBDTWRhdGExICogcEMtPmZPcmlnRmFjdG9yICogcEMtPmZQVFZvbExldmVsCi0gICAgICAgICAgICAgICArICpwUENNZGF0YTIgKiBwQy0+ZkFkZGVkRmFjdG9yICogcEMtPmZCVFZvbExldmVsICk7Ci0KLSAgICAgICAgICAgIHBQQ01kYXRhMSsrOwotICAgICAgICAgICAgcFBDTWRhdGEyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgcEMtPnBTc3JjQnVmZmVyT3V0IGJ1ZmZlciAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICsgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC09Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICB7Ci0gICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbgotICAgICAgICAgICAgKyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIH0KLQotICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIksgKioqKiBibGVuZCBBVXMiKTsKLQotICAgIC8qKgotICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLSAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9Ci0gICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkwgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgdGhlIGF1ZGlvIENUUyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5ld2MuZEFUbyArPSBmcmFtZVRpbWVEZWx0YSAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgRGVjb2RlL2VuY29kZSBhIGZldyBBVSBiYWNrd2FyZCB0byBpbml0aWF0ZSB0aGUgZW5jb2RlciBmb3IgbGF0ZXIgTWl4IHNlZ21lbnQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IDA7IC8qKjwgRHVyYXRpb24gb2YgdGhlIGVuY29kZWQgKHRoZW4gd3JpdHRlbikgZGF0YSAqLwotCi0gICAgTTRPU0FfSW50MzIgaVRhcmdldEN0cywgaUN1cnJlbnRDdHM7Ci0KLSAgICAvKioKLSAgICAqICdCWlpaJyBidWcgZml4OgotICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigpOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpQ3VycmVudEN0cyA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAvKiBEbyBub3QgZG8gcHJlLWVuY29kZSBzdGVwIGlmIHRoZXJlIGlzIG5vIG1peGluZyAocmVtb3ZlLCAxMDAgJSwgb3Igbm90IGVkaXRhYmxlKSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQWR2YW5jZSBpbiB0aGUgb3JpZ2luYWwgYXVkaW8gc3RyZWFtIHRvIHJlYWNoIHRoZSBjdXJyZW50IHRpbWUKLSAgICAgICAgKiAoV2UgZG9uJ3Qgd2FudCBpQXVkaW9DVFMgdG8gYmUgbW9kaWZpZWQgYnkgdGhlIGp1bXAgZnVuY3Rpb24sCi0gICAgICAgICogc28gd2UgaGF2ZSB0byB1c2UgYSBsb2NhbCB2YXJpYWJsZSkuICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBJbnB1dENsaXBDdHh0LCAmaUN1cnJlbnRDdHMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKjwgZG9uJ3QgdHJ5IHRvIHByZS1kZWNvZGUgaWYgY2xpcCBpcyBhdCBpdHMgYmVnaW5uaW5nLi4uICovCi0gICAgICAgIGlmKCBpQ3VycmVudEN0cyA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgYSBmZXcgQVVzIGJhY2t3YXJkICovCi0gICAgICAgICAgICBpVGFyZ2V0Q3RzID0gaUN1cnJlbnRDdHMgLSBNNFZTUzNHUFBfTkJfQVVfUFJFRkVUQ0gKLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgICAgICBpZiggaVRhcmdldEN0cyA8IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSAwOyAvKio8IFNhbml0eSBjaGVjayAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDLT5wSW5wdXRDbGlwQ3R4dCwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgd2hpbGUoIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPCBpQ3VycmVudEN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJNIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldAotICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOiBERUNPREVfRU5DT0RFLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk4gKioqKiBwcmUtZW5jb2RlIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsKLSAgICAgICAgICAgICAgICAwXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk8gLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVIHJldHVybnMgMHgleCEiLCAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgRW5jUGFyYW1zOwotCi0gICAgLyoqCi0gICAgKiBTaW11bGF0ZSBhIHdyaXRlciBpbnRlcmZhY2Ugd2l0aCBvdXIgc3BlY2lmaWMgZnVuY3Rpb24gKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFByb2Nlc3NBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVU7IC8qKjwgVGhpcyBmdW5jdGlvbiBpcyBWU1MgM0dQUCBzcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wU3RhcnRBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTdGFydEFVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgZm9sbG93IHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBXcml0ZXJDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQpCi0gICAgICAgIHBDOyAvKio8IFdlIGdpdmUgdGhlIGludGVybmFsIGNvbnRleHQgYXMgd3JpdGVyIGNvbnRleHQgKi8KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSwgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6IHNldEN1cnJlbnRFbmNvZGVyIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBlbmNvZGVyIHNoZWxsIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIFZTUyBzZXR0aW5ncyAqLwotCi0gICAgLyogQ29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0gICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+ZXdjLnVpVmlkZW9XaWR0aDsKLSAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQ7Ci0gICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlOwotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbCA9IHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIC8qIE5vIHN0cmljdCByZWd1bGF0aW9uIGluIHZpZGVvIGVkaXRvciAqLwotICAgIC8qIEJlY2F1c2Ugb2YgdGhlIGVmZmVjdHMgYW5kIHRyYW5zaXRpb25zIHdlIHNob3VsZCBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5ICovCi0gICAgLyogQWxzbyBpdCBwcmV2ZW50cyB0byBkcm9wIGltcG9ydGFudCBmcmFtZXMKLSAgICAgICh3aXRoIGEgYmFkIHJlc3VsdCBvbiBzaGVkdWxpbmcgYW5kIGJsb2NrIGVmZmV0Y3MpICovCi0gICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2tWQVJJQUJMRV9GUFM7Ci0KLSAgICAvKioKLSAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKGRlZmF1bHRzKSAqLwotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgPSAwOyAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7ICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzID0gMDsgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgICAvKiBpbml0aWFsIFFQID0gMTAgKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotICAgIHN3aXRjaCggcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUEVHNDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDg7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBNNFNZU19IMjY0Iik7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBVbmtub3duIHZpZGVvU3RyZWFtVHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBFbmNQYXJhbXMuQml0cmF0ZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLQotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdEluaXQiKTsKLSAgICAvKioKLSAgICAqIEluaXQgdGhlIHZpZGVvIGVuY29kZXIgKGFkdmFuY2VkIHNldHRpbmdzIHZlcnNpb24gb2YgdGhlIGVuY29kZXIgT3BlbiBmdW5jdGlvbikgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZTUzNHUFBfaW50VlBQLCBwQywKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEksCi0gICAgICAgIHBDLT5TaGVsbEFQSS5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdE9wZW4iKTsKLSAgICBNNE9TQV9UUkFDRTFfMigidnNzOiBhdWRpbyBtaXggZW5jb2RlciBvcGVuIHByb2ZpbGUgOiVkLCBsZXZlbCAlZCIsCi0gICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUsIEVuY1BhcmFtcy52aWRlb0xldmVsKTsKLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdFN0YXJ0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIERlc3Ryb3kgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEVuY0NvbnRleHQgKQotICAgIHsKLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmcgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa05vRW5jb2RlcjsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVzZXQgdmFyaWFibGUgKi8KLSAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfQm9vbCBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCggTTRPU0FfSW50MzIgKmF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgc3RvcmVDb3VudCwgTTRPU0FfSW50MzIgdGhyZXNob2xkVmFsdWUgKQotewotICAgIE00T1NBX0Jvb2wgcmVzdWx0ID0gMDsKLSAgICBpbnQgaTsKLSAgICBpbnQgZmluYWxWYWx1ZSA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHN0b3JlQ291bnQ7IGkrKyApCi0gICAgICAgIGZpbmFsVmFsdWUgKz0gYXZlcmFnZVZhbHVlW2ldOwotCi0gICAgZmluYWxWYWx1ZSA9IGZpbmFsVmFsdWUgLyBzdG9yZUNvdW50OwotCi0KLSAgICBpZiggZmluYWxWYWx1ZSA+IHRocmVzaG9sZFZhbHVlICkKLSAgICAgICAgcmVzdWx0ID0gTTRPU0FfVFJVRTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDA2MTJmMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQ2xpcC5jCi0gKiBAYnJpZWYgICAgSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gaW5wdXQgY2xpcCBtYW5hZ2VtZW50LgotICogQG5vdGUgICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHN0YXRpYywgaS5lLiBub24gcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0KLS8qKgotICogICAgT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyoqCi0gKiBDb21tb24gaGVhZGVycyAoZm9yIGFhYykgKi8KLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotLyogT3NhbCBoZWFkZXIgZmlsZW5vICovCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkZWZpbmUgICAgU3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKQotICogQGJyaWVmICAgIE9wZW4gYSBjbGlwLiBDcmVhdGVzIGEgY2xpcCBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIGhDbGlwQ3R4dCAgICAgICAgICAgIChPVVQpIFJldHVybiB0aGUgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3Mgb2YgdGhpcyBjbGlwLiBUaGUgbW9kdWxlIHdpbGwga2VlcCBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhpcyBwb2ludGVyCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBiU2tpcEF1ZGlvVHJhY2sgICAgICAgIChJTikgSWYgdHJ1ZSwgZG8gbm90IG9wZW4gdGhlIGF1ZGlvCi0gKiBAcGFyYW0gICAgYkZhc3RPcGVuTW9kZSAgICAgICAgKElOKSBJZiB0cnVlLCB1c2UgdGhlIGZhc3QgbW9kZSBvZiB0aGUgM2dwcCByZWFkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB0aGUgZmlyc3QgQVUgaXMgcmVhZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSW5pdCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqIGhDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gaENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0OiBoQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEluaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIHRoZSBjbGlwIGNvbnRleHQgKi8KLSAgICAqaENsaXBDdHh0ID0KLSAgICAgICAgKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBDb250ZXh0KSwKLSAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJNNFZTUzNHUFBfQ2xpcENvbnRleHQiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09ICpoQ2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0KCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBNNFZTUzNHUFBfQ2xpcENvbnRleHQsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwSW5pdCgpOiBjbGlwQ3R4dD0weCV4IiwgKmhDbGlwQ3R4dCk7Ci0KLQotICAgIC8qKgotICAgICogVXNlIHRoaXMgc2hvcnRjdXQgdG8gc2ltcGxpZnkgdGhlIGNvZGUgKi8KLSAgICBwQ2xpcEN0eHQgPSAqaENsaXBDdHh0OwotCi0gICAgLyogSW5pYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcENsaXBDdHh0LCAwLHNpemVvZihNNFZTUzNHUFBfQ2xpcENvbnRleHQpKTsKLQotICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgcENsaXBDdHh0LT5pVm9mZnNldCA9IDA7Ci0gICAgcENsaXBDdHh0LT5pQW9mZnNldCA9IDA7Ci0gICAgcENsaXBDdHh0LT5Wc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0gICAgcENsaXBDdHh0LT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0KLSAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gMDsKLSAgICBwQ2xpcEN0eHQtPmlWaWRlb1JlbmRlckN0cyA9IDA7Ci0gICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPmJWaWRlb0F1QXZhaWxhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBDdHh0LT5iRmlyc3RBdVdyaXR0ZW4gPSBNNE9TQV9GQUxTRTsKLQotICAgIHBDbGlwQ3R4dC0+Yk1wZWc0R292U3RhdGUgPSBNNE9TQV9GQUxTRTsKLQotICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgPSAwOwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgcENsaXBDdHh0LT5wRmlsZVJlYWRQdHJGY3QgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgICA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYygmcENsaXBDdHh0LT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLy8gVGhpcyBtZXRob2QgbWFwcyB0aGUgZnJlcXVlbmN5IHZhbHVlIHRvIGEgc3RyaW5nLgotc3RhdGljIGNvbnN0IGNoYXIqIGZyZXFUb1N0cmluZyhpbnQgZnJlcSkgewotICAgIHN3aXRjaCAoZnJlcSkgewotICAgIGNhc2UgODAwMDoKLSAgICAgICAgcmV0dXJuICJfODAwMCI7Ci0gICAgY2FzZSAxMTAyNToKLSAgICAgICAgcmV0dXJuICJfMTEwMjUiOwotICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgIHJldHVybiAiXzEyMDAwIjsKLSAgICBjYXNlIDE2MDAwOgotICAgICAgICByZXR1cm4gIl8xNjAwMCI7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgcmV0dXJuICJfMjIwNTAiOwotICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgIHJldHVybiAiXzI0MDAwIjsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgICByZXR1cm4gIl8zMjAwMCI7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgcmV0dXJuICJfNDQxMDAiOwotICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgIHJldHVybiAiXzQ4MDAwIjsKLSAgICBkZWZhdWx0OgotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiVW5zdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZTogJWQgSHoiLCBmcmVxKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vLyBUaGlzIG1ldGhvZCBtYXBzIHRoZSBudW1iZXIgb2YgY2hhbm5lbCB2YWx1ZSB0bwotLy8gYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHBhcnQgb2YgYSBmaWxlIG5hbWUgZXh0ZW5zaW9uCi1zdGF0aWMgY29uc3QgY2hhciogY2hhbm5lbFRvU3RyaW5nQW5kRmlsZUV4dChpbnQgY2hhbm5lbHMpIHsKLSAgICBzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0gICAgY2FzZSAxOgotICAgICAgICByZXR1cm4gIl8xLnBjbSI7Ci0gICAgY2FzZSAyOgotICAgICAgICByZXR1cm4gIl8yLnBjbSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIlVuc3VwcG9ydGVkICVkIGNoYW5uZWxzIiwgY2hhbm5lbHMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIE5vdGU6IGlmIHRoZSBjbGlwIGlzIG9wZW5lZCBpbiBmYXN0IG1vZGUsIGl0IGNhbiBvbmx5IGJlIHVzZWQgZm9yIGFuYWx5c2lzIGFuZCBub3RoaW5nIGVsc2UuICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywgTTRPU0FfQm9vbCBiU2tpcEF1ZGlvVHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZhc3RPcGVuTW9kZSwgTTRPU0FfQm9vbCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXI7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgZHVtbXlTdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX0ludDMyIGlEdXJhdGlvbjsKLSAgICBNNE9TQV9Wb2lkICpkZWNvZGVyVXNlckRhdGE7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8gZHVtbXk7Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSB2aWRlb1NpemVGcm9tRFNJOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciBGaWx0ZXJPcHRpb247Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBjYWxsZWQgd2l0aCBwQ2xpcEN0eHQ6IDB4JXgsIGJBdm9pZE9wZW5pbmdWaWRlb0RlYz0weCV4IiwKLSAgICAgICAgcENsaXBDdHh0LCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMpOwotICAgIC8qKgotICAgICogS2VlcCBhIHBvaW50ZXIgdG8gdGhlIGNsaXAgc2V0dGluZ3MuIFJlbWVtYmVyIHRoYXQgd2UgZG9uJ3QgcG9zc2VzcyBpdCEgKi8KLSAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncyA9IHBDbGlwU2V0dGluZ3M7Ci0gICAgaWYoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSkgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBJbWFnZSBzdHJlYW07IHNldCBjdXJyZW50IHZpZCBkZWMiKTsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5TaGVsbEFQSSwgTTREQV9TdHJlYW1UeXBlVmlkZW9BUkdCODg4OCk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAmZHVtbXlTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXIsCi0gICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCwKLSAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPlZpZGVvQVUsCi0gICAgICAgICAgICAgICAgICBkZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogXAotICAgICAgICAgICAgICAgIG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFwKLSAgICAgICAgICAgIFZpZCBkZWMgc3RhcnRlZDsgcFZpRGVjQ3R4dD0weCV4IiwgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgY29ycmVjdCByZWFkZXIgaW50ZXJmYWNlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRSZWFkZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIDNHUFAgb3IgTVAzIHJlYWRlciAqLwotICAgIGVyciA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdGhlIHJlYWRlciBpbnRlcmZhY2UgdG8gdGhlIHJlYWRlciBjb250ZXh0ICh1c2VkIGJ5IHRoZSBkZWNvZGVyIHRvIGtub3cgdGhlIHJlYWRlcikgKi8KLSAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9yZWFkZXJDb250ZXh0ID0KLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSBPU0FMIHJlYWQgZnVuY3Rpb24gc2V0ICovCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikocENsaXBDdHh0LT5wRmlsZVJlYWRQdHJGY3QpKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGZhc3Qgb3BlbiBtb2RlIGlmIGFza2VkICgzR1BQIG9ubHkpICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBiRmFzdE9wZW5Nb2RlICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlLCBNNE9TQV9OVUxMKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oRmFzdE9wZW5Nb2RlKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHNraXAgYXVkaW8gb3B0aW9uIGlmIGFza2VkICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IGJTa2lwQXVkaW9UcmFjayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1ZpZGVvT25seSwgTTRPU0FfTlVMTCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oVmlkZW9Pbmx5KSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNKSB7Ci0gICAgICAgIC8vIENvbXBvc2UgdGhlIHRlbXAgZmlsZW5hbWUgd2l0aCBzYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbCBpbmZvcm1hdGlvbi4KLSAgICAgICAgY29uc3QgY2hhciogZnJlcVN0ciA9IGZyZXFUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotCi0gICAgICAgIGlmIChmcmVxU3RyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBjaGFyKiBjaGFuU3RyID0gY2hhbm5lbFRvU3RyaW5nQW5kRmlsZUV4dCgKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0KLSAgICAgICAgaWYgKGNoYW5TdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbG9jYXRlIG9uZSBieXRlIG1vcmUgdG8gaG9sZCB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPQotICAgICAgICAgICAgc3RybGVuKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSArIHN0cmxlbihmcmVxU3RyKSArIHN0cmxlbihjaGFuU3RyKSArIDE7Ci0KLSAgICAgICAgY2hhciogcFRlbXBGaWxlID0gKGNoYXIgKikgbWFsbG9jKGxlbmd0aCk7Ci0gICAgICAgIGlmIChwVGVtcEZpbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtYWxsb2MgJWQgYnl0ZXMgZmFpbCIsbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQocFRlbXBGaWxlLCAwLCBsZW5ndGgpOwotICAgICAgICBtZW1jcHkocFRlbXBGaWxlLCBwQ2xpcFNldHRpbmdzLT5wRmlsZSwgc3RybGVuKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSk7Ci0gICAgICAgIHN0cm5jYXQocFRlbXBGaWxlLCBmcmVxU3RyLCBzdHJsZW4oZnJlcVN0cikpOwotICAgICAgICBzdHJuY2F0KHBUZW1wRmlsZSwgY2hhblN0ciwgc3RybGVuKGNoYW5TdHIpKTsKLQotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0T3BlbiggcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgcFRlbXBGaWxlKTsKLSAgICAgICAgaWYgKHBUZW1wRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBUZW1wRmlsZSk7Ci0gICAgICAgICAgICBwVGVtcEZpbGUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmICggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG9wZW4gcGNtIGZpbGUgcmV0dXJucyBlcnJvciA6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIC8qKgotICAgICAgICAqIE9wZW4gdGhlIDNHUFAvTVAzIGNsaXAgZmlsZSAqLwotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0T3BlbiggcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0gICAgfQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlEdW1teSwgdWlDb3JlSWQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgZXJyb3IgaXMgZnJvbSB0aGUgY29yZSByZWFkZXIsIHdlIGNoYW5nZSBpdCB0byBhIHB1YmxpYyBWU1MzR1BQIGVycm9yICovCi0gICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLQotICAgICAgICBpZiggTTRNUDRfUkVBREVSID09IHVpQ29yZUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgKi8KLSAgICB3aGlsZSggZXJyID09IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0oCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LCAmbWVkaWFGYW1pbHksICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyppbiBjYXNlIHdlIGZvdW5kIGEgQklGUyBzdHJlYW0gb3Igc29tZXRoaW5nIGVsc2UuLi4qLwotICAgICAgICBpZiggKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIGEgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiggKCBtZWRpYUZhbWlseSA9PSBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbykKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNAotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IG9yIEgyNjQgdmlkZW8gc3RyZWFtIGluIGlucHV0IDNncHAgY2xpcDsgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1ZpZGVvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTX2VkaXRDbGlwT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAoMHgleCkgaW4gaW5wdXQgM2dwcCBjbGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiggKCBtZWRpYUZhbWlseSA9PSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbykKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiBBTVItTkIgb3IgQUFDIG9yIE1QMyBhdWRpbyBzdHJlYW0gaW4gaW5wdXQgY2xpcDsgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RSZXNldChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBBTVItTkIgb3IgQUFDIChBTVItV0IuLi4pICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiB1bnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0gKDB4JXgpIGluIGlucHV0IDNncHAvbXAzIGNsaXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbSgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0IFZpZGVvIGRlY29kZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgewotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAvKiBJZiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUsIGl0J3MgYmVzdCB0byBhdm9pZCBvcGVuaW5nIHRoZSBkZWNvZGVyIGlmIHRoZSBjbGlwIGlzIG9ubHkKLSAgZ29pbmcgdG8gYmUgdXNlZCBmb3IgYW5hbHlzaXMsIGFzIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQgZm9yIHRoZSBhbmFseXNpcyBpbiB0aGUgY2FzZSBvZiBhCi0gIHBvc3NpYmxlIGV4dGVybmFsIGRlY29kZXIgYW55d2F5LCBhbmQgZWl0aGVyIHRoZXJlIGNvdWxkIGJlIG5vIGRlY29kZXIgYXQgdGhpcyBwb2ludCBvciB0aGUgSFcKLSAgZGVjb2RlciBjb3VsZCBiZSBwcmVzZW50LCB3aGljaCB3ZSB3YW50IHRvIGF2b2lkIG9wZW5pbmcgZm9yIHRoYXQuIFNlZSBjb21tZW50cyBpbgotICBpbnRCdWlsZEFuYWx5c2lzIGZvciBtb3JlIGRldGFpbHMuICovCi0KLSAgLyogQ0hBTkdFTUUgVGVtcG9yYXJpbHkgb25seSBkbyB0aGlzIGZvciBNUEVHNCwgc2luY2UgZm9yIG5vdyBvbmx5IE1QRUc0IGV4dGVybmFsIGRlY29kZXJzIGFyZQotICBzdXBwb3J0ZWQsIGFuZCB0aGUgZm9sbG93aW5nIHdvdWxkbid0IHdvcmsgZm9yIEgyNjMgc28gYSByZWxlYXNlIHdoZXJlIGV4dGVybmFsIGRlY29kZXJzIGFyZQotICBwb3NzaWJsZSwgYnV0IG5vdCB1c2VkLCB3b3VsZG4ndCB3b3JrIHdpdGggSDI2MyBzdHVmZi4gKi8KLQotICAgICAgICBpZiggYkF2b2lkT3BlbmluZ1ZpZGVvRGVjICYmIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBPb3BzISBUaGUgbWVyZSBhY3Qgb2Ygb3BlbmluZyB0aGUgZGVjb2RlciBhbHNvIHJlc3VsdHMgaW4gdGhlIGltYWdlIHNpemUgYmVpbmcKLSAgICAgICAgICAgIGZpbGxlZCBpbiB0aGUgdmlkZW8gc3RyZWFtISBDb21wZW5zYXRlIGZvciB0aGlzIGJ5IHVzaW5nIFBhcnNlVmlkZW9EU0kgdG8gZmlsbAotICAgICAgICAgICAgdGhpcyBpbmZvLiAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogTXBlZzQgc3RyZWFtOyB2aWQgZGVjIG5vdCBzdGFydGVkIik7Ci0gICAgICAgICAgICBlcnIgPSBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSShwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmZHVtbXksICZ2aWRlb1NpemVGcm9tRFNJKTsKLQotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aCA9IHZpZGVvU2l6ZUZyb21EU0kubV91aVdpZHRoOwotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQgPQotICAgICAgICAgICAgICAgIHZpZGVvU2l6ZUZyb21EU0kubV91aUhlaWdodDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IE1wNC9IMjYzL0gyNjQgc3RyZWFtOyBzZXQgY3VycmVudCB2aWQgZGVjIik7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlcigmcENsaXBDdHh0LT5TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgICAgIGRlY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlKAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlciwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCwKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5WaWRlb0FVLCBkZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggKCAoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEKSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgfHwgKCgoTTRPU0FfVUludDMyKU00RVJSX0RFQ09ERVJfSDI2M19OT1RfQkFTRUxJTkUpID09IGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogT3VyIGRlY29kZXIgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBIMjYzIHByb2ZpbGUgb3RoZXIgdGhhbiAwLgotICAgICAgICAgICAgICAgICogU28gaXQgcmV0dXJucyB0aGlzIGludGVybmFsIGVycm9yIGNvZGUuCi0gICAgICAgICAgICAgICAgKiBXZSB0cmFuc2xhdGUgaXQgdG8gb3VyIG93biBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFZpZCBkZWMgc3RhcnRlZDsgcFZpRGVjQ3R4dD0weCV4IiwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQpOwotCi0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YwotICAgICAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlck9wdGlvbi5tX3BGaWx0ZXJGdW5jdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopICZNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMDsKLSAgICAgICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsdGVyT3B0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIgT0siKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCBBdWRpbyBkZWNvZGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyKHBDbGlwQ3R4dCk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBBdWRpbyBkZWMgc3RhcnRlZDsgY29udGV4dD0weCV4IiwKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3N0cmVhbUlEID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fRFRTID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fYXR0cmlidXRlID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fbWF4c2l6ZSA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3N0cnVjdFNpemUgPSBzaXplb2YocENsaXBDdHh0LT5BdWRpb0FVKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3Qgc3RyZWFtICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCApCi0gICAgewotICAgICAgICAvKiBJZiBhbHJlYWR5IGNhbGN1bGF0ZWQgc2V0IGl0IHRvIHByZXZpb3VzIHZhbHVlICovCi0gICAgICAgIC8qIEJlY2F1c2UgZmFzdCBvcGVuIGFuZCBmdWxsIG9wZW4gY2FuIHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZSwKLSAgICAgICAgICAgaXQgY2FuIG1pc21hdGNoIHVzZXIgc2V0dGluZ3MgKi8KLSAgICAgICAgLyogVmlkZW8gdHJhY2sgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBhdWRpbyB0cmFjayAoaWYgdmlkZW8gdHJhY2sgaXMgc2hvcnRlciB0aGFuCi0gICAgICAgICAgIGF1ZGlvIHRyYWNrLCBpdCBjYW4gbGVkIHRvIGN1dCBsYXJnZXIgdGhhbiBleHBlY3RlZCkgKi8KLSAgICAgICAgaUR1cmF0aW9uID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0KLSAgICAgICAgaWYoIGlEdXJhdGlvbiA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgaUR1cmF0aW9uID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEVsc2UgY29tcHV0ZSBpdCBmcm9tIHN0cmVhbXMgKi8KLSAgICAgICAgaUR1cmF0aW9uID0gMDsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSkgJiYgKChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbikKLSAgICAgICAgICAgID4gaUR1cmF0aW9uKSAmJiBpRHVyYXRpb24gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiBlbmQgdGltZSBpcyBub3QgdXNlZCwgd2Ugc2V0IGl0IHRvIHRoZSB2aWRlbyB0cmFjayBkdXJhdGlvbiAqLwotICAgIGlmKCAwID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT51aUVuZEN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnVpRW5kQ3V0VGltZSA9IChNNE9TQV9VSW50MzIpaUR1cmF0aW9uOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+aUVuZFRpbWUgPSAoTTRPU0FfSW50MzIpcENsaXBDdHh0LT5wU2V0dGluZ3MtPnVpRW5kQ3V0VGltZTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soKQotICogQGJyaWVmICAgIERlbGV0ZSB0aGUgYXVkaW8gdHJhY2suIENsaXAgd2lsbCBiZSBsaWtlIGlmIGl0IGhhZCBubyBhdWRpbyB0cmFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgLyoqCi0gICAgKiBCdXQgd2UgZG9uJ3QgaGF2ZSB0byBmcmVlIHRoZSBhdWRpbyBzdHJlYW0uIEl0IHdpbGwgYmUgZnJlZWQgYnkgdGhlIHJlYWRlciB3aGVuIGNsb3NpbmcgaXQqLwotICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogV2Ugd2lsbCByZXR1cm4gYSBjb25zdGFudCBzaWxlbmNlIEFNUiBBVS4KLSAgICAqIFdlIHNldCBpdCBoZXJlIG9uY2UsIGluc3RlYWQgb2YgYXQgZWFjaCByZWFkIGF1ZGlvIHN0ZXAuICovCi0gICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhOwotICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAoaXQgbmVlZHMgdG8gYmUgcmUtYWxsb2NhdGVkIHRvIHN0b3JlIHNpbGVuY2UKLSAgICAgIGZyYW1lIGV2ZW50dWFsbHkpKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdXJyZW50VGltZSgpCi0gKiBAYnJpZWYgICAgSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGFuZCBkZWNvZGUgdXAgdG8gdGhlIGN1cnJlbnQgdmlkZW8gdGltZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBpQ3RzICAgICAgICAoSU4pIFRhcmdldCBDVFMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpQ3RzICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpUmFwQ3RzLCBpQ2xpcEN0czsKLSAgICBNNF9NZWRpYVRpbWUgZERlY29kZVRpbWU7Ci0gICAgTTRPU0FfQm9vbCBiQ2xpcEp1bXAgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHRoZSB0aW1lIGluIHRoZSBjbGlwIGJhc2UgKi8KLSAgICBpQ2xpcEN0cyA9IGlDdHMgLSBwQ2xpcEN0eHQtPmlWb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgKiBJZiB3ZSB3ZXJlIHJlYWRpbmcgdGhlIGNsaXAsIHdlIG11c3QganVtcCB0byB0aGUgcHJldmlvdXMgUkFQCi0gICAgKiB0byBkZWNvZGUgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQ2xpcEN0eHQtPlZzdGF0dXMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogVGhlIGRlY29kZXIgbXVzdCBiZSB0b2xkIHRvIGp1bXAgKi8KLSAgICAgICAgYkNsaXBKdW1wID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPSBpQ2xpcEN0czsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBSZW1lbWJlciB0aGUgY2xpcCByZWFkaW5nIHN0YXRlICovCi0gICAgICAgIHBDbGlwQ3R4dC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB3ZSBhcmUgaW4gZGVjb2RlVXBUbygpIHByb2Nlc3MsIGNoZWNrIGlmIHdlIG5lZWQgdG8gZG8KLSAgICBvbmUgbW9yZSBzdGVwIG9yIGlmIGRlY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcENsaXBDdHh0LT5Wc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIC8qIERvIGEgc3RlcCBvZiA1MDAgbXMgZGVjb2RpbmcgKi8KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgKz0gNTAwOwotCi0gICAgICAgIGlmKCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyA+IGlDbGlwQ3RzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGFyZ2V0IHRpbWUgcmVhY2hlZCwgd2Ugc3dpdGNoIGJhY2sgdG8gREVDT0RFIG1vZGUgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gaUNsaXBDdHM7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoImMgLCwsLCBkZWNvZGUgdXAgdG8gOiAlbGQiLCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEp1c3QgZGVjb2RlIGF0IGN1cnJlbnQgY2xpcCBjdHMgKi8KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPSBpQ2xpcEN0czsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiZCAsLCwsIGRlY29kZSB1cCB0byA6ICVsZCIsIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIERlY29kZSB1cCB0byB0aGUgdGFyZ2V0ICovCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0czogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiwgcENsaXBDdHh0PTB4JXgiLAotICAgICAgICBkRGVjb2RlVGltZSwgcENsaXBDdHh0KTsKLQotICAgIGREZWNvZGVUaW1lID0gKE00T1NBX0RvdWJsZSlwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0czsKLSAgICBwQ2xpcEN0eHQtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0gICAgZXJyID0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICZkRGVjb2RlVGltZSwgYkNsaXBKdW1wLCAwKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpCi0gICAgICAgICYmIChlcnIgIT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzOiBtX3BGY3REZWNvZGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5pc1JlbmRlckR1cCA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHM6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcmFtZSBpbiB0aGUgY2xpcAotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBOTyBBVURJTyAtLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICAvKiBJZiB0aGVyZSBpcyBubyBhdWRpbyB0cmFjaywgd2UgcmV0dXJuIHNpbGVuY2UgQVVzICovCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzICs9IHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJiICMjIyMgYmxhbmsgdHJhY2siKTsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBBTVItTkIsIEVWUkMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UgaWYoICggTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0VWUkMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTm8gQVUgYXZhaWxhYmxlLCBzbyB3ZSBtdXN0IG11c3QgcmVhZCBvbmUgZnJvbSB0aGUgb3JpZ2luYWwgdHJhY2sgcmVhZGVyICovCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBBTVIgZnJhbWUgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVhZCBBVSAqLwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBBTVIgZnJhbWUgQ1RTICovCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSAmJiAoTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIGxlc3MgYXVkaW8gdGhhbiB0aGUgc3RyZWFtIGR1cmF0aW9uIGluZGljYXRlZCwKLSAgICAgICAgICAgICAgICAqIHdlIHJldHVybiBzaWxlbmNlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gKi8KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0gcENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJhICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBNNFdBUl9OT19NT1JFX0FVICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSAoc2lsZW5jZSkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyoqPCBmYXRhbCBlcnJvciAob3Igbm8gc2lsZW5jZSBpbiBFVlJDKSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGJBdWRpb0ZyYW1lQXZhaWxhYmxlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBHbyB0byB0aGUgbmV4dCBBTVIgZnJhbWUgaW4gdGhlIEFVICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyICs9IHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluY3JlbWVudCBDVFM6IG9uZSBBTVIgZnJhbWUgaXMgMjAgbXMgbG9uZyAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlZCBBTVIgZnJhbWUgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAwID09IHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogQVUgZnJhbWUgc2l6ZSA9PSAwLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQU1SX0FVIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID4gcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogQVUgZnJhbWUgc2l6ZSBncmVhdGVyIHRoYW4gQVUgc2l6ZSEsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BTVJfQVUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGlmIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgQVUgaGFzIGJlZW4gcmVhY2hlZCBvciBub3QgKi8KLSAgICAgICAgaWYoICggcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciArIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSkKLSAgICAgICAgICAgIDwgKHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzICsgcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKio8IHdpbGwgYmUgdXNlZCBmb3IgbmV4dCBjYWxsICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBBQUMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UgaWYoICggTTRWSURFT0VESVRJTkdfa0FBQwotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0FBQ3BsdXMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tlQUFDcGx1cwotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKSApCi0gICAgewotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbwotICAgICAgICAgICAgICAgICsgMC41KTsKLQotICAgICAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAgICAgLyogKGN0cyBpcyBub3QgYW4gaW50ZWdlciB3aXRoIGZyZXF1ZW5jeSAyNCBrSHogZm9yIGV4YW1wbGUpICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gKCAoIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICArIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gMikKLSAgICAgICAgICAgICAgICAvIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uKQotICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSWYgdGhlcmUgaXMgbGVzcyBhdWRpbyB0aGFuIHRoZSBzdHJlYW0gZHVyYXRpb24gaW5kaWNhdGVkLAotICAgICAgICAgICAgKiB3ZSByZXR1cm4gc2lsZW5jZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImEgIyMjIyBzaWxlbmNlIEFVIik7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBNNFdBUl9OT19NT1JFX0FVICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BQUM6XAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIChzaWxlbmNlKSIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKio8IGZhdGFsIGVycm9yICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFBQzogbV9wRmN0R2V0TmV4dEF1KCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gTVAzLCBvdGhlcnMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCktTVAzOiBtX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzOwotICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSAoTTRPU0FfVUludDE2KXBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemU7Ci0gICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICArIDAuNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIENyZWF0ZXMgYW5kIGluaXRpYWxpemUgdGhlIGF1ZGlvIGRlY29kZXIgZm9yIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfU3RyZWFtVHlwZSBhdWRpb3R5cGU7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNF9BQUNUeXBlIGlBYWNUeXBlID0gMDsKLQotI2VuZGlmCi0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvcGVyIGF1ZGlvIGRlY29kZXIgKi8KLQotICAgIGF1ZGlvdHlwZSA9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGU7Ci0KLSAgICAvL0VWUkMKLSAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgICE9IGF1ZGlvdHlwZSApIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksIGF1ZGlvdHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZXMgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2RlciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKTogRmFpbHMgdG8gaW5pdGlhdGUgdGhlIGF1ZGlvIGRlY29kZXIuIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0ICkKLSAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcENsaXBDdHh0LT5TaGVsbEFQSS5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9QY20gIT0gYXVkaW90eXBlKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgIE00T1NBX05VTEwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlY1wKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgQ3JlYXRpbmcgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlciBvZiB0eXBlIDB4JXgiLCBhdWRpb3R5cGUpOwotICAgICAgICAgICAgLyogRXh0ZXJuYWwgT01YIGNvZGVjcyBhcmUgdXNlZCovCi0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEFBQyBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgICAgICAgICAgLypnZXQgZnJvbSBSZWFkZXI7IHRlbXBvcmFyeSwgdGlsbCBBdWRpbyBkZWNvZGVyIHNoZWxsIEFQSQotICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBnZXQgdGhlIEFBQyBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMocENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmaUFhY1R5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBlcnIgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSA9IE00X2tBQUM7IC8vc2V0IHRvIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBzdHJlYW1UeXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGlBYWNUeXBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFFeHRlbnNpb25TYW1wRnJlcSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IEFBQyBOQkNoYW5zPSVkLCBTYW1wbEZyZXE9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2Vsc2UKLSAgICAgICAgLyogVHJpY2ssIEkgdXNlIHBVc2VyRGF0YSB0byByZXRyaWV2ZSBhYWMgcHJvcGVydGllcywKLSAgICAgICAgICAgd2FpdGluZyBmb3Igc29tZSBiZXR0ZXIgaW1wbGVtZW50YXRpb24uLi4gKi8KLQotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwgJihwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICBNNE9TQV9OVUxMIC8qIHRvIGJlIGNoYW5nZWQgd2l0aCBIVyBpbnRlcmZhY2VzICovKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICB9Ci0KLSAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogQU1SIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogRVZSQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogTVAzIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICB7Ci0gICAgICAgIC8qIEFBQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBEZWNvZGUgaGlnaCBxdWFsaXR5IGFhYyBidXQgZGlzYWJsZSBQUyBhbmQgU0JSICovCi0gICAgICAgIC8qIEJlY2F1c2Ugd2UgaGF2ZSB0byBtaXggZGlmZmVyZW50IGtpbmQgb2YgQUFDIHNvIHdlIG11c3QgdGFrZSB0aGUgbG93ZXN0IGNhcGFiaWxpdHkgKi8KLSAgICAgICAgLyogSW4gTUNTIGl0IHdhcyBub3QgbmVlZGVkIGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtICovCi0gICAgICAgIE00X0FhY0RlY29kZXJDb25maWcgQWFjRGVjUGFyYW07Ci0KLSAgICAgICAgQWFjRGVjUGFyYW0ubV9BQUNEZWNvZGVyUHJvZmlsZSA9IEFBQ19rQUFDOwotICAgICAgICBBYWNEZWNQYXJhbS5tX0Rvd25TYW1wbGluZ01vZGUgPSBBQUNfa0RTX09GRjsKLQotICAgICAgICBpZiggTTRFTkNPREVSX2tNb25vID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa1N0ZXJlbzsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgIE00QURfa09wdGlvbklEX1VzZXJQYXJhbSwgKE00T1NBX0RhdGFPcHRpb24pICZBYWNEZWNQYXJhbSk7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjICkgewotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZSwKLSAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLAotICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICkKLSAgICB7Ci0gICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCBpbiBhbGwgZGVjb2RlcnMgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgKiBzaXplb2YoTTRPU0FfSW50MTYpLAotICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigpOlwKLSAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBEZWNvZGUgdGhlIGN1cnJlbnQgQVVESU8gZnJhbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBTaWxlbmNlIG1vZGUgKi8KLSAgICBpZiggcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YQotICAgICAgICA9PSAoTTRPU0FfVUludDggKilwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlTaWxlbmNlUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX0ludDE2KSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFAsKE00T1NBX0NoYXIgKikgIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIEF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbGwgaXQgd2l0aCAwICg9IHBjbSBzaWxlbmNlKSAqLwotICAgICAgICBtZW1zZXQocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLDAsCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKiBzaXplb2YoTTRPU0FfSW50MTYpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ00pCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOCkgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cjsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSAgPSBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKilwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcywgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBTdGFuZGFyZCBkZWNvZGluZyBtb2RlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVjb2RlIGN1cnJlbnQgQU1SIGZyYW1lICovCi0gICAgICAgIGlmICggcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciAhPSBNNE9TQV9OVUxMICkgewotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyOwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fdGltZVN0YW1wVXMgPQotICAgICAgICAgICAgIChpbnQ2NF90KSAocENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyAqIDEwMDBMTCk7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4sICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0LAotICAgICAgICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFBhc3MgTnVsbCBpbnB1dCBidWZmZXIKLSAgICAgICAgICAgIC8vIFJlYWRlciBpbnZva2VkIGZyb20gQXVkaW8gZGVjb2RlciBzb3VyY2UKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgIE00T1NBX05VTEwsICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0LAotICAgICAgICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCk6XAotICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKQotICogQGJyaWVmICAgIEp1bXAgaW4gdGhlIGF1ZGlvIHRyYWNrIG9mIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwSnVtcEN0cyAgICAgICAgICAgIChJTi9PVVQpIGluOnRhcmdldCBDVFMsIG91dDogcmVhY2hlZCBDVFMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcEp1bXBDdHMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfSW50MzIgaVRhcmdldEN0czsKLSAgICBNNE9TQV9JbnQzMiBpSnVtcEN0c01zOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IHBDbGlwQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBKdW1wQ3RzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdDogcEp1bXBDdHMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaVRhcmdldEN0cyA9ICpwSnVtcEN0czsKLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8gc3RyZWFtLCB3ZSBzaW11bGF0ZSBhIGp1bXAgYXQgdGhlIHRhcmdldCBqdW1wIENUUyAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIHRoZSB0YXJnZXQgQ1RTIHdpbGwgYmUgcmVhY2hlZCBhdCBuZXh0IFJlYWRGcmFtZSBjYWxsICh0aHVzIHRoZSAtMjApICovCi0gICAgICAgICpwSnVtcEN0cyA9IGlUYXJnZXRDdHMgLSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAvKiBQYXRjaCBiZWNhdXNlIG1fQ1RTIGlzIHVuZm9ydHVuYXRlbHkgcm91bmRlZCBpbiAzZ3AgcmVhZGVyIHNoZWxsICovCi0gICAgICAgIC8qIChjdHMgaXMgbm90IGFuIGludGVnZXIgd2l0aCBmcmVxdWVuY3kgMjQga0h6IGZvciBleGFtcGxlKSAqLwotICAgICAgICAqcEp1bXBDdHMgPSAoICggKnBKdW1wQ3RzICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyAyKQotICAgICAgICAgICAgLyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikKLSAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgKgotICAgICAgICAgICAgcEp1bXBDdHM7IC8qIHNpbXVsYXRlIGEgcmVhZCBhdCBqdW1wIHBvc2l0aW9uIGZvciBsYXRlciBzaWxlbmNlIEFVcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9JbnQzMiBjdXJyZW50X3RpbWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQzMiBsb29wX2NvdW50ZXIgPSAwOwotCi0gICAgICAgIGlmKCAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDMKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUoICggbG9vcF9jb3VudGVyIDwgTTRWU1MzR1BQX01QM19KVU1QRURfQVVfTlVNQkVSX01BWCkKLSAgICAgICAgICAgICAgICAmJiAoY3VycmVudF90aW1lIDwgaVRhcmdldEN0cykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGN1cnJlbnRfdGltZSA9IChNNE9TQV9JbnQzMilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFM7Ci0gICAgICAgICAgICAgICAgbG9vcF9jb3VudGVyKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGUgY3VycmVudCBBVSBpcyBzdG9yZWQgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICAgICAgKyAwLjUpOwotCi0gICAgICAgICAgICAqcEp1bXBDdHMgPSBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgaW4gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgaUp1bXBDdHNNcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgqcEp1bXBDdHMgLyBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZpSnVtcEN0c01zKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTogbV9wRmN0SnVtcCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnBKdW1wQ3RzID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKGlKdW1wQ3RzTXMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAgICAgLyogKGN0cyBpcyBub3QgYW4gaW50ZWdlciB3aXRoIGZyZXF1ZW5jeSAyNCBrSHogZm9yIGV4YW1wbGUpICovCi0gICAgICAgICAgICAqcEp1bXBDdHMgPSAoICggKnBKdW1wQ3RzICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyAyKQotICAgICAgICAgICAgICAgIC8gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24pCi0gICAgICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPSAwOyAvKiBObyBmcmFtZSByZWFkIHlldCAqLwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVG8gZGV0ZWN0IHNvbWUgbWF5LWJlIGJ1Z3MsIEkgcHJlZmVyIHRvIHJlc2V0IGFsbCB0aGVzZSBhZnRlciBhIGp1bXAgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW4gQU1SLCB3ZSBoYXZlIHRvIG1hbmFnZSBtdWx0aS1mcmFtZWQgQVVzLAotICAgICAgICAgICAgYnV0IGFsc28gaW4gQUFDIHRoZSBqdW1wIGNhbiBiZSAxIEFVIHRvbyBtdWNoIGJhY2t3YXJkICovCi0gICAgICAgICAgICBpZiggKnBKdW1wQ3RzIDwgaVRhcmdldEN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBKdW1wIGRvZXNuJ3QgcmVhZCBhbnkgQVUsIHdlIG11c3QgcmVhZCBhdCBsZWFzdCBvbmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcEN0eHQpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShhKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgQVUgZnJhbWVzIGFzIGxvbmcgYXMgd2UgcmVhY2ggdGhlIEFVIGJlZm9yZSB0aGUgdGFyZ2V0IENUUwotICAgICAgICAgICAgICAgICogKHNvIHRoZSB0YXJnZXQgd2lsbCBiZSByZWFjaGVkIHdoZW4gdGhlIHVzZXIgY2FsbCBSZWFkTmV4dEF1ZGlvRnJhbWUpLiAqLwotICAgICAgICAgICAgICAgIHdoaWxlKCBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIDwgKGlUYXJnZXRDdHMgLSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXR1cm4gdGhlIENUUyB0aGF0IHdpbGwgYmUgcmVhY2hlZCBhdCBuZXh0IFJlYWRGcmFtZSAqLwotICAgICAgICAgICAgICAgICpwSnVtcEN0cyA9IHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgKyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCkKLSAqIEBicmllZiAgICBDbG9zZSBhIGNsaXAuIERlc3Ryb3kgdGhlIGNvbnRleHQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbG9zZSggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbG9zZTogcENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZGVjb2RlciBjb250ZXh0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlEZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGF1ZGlvIGRlY29kZXIgY29udGV4dCAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2U6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBVSBpcyBhbGxvY2F0ZWQgYnkgcmVhZGVyLgotICAgICogSWYgbm8gYXVkaW8gdHJhY2ssIGF1ZGlvIEFVIGlzIHNldCBhdCAnc2lsZW50JyAoU0lEKSBieSBWU1MuCi0gICAgKiBBcyBhIGNvbnNlcXVlbmNlLCBpZiBhdWRpbyBBVSBpcyBzZXQgdG8gJ3NpbGVudCcgKHN0YXRpYykKLSAgICBpdCBjYW4ndCBiZSBmcmVlIHVubGVzcyBpdCBpcyBzZXQgdG8gTlVMTCAqLwotICAgIGlmKCAoIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4Ci0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKQotICAgICAgICB8fCAoKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MpICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdENsb3NlKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoKTogbV9wUmVhZGVyLT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZXN0cm95IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgY29udGV4dCAqLwotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCk6IG1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoQ3R4dD0weCV4KTogcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICBwQ2xpcEN0eHQpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IsIGVycjI7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwOiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSB2aWRlbyBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQpOwotICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgYXVkaW8gZGVjb2RlciBjb250ZXh0ICAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXA6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgZXJyID0gZXJyMjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBVSBpcyBhbGxvY2F0ZWQgYnkgcmVhZGVyLgotICAgICogSWYgbm8gYXVkaW8gdHJhY2ssIGF1ZGlvIEFVIGlzIHNldCBhdCAnc2lsZW50JyAoU0lEKSBieSBWU1MuCi0gICAgKiBBcyBhIGNvbnNlcXVlbmNlLCBpZiBhdWRpbyBBVSBpcyBzZXQgdG8gJ3NpbGVudCcgKHN0YXRpYykKLSAgICBpdCBjYW4ndCBiZSBmcmVlIHVubGVzcyBpdCBpcyBzZXQgdG8gTlVMTCAqLwotICAgIGlmKCAoIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4Ci0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKQotICAgICAgICB8fCAoKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MpICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICAgICAgZXJyMiA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVycjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCk6IG1fcFJlYWRlci0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZXN0cm95IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgY29udGV4dCAqLwotICAgICAgICBlcnIyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpOiBtX3BSZWFkZXItPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZihwQ2xpcEN0eHQtPnBQbGFuZVl1diAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGlmKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1diA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QpOwotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcDogcENsaXBDdHh0PTB4JXgiLCBwQ2xpcEN0eHQpOwotICAgIC8qKgotICAgICogRnJlZSB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgZnJlZShwQ2xpcEN0eHQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBBTVIgTmFycm93LUJhbmQgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQXVkaW9GcmFtZSAgIChJTikgQU1STkIgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAoICpwQXVkaW9GcmFtZSkgJigweEYgPDwgMykpID4+IDM7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA5NTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNDc1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMDM7Ci0gICAgICAgICAgICBicmVhazsgLyogIDUxNTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTE4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA1OTAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDEzNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNjcwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNDg7Ci0gICAgICAgICAgICBicmVhazsgLyogIDc0MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTU5OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3OTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDIwNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAxMDIwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyNDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTIwMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMzk7Ci0gICAgICAgICAgICBicmVhazsgLyogU0lEIChTaWxlbmNlKSAqLwotCi0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qIE5vIGRhdGEgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoKTogQ29ycnVwdGVkIEFNUiBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKCkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQyggTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKQotewotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVR5cGUgPSAoICpwQXVkaW9GcmFtZSkgJjB4MEY7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBibGFuayAqLwotCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE2OwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzggKi8KLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA0MDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS80ICovCi0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgZnJhbWVTaXplID0gODA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvMiAqLwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE3MTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMSAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIGVyYXN1cmUgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQygpOiBDb3JydXB0ZWQgRVZSQyBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNEFEX0J1ZmZlciBvdXRwdXRCdWZmZXI7Ci0gICAgdWludDMyX3Qgb3B0aW9uVmFsdWUgPTA7Ci0KLSAgICAvLyBEZWNvZGUgZmlyc3QgYXVkaW8gZnJhbWUgZnJvbSBjbGlwIHRvIGdldCBwcm9wZXJ0aWVzIGZyb20gY29kZWMKLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICYocENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzKSk7Ci0KLSAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLAotICAgICAoTTRPU0FfRGF0YU9wdGlvbikgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQpOwotCi0gICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1ZGlvQVUsCi0gICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgIGlmKCBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0KTsKLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzOiBcCi0gICAgICAgICAgICAgICAgIG1fcEZjdFN0YXJ0QXVkaW9EZWMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVTYW1wbGVTaXplCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplID4gMCApIHsKLQotICAgICAgICBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikib3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00T1NBX05VTEwsICZvdXRwdXRCdWZmZXIsIE00T1NBX0ZBTFNFKTsKLQotICAgIGlmICggZXJyID09IE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSApIHsKLQotICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnRpZXMgZnJvbSBjb2RlYyBub2RlCi0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9OYkNoYW5uZWxzLCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4gPSBvcHRpb25WYWx1ZTsKLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5LCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxID0gb3B0aW9uVmFsdWU7Ci0gICAgICAgIC8vIFJlc2V0IFJlYWRlciBzdHJ1Y3R1cmUgdmFsdWUgYWxzbwotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IG9wdGlvblZhbHVlOwotCi0gICAgfSBlbHNlIGlmKCBlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYyByZXR1cm5zIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIGZyZWUob3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIKLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0UmVzZXQoCi0gICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXNcCi0gICAgICAgICAgICBFcnJvciBpbiByZXNldGluZyByZWFkZXI6IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyYzZkN2EuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKLSAqIEBicmllZiAgICBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgcmVsYXRlZCB0byBhbmFseXNpcyBvZiBpbnB1dCBjbGlwcwotICogQG5vdGUgICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHN0YXRpYywgaS5lLiBub24gcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLQotCi0vKioKLSAqICAgIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKiBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qIE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiBhIGNsaXAgaXMgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQIGVkaXRpbmcKLSAqIEBub3RlICAgIEl0IGFsc28gZmlsbHMgYSBDbGlwQW5hbHlzaXMgc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0d28KLSAqICAgICAgICBjbGlwcyBhcmUgY29tcGF0aWJsZQotICogQHBhcmFtICAgIHBDbGlwICAgICAgICAgICAgICAgIChJTikgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCAzR1BQL01QMyBjbGlwIGZpbGUuCi0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICAgRmlsZVR5cGUgICAgICAgICAgICAoSU4pIFR5cGUgb2YgdGhlIGlucHV0IGZpbGUgKC4zZ3AsIC5hbXIsIC5tcDMpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEMKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCggTTRPU0FfVm9pZCAqcENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIENsaXBTZXR0aW5nczsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCBjYWxsZWQgd2l0aCBwQ2xpcD0weCV4LCBwQ2xpcFByb3BlcnRpZXM9MHgleCIsCi0gICAgICAgIHBDbGlwLCBwQ2xpcFByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBwQ2xpcCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwUHJvcGVydGllcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IHBDbGlwUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEJ1aWxkIGR1bW15IGNsaXAgc2V0dGluZ3MsIGluIG9yZGVyIHRvIHVzZSB0aGUgZWRpdENsaXBPcGVuIGZ1bmN0aW9uICovCi0gICAgQ2xpcFNldHRpbmdzLnBGaWxlID0gcENsaXA7Ci0gICAgQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gRmlsZVR5cGU7Ci0gICAgQ2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICBDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lID0gMDsKLQotICAgIC8qIENsaXAgcHJvcGVydGllcyBub3QgYnVpbGQgeWV0LCBzZXQgYXQgbGVhc3QgdGhpcyBmbGFnICovCi0gICAgQ2xpcFNldHRpbmdzLkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBjbGlwIGluIGZhc3Qgb3BlbiBtb2RlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQ2xpcENvbnRleHQsIHBGaWxlUmVhZFB0ckZjdCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludENsaXBJbml0KCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEZyZWUgdGhlIGNsaXAgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ocENsaXBDb250ZXh0LCAmQ2xpcFNldHRpbmdzLCBNNE9TQV9GQUxTRSwKLSAgICAgICAgTTRPU0FfVFJVRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludENsaXBPcGVuKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEhlcmUgaXQgaXMgYmV0dGVyIHRvIHJldHVybiB0aGUgRWRpdGluZyBzcGVjaWZpYyBlcnJvciBjb2RlICovCi0gICAgICAgIGlmKCAoICgoTTRPU0FfVUludDMyKU00RVJSX0RFQ09ERVJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQpID09IGVycikKLSAgICAgICAgICAgIHx8ICgoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfTk9UX0JBU0VMSU5FKSA9PSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFuYWx5c2UgdGhlIGNsaXAgKi8KLSAgICBpZihNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggIT0gcENsaXBDb250ZXh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlKSB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKHBDbGlwQ29udGV4dCwgcENsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJlZSB0aGUgY2xpcCAqLwotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwQ29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY2xpcCAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UocENsaXBDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBNNFZTU19pbnRDbGlwQ2xvc2UoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayB0aGUgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIGVkaXRpbmcgKi8KLSAgICBpZihNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggIT0gQ2xpcFNldHRpbmdzLkZpbGVUeXBlKSB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcocENsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgVlNTIDNHUFAgZWRpdGluZyBhc3NlbWJseSBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ2xpcDFQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIGZpcnN0IGNsaXAKLSAqIEBwYXJhbSAgICBwQ2xpcDJQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIHNlY29uZCBjbGlwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRQotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORwotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcDFQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBDbGlwMlByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiB2aWRlb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBhdWRpb19lcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfQm9vbCBiQ2xpcDFJc0FBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkNsaXAySXNBQUMgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkgY2FsbGVkIHdpdGggcENsaXAxQW5hbHlzaXM9MHgleCxcCi0gICAgICAgICAgICAgICAgICAgcENsaXAyQW5hbHlzaXM9MHgleCIsIHBDbGlwMVByb3BlcnRpZXMsIHBDbGlwMlByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXAxUHJvcGVydGllcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogcENsaXAxUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwMlByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHk6IHBDbGlwMlByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaWYoICggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyA9PSBwQ2xpcDFQcm9wZXJ0aWVzLT5GaWxlVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIgPT0gcENsaXAxUHJvcGVydGllcy0+RmlsZVR5cGUpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzICE9IHBDbGlwMlByb3BlcnRpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OiBNUDMgQ0FOIE9OTFkgQkUgQ1VULFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdlIGFyZSBpbiBWU1MgU3BsaXR0ZXIgbW9kZSAqLwotICAgICAgICAgICAgZ290byBhdWRpb19hbmFseXNpczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqIEF1ZGlvICoqKioqKioqKioqKi8KLQotYXVkaW9fYW5hbHlzaXM6Ci0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcENsaXAxUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQUFDICovCi0gICAgICAgIHN3aXRjaCggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIGJDbGlwMUlzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgYkNsaXAySXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8sIHRoZSBjbGlwcyBhcmUgY29tcGF0aWJsZXMgLi4uICovCi0gICAgaWYoICggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICE9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8pCi0gICAgICAgICYmIChwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbykgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgYXVkaW8gc3RyZWFtIHR5cGUKLSAgICAgICAgKiBBbmQgbGV0X3Mgc2F5IEFBQywgQUFDKyBhbmQgZUFBQysgYXJlIG1peGFibGUgKi8KLSAgICAgICAgaWYoICggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgICAgICAmJiAoKCBNNE9TQV9GQUxTRSA9PSBiQ2xpcDFJc0FBQykgfHwgKE00T1NBX0ZBTFNFID09IGJDbGlwMklzQUFDKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgICAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIEF1ZGlvIFN0cmVhbSBUeXBlIik7Ci0KLSAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMgIT0gcENsaXAyUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBOYiBvZiBDaGFubmVscyIpOwotICAgICAgICAgICAgYXVkaW9fZXJyID0gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFM7Ci0gICAgICAgICAgICBnb3RvIGFuYWx5c2lzX2RvbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBib3RoIGNsaXBzIGhhdmUgc2FtZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICAgICAgaWYoIHBDbGlwMVByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICE9IHBDbGlwMlByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgICAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIFNhbXBsaW5nIEZyZXF1ZW5jeSIpOwotICAgICAgICAgICAgYXVkaW9fZXJyID0gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcENsaXAyUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotCi1hbmFseXNpc19kb25lOgotICAgIGlmKCB2aWRlb19lcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHJldHVybiB2aWRlb19lcnI7Ci0KLSAgICBpZiggYXVkaW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gYXVkaW9fZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKQotICogQGJyaWVmICAgIEdldCB2aWRlbyBhbmQgYXVkaW8gcHJvcGVydGllcyBmcm9tIHRoZSBjbGlwIHN0cmVhbXMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbXVzdCByZXR1cm4gZmF0YWwgZXJyb3JzIG9ubHkgKGVycm9ycyB0aGF0IHNob3VsZCBub3QgaGFwcGVuCi0gKiAgICAgICAgaW4gdGhlIGZpbmFsIGludGVncmF0ZWQgcHJvZHVjdCkuCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZpZ0luZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSBkdW1teVNpemU7Ci0gICAgTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbCBBVkNQcm9mbGU7Ci0KLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCB2aWRlbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0xldmVsID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJ2bGMgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJlc3luY2hNYXJrZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIG1lbXNldCgodm9pZCAqKSAmcENsaXBQcm9wZXJ0aWVzLT5mdHlwLDAsCi0gICAgICAgIHNpemVvZihwQ2xpcFByb3BlcnRpZXMtPmZ0eXApKTsKLQotICAgIC8qKgotICAgICogVmlkZW8gQW5hbHlzaXMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgewotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCA9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0hlaWdodCA9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmZBdmVyYWdlRnJhbWVSYXRlID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVBFRzQ7Ci0KLSAgIC8qIFRoaXMgaXNzdWUgaXMgc28gaW5jcmVkaWJseSBzdHVwaWQgdGhhdCBpdCdzIGRlcHJlc3NpbmcuIEJhc2ljYWxseSwgYSBmaWxlIGNhbiBiZSBhbmFseXNlZAotICAgb3V0c2lkZSBvZiBhbnkgY29udGV4dCAoYmVzaWRlcyB0aGF0IG9mIHRoZSBjbGlwIGl0c2VsZiksIHNvIHRoYXQgZm9yIGluc3RhbmNlIHR3byBjbGlwcyBjYW4KLSAgIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkgYmVmb3JlIGFsbG9jYXRpbmcgYW4gZWRpdCBjb250ZXh0IGZvciBlZGl0aW5nIHRoZW0uIEJ1dCB0aGlzCi0gICBtZWFucyB0aGVyZSBpcyBubyB3YXkgaW4gaGVjayB0byBwYXNzIGFuIGV4dGVybmFsIHZpZGVvIGRlY29kZXIgKHRvIGJlZ2luIHdpdGgpIHRvIHRoaXMKLSAgIGZ1bmN0aW9uLCBhcyB0aGV5IHdvcmsgYnkgYmVpbmcgcmVnaXN0ZXJlZCBpbiBhbiBleGlzdGluZyBjb250ZXh0OyBmdXJ0aGVybW9yZSwgaXQgaXMgYWN0dWFsbHkKLSAgIHByZXR0eSBvdmVya2lsbCB0byB1c2UgYSBmdWxsIGRlY29kZXIgZm9yIHRoYXQsIG1vcmVzbyBhIEhBUkRXQVJFIGRlY29kZXIganVzdCB0byBnZXQgdGhlCi0gICBjbGlwIGNvbmZpZyBpbmZvLiBJbiBmYWN0LCB0aGUgaGFyZHdhcmUgaXRzZWxmIGRvZXNuJ3QgcHJvdmlkZSB0aGlzIHNlcnZpY2UsIGluIHRoZSBjYXNlIG9mIGEKLSAgIEhXIGRlY29kZXIsIHRoZSBzaGVsbCBidWlsZHMgdGhlIGNvbmZpZyBpbmZvIGl0c2VsZiwgc28gd2UgZG9uJ3QgbmVlZCB0aGUgYWN0dWFsIGRlY29kZXIsIG9ubHkKLSAgIGEgZGV0YWNoZWQgZnVuY3Rpb25hbGl0eSBvZiBpdC4gU28gaW4gY2FzZSBIVy9leHRlcm5hbCBkZWNvZGVycyBtYXkgYmUgcHJlc2VudCwgd2UgaW5zdGVhZCB1c2UKLSAgIGRpcmVjdGx5IHRoZSBEU0kgcGFyc2luZyBmdW5jdGlvbiBvZiB0aGUgc2hlbGwgSFcgZGVjb2RlciAod2hpY2ggd2Uga25vdyB0byBiZSBwcmVzZW50LCBzaW5jZQotICAgSFcgZGVjb2RlcnMgYXJlIHBvc3NpYmxlKSB0byBnZXQgdGhlIGNvbmZpZyBpbmZvLiBOb3RpY2UgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGV2ZW4gaWYgdGhlCi0gICBzb2Z0d2FyZSBkZWNvZGVyIGlzIGFjdHVhbGx5IHByZXNlbnQgYW5kIGV2ZW4gaWYgaXQgd2lsbCBlbmQgdXAgYmVpbmcgYWN0dWFsbHkgdXNlZDogZmlndXJpbmcKLSAgIG91dCB0aGUgY29uZmlnIGRvZXMgbm90IGludm9sdmUgYWN0dWFsIGRlY29kaW5nIG5vciB0aGUgcGFydGljdWxhcml0aWVzIG9mIGEgc3BlY2lmaWMgZGVjb2RlciwKLSAgIGl0J3MgdGhlIGZhY3QgdGhhdCBpdCdzIE1QRUc0IHRoYXQgbWF0dGVycywgc28gaXQgc2hvdWxkIG5vdCBiZSBmdW5jdGlvbmFsbHkgYW55IGRpZmZlcmVudAotICAgZnJvbSB0aGUgd2F5IGl0IHdhcyBkb25lIGJlZm9yZSAoYW5kIGl0J3MgbGlnaHQgZW5vdWdoIGZvciBwZXJmb3JtYW5jZSBub3QgdG8gYmUgYW55IHByb2JsZW0KLSAgICAgICAgIHdoYXRzb2V2ZXIpLiAqLwotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kocENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlY0NvbmZpZ0luZm8sICZkdW1teVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgIERlY0NvbmZpZ0luZm8udWlUaW1lU2NhbGU7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRkYXRhUGFydGl0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby5iRGF0YVBhcnRpdGlvbjsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJ2bGMgPQotICAgICAgICAgICAgICAgICAgICBEZWNDb25maWdJbmZvLmJVc2VPZlJWTEM7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRyZXN5bmNoTWFya2VyID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby51aVVzZU9mUmVzeW5jaE1hcmtlcjsKLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChEZWNDb25maWdJbmZvLnVpUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1Byb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpKTsKLSAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1QRUc0UHJvZmlsZUFuZExldmVsIHJldHVybnMgMHglMDhYIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICAvKiBIMjYzIHRpbWUgc2NhbGUgaXMgYWx3YXlzIDMwMDAwICovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvVGltZVNjYWxlID0gMzAwMDA7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRIMjYzUHJvZmlsZUFuZExldmVsKHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9MZXZlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcygpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIGVyciA9IGdldEFWQ1Byb2ZpbGVBbmRMZXZlbChwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFWQ1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXM6IHVua25vd24gaW5wdXQgdmlkZW8gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgIC8qKiBXZSBkbyBub3QgcmV0dXJuIGVycm9yIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgKiAgVGhlIHZpZGVvIGZvcm1hdCBjb21wYXRpYmlsaXR5IGNoZWNrIHdpbGwgYmUgZG9uZSBsYXR0ZXIgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotCi0gICAgICAgIC8qIGlmIHZpZGVvIGJpdHJhdGUgbm90IGF2YWlsYWJsZSByZXRyaWV2ZSBhbiBlc3RpbWF0aW9uIG9mIHRoZSBvdmVyYWxsIGJpdHJhdGUgKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0JpdHJhdGUpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgYXVkaW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlIC09Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW87Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRGVjb2RlZFBjbVNpemUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBbmFseXNpcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQUFDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9QY206Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tQQ007Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzOiB1bmtub3duIGlucHV0IGF1ZGlvIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiEiLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBXZSBkbyBub3QgcmV0dXJuIGVycm9yIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBmb3JtYXQgY29tcGF0aWJpbGl0eSBjaGVjayB3aWxsIGJlIGRvbmUgbGF0dGVyICovCi0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcEF1ZGlvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbjsKLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aURlY29kZWRQY21TaXplID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEJ1Z2ZpeCBQNE1FMDAwMDExMjg6IFdpdGggc29tZSBJTVRDIGZpbGVzLCB0aGUgQU1SIGJpdCByYXRlIGlzIDAga2JwcwotICAgICAgICBhY2NvcmRpbmcgdGhlIEdldFByb3BlcnRpZXMgZnVuY3Rpb24gKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CID09IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgMTIuMiBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlIDAga2JwcyB2YWx1ZSEqLwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgPSBNNFZTUzNHUFBfQU1SX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tFVlJDID09IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgOS4yIGticHMgdmFsdWUgdGhhbiBhIHN1cmUtdG8tYmUtZmFsc2UgMCBrYnBzIHZhbHVlISovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LCBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgdmlkZW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSAtPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5ldyBhYWMgcHJvcGVydGllcyAqLwotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbjsKLSAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcTsKLQotICAgICAgICAgICAgaWYoIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQUFDcGx1czsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBHZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCwgJnBDbGlwUHJvcGVydGllcy0+ZnR5cCk7Ci0KLSAgICAvKioKLSAgICAqIFdlIHdyaXRlIHRoZSBWU1MgM0dQUCB2ZXJzaW9uIGluIHRoZSBjbGlwIGFuYWx5c2lzIHRvIGJlIHN1cmUgdGhlIGludGVncmF0b3IgZG9lc24ndAotICAgICogbWl4IG9sZGVyIGFuYWx5c2lzIHJlc3VsdHMgd2l0aCBuZXdlciBsaWJyYXJpZXMgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SOwotICAgIHBDbGlwUHJvcGVydGllcy0+VmVyc2lvblsxXSA9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1I7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzJdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHBDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgPSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGU7Ci0KLSAgICBpZiggcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBWaWRlb0R1cmF0aW9uCi0gICAgICAgID4gcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uICkKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBEdXJhdGlvbiA9IHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICBlbHNlCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwRHVyYXRpb24gPSBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0KLSAgICAvKiBSZXNldCBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEFuYWx5c2lzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBbmFseXNlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKQotICogQGJyaWVmICAgIENoZWNrIGlmIHRoZSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgZWRpdGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKAotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX1VJbnQzMiB1aU5iT2ZWYWxpZFN0cmVhbXMgPSAwOwotICAgIE00T1NBX0VSUiB2aWRlb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBhdWRpb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIC8qKioqKioqKiogZmlsZSB0eXBlICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SID09IHBDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZzpcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyA9PSBwQ2xpcFByb3BlcnRpZXMtPkZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBWaWRlbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbwotICAgICAgICAhPSBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYSB2aWRlbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qIENoZWNrIHZpZGVvIGZvcm1hdCBpcyBNUEVHLTQsIEgyNjMgb3IgSDI2NCAqLwotICAgICAgICBzd2l0Y2goIHBDbGlwUHJvcGVydGllcy0+VmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICB1aU5iT2ZWYWxpZFN0cmVhbXMrKzsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJWaWRlb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKjwgS08sIHdlIHJldHVybiBlcnJvciAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQiKTsKLSAgICAgICAgICAgICAgICB2aWRlb19lcnIgPSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBdWRpbyBvbmx5IHN0cmVhbSBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFZTUyBlZGl0aW5nIGZlYXR1cmUKLSAgICAgICAgKHVubGVzcyBpbiB0aGUgTVAzIGNhc2UpICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogTm8gdmlkZW8gc3RyZWFtIGluIGNsaXAiKTsKLSAgICAgICAgdmlkZW9fZXJyID0gTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqIEF1ZGlvICoqKioqKioqKi8KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQ2xpcFByb3BlcnRpZXMtPgotICAgICAgICBBdWRpb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYXVkaW8gZm9ybWF0IGlzIEFNUi1OQiwgRVZSQyBvciBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgIC8qPCBPSywgd2UgcHJvY2VlZCwgbm8gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgdWlOYk9mVmFsaWRTdHJlYW1zKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qPCBLTywgd2UgcmV0dXJuIGVycm9yICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOwotICAgICAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2lsZW5jZSBpcyBhbHdheXMgZWRpdGFibGUgKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB2YWxpZCBzdHJlYW0gaW4gdGhlIGZpbGUuLi4gKi8KLSAgICBpZiggdmlkZW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gdmlkZW9fZXJyOwotCi0gICAgaWYoIGF1ZGlvX2VyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgcmV0dXJuIGF1ZGlvX2VycjsKLQotICAgIGlmKCAwID09IHVpTmJPZlZhbGlkU3RyZWFtcyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IEZpbGUgY29udGFpbnMgbm8gc3VwcG9ydGVkIHN0cmVhbSxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGZlYXR1cmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgYXVkaW8gbWl4ZXIKLSAqIEBwYXJhbSAgICBwSW5wdXRDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KCBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcElucHV0Q2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQWRkZWRDbGlwUHJvcGVydGllcyApCi17Ci0gICAgTTRPU0FfQm9vbCBiQ2xpcDFJc0FBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkNsaXAySXNBQUMgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgc2V0dGluZ3MgKi8KLSAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoYXQgYW5hbHlzaXMgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgVlNTM0dQUCBsaWJyYXJ5ICovCi0gICAgaWYoICggcElucHV0Q2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gIT0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUikKLSAgICAgICAgfHwgKHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzFdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgIHx8IChwSW5wdXRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXQotICAgICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6IFRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZFwKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgdmVyc2lvbiwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT047Ci0gICAgfQotCi0gICAgaWYoICggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gIT0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUikKLSAgICAgICAgfHwgKHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzFdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgIHx8IChwQWRkZWRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXQotICAgICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6IFRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZFwKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgdmVyc2lvbiwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT047Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBpbnB1dCBmaWxlIHR5cGUgKioqKioqKioqLwotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICE9IHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFA7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBpbnB1dCBhdWRpbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwSW5wdXRDbGlwUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQU1SLU5CIG9yIEFBQyAqLwotICAgICAgICBzd2l0Y2goIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwSW5wdXRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkNsaXAxSXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNpbGVuY2UgaXMgYWx3YXlzIGVkaXRhYmxlICovCi0gICAgICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqIGFkZGVkIGF1ZGlvICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICE9IHBBZGRlZENsaXBQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBTVItTkIgb3IgQUFDICovCi0gICAgICAgIHN3aXRjaCggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIEkgdXNlIHRoaXMgZmllbGQgdG8ga25vdyBpZiBzaWxlbmNlIHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgIGJDbGlwMklzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUENNOgotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLQotICAgICAgICAgICAgICAgIGlmKCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiQ2xpcDJJc0FBQyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6IC8qUkMqLwotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBUaGUgd3JpdGVyIGNhbm5vdCB3cml0ZSB0aGlzICBpbnRvIGEgM2dwcCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTaWxlbmNlIGlzIGFsd2F5cyBlZGl0YWJsZSAqLwotICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICB9Ci0KLSAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICE9IHBBZGRlZENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogV2UgbmVlZCB0byBjYWxsIFNTUkMgaW4gb3JkZXIgdG8gYWxpZ24gQVNGIGFuZC9vciBuYiBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgLyogTW9yZW92ZXIsIGF1ZGlvIGVuY29kZXIgbWF5IGJlIG5lZWRlZCBpbiBjYXNlIG9mIGF1ZGlvIHJlcGxhY2luZy4uLiAqLwotICAgICAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgPCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU3RlcmVvIHRvIE1vbm8gKi8KLSAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgPiBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogTW9ubyB0byBTdGVyZW8gKi8KLSAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9Db2RlY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNlZDkzNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9Db2RlY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00VlNTM0dQUF9Db2RlY3MuYwotICogQGJyaWVmICBWU1MgaW1wbGVtZW50YXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgcmVsYXRlZCB0byBhdWRpby92aWRlbwotICogICAgICAgICAgICBjb2RlYyBtYW5pcHVsYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIGRlYnVnIHNlcnZpY2VzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIiAvKio8IEludGVybmFsIHR5cGVzIG9mIHRoZSBWU1MgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoKQotICogQGJyaWVmICAgIENsZWFyIGVuY29kZXJzLCBkZWNvZGVycywgcmVhZGVyIGFuZCB3cml0ZXJzIGludGVyZmFjZXMgdGFibGVzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIFRoZSBjb250ZXh0IGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBJbml0aWFsaXNhdGlvbiB0aGF0IHdpbGwgYWxsb3cgdG8gY2hlY2sgaWYgcmVnaXN0ZXJpbmcgdHdpY2UgKi8KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRXUklURVJfa1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycyA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00UkVBREVSX2tNZWRpYVR5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgIGNvbnRleHQgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvciBwV3RyRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSAqcFd0ckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAqcFd0ckRhdGFJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckdsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicFd0ckdsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckRhdGFJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBXdHJEYXRhSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIlZTUzogTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBXdHJHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgIHBXdHJEYXRhSW50ZXJmYWNlPTB4JXgiLAotICAgICAgICBwQywgcFd0ckdsb2JhbEludGVyZmFjZSwgcFd0ckRhdGFJbnRlcmZhY2UpOwotCi0gICAgaWYoICggTWVkaWFUeXBlID09IE00V1JJVEVSX2tVbmtub3duKSB8fCAoTWVkaWFUeXBlID49IE00V1JJVEVSX2tUeXBlX05CKSApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBtZWRpYSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5Xcml0ZXJJbnRlcmZhY2VbTWVkaWFUeXBlXS5wR2xvYmFsRmN0cyAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIGEgd3JpdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFNhdmUgd3JpdGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzID0gcFd0ckdsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucERhdGFGY3RzID0gcFd0ckRhdGFJbnRlcmZhY2U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgIGNvbnRleHQgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlckVuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgTWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSwgTWVkaWFUeXBlKTsKLQotICAgIGlmKCBNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tWaWRlb19OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgdmlkZW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZW5jb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGVuY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGVuY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgYW5kIGV4dGVybmFsIEFQSSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZW5jb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciBjYWxsZWQgcENvbnRleHQ9MHgleCwgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgTWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSwgTWVkaWFUeXBlKTsKLQotICAgIGlmKCBNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tBdWRpb19OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgYXVkaW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoKLSAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tNZWRpYVR5cGVdID0gTTRPU0FfRkFMU0U7IC8qIGludGVybmFsIGVuY29kZXIgKi8KLSAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcjogcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbMHgleF0gPSAweCV4IiwKLSAgICAgICAgTWVkaWFUeXBlLCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgbWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlICkKLXsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmRyR2xvYmFsSW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZ2xvYmFsIGludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmRyRGF0YUludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlclJlYWRlcjogaW52YWxpZCBwb2ludGVyIG9uIGRhdGEgaW50ZXJmYWNlIik7Ci0KLSAgICBpZiggbWVkaWFUeXBlID09IE00UkVBREVSX2tNZWRpYVR5cGVVbmtub3duCi0gICAgICAgIHx8IG1lZGlhVHlwZSA+PSBNNFJFQURFUl9rTWVkaWFUeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIGEgcmVhZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSA9IHBSZHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW21lZGlhVHlwZV0gPSBwUmRyRGF0YUludGVyZmFjZTsKLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgRGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSApCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYoIGRlY29kZXJUeXBlID49IE00REVDT0RFUl9rVmlkZW9UeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiSW52YWxpZCB2aWRlbyBkZWNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSNpZm5kZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgICAgIC8qIGEgZGVjb2RlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJEZWNvZGVyIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotCi0jZWxzZSAvKiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUgKi8KLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGRlY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBkZWNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBkZWNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgLyogb2gsIGFuZCBkb24ndCBmb3JnZXQgdGhlIHVzZXIgZGF0YSwgdG9vLiAqLwotICAgICAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0jZW5kaWYgLyogYXJlIGV4dGVybmFsIGRlY29kZXJzIHBvc3NpYmxlPyAqLwotCi0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gcERlY29kZXJJbnRlcmZhY2U7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGRlY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMrKzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBieSB0aGUgVlNTIHRvIHJlZ2lzdGVyIE5YUCBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYoIGRlY29kZXJUeXBlID49IE00QURfa1R5cGVfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJJbnZhbGlkIGF1ZGlvIGRlY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2RlY29kZXJUeXBlXSA9Ci0gICAgICAgIE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBkZWNvZGVyICovCi0gICAgcEMtPnBBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMgKQotewotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNFdSSVRFUl9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMpOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMpOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVyczogcEM9MHgleCIsIHBDKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEVOQ09ERVJfa0F1ZGlvX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZW5jb2RlcnMgaW50ZXJmYWNlcyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0pOwotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzID0gMDsKLSAgICBwQy0+bV9wUmVhZGVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGRlY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVyczogcEM9MHgleCIsIHBDKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRERUNPREVSX2tWaWRlb1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSApCi0gICAgICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSk7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlcnMgaW50ZXJmYWNlcyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgd3JpdGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2goIG1lZGlhVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2szR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRSwKLSAgICAgICAgICAgICAgICAiV3JpdGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gcEMtPldyaXRlckludGVyZmFjZVt3cml0ZXJUeXBlXS5wR2xvYmFsRmN0czsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gcEMtPldyaXRlckludGVyZmFjZVt3cml0ZXJUeXBlXS5wRGF0YUZjdHM7Ci0KLSAgICBpZiggcEMtPnBXcml0ZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwKLSAgICAgICAgfHwgcEMtPnBXcml0ZXJEYXRhRmN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFLAotICAgICAgICAgICAgIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00RU5DT0RFUl9Gb3JtYXQgZW5jb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFULAotICAgICAgICAgICAgICAgICJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbZW5jb2RlclR5cGVdOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJID0KLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiggcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFULAotICAgICAgICAgICAgIlZpZGVvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlICkKLXsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgZW5jb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogZW5jb2RlciB0eXBlIEFNUiIpOwotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyOiBlbmNvZGVyIHR5cGUgQUFDIik7Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiQXVkaW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyOiBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVsweCV4XT0weCV4LFwKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gMHgleCIsCi0gICAgICAgIGVuY29kZXJUeXBlLCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtlbmNvZGVyVHlwZV0sCi0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyk7Ci0KLSAgICBpZiggcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFULAotICAgICAgICAgICAgIkF1ZGlvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgcmVhZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRSRUFERVJfTWVkaWFUeXBlIHJlYWRlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZTNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVI6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZUFNUjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVQQ007Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAgICAgIlJlYWRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXIgPSBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtyZWFkZXJUeXBlXTsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW3JlYWRlclR5cGVdOwotCi0gICAgaWYoIHBDLT5tX3BSZWFkZXIgPT0gTTRPU0FfTlVMTCB8fCBwQy0+bV9wUmVhZGVyRGF0YUl0ID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzIoIk00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyOiBwQz0weCV4LCBtZWRpYVR5cGU9MHgleCIsCi0gICAgICAgIHBDLCBtZWRpYVR5cGUpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVBVkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0FSR0I4ODg4OgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZVlVVjQyMFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFULAotICAgICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2RlciA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQsCi0gICAgICAgICAgICAiVmlkZW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlZpZGVvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzIoIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyOiBwQz0weCV4LCBtZWRpYVR5cGU9MHgleCIsCi0gICAgICAgIHBDLCBtZWRpYVR5cGUpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRFRTOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURJRjoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFBQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVNUDM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlUENNOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFULAotICAgICAgICAgICAgICAgICJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEgPQotICAgICAgICBwQy0+cEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0gICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFULAotICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmOGI3ZDUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0VkaXQuYwotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZWRpdCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIiAvKio8IE9TQUwgc3RyaW5nIG1hbmFnZW1lbnQgKi8KLQotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSAic3RyaW5nLmgiICAgICAgICAgLyoqPCBmb3Igc3RyY3B5IChEb24ndCB3YW50IHRvIGdldCBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTTRPU0FfU3RyaW5nLi4uKSAqLwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgKi8KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrKAotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICpwVHJhbnNpdGlvbiApOwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEZyZWVTZXR0aW5nc0xpc3QoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcE91dHB1dEZpbGUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aU1hc3RlckNsaXAgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oKQotICogQGJyaWVmICAgIEdldCB0aGUgVlNTIDNHUFAgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0VmVyc2lvbiggTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uSW5mbyApCi17Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9HZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uSW5mbz0weCV4IiwKLSAgICAgICAgcFZlcnNpb25JbmZvKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwVmVyc2lvbkluZm8pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfR2V0VmVyc2lvbjogcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciA9IE00VlNTX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yID0gTTRWU1NfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBNNFZTU19WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0SW5pdCgpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyAzR1BQIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoIE00VlNTM0dQUF9FZGl0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcEZpbGVXcml0ZVB0ckZjdCApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBcCi0gICAgICAgIHBGaWxlUmVhZFB0ckZjdD0weCV4LCBwRmlsZVdyaXRlUHRyRmN0PTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcEZpbGVSZWFkUHRyRmN0LCBwRmlsZVdyaXRlUHRyRmN0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlV3JpdGVQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBGaWxlV3JpdGVQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGNvbnRleHQgYW5kIHJldHVybiBpdCB0byB0aGUgdXNlciAqLwotICAgIHBDID0gKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikiTTRWU1MzR1BQX0ludGVybmFsQ29udGV4dCIpOwotICAgICpwQ29udGV4dCA9IHBDOwotICAgICAgICAvKiBJbmlhbGl6YXRpb24gb2YgY29udGV4dCBWYXJpYWJsZXMgKi8KLSAgICBtZW1zZXQoKHZvaWQgKilwQywgMCxzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQpKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdCgpOiB1bmFibGUgdG8gYWxsb2NhdGUgTTRWU1MzR1BQX0ludGVybmFsQ29udGV4dCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotCi0gICAgLyogSW5pdCB0aGUgY29udGV4dC4gKi8KLSAgICBwQy0+dWlDbGlwTnVtYmVyID0gMDsKLSAgICBwQy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT51aUN1cnJlbnRDbGlwID0gMDsKLSAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2MVswXS5wYWNfZGF0YSA9IHBDLT55dXYxWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYxWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2MlswXS5wYWNfZGF0YSA9IHBDLT55dXYyWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYyWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2M1swXS5wYWNfZGF0YSA9IHBDLT55dXYzWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2NFswXS5wYWNfZGF0YSA9IHBDLT55dXY0WzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXY0WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+YkNsaXAxQXRCZWdpbkN1dCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QgPSAwOwotICAgIHBDLT5pQ2xpcDJBY3RpdmVFZmZlY3QgPSAwOwotICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogSW5pdCBQQy0+ZXdjIG1lbWJlcnMgKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICA9IDAuMDsKLSAgICBwQy0+ZXdjLmRPdXRwdXRWaWRDdHMgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kQVRvID0gMC4wOwotICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uID0gMDsKLSAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgcEMtPmV3Yy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAwOwotICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDA7Ci0gICAgcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgIHBDLT5ld2MudWlOYkNoYW5uZWxzID0gMTsKLSAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jRFNJLmluZm9TaXplID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5wSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0gMDsKLSAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAwOwotICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSAwLjA7Ci0gICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5pTXBlZzRHb3ZPZmZzZXQgPSAwOwotICAgIHBDLT5ld2MuVnBwRXJyb3IgPSAwOwotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tOb0VuY29kZXI7Ci0gICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+ZXdjLnVpQXVkaW9NYXhBdVNpemUgPSAwOwotICAgIC8qKgotICAgICogS2VlcCB0aGUgT1NBTCBmaWxlIGZ1bmN0aW9ucyBwb2ludGVyIHNldCBpbiBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcEMtPnBPc2FGaWxlV3JpdFB0ciA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0KLSAgICAvKgotICAgICogUmVzZXQgcG9pbnRlcnMgZm9yIG1lZGlhIGFuZCBjb2RlY3MgaW50ZXJmYWNlcyAqLwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogVXBkYXRlIG1haW4gc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRDsKLSAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgLyogVGhlIGZsYWcgaXMgc2V0IHRvIGZhbHNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgY2xpcCAqLwotICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQy0+YklzTU1TID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQy0+aUluT3V0VGltZU9mZnNldCA9IDA7Ci0gICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm5iQWN0aXZlRWZmZWN0cyA9IDA7Ci0gICAgcEMtPm5iQWN0aXZlRWZmZWN0czEgPSAwOwotICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRJbml0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5FZmZlY3RzWyBdIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBDbGlwIHBhdGggc2l6ZSAobmVlZGVkIGZvciBVVEYgMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MoIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZSwgTTRPU0FfVUludDMyIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLQotICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggcENsaXBTZXR0aW5ncz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGNsaXAgc2V0dGluZ3MgdG8gZGVmYXVsdCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0gTTRPU0FfTlVMTDsgICAgICAgIC8qKjwgbm8gZmlsZSAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkZpbGVUeXBlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOyAvKio8IHVuZGVmaW5lZCAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEZpbGUgKQotICAgIHsKLSAgICAgICAgLy9wQ2xpcFNldHRpbmdzLT5wRmlsZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwRmlsZSkrMSwgTTRWU1MzR1BQLAotICAgICAgICAvLyAicENsaXBTZXR0aW5ncy0+cEZpbGUiKTsKLSAgICAgICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIGJlY2F1c2Ugb2YgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmaWxlUGF0aFNpemUgKyAxLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzLT5wRmlsZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MtPnBGaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8vbWVtY3B5KHBDbGlwU2V0dGluZ3MtPnBGaWxlLCBwRmlsZSwgc3RybGVuKHBGaWxlKSsxKTsKLSAgICAgICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIGJlY2F1c2Ugb2YgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzLT5wRmlsZSwgKHZvaWQgKilwRmlsZSwgZmlsZVBhdGhTaXplICsgMSk7Ci0gICAgfQotCi0gICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIHRvIHN1cHBvcnQgVVRGMTYgY29udmVyc2lvbiovCi0gICAgcENsaXBTZXR0aW5ncy0+ZmlsZVBhdGhTaXplID0gZmlsZVBhdGhTaXplICsgMTsKLSAgICAvKiovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuRmlsZVR5cGUgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMF0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMV0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMl0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0gMDsKLQotICAgIHBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lID0gMDsgLyoqPCBubyBiZWdpbiBjdXQgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT51aUVuZEN1dFRpbWUgPSAwOyAgIC8qKjwgbm8gZW5kIGN1dCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvTGV2ZWwgPQotICAgICAgICBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRydmxjID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYk1QRUc0cmVzeW5jaE1hcmtlciA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0U2V0RGVmYXVsdFNldHRpbmdzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSCi1NNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkNvcHlFZmZlY3RzICkKLXsKLSAgICBNNE9TQV9VSW50OCB1aUZ4OwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyBjYWxsZWQgd2l0aCBkZXN0PTB4JXAgc3JjPTB4JXAiLAotICAgICAgICBwQ2xpcFNldHRpbmdzRGVzdCwgcENsaXBTZXR0aW5nc09yaWcpOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3NEZXN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NEZXN0IGlzIE5VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc09yaWcpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5nc09yaWcgaXMgTlVMTCIpOwotCi0gICAgLyogQ29weSBwbGFpbiBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgKHZvaWQgKilwQ2xpcFNldHRpbmdzT3JpZywgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpKTsKLQotICAgIC8qIER1cGxpY2F0ZSBmaWxlbmFtZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSApCi0gICAgewotICAgICAgICAvL3BDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSA9Ci0gICAgICAgIC8vIChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUpKzEsIE00VlNTM0dQUCwKLSAgICAgICAgLy8gInBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSIpOwotICAgICAgICAvKkZCOiBjbGlwIHBhdGggc2l6ZSBpcyBuZWVkZWQgZm9yIHV0ZiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgLypGQiAyMDA4LzEwLzE2OiBiYWQgYWxsb2NhdGlvbiBzaXplIHdoaWNoIHJhaXNlcyBhIGNyYXNoKi8KLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUgKyAxLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MgOiBFUlJPUiBhbGxvY2F0aW5nIGZpbGVuYW1lIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgLypGQjogY2xpcCBwYXRoIHNpemUgaXMgbmVlZGVkIGZvciB1dGYgMTYgY29udmVyc2lvbiovCi0gICAgICAgIC8vbWVtY3B5KHBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSwgcENsaXBTZXR0aW5nc09yaWctPnBGaWxlLAotICAgICAgICAvLyBzdHJsZW4ocENsaXBTZXR0aW5nc09yaWctPnBGaWxlKSsxKTsKLSAgICAgICAgLypGQiAyMDA4LzEwLzE2OiBiYWQgYWxsb2NhdGlvbiBzaXplIHdoaWNoIHJhaXNlcyBhIGNyYXNoKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlLCAodm9pZCAqKXBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSwKLSAgICAgICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUvKisxKi8pOwotICAgICAgICAoIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKXBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSlbcENsaXBTZXR0aW5nc09yaWctPmZpbGVQYXRoU2l6ZV0gPSAnXDAnOwotICAgIH0KLQotICAgIC8qIER1cGxpY2F0ZSBlZmZlY3RzICovCi0gICAgLyogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyApCi17Ci0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5ncyBpcyBOVUxMIik7Ci0KLSAgICAvKiBmcmVlIGZpbGVuYW1lICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBTZXR0aW5ncy0+cEZpbGUgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0gICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBmcmVlIGVmZmVjdHMgc2V0dGluZ3MgKi8KLSAgICAvKiAgICBpZihNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHMpCi0gICAgewotICAgIGZyZWUocENsaXBTZXR0aW5ncy0+RWZmZWN0cyk7Ci0gICAgcENsaXBTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9IFJDICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCkKLSAqIEBicmllZiAgICAgU2V0IHRoZSBWU1MgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KLSAqIEBub3RlICAgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBjcmVhdGVkIHlldC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgICBwU2V0dGluZ3MgICAgICAgICAgIChJTikgRWRpdCBzZXR0aW5ncwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKnBTZXR0aW5ncyApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgb3V0cHV0RmlsZVR5cGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7IC8qKjwgM0dQUCBvciBNUDMgKHdlIGRvbid0IGRvIEFNUiBvdXRwdXQpICovCi0gICAgTTRPU0FfVUludDMyIHVpQzFkdXJhdGlvbiwgdWlDMmR1cmF0aW9uOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW4gY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFNldHRpbmdzPTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcFNldHRpbmdzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTZXR0aW5ncy0+cENsaXBMaXN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBwU2V0dGluZ3MtPnBDbGlwTGlzdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCggcFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPiAxKQotICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggKCBwQy0+U3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRCkKLSAgICAgICAgJiYgKHBDLT5TdGF0ZSAhPSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogU3RhdGUgZXJyb3IgKDB4JXgpISBSZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgaW50ZXJuYWwgc2V0dGluZ3MgbGlzdCAqLwotICAgIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KHBDKTsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgdXNlciBzZXR0aW5ncyBpbiBvdXIgY29udGV4dCAqLwotICAgIHBDLT51aUNsaXBOdW1iZXIgPSBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgY2xpcCBsaXN0ICovCi0gICAgcEMtPnBDbGlwTGlzdCA9Ci0gICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKQotICAgICAgICAqIHBDLT51aUNsaXBOdW1iZXIsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBDbGlwTGlzdCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDbGlwTGlzdCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+U2V0dGluZ3MucENsaXBMaXN0LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCYocEMtPnBDbGlwTGlzdFtpXSksCi0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwgTTRPU0FfVFJVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGVmZmVjdHMgbGlzdCBSQyAqLwotCi0gICAgLypGQiBidWcgZml4IDE5LjAzLjIwMDggaWYgdGhlIG51bWJlciBvZiBlZmZlY3RzIGlzIDAgLT4gY3Jhc2gqLwotICAgIGlmKCBwU2V0dGluZ3MtPm5iRWZmZWN0cyA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotICAgICAgICBwQy0+cEVmZmVjdHNMaXN0ID0gKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncwotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykgKiBwQy0+bmJFZmZlY3RzLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cEVmZmVjdHNMaXN0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBFZmZlY3RzTGlzdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+cEVmZmVjdHNMaXN0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPm5iRWZmZWN0czsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBFZmZlY3RzTGlzdFtpXSksCi0gICAgICAgICAgICAgICAgKHZvaWQgKikgJihwU2V0dGluZ3MtPkVmZmVjdHNbaV0pLAotICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGFjdGl2ZSBlZmZlY3RzIGxpc3QgUkMgKi8KLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VJbnQ4KSAqIHBDLT5uYkVmZmVjdHMsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5wQWN0aXZlRWZmZWN0c0xpc3QiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbGxvY2F0ZSBhY3RpdmUgZWZmZWN0cyBsaXN0ICovCi0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVUludDgpICogcEMtPm5iRWZmZWN0cywKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBBY3RpdmVFZmZlY3RzTGlzdCIpOwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm5iRWZmZWN0cyA9IDA7Ci0gICAgICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSAwOwotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzMSA9IDA7Ci0gICAgICAgIHBDLT5wRWZmZWN0c0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIC8qKgotICAgICogVGVzdCB0aGUgY2xpcCBhbmFseXNpcyBkYXRhLCBpZiBpdCBpcyBub3QgcHJvdmlkZWQsIGFuYWx5c2UgdGhlIGNsaXBzIGJ5IG91cnNlbHZlcy4gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5iQW5hbHlzZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEFuYWx5c2lzIG5vdCBwcm92aWRlZCBieSB0aGUgaW50ZWdyYXRvciAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcChwQy0+cENsaXBMaXN0W2ldLnBGaWxlLAotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUsICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGNsaXAgY29tcGF0aWJpbGl0eSAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlICE9TTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgYWxsIHRoZSBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQICovCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoJWQpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBpLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayB0aGUgbWFzdGVyIGNsaXAgdmVyc3VzIGFsbCB0aGUgb3RoZXIgb25lcy4KLSAgICAgICAgKGluY2x1ZGluZyBtYXN0ZXIgY2xpcCB3aXRoIGl0c2VsZiwgZWxzZSB2YXJpYWJsZXMgZm9yIG1hc3RlciBjbGlwCi0gICAgICAgIGFyZSBub3QgcHJvcGVybHkgc2V0dGVkKSAqLwotICAgICAgICBpZihwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlICE9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoCi0gICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIC8qIGluIGNhc2Ugb2Ygd2FybmluZyByZWdhcmRpbmcgYXVkaW8gaW5jb21wYXRpYmlsaXR5LAotICAgICAgICAgICAgICAgIGVkaXRpbmcgY29udGludWVzICovCi0gICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSByZXR1cm5zIDB4JXghIiwgaSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogU2VhcmNoIGF1ZGlvIHRyYWNrcyB0aGF0IGNhbm5vdCBiZSBlZGl0ZWQgOgotICAgICogICAtIGRlbGV0ZSBhbGwgYXVkaW8gZWZmZWN0cyBmb3IgdGhlIGNsaXAKLSAgICAqICAgLSBpZiBtYXN0ZXIgY2xpcCBpcyBlZGl0YWJsZSBsZXQgdGhlIHRyYW5zaXRpb24KLSAgICAoYmFkIHRyYWNrIHdpbGwgYmUgcmVwbGFjZWQgbGF0ZXIgd2l0aCBzaWxlbmNlKQotICAgICogICAtIGlmIG1hc3RlciBjbGlwIGlzIG5vdCBlZGl0YWJsZSBzd2l0Y2ggdG8gYSBkdW1teSB0cmFuc2l0aW9uIChvbmx5IGNvcHkvcGFzdGUpICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBwQy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpRng7Ci0KLSAgICAgICAgICAgIGZvciAoIHVpRnggPSAwOyB1aUZ4IDwgcEMtPm5iRWZmZWN0czsgdWlGeCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNMaXN0W3VpRnhdLkF1ZGlvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgICAgICA9IE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGkgPCAocEMtPnVpQ2xpcE51bWJlciAtIDEpKQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgdWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5iQXVkaW9Jc0VkaXRhYmxlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPkF1ZGlvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgICAgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogV2UgYWRkIGEgdHJhbnNpdGlvbiBvZiBkdXJhdGlvbiAwIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgY2xpcC4KLSAgICAqIEl0IHdpbGwgc3VwcHJlc3MgYSB3aG9sZSBidW5jaCBhIHRlc3QgbGF0dGVyIGluIHRoZSBwcm9jZXNzaW5nLi4uICovCi0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdCA9IChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKQotICAgICAgICAqIChwQy0+dWlDbGlwTnVtYmVyKSwgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cFRyYW5zaXRpb25MaXN0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFRyYW5zaXRpb25MaXN0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5TZXR0aW5ncy5wVHJhbnNpdGlvbkxpc3QsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKio8IGNvcHkgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgKHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyIC0gMSk7IGkrKyApCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKikgJihwQy0+cFRyYW5zaXRpb25MaXN0W2ldKSwKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwotICAgIH0KLQotICAgIC8qKjwgV2UgZmlsbCB0aGUgbGFzdCAiZHVtbXkiIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUNsaXBOdW1iZXIgLSAxXS51aVRyYW5zaXRpb25EdXJhdGlvbiA9IDA7Ci0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDbGlwTnVtYmVyCi0gICAgICAgIC0gMV0uVmlkZW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ2xpcE51bWJlcgotICAgICAgICAtIDFdLkF1ZGlvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLQotICAgIC8qKgotICAgICogQXZvaWQgd2VpcmQgY2xpcCBzZXR0aW5ncyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSAhPU00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrKCZwQy0+cENsaXBMaXN0W2ldKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IChwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gIT0gMCkgewotICAgICAgICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbjsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpKzFdLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lIC0gcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaSsxXS5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlFbmRDdXRUaW1lIC0gcEMtPnBDbGlwTGlzdFtpKzFdLnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTWF4aW11bSB0cmFuc2l0aW9uIGR1cmF0aW9uIGJldHdlZW4gY2xpcCBuIGFuZCBjbGlwIG4rMSBpcyB0aGUgZHVyYXRpb24KLSAgICAgICAgKiBvZiB0aGUgc2hvcnRlc3QgY2xpcCAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQzFkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgZHVyYXRpb24gb2YgY2xpcCBuIGlzIHRoZSBlbmQgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIHVpQzFkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBTdWJzdHJhY3QgYmVnaW4gY3V0ICovCi0gICAgICAgIHVpQzFkdXJhdGlvbiAtPSBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIC8qKjwgQ2hlY2sgdGhhdCB0aGUgdHJhbnNpdGlvbiBpcyBzaG9ydGVyIHRoYW4gY2xpcCBuICovCi0gICAgICAgIGlmKCBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uID4gdWlDMWR1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA9IHVpQzFkdXJhdGlvbiAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2kgKyAxXS51aUVuZEN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUMyZHVyYXRpb24gPQotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaSArIDFdLkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IGR1cmF0aW9uIG9mIGNsaXAgbisxIGlzIHRoZSBlbmQgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIHVpQzJkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaSArIDFdLnVpRW5kQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgU3Vic3RyYWN0IGJlZ2luIGN1dCAqLwotICAgICAgICB1aUMyZHVyYXRpb24gLT0gcEMtPnBDbGlwTGlzdFtpICsgMV0udWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgLyoqPCBDaGVjayB0aGF0IHRoZSB0cmFuc2l0aW9uIGlzIHNob3J0ZXIgdGhhbiBjbGlwIG4rMSAqLwotICAgICAgICBpZiggcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA+IHVpQzJkdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPSB1aUMyZHVyYXRpb24gLSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQXZvaWQgd2VpcmQgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBlcnIgPQotICAgICAgICAgICAgTTRWU1MzR1BQX2ludFRyYW5zaXRpb25TZXR0aW5nc1Nhbml0eUNoZWNrKCZwQy0+cFRyYW5zaXRpb25MaXN0W2ldKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2sgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayB0aGF0IHR3byB0cmFuc2l0aW9ucyBhcmUgbm90IG92ZXJsYXBwaW5nCi0gICAgICAgICAgKG5vIG92ZXJsYXBwaW5nIHBvc3NpYmxlIGZvciBmaXJzdCBjbGlwKSAqLwotICAgICAgICBpZiggaSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlcmUgaXMgYSB0cmFuc2l0aW9uIG92ZXJsYXAgaWYgdGhlIHN1bSBvZiB0aGUgZHVyYXRpb24gb2YKLSAgICAgICAgICAgICAgdHdvIGNvbnNlY3V0aXZlIHRyYW5zaXRpb25zCi0gICAgICAgICAgICAqIGlzIGhpZ2hlciB0aGFuIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2xpcCBpbi1iZXR3ZWVuLiAqLwotICAgICAgICAgICAgaWYoICggcEMtPnBUcmFuc2l0aW9uTGlzdFtpIC0gMV0udWlUcmFuc2l0aW9uRHVyYXRpb24KLSAgICAgICAgICAgICAgICArIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24pID49IHVpQzFkdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE92ZXJsYXBwaW5nIHRyYW5zaXRpb25zIG9uIGNsaXAgJWQsXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUyIsCi0gICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX09WRVJMQVBQSU5HX1RSQU5TSVRJT05TOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPdXRwdXQgY2xpcCBkdXJhdGlvbiAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHN1bSBvZiB0aGUgY2xpcCBkdXJhdGlvbiAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgcEMtPgotICAgICAgICAgICAgICAgIHBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgaV0uQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBWaWRlb0R1cmF0aW9uOyAvKiBPbmx5IHZpZGVvIHRyYWNrIGR1cmF0aW9uIGlzIGltcG9ydGFudCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgZGV2aWF0aW9uIGlmIGF1ZGlvIHRyYWNrIGlzIGxvbmdlciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKz0KLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZTsgLyoqPCBBZGQgZW5kIGN1dCAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gLT0KLSAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlCZWdpbkN1dFRpbWU7IC8qKjwgUmVtb3ZlIGJlZ2luIGN1dCAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFJlbW92ZSB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gKGl0IGlzIGNvdW50ZWQgdHdpY2UpICovCi0gICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uIC09IHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgfQotCi0gICAgLyogR2V0IHZpZGVvIHByb3BlcnRpZXMgZnJvbSBvdXRwdXQgcHJvcGVydGllcyAqLwotCi0gICAgLyogR2V0IG91dHB1dCB3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgc3dpdGNoKHBDLT54VlNTLm91dHB1dFZpZGVvU2l6ZSkgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTI4OwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gOTY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDE2MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMzIwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMzUyOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQToKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNjQwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiArUFIgTFY1ODA3ICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDgwMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSA3MjA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIC1QUiBMVjU4MDcgKi8KLSAgICAgICAgICAgIC8qICtDUiBHb29nbGUgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNjQwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMzYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjgwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTI4MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gOTYwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDEwODg7IC8vIG5lZWQgdG8gYmUgbXVsdGlwbGVzIG9mIDE2Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKiBJZiBvdXRwdXQgdmlkZW8gc2l6ZSBpcyBub3QgZ2l2ZW4sIHdlIHRha2UgUUNJRiBzaXplICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBubyBvdXRwdXQgdmlkZW8gc2l6ZSBnaXZlbiwgZGVmYXVsdCB0byBRQ0lGISIpOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBwQy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSAgICAgICAgPSAzMDsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgID0gMDsKLSAgICAvKiBTZXQgb3V0cHV0IHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsICovCi0gICAgcEMtPmV3Yy5vdXRwdXRWaWRlb1Byb2ZpbGUgPSBwQy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgcEMtPmV3Yy5vdXRwdXRWaWRlb0xldmVsID0gcEMtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIHN3aXRjaChwQy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCkgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBhdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSBtYXN0ZXIgY2xpcCB0byB0aGUgb3V0cHV0IHByb3BlcnRpZXMgKi8KLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgIHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPgotICAgICAgICB1aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgc3dpdGNoKCBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTjsKLSAgICAgICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSwgbXAzIGNvcmUgcmVhZGVyIHJldHVybiBhIHRpbWUgaW4gbXMgKi8KLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSAxLjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAxNjA7IC8qIEVWUkMgZnJhbWVzIGFyZSAyMCBtcyBhdCA4MDAwIEh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZXMgaXQgZWFzaWVyIHRvIGZhY3Rvcml6ZSBhbXIgYW5kIGV2cmMgY29kZSkgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxwQy0+dWlDbGlwTnVtYmVyOyBpKyspIHsKLSAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uYlRyYW5zY29kaW5nUmVxdWlyZWQgPT0gTTRPU0FfRkFMU0UpIHsKLSAgICAgICAgICAgIC8qKiBJZiBub3QgdHJhbnNjb2RlZCBpbiBBbmFseXNpcyBwaGFzZSwgY2hlY2sKLSAgICAgICAgICAgICAqIGlmIHRyYW5zY29kaW5nIHJlcXVpcmVkIG5vdwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICE9Ci0gICAgICAgICAgICAgICAgICBwQy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCl8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoICE9Ci0gICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgpIHx8Ci0gICAgICAgICAgICAgICAgICAocEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ICE9Ci0gICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KSB8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09Ci0gICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0gyNjQpIHx8Ci0gICAgICAgICAgICAgICAgICAocEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rTVBFRzQgJiYKLSAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgIT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlKSkgewotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uYlRyYW5zY29kaW5nUmVxdWlyZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqIElmIGJUcmFuc2NvZGluZ1JlcXVpcmVkIGlzIHRydWUsIGl0IG1lYW5zIHRoZSBjbGlwIGhhcwotICAgICAgICAgICAgICogYmVlbiB0cmFuc2NvZGVkIGluIEFuYWx5c2lzIHBoYXNlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLmJUcmFuc2NvZGluZ1JlcXVpcmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBXZSBwcm9kdWNlIGEgM2dwcCBmaWxlLCB1bmxlc3MgaXQgaXMgbXAzICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tNUDMgPT0gcEMtPgotICAgICAgICBwQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIG91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzsKLSAgICBlbHNlCi0gICAgICAgIG91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAvKioKLSAgICAqIEJld2FyZSwgYSBudWxsIGR1cmF0aW9uIHdvdWxkIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBlcnJvciAoYmV0dGVyIHNhZmUgdGhhbiBzb3JyeS4uLikgKi8KLSAgICBpZiggMCA9PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgewotICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiA9IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPcGVuIGZpcnN0IGNsaXAgKi8KLSAgICBwQy0+dWlDdXJyZW50Q2xpcCA9IDA7Ci0KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICA9IDAuMDsKLSAgICBwQy0+ZXdjLmRPdXRwdXRWaWRDdHMgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kQVRvID0gMC4wOwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAocEMpOwotICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciAmJiBlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRG8gdGhlIHZpZGVvIHN0dWZmIGluIDNHUFAgQXVkaW8vVmlkZW8gY2FzZSAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCA9PSBvdXRwdXRGaWxlVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8gZm9yIHRoZSBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIHN0cmVhbXMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKHBDLAotICAgICAgICAgICAgcFNldHRpbmdzLT51aU1hc3RlckNsaXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbmNyZW1lbnQgZm9yIHRoZSB0cmFuc2l0aW9uIGZpbGUgKi8KLSAgICAgICAgc3dpdGNoKCBwU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDcuNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTBfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDEwLjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDEyLjU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAxNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMF9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gMjAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDI1LjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAzMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuKCk6IGludmFsaWQgdmlkZW9GcmFtZVJhdGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00U1lTX2tNUEVHXzQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlBbHBoYTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBNUEVHLTQgY2FzZS4KLSAgICAgICAgICAgICogVGltZSBzY2FsZSBvZiB0aGUgdHJhbnNpdGlvbiBlbmNvZGVyIG11c3QgYmUgdGhlIHNhbWUgdGhhbiB0aGUKLSAgICAgICAgICAgICogdGltZXNjYWxlIG9mIHRoZSBpbnB1dCBmaWxlcy4KLSAgICAgICAgICAgICogU28gdGhlIGZyYW1lIGR1cmF0aW9uIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgdGltZSBzY2FsZSwKLSAgICAgICAgICAgICogYnV0IHdpdGhvdXQgYmVlaW5nIHRvbyBzaG9ydC4KLSAgICAgICAgICAgICogRm9yIHRoYXQsIHdlIG11c3QgY29tcHV0ZSBhbHBoYSAoaW50ZWdlcikgc28gdGhhdDoKLSAgICAgICAgICAgICogICAgICAgICAgICAgKGFscGhhIHggMTAwMCkvRW5jb2RlclRpbWVTY2FsZSA+IE1pbkZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICoqLwotCi0gICAgICAgICAgICB1aUFscGhhID0gKE00T1NBX1VJbnQzMikoKCBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSkgLyAxMDAwLjAgKyAwLjUpOwotCi0gICAgICAgICAgICBpZiggdWlBbHBoYSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICggdWlBbHBoYSAqIDEwMDAuMCkgLyBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRTWVNfa0gyNjMgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIwX0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbigpOiBpbnZhbGlkIHZpZGVvRnJhbWVSYXRlIGZvciBIMjYzLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgTVAzIG91dHB1dCBmaWxlICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgPT0gb3V0cHV0RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRSRUFERVJfQnVmZmVyIG1wM3RhZ0J1ZmZlcjsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUocEMsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUaGUgSUQzdjIgdGFnIGNvdWxkIGJlIGF0IGFueSBwbGFjZSBpbiB0aGUgbXAzIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFRoZSBtcDMgcmVhZGVyIG9ubHkgY2hlY2tzIGZldyBieXRlcyBpbiB0aGUgYmVnaW5uaW5nIG9mCi0gICAgICAgICAgIHN0cmVhbSB0byBsb29rIGZvciBhIElEM3YyIHRhZyAgKi8KLSAgICAgICAgLyogSXQgbWVhbnMgdGhhdCBpZiB0aGUgSUQzdjIgdGFnIGlzIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRoZSByZWFkZXIgZG8KLSAgICAgICAgYXMgdGhlcmUgaXMgbm8gdGhlc2UgbWV0YWRhdGEgKi8KLQotICAgICAgICAvKiBSZXRyaWV2ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjIgVGFnICovCi0gICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MlRhZywKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmbXAzdGFnQnVmZmVyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNE1QM1JfZ2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXcml0ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjIgVGFnIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICBpZiggMCAhPSBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbXAzdGFnQnVmZmVyLm1fcERhdGEsIG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcmVlIGJlZm9yZSB0aGUgZXJyb3IgY2hlY2tpbmcgYW55d2F5ICovCi0gICAgICAgICAgICBmcmVlKG1wM3RhZ0J1ZmZlci5tX3BEYXRhKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEVycm9yIGNoZWNraW5nICovCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBXcml0ZURhdGEoSUQzdjJUYWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgIG1wM3RhZ0J1ZmZlci5tX3BEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgM0dQUCBvdXRwdXQgZmlsZSAqLwotICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQID09IG91dHB1dEZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIDExLzEyLzIwMDggQ1IzMjgzIE1NUyB1c2UgY2FzZSBpbiBWaWRlb0FydGlzdDogU2V0IG1heCBvdXRwdXQgZmlsZSBzaXplIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIERlZmF1bHQgZXJyb3IgY2FzZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogaW52YWxpZCBvdXRwdXRGaWxlVHlwZSA9IDB4JXgsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfT1VUUFVUX0ZJTEVfVFlQRV9FUlJPUiIsCi0gICAgICAgICAgICBvdXRwdXRGaWxlVHlwZSk7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9PVVRQVVRfRklMRV9UWVBFX0VSUk9SOyAvKio8IHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duIHRvIHRoZSB1c2VyICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplIHN0YXRlICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIE1QMyBjYXNlIHdlIHVzZSBhIHNwZWNpYWwgYXVkaW8gc3RhdGUgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHN0YXJ0IHdpdGggdGhlIHZpZGVvIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplIHN0YXRlLgotICAgICogVGhlIGZpcnN0IGNsaXAgaXMgaW5kZXBlbmRhbnQgdG8gdGhlICJ2aXJ0dWFsIHByZXZpb3VzIGNsaXBzIiwKLSAgICAqIHNvIGl0J3MgbGlrZSBpZiB3ZSB3aGVyZSBpbiBSZWFkL1dyaXRlIG1vZGUgYmVmb3JlIGl0LiAqLwotICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcCgpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBlZGl0aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgIHBQcm9ncmVzcyAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGVkaXRpbmcgb3BlcmF0aW9uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgIFZTUyAzR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOiBFZGl0aW9uIGlzIGRvbmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsCi0gKiAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdGVwKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiB1aVByb2dyZXNzQXVkaW8sIHVpUHJvZ3Jlc3NWaWRlbywgdWlQcm9ncmVzczsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0U3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdFN0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFByb2dyZXNzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRTdGVwOiBwUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gYW5kIHNlbGVjdCBjb3JyZWN0IHByb2Nlc3NpbmcgKi8KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8ocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9BVURJTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA6Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdFN0ZXAoKTogaW52YWxpZCBpbnRlcm5hbCBzdGF0ZSAoMHgleCksIHJldHVybmluZyBNNEVSUl9TVEFURSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBwcm9ncmVzcy4KLSAgICAqIFdlIGRvIHRoZSBjb21wdXRpbmcgd2l0aCAzMmJpdHMgcHJlY2lzaW9uIGJlY2F1c2UgaW4gc29tZSAodmVyeSkgZXh0cmVtZSBjYXNlLCB3ZSBtYXkgZ2V0Ci0gICAgKiB2YWx1ZXMgaGlnaGVyIHRoYW4gMjU2ICguLi4pICovCi0gICAgdWlQcm9ncmVzc0F1ZGlvID0KLSAgICAgICAgKCAoTTRPU0FfVUludDMyKShwQy0+ZXdjLmRBVG8gKiAxMDApKSAvIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgdWlQcm9ncmVzc1ZpZGVvID0gKChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzICogMTAwKSkgLyBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgIHVpUHJvZ3Jlc3MgPSB1aVByb2dyZXNzQXVkaW8gKyB1aVByb2dyZXNzVmlkZW87Ci0KLSAgICBpZiggKCBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFNZU19rQXVkaW9Vbmtub3duKQotICAgICAgICAmJiAocEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgIT0gTTRTWVNfa1ZpZGVvVW5rbm93bikgKQotICAgICAgICB1aVByb2dyZXNzIC89IDI7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCB1aVByb2dyZXNzID4gMTAwICkKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAxMDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpdWlQcm9ncmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB0aGUgZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRTdGVwKCk6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCkKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIFZTUyBlZGl0IG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgKElOKSBWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfRVJSIHJldHVybmVkRXJyb3IgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0Q2xvc2UgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24uCi0gICAgKiBJbiAidGhlb3J5Iiwgd2Ugc2hvdWxkIG5vdCBhdXRob3JpemUgY2xvc2luZyBpZiB3ZSBhcmUgaW4gQ1JFQVRFRCBzdGF0ZS4KLSAgICAqIEJ1dCBpbiBwcmFjdGljZSwgaW4gY2FzZSB0aGUgb3BlbmluZyBmYWlsZWQsIGl0IG1heSBoYXZlIGJlZW4gcGFydGlhbGx5IGRvbmUuCi0gICAgKiBJbiB0aGF0IGNhc2Ugd2UgaGF2ZSB0byBmcmVlIHNvbWUgb3BlbmVkIHJlc3NvdXJjZXMgYnkgY2FsbGluZyBDbG9zZS4gKi8KLSAgICBpZiggTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ0xPU0VEID09IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBXcm9uZyBzdGF0ZSAoMHgleCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBUaGVyZSBtYXkgYmUgYW4gZW5jb2RlciB0byBkZXN0cm95ICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IE00VlNTM0dQUF9lZGl0RGVzdHJveVZpZGVvRW5jb2RlcigpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBpZiggTTRTWVNfa01QMyA9PSBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBNUDMgY2FzZSAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+Y2xvc2VXcml0ZShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSBvdXRwdXQgM0dQUCBjbGlwLCBpZiBpdCBoYXMgYmVlbiBvcGVuZWQgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBsYXN0IFZpZGVvIENUUyAqLwotICAgICAgICAgICAgbGFzdENUUyA9IHBDLT5ld2MuaU91dHB1dER1cmF0aW9uOwotCi0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24sICZsYXN0Q1RTKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogcEZjdENsb3NlV3JpdGUoT1VUKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUgotICAgICAgICAgICAgICAgICAgICA9PSByZXR1cm5lZEVycm9yICkgLyoqPCB3ZSByZXR1cm4gdGhlIGZpcnN0IGVycm9yIHRoYXQgaGFwcGVuZWQgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIG91dHB1dCB2aWRlbyBEU0ksIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpKTsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgb3V0cHV0IGF1ZGlvIERTSSwgaWYgaXQgaGFzIGJlZW4gY3JlYXRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kpOwotICAgICAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBjbGlwMSwgaWYgbmVlZGVkICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDMSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocEMtPnBDMSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChDMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IKLSAgICAgICAgICAgICAgICA9PSByZXR1cm5lZEVycm9yICkgLyoqPCB3ZSByZXR1cm4gdGhlIGZpcnN0IGVycm9yIHRoYXQgaGFwcGVuZWQgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm5lZEVycm9yID0gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5wQzEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgY2xpcDIsIGlmIG5lZWRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzIgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzIpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoQzIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgPT0gcmV0dXJuZWRFcnJvciApIC8qKjwgd2UgcmV0dXJuIHRoZSBmaXJzdCBlcnJvciB0aGF0IGhhcHBlbmVkICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuZWRFcnJvciA9IGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHRlbXBvcmFyeSBZVVYgcGxhbmVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djFbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MVswXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYxWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MVsxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYxWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djFbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYxWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djFbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djJbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYyWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MlsxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYyWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djJbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYyWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djJbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MlsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogUkMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2M1swXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djNbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYzWzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djNbMV0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2M1sxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djNbMl0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2M1syXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSQyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXY0WzBdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djRbMF0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2NFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djRbMV0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2NFsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXY0WzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2NFsyXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXY0WzJdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djRbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogUkMgRnJlZSBlZmZlY3RzIGxpc3QgKi8KLSAgICBpZiggcEMtPnBFZmZlY3RzTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBFZmZlY3RzTGlzdCk7Ci0gICAgICAgIHBDLT5wRWZmZWN0c0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogUkMgRnJlZSBhY3RpdmUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYoIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QpOwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogIEZyZWUgYWN0aXZlIGVmZmVjdHMgbGlzdCAqLwotICAgIGlmKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxKTsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihwQy0+bV9haXJfY29udGV4dCAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRDbG9zZSgpOiByZXR1cm5pbmcgMHgleCIsIHJldHVybmVkRXJyb3IpOwotICAgIHJldHVybiByZXR1cm5lZEVycm9yOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsZWFuVXAoKQotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRDbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSwgaWYgbmVlZGVkLgotICAgICogSW4gInRoZW9yeSIsIHdlIHNob3VsZCBub3QgY2xvc2UgaWYgd2UgYXJlIGluIENSRUFURUQgc3RhdGUuCi0gICAgKiBCdXQgaW4gcHJhY3RpY2UsIGluIGNhc2UgdGhlIG9wZW5pbmcgZmFpbGVkLCBpdCBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseSBkb25lLgotICAgICogSW4gdGhhdCBjYXNlIHdlIGhhdmUgdG8gZnJlZSBzb21lIG9wZW5lZCByZXNzb3VyY2VzIGJ5IGNhbGxpbmcgQ2xvc2UuICovCi0gICAgaWYoIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBjYWxsaW5nIE00VlNTM0dQUF9lZGl0Q2xvc2UiKTsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDbG9zZShwQyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBNNFZTUzNHUFBfZWRpdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZW5jb2RlciBkdW1teSBBVSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucER1bW15QXVCdWZmZXIgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+ZXdjLnBEdW1teUF1QnVmZmVyKTsKLSAgICAgICAgcEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBBdWRpbyBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzaGVsbHMgaW50ZXJmYWNlcyAqLwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCZwQy0+U2hlbGxBUEkpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzZXR0aW5ncyBjb3BpZWQgaW4gdGhlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdChwQyk7Ci0KLSAgICAvKioKLSAgICAqIEZpbmFsbHksIEZyZWUgY29udGV4dCAqLwotICAgIGZyZWUocEMpOwotICAgIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRDbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNpZmRlZiBXSU4zMgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZSgpCi0gKiBAYnJpZWYgICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGVycm9yIGNvZGUKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZCAoYW5kIGxvbmcgZW5vdWdoISkKLSAqIEBwYXJhbSAgICBlcnIgICAgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHRvIGdldCB0aGUgZGVzY3JpcHRpb24gZnJvbQotICogQHBhcmFtICAgIHNNZXNzYWdlICAgICAgICAoSU4vT1VUKSBBbGxvY2F0ZWQgc3RyaW5nIGluIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiB3aWxsIGJlIGNvcGllZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgSW5wdXQgZXJyb3IgaXMgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOklucHV0IGVycm9yIGlzIG5vdCBmcm9tIHRoZSBWU1MzR1BQIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKCBNNE9TQV9FUlIgZXJyLCBNNE9TQV9DaGFyICpzTWVzc2FnZSApCi17Ci0gICAgc3dpdGNoKCBlcnIgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX1RSQU5TSVRJT05fVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX0VGRkVDVF9OVUxMOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlMiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19BVV9UT09fTEFSR0U6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRlJBTUVfU0laRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkc6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU1RSRUFNX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TVFJFQU1fVFlQRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX05CX09GX0NIQU5ORUxTIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BRERWT0xVTUVfRVFVQUxTX1pFUk86Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQUREQ1RTX0hJR0hFUl9USEFOX1ZJREVPX0RVUkFUSU9OIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5ERUZJTkVEX0FVRElPX1RSQUNLX0ZJTEVfRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTkRFRklORURfQVVESU9fVFJBQ0tfRklMRV9GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU06Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FVRElPX01JWElOR19VTlNVUFBPUlRFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQVVESU9fTUlYSU5HX1VOU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRkVBVFVSRV9VTlNVUFBPUlRFRF9XSVRIX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKio8IE5vdCBhIFZTUzNHUFAgZXJyb3IgKi8KLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIiIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKiAgIFNUQVRJQyBGVU5DVElPTlMgICAqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygpCi0gKiBAYnJpZWYgICAgU2ltcGxpZnkgdGhlIGdpdmVuIGNsaXAgc2V0dGluZ3MKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbWF5IG1vZGlmeSB0aGUgZ2l2ZW4gc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwQ2xpcCAgICAoSU4vT1VUKSBDbGlwIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcCApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlDbGlwQWN0dWFsRHVyYXRpb247IC8qKjwgdGhlIGNsaXAgZHVyYXRpb24gb25jZSB0aGUgY3V0cyBhcmUgZG9uZSAqLwotICAgIE00T1NBX1VJbnQzMiB1aUR1cmF0aW9uOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotCi0gICAgLyoqCi0gICAgKiBJZiBiZWdpbiBjdXQgaXMgdG9vIGZhciwgcmV0dXJuIGFuIGVycm9yICovCi0gICAgdWlEdXJhdGlvbiA9IHBDbGlwLT5DbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLQotICAgIGlmKCBwQ2xpcC0+dWlCZWdpbkN1dFRpbWUgPiB1aUR1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogJWQgPiAlZCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04iLAotICAgICAgICAgICAgcENsaXAtPnVpQmVnaW5DdXRUaW1lLCB1aUR1cmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgZW5kIGN1dCBpcyB0b28gZmFyLCBzZXQgdG8gemVybyAoaXQgbWVhbnMgbm8gZW5kIGN1dCkgKi8KLSAgICBpZiggcENsaXAtPnVpRW5kQ3V0VGltZSA+IHVpRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcENsaXAtPnVpRW5kQ3V0VGltZSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIGFjdHVhbCBjbGlwIGR1cmF0aW9uIChvbmNlIGN1dHMgYXJlIGRvbmUpICovCi0gICAgaWYoIDAgPT0gcENsaXAtPnVpRW5kQ3V0VGltZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBObyBlbmQgY3V0ICovCi0gICAgICAgIHVpQ2xpcEFjdHVhbER1cmF0aW9uID0gdWlEdXJhdGlvbiAtIHBDbGlwLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDbGlwLT51aUJlZ2luQ3V0VGltZSA+PSBwQ2xpcC0+dWlFbmRDdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogJWQgPiAlZCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQiLAotICAgICAgICAgICAgICAgIHBDbGlwLT51aUJlZ2luQ3V0VGltZSwgcENsaXAtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVDsKLSAgICAgICAgfQotICAgICAgICB1aUNsaXBBY3R1YWxEdXJhdGlvbiA9IHBDbGlwLT51aUVuZEN1dFRpbWUgLSBwQ2xpcC0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygpCi0gKiBAYnJpZWYgICAgU2ltcGxpZnkgdGhlIGdpdmVuIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEBub3RlICAgICBUaGlzIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIGdpdmVuIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBUcmFuc2l0aW9uICAgIChJTi9PVVQpIFRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VHJhbnNpdGlvblNldHRpbmdzU2FuaXR5Q2hlY2soCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqcFRyYW5zaXRpb24gKQotewotICAgIC8qKgotICAgICogTm8gdHJhbnNpdGlvbiAqLwotICAgIGlmKCAwID09IHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+VmlkZW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgICAgICBwVHJhbnNpdGlvbi0+QXVkaW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgIH0KLSAgICBlbHNlIGlmKCAoIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lCi0gICAgICAgID09IHBUcmFuc2l0aW9uLT5WaWRlb1RyYW5zaXRpb25UeXBlKQotICAgICAgICAmJiAoTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmUKLSAgICAgICAgPT0gcFRyYW5zaXRpb24tPkF1ZGlvVHJhbnNpdGlvblR5cGUpICkKLSAgICB7Ci0gICAgICAgIHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBleHRlcm5hbCB0cmFuc2l0aW9uIGZ1bmN0aW9uIGlzIHNldCAqLwotICAgIGlmKCAoIHBUcmFuc2l0aW9uLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgID49IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCkKLSAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcFRyYW5zaXRpb24tPkV4dFZpZGVvVHJhbnNpdGlvbkZjdCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IG1pbmltYWwgdHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgIGlmKCAoIHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiA+IDApCi0gICAgICAgICYmIChwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24KLSAgICAgICAgPCBNNFZTUzNHUFBfTUlOSU1BTF9UUkFOU0lUSU9OX0RVUkFUSU9OKSApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gPQotICAgICAgICAgICAgTTRWU1MzR1BQX01JTklNQUxfVFJBTlNJVElPTl9EVVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBzZXR0aW5ncyBjb3BpZWQgaW4gdGhlIGludGVybmFsIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdCgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzZXR0aW5ncyBsaXN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDbGlwTGlzdCApCi0gICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncygmKHBDLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZyZWUocEMtPnBDbGlwTGlzdCk7Ci0gICAgICAgIHBDLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdHJhbnNpdGlvbiBsaXN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBUcmFuc2l0aW9uTGlzdCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wVHJhbnNpdGlvbkxpc3QpOwotICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICAgICAgIENyZWF0ZXMgYW5kIHByZXBhcmUgdGhlIG91dHB1dCBNUCBmaWxlCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0KLSAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+b3BlbldyaXRlKCZwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBwT3V0cHV0RmlsZSwKLSAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGU6IFdyaXRlT3BlbiByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuZCBwcmVwYXJlIHRoZSBvdXRwdXQgTVAzIGZpbGUKLSAqIEBub3RlICAgIENyZWF0ZXMgdGhlIHdyaXRlciwgQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUsIEFkZHMgdGhlIHN0cmVhbXMsCi0gICAgICAgICAgIFJlYWRpZXMgdGhlIHdyaXRpbmcgcHJvY2VzcwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcE9zYUZpbGVXcml0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcE9zYUZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbWF4T3V0cHV0RmlsZVNpemUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpVmVyc2lvbjsKLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlIHRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSBjYWxsZWQgd2l0aCBwQ19ld2M9MHgleCwgcE91dHB1dEZpbGU9MHgleCIsCi0gICAgICAgIHBDX2V3YywgcE91dHB1dEZpbGUpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENfZXdjKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiBwQ19ld2MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwT3V0cHV0RmlsZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogcE91dHB1dEZpbGUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyogU2V0IHdyaXRlciAqLwotICAgIGVyciA9Ci0gICAgICAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKHBDX1NoZWxsQVBJLCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RPcGVuKCZwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBwT3V0cHV0RmlsZSwgcE9zYUZpbGVXcml0UHRyLCBwVGVtcEZpbGUsIHBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBzaWduYXR1cmUgb3B0aW9uIG9mIHRoZSB3cml0ZXIgKi8KLSAgICBlcnIgPQotICAgICAgICBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nLCAoTTRPU0FfRGF0YU9wdGlvbikiTlhQLVNXIDogVlNTICAgICIpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKjExLzEyLzIwMDggQ1IzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3Q6Ci0gICAgU2V0IHRoZSBtYXggb3V0cHV0IGZpbGUgc2l6ZSBvcHRpb24gaW4gdGhlIHdyaXRlciBzbyB0aGF0IHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlCi0gICAgc21hbGxlciB0aGFuIHRoZSBnaXZlbiBmaWxlIHNpemUgbGltaXRhdGlvbiovCi0gICAgaWYoIG1heE91dHB1dEZpbGVTaXplID4gMCApCi0gICAgewotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRXUklURVJfa01heEZpbGVTaXplLCAmbWF4T3V0cHV0RmlsZVNpemUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHdyaXRlciBzZXQgb3B0aW9uIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHZlcnNpb24gb3B0aW9uIG9mIHRoZSB3cml0ZXIgKi8KLSAgICB1aVZlcnNpb24gPQotICAgICAgICAoTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUiAqIDEwMCArIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IgKiAxMAotICAgICAgICArIE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pOwotICAgIGVyciA9Ci0gICAgICAgIHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLCAoTTRPU0FfRGF0YU9wdGlvbikgJnVpVmVyc2lvbik7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCgoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggTTRTWVNfa1ZpZGVvVW5rbm93biAhPSBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLmhlaWdodCA9IHBDX2V3Yy0+dWlWaWRlb0hlaWdodDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGggPSBwQ19ld2MtPnVpVmlkZW9XaWR0aDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uZnBzID0KLSAgICAgICAgICAgIDAuMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgcENfZXdjLT5wVmlkZW9PdXRwdXREc2k7IC8qKjwgUHJldmlvdXNseSBjb21wdXRlZCBvdXRwdXQgRFNJICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0gcENfZXdjLT4KLSAgICAgICAgICAgIHVpVmlkZW9PdXRwdXREc2lTaXplOyAvKio8IFByZXZpb3VzbHkgY29tcHV0ZWQgb3V0cHV0IERTSSBzaXplICovCi0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gcENfZXdjLT5WaWRlb1N0cmVhbVR5cGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgICAgIC8qKjwgV2UgSEFWRSB0byBwdXQgYSB2YWx1ZSBoZXJlLi4uICovCi0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5tYXhCaXRyYXRlID0gcENfZXdjLT51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogdW5rbm93biBpbnB1dCB2aWRlbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUISIsCi0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+VmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0udGltZVNjYWxlID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpICYocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFkZCB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbSgKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsICZwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbSh2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgQVUgcHJvcGVydGllcyBmb3IgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5DVFMgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuRFRTID0gMDsgICAgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLmZyYWcgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5zaXplID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLnN0cmVhbSA9ICYocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IHZpZGVvIEFVIHNpemUgKi8KLSAgICAgICAgcENfZXdjLT51aVZpZGVvTWF4QXVTaXplID0gKE00T1NBX1VJbnQzMikoMS41RgotICAgICAgICAgICAgKihNNE9TQV9GbG9hdCkocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGgKLSAgICAgICAgICAgICogcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uaGVpZ2h0KQotICAgICAgICAgICAgKiBNNFZTUzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPKTsKLSAgICAgICAgdGVtcC5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICB0ZW1wLnZhbHVlID0gcENfZXdjLT51aVZpZGVvTWF4QXVTaXplOwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBjaHVuayBzaXplICovCi0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IChNNE9TQV9VSW50MzIpKHBDX2V3Yy0+dWlWaWRlb01heEF1U2l6ZSBcCi0gICAgICAgICAgICAqIE00VlNTM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPKTsgLyoqPCBmcm9tIG1heCBBVSBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggQ2h1bmNrIHNpemUgKi8KLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3Mgc3RyZWFtQXVkaW9JbmZvOwotCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYlNhbXBsZXNQZXJTZWMgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYkJpdHNQZXJTYW1wbGUgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYkNoYW5uZWxzID0gMTsgICAgICAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0KLSAgICAgICAgaWYoIHBDX2V3Yy0+cEF1ZGlvT3V0cHV0RHNpICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBjb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgaW5wdXQsIHdlIGNvcHkgaXRzIERTSSAqLwotICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gcENfZXdjLT51aUF1ZGlvT3V0cHV0RHNpU2l6ZTsKLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIucEJ1ZiA9IHBDX2V3Yy0+cEF1ZGlvT3V0cHV0RHNpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogV3JpdGVyIHdpbGwgcHV0IGEgZGVmYXVsdCBEU0kgKi8KLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtSW5mby5uYlNhbXBsZXNQZXJTZWMgPQotICAgICAgICAgICAgcENfZXdjLT51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZSA9IHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbUluZm8ubmJDaGFubmVscyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDX2V3Yy0+dWlOYkNoYW5uZWxzOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtSW5mby5uYkJpdHNQZXJTYW1wbGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICBzd2l0Y2goIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPSBwQ19ld2MtPnVpQXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QMzogLyoqPCB0aGVyZSBjYW4ndCBiZSBNUDMgdHJhY2sgaW4gM0dQUCBmaWxlIC0+IGVycm9yICovCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiB1bmtub3duIG91dHB1dCBhdWRpbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUISIsCi0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdXIgd3JpdGVyIHNoZWxsIGludGVyZmFjZSBpcyBhIGxpdHRsZSB0cmlja3k6IHdlIHB1dCBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gICAgICAgIGluIHRoZSBEU0kgcG9pbnRlci4uLiAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJnN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBMaW5rIHRoZSBBVSBhbmQgdGhlIHN0cmVhbSAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuc3RyZWFtID0gJihwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgIC1wQ19ld2MtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAmcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IGF1ZGlvIEFVIHNpemUgKi8KLSAgICAgICAgcENfZXdjLT51aUF1ZGlvTWF4QXVTaXplID0gTTRWU1MzR1BQX0FVRElPX01BWF9BVV9TSVpFOwotICAgICAgICB0ZW1wLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHRlbXAudmFsdWUgPSBwQ19ld2MtPnVpQXVkaW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmdGVtcCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa01heEFVU2l6ZSwgYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IGF1ZGlvIGNodW5jayBzaXplICovCi0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IE00VlNTM0dQUF9BVURJT19NQVhfQ0hVTkNLX1NJWkU7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZ0ZW1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCBhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbCBzdHJlYW1zIGFkZGVkLCB3ZSdyZSBub3cgcmVhZHkgdG8gd3JpdGUgKi8KLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTdGFydFdyaXRpbmcoCi0gICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZygpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCkKLSAqIEBicmllZiAgICBHZW5lcmF0ZSBhIEgyNjMgb3IgTVBFRy00IGRlY29kZXIgc3BlY2lmaWMgaW5mbyBjb21wYXRpYmxlIHdpdGggYWxsIGlucHV0IHZpZGVvCi0gKiAgICAgICAgICAgIHRyYWNrcy4gQ29weSBhdWRpbyBkc2kgZnJvbSBtYXN0ZXIgY2xpcC4KLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aU1hc3RlckNsaXAgKQotewotICAgIE00T1NBX0ludDMyIGlSZXN5bmNoTWFya2VyRHNpSW5kZXg7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUZvckRzaTsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZpZ0luZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSBkdW1teVNpemU7Ci0gICAgTTRPU0FfQm9vbCBiR2V0RFNpRnJvbUVuY29kZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00RU5DT0RFUl9IZWFkZXIgKmVuY0hlYWRlcjsKLSAgICBNNFNZU19TdHJlYW1JRG1lbUFkZHIgc3RyZWFtSGVhZGVyOwotCi0gICAgcFN0cmVhbUZvckRzaSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgKiBIMjYzIGNhc2UgKi8KLSAgICBpZiggTTRTWVNfa0gyNjMgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSDI2MyBvdXRwdXQgRFNJIGlzIGFsd2F5cyA3IGJ5dGVzICovCi0gICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSA3OwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucFZpZGVvT3V0cHV0RHNpIChIMjYzKSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFZpZGVvT3V0cHV0RHNpIChIMjYzKSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiAoV2Ugb3ZlcnJpZGUgdGhlIGlucHV0IHZlbmRvciBpbmZvLgotICAgICAgICAqIEF0IGxlYXN0IHdlIGtub3cgdGhhdCBub3RoaW5nIHNwZWNpYWwgd2lsbCBiZSB0cmllZCB3aXRoIFBITFAtc3RhbXBlZAotICAgICAgICAgIGVkaXRlZCBzdHJlYW1zLi4uKSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVswXSA9ICdQJzsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbMV0gPSAnSCc7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpWzJdID0gJ0wnOwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVszXSA9ICdQJzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZWNvZGVyIHZlcnNpb24gaXMgMCAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs0XSA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTGV2ZWwgaXMgdGhlIHNpeHRoIGJ5dGUgaW4gdGhlIERTSSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs1XSA9IHBDLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUHJvZmlsZSBpcyB0aGUgc2V2ZW50aCBieXRlIGluIHRoZSBEU0kqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs2XSA9IHBDLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE1QRUctNCBjYXNlICovCi0gICAgZWxzZSBpZiggTTRTWVNfa01QRUdfNCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSB8fAotICAgICAgICBNNFNZU19rSDI2NCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSkgewotCi0gICAgICAgIC8qIEZvciBNUEVHNCBhbmQgSC4yNjQgZW5jb2RlciBjYXNlCi0gICAgICAgICogRmV0Y2ggdGhlIERTSSBmcm9tIHRoZSBzaGVsbCB2aWRlbyBlbmNvZGVyLCBhbmQgZmVlZCBpdCB0byB0aGUgd3JpdGVyIGJlZm9yZQotICAgICAgICBjbG9zaW5nIGl0LiAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogZ2V0IERTSSBmb3IgSDI2NCBzdHJlYW0iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogcEMtPmV3Yy5wRW5jQ29udGV4dCBpcyBOVUxMIik7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQsIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOiBlbmNIZWFkZXItPnBCdWY9MHgleCwgc2l6ZT0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5wQnVmLCBlbmNIZWFkZXItPlNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgIHNlbmQgRFNJIGZvciB2aWRlbyBzdHJlYW0gdG8gM0dQIHdyaXRlciIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbmV3IERTSSAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhlbmNIZWFkZXItPlNpemUsIE00VlNTM0dQUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKEgyNjQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBWaWRlb091dHB1dERzaSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwsIGNhbm5vdCBnZXQgdGhlIERTSSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcFN0cmVhbUZvckRzaSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogQ29tcHV0ZSBBdWRpbyBEU0kgKi8KLSAgICBpZiggTTRTWVNfa0F1ZGlvVW5rbm93biAhPSBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICBpZiggdWlNYXN0ZXJDbGlwID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDbGlwIGlzIGFscmVhZHkgb3BlbmVkICovCi0gICAgICAgICAgICBwU3RyZWFtRm9yRHNpID0gJihwQy0+cEMxLT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXZSBjYW4gdXNlIHRoZSBmYXN0IG9wZW4gbW9kZSB0byBnZXQgdGhlIERTSSAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQ2xpcCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEluaXQoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ2xpcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQ2xpcCwgJnBDLT5wQ2xpcExpc3RbdWlNYXN0ZXJDbGlwXSwKLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2kgPSAmKHBDbGlwLT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2ktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCk6XAotICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwQXVkaW9PdXRwdXREc2ksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwU3RyZWFtRm9yRHNpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLnBBdWRpb091dHB1dERzaSwKLSAgICAgICAgICAgICh2b2lkICopcFN0cmVhbUZvckRzaS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIElmIGEgY2xpcCBoYXMgYmVlbiB0ZW1wb3JhcmlseSBvcGVuZWQgdG8gZ2V0IGl0cyBEU0ksIGNsb3NlIGl0ICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKQotICogQGJyaWVmICAgIFN3aXRjaCBmcm9tIHRoZSBjdXJyZW50IGNsaXAgdG8gdGhlIG5leHQgb25lCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzEgKQotICAgIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpIHsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSBjdXJyZW50IGZpcnN0IGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzEpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcDogTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKEMxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqICBpbmNyZW1lbnQgY2xpcCBjb3VudGVyICovCi0gICAgICAgIHBDLT51aUN1cnJlbnRDbGlwKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBsYXN0IGNsaXAgKi8KLSAgICBpZiggcEMtPnVpQ3VycmVudENsaXAgPj0gcEMtPnVpQ2xpcE51bWJlciApCi0gICAgewotICAgICAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6XAotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbG9zZShDMSkgcmV0dXJucyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGUgbmV4dCBjbGlwIGhhcyBhbHJlYWR5IGJlIG9wZW5lZCwgc2V0IGl0IGFzIGZpcnN0IGNsaXAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEMyICkKLSAgICB7Ci0gICAgICAgIHBDLT5wQzEgPSBwQy0+cEMyOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQzItPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSA9IHBDLT5wQzItPm1fcFByZVJlc2l6ZUZyYW1lOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wQzIgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0OwotICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLSAgICAvKioKLSAgICAqIGVsc2Ugb3BlbiBpdCAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzEsCi0gICAgICAgICAgICAmcEMtPnBDbGlwTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcDogTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgc2Vjb25kIGNsaXAgaGFzIG5vdCBiZWVuIG9wZW5lZCB5ZXQsCi0gICAgICAgICAgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGhhcyBiZWVuIG5vIHRyYW5zaXRpb24uCi0gICAgICAgICogU28gYm90aCBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIHRpbWVzIGFyZSBPSy4KLSAgICAgICAgKiBTbyB3ZSBjYW4gc2V0IGJvdGggdmlkZW8yIGFuZCBhdWRpbyBvZmZzZXRzICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIGN1cnJlbnQgdmlkZW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCB2aWRlbyBvZmZzZXQgKi8KLQotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICBwQy0+cEMxLT5pVm9mZnNldCArPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgY3VycmVudCBhdWRpbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIGF1ZGlvIG9mZnNldCAqLwotICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCArPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAqIFRoZXJlIG1heSBiZSBhIHBvcnRpb24gb2YgdGhlIGR1cmF0aW9uIG9mIGFuIGF1ZGlvIEFVIG9mIGRlc3luY2hybyBhdCBlYWNoIGFzc2VtYmx5LgotICAgICAgICAqIEl0IGxlYWRzIHRvIGFuIGF1ZGlibGUgZGVzeW5jaHJvIHdoZW4gdGhlcmUgYXJlIGEgbG90IG9mIGNsaXBzIGFzc2VtYmxlZC4KLSAgICAgICAgKiBUaGlzIGJ1ZyBmaXggYWxsb3dzIHRvIHJlc3luY2ggdGhlIGF1ZGlvIHRyYWNrIHdoZW4gdGhlIGRlbHRhIGlzIGhpZ2hlcgotICAgICAgICAqIHRoYW4gb25lIGF1ZGlvIEFVIGR1cmF0aW9uLgotICAgICAgICAqIFdlIFN0ZXAgb25lIEFVIGluIHRoZSBzZWNvbmQgY2xpcCBhbmQgd2UgY2hhbmdlIHRoZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkuICovCi0gICAgICAgIGlmKCAoIHBDLT5wQzEtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAtIChNNE9TQV9JbnQzMikocEMtPnBDMS0+aVZvZmZzZXQgKnBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KSkKLSAgICAgICAgPiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZHZhbmNlIG9uZSBBTVIgZnJhbWUgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVwZGF0ZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkqLwotICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLT0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgc3RhcnRpbmcgc3RhdGUgZm9yIHRoaXMgY2xpcCBwcm9jZXNzaW5nICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIE1QMyBjYXNlIHdlIHVzZSBhIHNwZWNpYWwgYXVkaW8gc3RhdGUgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHN0YXJ0IHdpdGggdGhlIHZpZGVvIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0KLSAgICAgICAgaWYoIHBDLT5Wc3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogaWYgbm90IGEgdHJhbnNpdGlvbiB0aGVuIHJlc2V0IHByZXZpb3VzIHZpZGVvIHN0YXRlICovCi0gICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIFRoZSBmbGFncyBhcmUgc2V0IHRvIGZhbHNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgY2xpcCAqLwotICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVA7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpCi0gKiBAYnJpZWYgICAgRG8gd2hhdCB0byBkbyB3aGVuIHRoZSBlbmQgb2YgYSBjbGlwIHZpZGVvIHRyYWNrIGlzIHJlYWNoZWQKLSAqIEBub3RlICAgIElmIHRoZXJlIGlzIGF1ZGlvIG9uIHRoZSBjdXJyZW50IGNsaXAsIHByb2Nlc3MgaXQsIGVsc2Ugc3dpdGNoIHRvIHRoZSBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogVmlkZW8gaXMgZG9uZSBmb3IgdGhpcyBjbGlwLCBub3cgd2UgZG8gdGhlIGF1ZGlvICovCi0gICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQVVESU87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsaXAgZG9uZSwgZG8gdGhlIG5leHQgb25lICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvOiBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKQotICogQGJyaWVmICAgIERvIHdoYXQgdG8gZG8gd2hlbiB0aGUgZW5kIG9mIGEgY2xpcCBhdWRpbyB0cmFjayBpcyByZWFjaGVkCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIENsaXAgZG9uZSwgZG8gdGhlIG5leHQgb25lICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbzogTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFN0YXJ0IHdpdGggdGhlIHZpZGVvICovCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkKLSAqIEBicmllZiAgICBPcGVuIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKiogaENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsgLyoqPCBzaG9ydGN1dCAqLwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBcIiVzXCIiLAotICAgICAgICAoTTRPU0FfQ2hhciAqKXBDbGlwU2V0dGluZ3MtPnBGaWxlKTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSW5pdChoQ2xpcCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBNNFZTUzNHUFBfaW50Q2xpcEluaXQoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgaWYoICpoQ2xpcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCpoQ2xpcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBzaG9ydGN1dCAqLwotICAgIHBDbGlwID0gKmhDbGlwOwotCi0gICAgaWYgKHBDbGlwU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCApIHsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzID0gJnBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzOwotICAgICAgICBwQ2xpcC0+cFNldHRpbmdzID0gcENsaXBTZXR0aW5nczsKLSAgICAgICAgcENsaXAtPmlFbmRUaW1lID0gcENsaXBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lOwotICAgIH0KLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQ2xpcCwgcENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IFwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAqaENsaXAgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSB7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcyA9ICZwQ2xpcC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgY29tbW9uICdzaWxlbmNlIGZyYW1lIHN0dWZmJyB0byBDbGlwQ29udGV4dCAqLwotICAgIHBDbGlwLT51aVNpbGVuY2VQY21TaXplID0gcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplOwotICAgIHBDbGlwLT5wU2lsZW5jZUZyYW1lRGF0YSA9IHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgcENsaXAtPnVpU2lsZW5jZUZyYW1lU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgIHBDbGlwLT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICBwQ2xpcC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcENsaXAtPmlBdWRpb0ZyYW1lQ3RzID0gLXBDbGlwLT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLQotICAgIC8qKgotICAgICogSWYgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG91dHB1dCBhdWRpbyBmb3JtYXQsCi0gICAgKiB3ZSByZW1vdmUgaXQuIFNvIGl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgc2lsZW5jZSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayhwQ2xpcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBY3R1YWwgYmVnaW4gY3V0ICovCi0gICAgaWYoIDAgPT0gcENsaXBTZXR0aW5ncy0+dWlCZWdpbkN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcENsaXAtPmlWb2Zmc2V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBb2Zmc2V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZihwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSnVtcCB0aGUgdmlkZW8gdG8gdGhlIHRhcmdldCBiZWdpbiBjdXQgdG8gZ2V0IHRoZSBhY3R1YWwgYmVnaW4gY3V0IHZhbHVlICovCi0gICAgICAgICAgICBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQ2xpcFNldHRpbmdzLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIGlDdHMgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAocENsaXAtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXAtPnBWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgdmlkZW8gYmVnaW4gY3V0ICovCi0gICAgICAgICAgICBwQ2xpcC0+aVZvZmZzZXQgPSAtcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSnVtcCB0aGUgYXVkaW8gdG8gdGhlIHZpZGVvIGFjdHVhbCBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rTVAzICE9IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+aUFjdHVhbEF1ZGlvQmVnaW5DdXQgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgICAgICAgICAgICAgaUN0cyA9IChNNE9TQV9JbnQzMikocENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0Ci0gICAgICAgICAgICAgICAgICAgICogcENsaXAtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocENsaXAsICZpQ3RzKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoQSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjbGlwIG9mZnNldCB3aXRoIHRoZSBhdWRpbyBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcC0+aUFvZmZzZXQgPSAtaUN0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEZvciB0aGUgTVAzLCB0aGUganVtcCBpcyBub3QgZG9uZSBiZWNhdXNlIG9mIHRoZSBWQlIsCi0gICAgICAgICAgICAgICAgICBpdCBjb3VsZCBiZSBub3QgZW5vdWdoIGFjY3VyYXRlICovCi0gICAgICAgICAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKXBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgaWYgKChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSkgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUmVhZCB0aGUgZmlyc3QgVmlkZW8gQVUgb2YgdGhlIGNsaXAgKi8KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICBwQ2xpcC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcC0+cFZpZGVvU3RyZWFtLCAmcENsaXAtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2UgKGFscmVhZHkhKSByZWFjaCB0aGUgZW5kIG9mIHRoZSBjbGlwLCB3ZSBmaWx0ZXIgdGhlIGVycm9yLgotICAgICAgICAgICAgICAgICogSXQgd2lsbCBiZSBjb3JyZWN0bHkgbWFuYWdlZCBhdCB0aGUgZmlyc3Qgc3RlcC4gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGggID0gcENsaXBQcm9wZXJ0aWVzLT51aVN0aWxsUGljV2lkdGg7Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSBwQ2xpcFByb3BlcnRpZXMtPnVpU3RpbGxQaWNIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLyogc3RhdGUgY2hlY2sgbm90IHRvIGFsbG9jYXRlIGJ1ZmZlciBkdXJpbmcgc2F2ZSBzdGFydCAqLwotCi0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogVmlkZW8gcmVzaXplIG1hbmFnZW1lbnQgICAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgaW5wdXQgY2xpcCBpcyBhIHJvdGF0ZSB2aWRlbyBvciB0aGUgb3V0cHV0IHJlc29sdXRpb24gaXMgZGlmZmVyZW50Ci0gICAgICAgICogZnJvbSB0aGUgaW5wdXQgcmVzb2x1dGlvbiwgdGhlbiB0aGUgdmlkZW8gZnJhbWUgbmVlZHMgdG8gYmUgcm90YXRlZAotICAgICAgICAqIG9yIHJlc2l6ZWQsIGZvcmNlIHRvIHJlc2l6ZSBtb2RlICovCi0gICAgICAgIGlmICgoKE00T1NBX1VJbnQzMilwQy0+ZXdjLnVpVmlkZW9XaWR0aCAhPQotICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCkgfHwKLSAgICAgICAgICAgICgoTTRPU0FfVUludDMyKXBDLT5ld2MudWlWaWRlb0hlaWdodCAhPQotICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQpIHx8Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnZpZGVvUm90YXRpb25EZWdyZWVzICE9IDApIHsKLQotICAgICAgICAgICAgaWYgKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIHZpZGVvIHBsYW5lIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgcmVjZWl2ZSB0aGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUgcmVzaXppbmcgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFByZVJlc2l6ZUZyYW1lIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBZIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGggID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3N0cmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jICgKLSAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgKiBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBVIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGggID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQgPj4gMTsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoCi0gICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlICogcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBWIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKAotICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSAqIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgdmlkZW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLQotICAgIGlmKCAoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgICYmIChNNFZJREVPRURJVElOR19rTVAzICE9IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBSZWFkIHRoZSBmaXJzdCBBdWRpbyBBVSBvZiB0aGUgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcCk7Ci0KLSAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgYXVkaW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludE9wZW5DbGlwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dEF2ZXJhZ2VWaWRlb0JpdHJhdGUoKQotICogQGJyaWVmICAgIEF2ZXJhZ2UgYml0cmF0ZSBvZiB0aGUgb3V0cHV0IGZpbGUsIGNvbXB1dGVkIGZyb20gaW5wdXQgYml0cmF0ZXMsCi0gKiAgICAgICAgICBkdXJhdGlvbnMsIHRyYW5zaXRpb25zIGFuZCBjdXRzLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDU18wLCAqcENTXzEsICpwQ1NfMjsKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICpwVDAsICpwVDI7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX1VJbnQzMiB0MF9kdXJhdGlvbiwgdDJfZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIHQwX2JpdHJhdGUsIHQyX2JpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyIGMxX2R1cmF0aW9uOwotCi0gICAgTTRPU0FfVUludDMyIHRvdGFsX2R1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiB0b3RhbF9iaXRzdW07Ci0KLSAgICB0b3RhbF9kdXJhdGlvbiA9IDA7Ci0gICAgdG90YWxfYml0c3VtID0gMDsKLQotICAgIC8qIExvb3Agb24gdGhlIG51bWJlciBvZiBjbGlwcyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDU18xID0gJnBDLT5wQ2xpcExpc3RbaV07Ci0KLSAgICAgICAgdDBfZHVyYXRpb24gPSAwOwotICAgICAgICB0MF9iaXRyYXRlID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICB0Ml9kdXJhdGlvbiA9IDA7Ci0gICAgICAgIHQyX2JpdHJhdGUgPSBwQ1NfMS0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyogVHJhbnNpdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBjbGlwICovCi0gICAgICAgIGlmKCBpID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDU18wID0gJnBDLT5wQ2xpcExpc3RbaSAtIDFdOwotICAgICAgICAgICAgcFQwID0gJnBDLT5wVHJhbnNpdGlvbkxpc3RbaSAtIDFdOwotCi0gICAgICAgICAgICBpZiggcFQwLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgIT0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQwX2R1cmF0aW9uID0gcFQwLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ1NfMC0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPiB0MF9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQwX2JpdHJhdGUgPSBwQ1NfMC0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogVHJhbnNpdGlvbiB3aXRoIHRoZSBuZXh0IGNsaXAgKi8KLSAgICAgICAgaWYoIGkgPCBwQy0+dWlDbGlwTnVtYmVyIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDU18yID0gJnBDLT5wQ2xpcExpc3RbaSArIDFdOwotICAgICAgICAgICAgcFQyID0gJnBDLT5wVHJhbnNpdGlvbkxpc3RbaV07Ci0KLSAgICAgICAgICAgIGlmKCBwVDItPlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAhPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdDJfZHVyYXRpb24gPSBwVDItPnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDU18yLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA+IHQyX2JpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdDJfYml0cmF0ZSA9IHBDU18yLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayBmb3IgY3V0IHRpbWVzICovCi0gICAgICAgIGlmKCBwQ1NfMS0+dWlFbmRDdXRUaW1lID4gMCApCi0gICAgICAgICAgICBjMV9kdXJhdGlvbiA9IHBDU18xLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMxX2R1cmF0aW9uID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0KLSAgICAgICAgaWYoIHBDU18xLT51aUJlZ2luQ3V0VGltZSA+IDAgKQotICAgICAgICAgICAgYzFfZHVyYXRpb24gLT0gcENTXzEtPnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIGMxX2R1cmF0aW9uIC09IHQwX2R1cmF0aW9uICsgdDJfZHVyYXRpb247Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBiaXRzdW0gYW5kIGR1cmF0aW9uICovCi0gICAgICAgIHRvdGFsX2R1cmF0aW9uICs9IGMxX2R1cmF0aW9uICsgdDBfZHVyYXRpb24gLyAyICsgdDJfZHVyYXRpb24gLyAyOwotCi0gICAgICAgIHRvdGFsX2JpdHN1bSArPQotICAgICAgICAgICAgYzFfZHVyYXRpb24gKiAocENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlIC8gMTAwMCkKLSAgICAgICAgICAgICsgKHQwX2JpdHJhdGUgLyAxMDAwKSAqIHQwX2R1cmF0aW9uIC8gMgotICAgICAgICAgICAgKyAodDJfYml0cmF0ZSAvIDEwMDApICogdDJfZHVyYXRpb24gLyAyOwotICAgIH0KLQotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSAoIHRvdGFsX2JpdHN1bSAvIHRvdGFsX2R1cmF0aW9uKSAqIDEwMDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRBdWRpby5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0Njg4M2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGVkaXQgQVBJIGltcGxlbWVudGF0aW9uLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotI2RlZmluZSBQV1JfRlhQX0ZSQUNUX01BWCAgICAgICAgICAgICgzMjc2OCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9VSW50OCB1aUNsaXAxb3JDbGlwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9JbnQxNiAqcFBDTWRhdGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGp1bXBpbmcgcHJvY2Vzc2luZyBmb3IgdGhlIE1QMyBjbGlwLgotICogQG5vdGUgICAgT24gb25lIHN0ZXAsIHRoZSBqdW1wIG9mIHNldmVyYWwgQVUgaXMgZG9uZQotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwID0gcEMtPnBDMTsgLyoqPCBzaG9ydGN1dCAqLwotICAgIE00T1NBX0ludDMyIEp1bXBDdHM7Ci0KLSAgICBKdW1wQ3RzID0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQ2xpcCwgJkp1bXBDdHMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChBKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIEp1bXBDdHMgPj0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX01QMzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgYXVkaW8gYmVnaW4gY3V0ICovCi0gICAgICAgIHBDbGlwLT5pQW9mZnNldCA9IC1KdW1wQ3RzOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFRoZSBhdWRpbyBpcyBjdXJyZW50bHkgaW4gcmVhZGluZyBtb2RlICovCi0gICAgICAgIHBDbGlwLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcAotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwID0gcEMtPnBDMTsgLyoqPCBzaG9ydGN1dCAqLwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIHBDbGlwLT5wQXVkaW9GcmFtZVB0ciwgKE00T1NBX1VJbnQzMilwQ2xpcC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcCk7Ci0KLSAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLCAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgY3VycmVudCB0aW1lICh0bz10YytUKSAqLwotICAgICAgICBwQy0+ZXdjLmRBVG8gPQotICAgICAgICAgICAgKCBwQ2xpcC0+aUF1ZGlvRnJhbWVDdHMgKyBwQ2xpcC0+aUFvZmZzZXQpIC8gcENsaXAtPnNjYWxlX2F1ZGlvOwotCi0gICAgICAgIGlmKCAoTTRPU0FfSW50MzIpKHBDbGlwLT5pQXVkaW9GcmFtZUN0cyAvIHBDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSkKLSAgICAgICAgICAgID49IHBDbGlwLT5pRW5kVGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00UkVBREVSX0J1ZmZlciBtcDN0YWdCdWZmZXI7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGUgZHVyYXRpb24gaXMgYmV0dGVyIHJlc3BlY3RlZCBpZiB0aGUgZmlyc3QgQVUgYW5kIGxhc3QgQVUgYXJlIGJvdGggYWJvdmUKLSAgICAgICAgICAgIHRoZSBjdXQgdGltZSAqLwotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgcENsaXAtPnBBdWRpb0ZyYW1lUHRyLAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpcENsaXAtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAvKiBUaGUgSUQzdjEgdGFnIGlzIGFsd2F5cyBhdCB0aGUgZW5kIG9mIHRoZSBtcDMgZmlsZSBzbyB0aGUgZW5kIG9mIHRoZSBjdXR0aW5nCi0gICAgICAgICAgICBwcm9jZXNzIGlzIHdhaXRlZCAqLwotICAgICAgICAgICAgLyogYmVmb3JlIHdyaXRpbmcgdGhlIG1ldGFkYXRhIGluIHRoZSBvdXRwdXQgZmlsZSovCi0KLSAgICAgICAgICAgIC8qIFJldHJpZXZlIHRoZSBkYXRhIG9mIHRoZSBJRDN2MSBUYWcgKi8KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQ2xpcC0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MVRhZywKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm1wM3RhZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDM6IE00TVAzUl9nZXRPcHRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBXcml0ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjEgVGFnIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICAgICAgaWYoIDAgIT0gbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1wM3RhZ0J1ZmZlci5tX3BEYXRhLCBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRnJlZSBiZWZvcmUgdGhlIGVycm9yIGNoZWNraW5nIGFueXdheSAqLwotICAgICAgICAgICAgICAgIGZyZWUobXAzdGFnQnVmZmVyLm1fcERhdGEpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFcnJvciBjaGVja2luZyAqLwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDM6XAotICAgICAgICAgICAgICAgICAgICAgICAgcE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEoSUQzdjFUYWcpIHJldHVybnMgMHgleCIsICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgICAgICBtcDN0YWdCdWZmZXIubV9wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFRoZSBFbmQgQ3V0IGhhcyBiZWVuIHJlYWNoZWQgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyhwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMgOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpICYmIChNNE9TQV9GQUxTRQotICAgICAgICAgICAgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKSAvKio8IFJlYWNoZWQgZW5kIG9mIGNsaXAgKi8KLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKAotICAgICAgICAgICAgICAgIHBDKTsgLyoqPCBDbGlwIGRvbmUsIGRvIHRoZSBuZXh0IG9uZSAqLwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBpbnQzMl90IGF1VGltZVN0YW1wID0gLTE7Ci0KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAgLyoqPCBFbmNvZGVyIGlucHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNPdXRCdWZmZXI7IC8qKjwgRW5jb2RlciBvdXRwdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNE9TQV9UaW1lCi0gICAgICAgIGZyYW1lVGltZURlbHRhOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLSAgICBNNE9TQV9Cb29sIGJTdG9wQXVkaW87Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgZW5kIGN1dCAqLwotICAgIGlmKCAoIHBDLT5ld2MuZEFUbyAtIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8gKyAwLjUpCi0gICAgICAgID49IHBDLT5wQzEtPmlFbmRUaW1lICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEF1ZGlvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgJiYgZXJyICE9IE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgQXVkaW8gTW9kZSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IG91dHB1dCBDVFMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoCi0gICAgICAgIHBDKTsgLyoqPCBUaGlzIGZ1bmN0aW9uIGNoYW5nZSB0aGUgcEMtPkFzdGF0ZSB2YXJpYWJsZSEgKi8KLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiICBBVURJTyBzdGVwIDogZEFUbyA9ICVmICBzdGF0ZSA9ICVkICBvZmZzZXQgPSAlbGQiLAotICAgICAgICBwQy0+ZXdjLmRBVG8sIHBDLT5Bc3RhdGUsIHBDLT5wQzEtPmlBb2Zmc2V0KTsKLQotICAgIGJTdG9wQXVkaW8gPSBNNE9TQV9GQUxTRTsKLQotICAgIHN3aXRjaCggcEMtPkFzdGF0ZSApCi0gICAgewotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgUkVBRF9XUklURSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gUkVBRF9XUklURSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICBSRUFEX1dSSVRFOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgb3V0cHV0IGF1ZGlvIENUUyAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBCWlpaIGJ1ZyBmaXggKHJlYWQtd3JpdGUgY2FzZSk6Ci0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBBTVIgQVUgb2YgdGhlIHN0cmVhbSB3aXRoIGEgc2lsZW5jZSBBVS4KLSAgICAgICAgICAgICAgICAqIEl0IHJlbW92ZXMgYW5ub3lpbmcgIkJaWloiIGF1ZGlvIGdsaXRjaC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgaWYgdGhlcmUgaXMgYSBiZWdpbiBjdXQuCi0gICAgICAgICAgICAgICAgKiBJdCBpcyBub3QgbmVlZGVkIGZvciB0aGUgZmlyc3QgY2xpcC4KLSAgICAgICAgICAgICAgICAqIEJlY2F1c2Ugb2YgYW5vdGhlciBidWdmaXggKDIwMDUtMDMtMjQpLCB0aGUgZmlyc3QgQVUgd3JpdHRlbiBtYXkgYmUKLSAgICAgICAgICAgICAgICAqIHRoZSBzZWNvbmQgb25lIHdoaWNoIENUUyBpcyAyMC4gSGVuY2UgdGhlIGN0czwyMSB0ZXN0LgotICAgICAgICAgICAgICAgICogKHRoZSBCWlpaIGVmZmVjdCBvY2N1cnMgZXZlbiB3aXRoIHRoZSBzZWNvbmQgQVUhKSAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IHBDLT5wQzEtPmJGaXJzdEF1V3JpdHRlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgKDAgIT0gcEMtPnVpQ3VycmVudENsaXApICYmIChwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICA8IChwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiArIDEpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGEgc2lsZW5jZSBBVSB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiQSAjIyMjIHNpbGVuY2UgQVUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplCi0gICAgICAgICAgICAgICAgICAgIDwgcEMtPmV3Yy51aUF1ZGlvTWF4QXVTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBSRUFEX1dSSVRFOiBBVSBzaXplIGdyZWF0ZXIgdGhhbiBNYXhBdVNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkPiVkKSEgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUsIHBDLT5ld2MudWlBdWRpb01heEF1U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBvbmx5IHVzZWQgdG8gZml4IHRoZSBCWlogYnVnLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dCBmaWxlCi0gICAgICAgICAgICAgICAgICAgIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfV1JJVEU6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXVkaW8gaXMgbm93IGluIHJlYWQgbW9kZSAodGhlcmUgbWF5IGJlIGEgImlmKHN0YXR1cyE9UkVBRCkiIGhlcmUsCi0gICAgICAgICAgICAgICAgYnV0IGl0IGlzIHJlbW92ZWQgZm9yIG9wdGltaXphdGlvbikgKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZEFUbyA9ICggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW87Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfRkFMU0UgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSWYgb3V0cHV0IGlzIG90aGVyIHRoYW4gQU1SIG9yIEFBQwotICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gRVZSQyx3ZSBjYW4ndCB3cml0ZSBzaWxlbmNlIGludG8gaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNvIHdlIHNpbXBseSBlbmQgaGVyZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgREVDT0RFX0VOQ09ERSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gREVDT0RFX0VOQ09ERSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgcmVhZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIGEgZmV3IEFVIGJhY2t3YXJkIHRvIGRlY29kZS9lbmNvZGUKLSAgICAgICAgICAgICAgICAod2l0aG91dCB3cml0aW5nIHJlc3VsdCkgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQy0+cEMxLT5Bc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHMsIGlDdXJyZW50Q3RzOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMxLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlBdWRpb0ZyYW1lQ3RzICkgLyoqPGRvbid0IHRyeSB0byBwcmUtZGVjb2RlIGlmIGNsaXAgaXMgYXQgaXRzIGJlZ2lubmluZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYSBmZXcgQVVzIGJhY2t3YXJkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ3VycmVudEN0cyA9IHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IGlDdXJyZW50Q3RzIC0gTTRWU1MzR1BQX05CX0FVX1BSRUZFVENICi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlUYXJnZXRDdHMgPCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0Q3RzID0gMDsgLyoqPCBTYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQy0+cEMxLCAmaVRhcmdldEN0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMSk7IC8qKjwgcmVhZCBBVSB3aGVyZSB3ZSBqdW1wZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkQgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShhKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRGVjb2RlL2VuY29kZSB1cCB0byB0aGUgd2FudGVkIHBvc2l0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPCBpQ3VycmVudEN0cyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJFICoqKiogcHJlLWVuY29kZSIpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvL2lmKDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0pCi0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aW1lc3RhbXAgb2YgbGFzdCByZWFkIEFVCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfQXVDVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmYXVUaW1lU3RhbXApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1VGltZVN0YW1wID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBhdWRpbyB0aW1lc3RhbXAgcmV0dXJuZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX0lOVkFMSURfVElNRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyA9IGF1VGltZVN0YW1wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBBdWRpbyBpcyBub3cgT0sgZm9yIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5wQXVkaW9GcmFtZVB0ciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGltZXN0YW1wIG9mIGxhc3QgcmVhZCBBVQotICAgICAgICAgICAgICAgIHBDLT5wQzEtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1Q1RTLAotICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmF1VGltZVN0YW1wKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdVRpbWVTdGFtcCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IGludmFsaWQgYXVkaW8gXAotICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wIHJldHVybmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPSBhdVRpbWVTdGFtcDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDEsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRFbmRBdWRpb0VmZmVjdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb21wdXRlIG91dHB1dCBhdWRpbyBDVFMgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldDsKLQotICAgICAgICAgICAgICAgIC8qIE1heSBoYXBwZW4gd2l0aCBjb3JydXB0ZWQgaW5wdXQgZmlsZXMgKHdoaWNoIGhhdmUgc3R0cyBlbnRyaWVzIG5vdAotICAgICAgICAgICAgICAgIG11bHRpcGxlIG9mIFNpbGVuY2VGcmFtZUR1cmF0aW9uKSAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIDwgMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJaWlogYnVnIGZpeCAoZGVjb2RlLWVuY29kZSBjYXNlKToKLSAgICAgICAgICAgICAgICAqIChZZXMsIHRoZSBCenogYnVnIG1heSBhbHNvIG9jY3VyIHdoZW4gd2UgcmUtZW5jb2RlLiBJdCBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgKiAgb2NjdXIgYXQgdGhlIGRlY29kZSBiZWZvcmUgdGhlIGVuY29kZSwgYnV0IGF0IHRoZSBwbGF5YmFjayEpCi0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBBTVIgQVUgb2YgdGhlIGVuY29kZWQgc3RyZWFtIHdpdGggYSBzaWxlbmNlIEFVLgotICAgICAgICAgICAgICAgICogSXQgcmVtb3ZlcyBhbm5veWluZyAiQlpaWiIgYXVkaW8gZ2xpdGNoLgotICAgICAgICAgICAgICAgICogSXQgaXMgbm90IG5lZWRlZCBpZiB0aGVyZSBpcyBhIGJlZ2luIGN1dC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgZm9yIHRoZSBmaXJzdCBjbGlwLgotICAgICAgICAgICAgICAgICogQmVjYXVzZSBvZiBhbm90aGVyIGJ1Z2ZpeCAoMjAwNS0wMy0yNCksIHRoZSBmaXJzdCBBVSB3cml0dGVuIG1heSBiZQotICAgICAgICAgICAgICAgICogdGhlIHNlY29uZCBvbmUgd2hpY2ggQ1RTIGlzIDIwLiBIZW5jZSB0aGUgY3RzPDIxIHRlc3QuCi0gICAgICAgICAgICAgICAgKiAodGhlIEJaWlogZWZmZWN0IG9jY3VycyBldmVuIHdpdGggdGhlIHNlY29uZCBBVSEpICovCi0gICAgICAgICAgICAgICAgaWYoICggTTRPU0FfRkFMU0UgPT0gcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuKQotICAgICAgICAgICAgICAgICAgICAmJiAoMCAhPSBwQy0+dWlDdXJyZW50Q2xpcCkgJiYgKHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIDwgKHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uICsgMSkpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgYSBzaWxlbmNlIEFNUiBBVSB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRyAjIyMjIHNpbGVuY2UgQVUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmaWx0ZXJlZCBQQ00gYXVkaW8gZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IEFVICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiSCArKysrIGVuY29kZSBBVSIpOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgYSBQQ00gYnVmZmVyIGZvciBldmVyeSBkZWNvZGVTdGVwIGNhbGwuKgotICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBTZXQgQVUgc2l6ZSAqLwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWwotICAgICAgICAgICAgICAgICAgICAgICAgMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVGhpcyBib29sZWFuIGlzIG9ubHkgdXNlZCB0byBmaXggdGhlIEJaWiBidWcuLi4gKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5iRmlyc3RBdVdyaXR0ZW4gPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkkgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoxMS8xMi8yMDA4IENSIDMyODMgTU1TIHVzZSBjYXNlIGZvciBWaWRlb0FydGlzdAotICAgICAgICAgICAgICAgICAgICB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVhZCB0aGUgbmV4dCBhdWRpbyBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkogLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVXBkYXRlIGN1cnJlbnQgdGltZSAodG89dGMrVCkgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kQVRvID0gKCBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBvdXRwdXQgaXMgb3RoZXIgdGhhbiBBTVIgb3IgQUFDCi0gICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBFVlJDLHdlIGNhbid0IHdyaXRlIHNpbGVuY2UgaW50byBpdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2Ugc2ltcGx5IGVuZCBoZXJlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICBiU3RvcEF1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBUUkFOU0lUSU9OIE1PREUgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9UUkFOU0lUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbyBUUkFOU0lUSU9OIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSByZWFkaW5nIHRoZSBjbGlwLCB3ZSBtdXN0IGp1bXAgYSBmZXcgQVUgYmFja3dhcmQgdG8gZGVjb2RlL2VuY29kZQotICAgICAgICAgICAgICAgICh3aXRob3V0IHdyaXRpbmcgcmVzdWx0KSBmcm9tIHRoYXQgcG9pbnQuICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEID09IHBDLT5wQzEtPkFzdGF0dXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaVRhcmdldEN0cywgaUN1cnJlbnRDdHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHBDLT5wQzEtPgotICAgICAgICAgICAgICAgICAgICAgICAgaUF1ZGlvRnJhbWVDdHMgKSAvKio8ZG9uJ3QgdHJ5IHRvIHByZS1kZWNvZGUgaWYgY2xpcCBpcyBhdCBpdHMgYmVnaW5uaW5nLiovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBKdW1wIGEgZmV3IEFVcyBiYWNrd2FyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaUN1cnJlbnRDdHMgPSBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSBpQ3VycmVudEN0cyAtIE00VlNTM0dQUF9OQl9BVV9QUkVGRVRDSAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpVGFyZ2V0Q3RzIDwgMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IDA7IC8qKjwgU2FuaXR5IGNoZWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBDMSwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT04tcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEpOyAvKio8IHJlYWQgQVUgd2hlcmUgd2UganVtcGVkICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJLIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIDwgaUN1cnJlbnRDdHMgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT04tcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJMICoqKiogcHJlLWVuY29kZSIpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk0gLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKGIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBBdWRpbyBpcyBub3cgT0sgZm9yIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBmaXJzdCBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShDMSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBEZWNvZGUgdGhlIHNlY29uZCBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShDMikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBib3RoIGNsaXBzIGRlY29kZWQgdGhlIHNhbWUgYW1vdW50IG9mIFBDTSBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRVJSIDogQXVkaW9UcmFuc2l0aW9uOiBib3RoIGNsaXBzIEFVIG11c3QgaGF2ZSB0aGUgc2FtZSBkZWNvZGVkXAotICAgICAgICAgICAgICAgICAgICAgICAgUENNIHNpemUhIHBjMSBzaXplPTB4JXgsIHBDMiBzaXplID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICogT01YIEF1ZGlvIGRlYyBzaGVsbCBkb2VzIGludGVybmFsIGJ1ZmZlcmluZyBhbmQgaGVuY2UgZG9lcyBub3QgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAgb3IgZGlmZmVyZW50IGZvciBjbGlwMSBhbmQgY2xpcDIuCi0gICAgICAgICAgICAgICAgICAgICogU28gbm8gbmVlZCB0byByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlICovCi0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86ICwgcGMxIEF1ZEJ1ZmYgc2l6ZT0weCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQzIgQXVkQnVmZiBzaXplID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERURfUENNX1NJWkVfSVNTVUU7Ci0KLSNlbmRpZiAvLyBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGF1ZGlvIGVmZmVjdCBvbiBjbGlwMSAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDEsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KEMxKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgYXVkaW8gZWZmZWN0IG9uIGNsaXAyICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5pQ2xpcDJBY3RpdmVFZmZlY3QgPj0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdChwQywgMiwgKE00T1NBX0ludDE2Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKXBDLT5wQzItPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QoQzIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSB0cmFuc2l0aW9uIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24ocEMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBDLT5wQzItPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk4gKioqKiBibGVuZCBBVXMiKTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLQotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWwotICAgICAgICAgICAgICAgICAgICAwXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk8gLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCx0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJQIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKEMxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiBzZWNvbmRhcnlFcnJvcjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gPSAoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBDMS0+aUFvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgaW4gdGhlIHNlY29uZCBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlFcnJvciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiUSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzItPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPmlBb2Zmc2V0IC8gcEMtPnBDMi0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1Ioc2Vjb25kYXJ5RXJyb3IpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoQzIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlFcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRXQVJfTk9fTU9SRV9BVSA9PSBzZWNvbmRhcnlFcnJvcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00T1NBX0ZBTFNFID09IHBDLT5iU3VwcG9ydFNpbGVuY2UpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIG91dHB1dCBpcyBvdGhlciB0aGFuIEFNUiBvciBBQUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIEVWUkMsd2UgY2FuJ3Qgd3JpdGUgc2lsZW5jZSBpbnRvIGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2Ugc2ltcGx5IGVuZCBoZXJlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgIHwqLwotICAgICAgICAgICAgLyp8IEVSUk9SIENBU0UgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX198Ki8KLQotICAgICAgICBkZWZhdWx0OgotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IGludmFsaWQgaW50ZXJuYWwgc3RhdGUgKDB4JXgpLCBcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5Bc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgZm9yY2VkIHRvIHN0b3AgYXVkaW8gKi8KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBiU3RvcEF1ZGlvICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEF1ZGlvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoKQotICogQGJyaWVmICAgIENoZWNrIHdoaWNoIGF1ZGlvIHByb2Nlc3MgbW9kZSB3ZSBtdXN0IHVzZSwgZGVwZW5kaW5nIG9uIHRoZSBvdXRwdXQgQ1RTLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGNvbnN0IE00T1NBX0ludDMyIFREID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgIHVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uOyAvKio8IFRyYW5zaXRpb24gZHVyYXRpb24gKi8KLQotICAgIGNvbnN0IE00VlNTM0dQUF9FZGl0QXVkaW9TdGF0ZSBwcmV2aW91c0FzdGF0ZSA9IHBDLT5Bc3RhdGU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIENsaXAxIGlzIG9uIGl0cyBiZWdpbiBjdXQsIG9yIGluIGl0cyBiZWdpbiBlZmZlY3Qgb3IgZW5kIGVmZmVjdCB6b25lICovCi0gICAgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKHBDLCAxKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uIHdpdGggbmV4dCBjbGlwICovCi0gICAgaWYoICggVEQgPiAwKSAmJiAoKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gLSBwQy0+cEMxLT5pQW9mZnNldAotICAgICAgICAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KSA+PSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCkpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTjsKLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBEbyB3ZSBlbnRlciB0aGUgdHJhbnNpdGlvbiBzZWN0aW9uID8gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiAhPSBwcmV2aW91c0FzdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcGVuIHNlY29uZCBjbGlwIGZvciB0cmFuc2l0aW9uLCBpZiBub3QgeWV0IG9wZW5lZCAqLwotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludE9wZW5DbGlwKHBDLCAmcEMtPnBDMiwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAgKyAxXSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlOiBNNFZTUzNHUFBfaW50T3BlbkNsaXAoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJbiBjYXNlIG9mIHNob3J0IHRyYW5zaXRpb24gYW5kIGJhZCBsdWNrICguLi4pLCB0aGVyZSBtYXkgYmUgbm8gdmlkZW8gQVUKLSAgICAgICAgICAgICAgICAqIGluIHRoZSB0cmFuc2l0aW9uLiBJbiB0aGF0IGNhc2UsIHRoZSBzZWNvbmQgY2xpcCBoYXMgbm90IGJlZW4gb3BlbmVkLgotICAgICAgICAgICAgICAgICogU28gd2UgbXVzdCB1cGRhdGUgdGhlIHZpZGVvIG9mZnNldCBoZXJlLiAqLwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgLyoqPCBBZGQgY3VycmVudCB2aWRlbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldCAqLwotICAgICAgICAgICAgICAgIHBDLT5wQzItPmlWb2Zmc2V0ICs9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZGQgY3VycmVudCBhdWRpbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldAotICAgICAgICAgICAgKiAodmlkZW8gb2Zmc2V0IGhhcyBhbHJlYWR5IGJlZW4gc2V0IHdoZW4gZG9pbmcgdGhlIHZpZGVvIHRyYW5zaXRpb24pICovCi0gICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCArPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAgICAgKiBUaGVyZSBtYXkgYmUgYSBwb3J0aW9uIG9mIHRoZSBkdXJhdGlvbiBvZiBhbiBhdWRpbyBBVSBvZiBkZXN5bmNocm8gYXQgZWFjaCBhc3NlbWJseS4KLSAgICAgICAgICAgICogSXQgbGVhZHMgdG8gYW4gYXVkaWJsZSBkZXN5bmNocm8gd2hlbiB0aGVyZSBhcmUgYSBsb3Qgb2YgY2xpcHMgYXNzZW1ibGVkLgotICAgICAgICAgICAgKiBUaGlzIGJ1ZyBmaXggYWxsb3dzIHRvIHJlc3luY2ggdGhlIGF1ZGlvIHRyYWNrIHdoZW4gdGhlIGRlbHRhIGlzIGhpZ2hlcgotICAgICAgICAgICAgKiB0aGFuIG9uZSBhdWRpbyBBVSBkdXJhdGlvbi4KLSAgICAgICAgICAgICogV2UgU3RlcCBvbmUgQVUgaW4gdGhlIHNlY29uZCBjbGlwIGFuZCB3ZSBjaGFuZ2UgdGhlIGF1ZGlvIG9mZnNldCBhY2NvcmRpbmdseS4gKi8KLSAgICAgICAgICAgIGlmKCAoIHBDLT5wQzItPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgLSAoTTRPU0FfSW50MzIpKHBDLT5wQzItPmlWb2Zmc2V0ICpwQy0+cEMyLT5zY2FsZV9hdWRpbyArIDAuNSkpCi0gICAgICAgICAgICAgICAgICAgID4gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQWR2YW5jZSBvbmUgQU1SIGZyYW1lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMik7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiWiAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUFvZmZzZXQgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVcGRhdGUgYXVkaW8gb2Zmc2V0IGFjY29yZGluZ2x5Ki8KLSAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCAtPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJlZ2luIGFuZCBlbmQgZWZmZWN0cyBmb3IgY2xpcDIgKi8KLSAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKHBDLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIG5vdCBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgaWYgY3VycmVudCBtb2RlIGlzIFJlYWQvV3JpdGUgb3IgRGVjb2RlL0VuY29kZSAqLwotICAgICAgICBpZiggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGNyZWF0ZS9kZXN0cm95IGFuIGVuY29kZXIgKi8KLSAgICBpZiggKCBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgPT0gcHJldmlvdXNBc3RhdGUpCi0gICAgICAgICYmIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgIChNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgIT0gcEMtPkFzdGF0ZSkgKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlBdWRpb0JpdHJhdGU7Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBtYXggYml0cmF0ZSBkZXBlbmRpbmcgb24gaW5wdXQgZmlsZXMgYml0cmF0ZXMgYW5kIHRyYW5zaXRpb25zICovCi0gICAgICAgIGlmKCBwQy0+QXN0YXRlID09IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIE1heCBvZiB0aGUgdHdvIGJsZW5kZWQgZmlsZXMgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPiBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlICkKLSAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBDMi0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNhbWUgYXMgaW5wdXQgZmlsZSAqLwotICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUgPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ3JlYXRlIHRoZSBlbmNvZGVyICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoJnBDLT5ld2MsICZwQy0+U2hlbGxBUEksCi0gICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZTogTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCBhdWRpbyBlZmZlY3QgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50IHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRPU0FfVUludDggdWlDbGlwTnVtYmVyICkKLXsKLSAgICBNNE9TQV9VSW50OCB1aUNsaXBJbmRleDsKLSAgICBNNE9TQV9VSW50OCB1aUZ4SW5kZXg7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNE9TQV9JbnQzMiBCQywgRUM7Ci0gICAgTTRPU0FfSW50OCAqcGlDbGlwQWN0aXZlRWZmZWN0OwotICAgIE00T1NBX0ludDMyIHQ7Ci0KLSAgICBpZiggMSA9PSB1aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcDsKLSAgICAgICAgcENsaXAgPSBwQy0+cEMxOwotICAgICAgICBwaUNsaXBBY3RpdmVFZmZlY3QgPSAmKHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QpOwotICAgIH0KLSAgICBlbHNlIC8qKjwgKDIgPT0gdWlDbGlwTnVtYmVyKSAqLwotICAgIHsKLSAgICAgICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcCArIDE7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcGlDbGlwQWN0aXZlRWZmZWN0ID0gJihwQy0+aUNsaXAyQWN0aXZlRWZmZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNob3J0Y3V0cyBmb3IgY29kZSByZWFkYWJpbGl0eSAqLwotICAgIEJDID0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotICAgIEVDID0gcENsaXAtPmlFbmRUaW1lOwotCi0gICAgLyoqCi0gICAgQ2hhbmdlIHRoZSBhYnNvbHV0IHRpbWUgdG8gY2xpcCByZWxhdGVkIHRpbWUKLSAgICAgUkMgdCA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvIC0gcENsaXAtPmlBb2Zmc2V0L3BDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgPCByb3VuZGluZyAqLzsKLSAgICB0ID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8vKi0gcENsaXAtPmlBb2Zmc2V0L3BDbGlwLT5zY2FsZV9hdWRpbyovCi0gICAgICAgICsgMC41KTsgLyoqPCByb3VuZGluZyAqLwotICAgIDsKLQotICAgIC8qKgotICAgICogRGVmYXVsdDogbm8gZWZmZWN0IGFjdGl2ZSAqLwotICAgICpwaUNsaXBBY3RpdmVFZmZlY3QgPSAtMTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgdGhlIHRocmVlIGVmZmVjdHMgKi8KLSAgICAvLyBSQyAgICBmb3IgKHVpRnhJbmRleD0wOyB1aUZ4SW5kZXg8cEMtPnBDbGlwTGlzdFt1aUNsaXBJbmRleF0ubmJFZmZlY3RzOyB1aUZ4SW5kZXgrKykKLSAgICBmb3IgKCB1aUZ4SW5kZXggPSAwOyB1aUZ4SW5kZXggPCBwQy0+bmJFZmZlY3RzOyB1aUZ4SW5kZXgrKyApCi0gICAgewotICAgICAgICAvKiogU2hvcnRjdXQsIHJldmVyc2Ugb3JkZXIgYmVjYXVzZSBvZiBwcmlvcml0eSBiZXR3ZWVuIGVmZmVjdHMKLSAgICAgICAgKCBFbmRFZmZlY3QgYWx3YXlzIGNsZWFuICkgKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+cEVmZmVjdHNMaXN0W3BDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4XSk7Ci0KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmUgIT0gcEZ4LT5BdWRpb0VmZmVjdFR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYWN0dWFsbHkgYSB2aWRlbyBlZmZlY3QgKi8KLSAgICAgICAgICAgIGlmKCAoIHQgPj0gKE00T1NBX0ludDMyKSgvKkJDICsqL3BGeC0+dWlTdGFydFRpbWUpKQotICAgICAgICAgICAgICAgICYmIC8qKjwgQXJlIHdlIGFmdGVyIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBlZmZlY3Q/ICovCi0gICAgICAgICAgICAgICAgKHQgPCAoTTRPU0FfSW50MzIpKC8qQkMgKyovcEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+Ci0gICAgICAgICAgICAgICAgdWlEdXJhdGlvbikpICkgLyoqPCBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBhY3RpdmUgZWZmZWN0ICovCi0gICAgICAgICAgICAgICAgKnBpQ2xpcEFjdGl2ZUVmZmVjdCA9IHBDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBUaGUgZmlyc3QgZWZmZWN0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiB0aGUgc2Vjb25kIG9uZSwKLSAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHRoaXJzIG9uZS4KLSAgICAgICAgICAgICAgICAqIEhlbmNlLCBhcyBzb29uIGFzIHdlIGZvdW5kIGFuIGFjdGl2ZSBlZmZlY3QsIHdlIGNhbiBnZXQgb3V0IG9mIHRoaXMgbG9vcCAqLwotICAgICAgICAgICAgICAgIHVpRnhJbmRleCA9IHBDLT5uYkVmZmVjdHM7IC8qKiBnZXQgb3V0IG9mIHRoZSBmb3IgbG9vcCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEJ1Z2ZpeDogVGhlIGR1cmF0aW9uIG9mIHRoZSBlbmQgZWZmZWN0IGhhcyBiZWVuIHNldCBhY2NvcmRpbmcgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VkIGNsaXAgZHVyYXRpb24uCi0gICAgICAgICAgICAqIElmIHRoZSBhbm5vdW5jZWQgZHVyYXRpb24gaXMgc21hbGxlciB0aGFuIHRoZSByZWFsIG9uZSwgdGhlIGVuZCBlZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgICB3b24ndCBiZSBhcHBsaWVkIGF0Ci0gICAgICAgICAgICAqIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgY2xpcC4gVG8gc29sdmUgdGhpcyBpc3N1ZSB3ZSBmb3JjZSB0aGUgZW5kIGVmZmVjdC4gKi8KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCgpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgdWlDbGlwMW9yQ2xpcDIgICAgKElOL09VVCkgMSBmb3IgZmlyc3QgY2xpcCwgMiBmb3Igc2Vjb25kIGNsaXAKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcDFvckNsaXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUgKQotewotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nczsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNE9TQV9JbnQzMgotICAgICAgICBpMzJzYW1wbGU7IC8qKjwgd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGlQb3M7Ci0gICAgTTRPU0FfSW50MzIgaUR1cjsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoIDEgIT0gdWlDbGlwMW9yQ2xpcDIpICYmICgyICE9IHVpQ2xpcDFvckNsaXAyKSwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludEJlZ2luQXVkaW9FZmZlY3Q6IHVpQ2xpcDFvckNsaXAyIGludmFsaWQiKTsKLQotICAgIGlmKCAxID09IHVpQ2xpcDFvckNsaXAyICkKLSAgICB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICAgICAgcENsaXBTZXR0aW5ncyA9ICYocEMtPnBDbGlwTGlzdFtwQy0+Ci0gICAgICAgICAgICB1aUN1cnJlbnRDbGlwXSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgLy8gUkMgICAgICAgIHBGeCA9ICYocENsaXBTZXR0aW5ncy0+RWZmZWN0c1twQy0+aUNsaXAxQWN0aXZlRWZmZWN0XSk7LyoqPCBHZXQgYSBzaG9ydGN1dAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBwRnggPSAmKHBDLT4KLSAgICAgICAgICAgIHBFZmZlY3RzTGlzdFtwQy0+Ci0gICAgICAgICAgICBpQ2xpcDFBY3RpdmVFZmZlY3RdKTsgLyoqPCBHZXQgYSBzaG9ydGN1dCB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjIoKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0IDwgMCkKLSAgICAgICAgICAgIHx8IChwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID4gMiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogaUNsaXAxQWN0aXZlRWZmZWN0IGludmFsaWQiKTsKLSAgICB9Ci0gICAgZWxzZSAvKio8IGlmICgyPT11aUNsaXAxb3JDbGlwMikgKi8KLSAgICB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcENsaXBTZXR0aW5ncyA9ICYocEMtPnBDbGlwTGlzdFtwQy0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgKyAxXSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgLy8gUkMgICAgICAgIHBGeCA9ICYocENsaXBTZXR0aW5ncy0+RWZmZWN0c1twQy0+aUNsaXAyQWN0aXZlRWZmZWN0XSk7LyoqPCBHZXQgYSBzaG9ydGN1dAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBwRnggPSAmKHBDLT4KLSAgICAgICAgICAgIHBFZmZlY3RzTGlzdFtwQy0+Ci0gICAgICAgICAgICBpQ2xpcDJBY3RpdmVFZmZlY3RdKTsgLyoqPCBHZXQgYSBzaG9ydGN1dCB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjIoKCBwQy0+aUNsaXAyQWN0aXZlRWZmZWN0IDwgMCkKLSAgICAgICAgICAgIHx8IChwQy0+aUNsaXAyQWN0aXZlRWZmZWN0ID4gMiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogaUNsaXAyQWN0aXZlRWZmZWN0IGludmFsaWQiKTsKLSAgICB9Ci0KLSAgICBpRHVyID0gKE00T1NBX0ludDMyKXBGeC0+dWlEdXJhdGlvbjsKLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICBpUG9zID0KLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKyAwLjUgLSBwQ2xpcC0+aUFvZmZzZXQgLyBwQ2xpcC0+c2NhbGVfYXVkaW8pCi0gICAgICAgIC0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0IC0gcEZ4LT51aVN0YXJ0VGltZTsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoIGlQb3MgPiBpRHVyICkKLSAgICB7Ci0gICAgICAgIGlQb3MgPSBpRHVyOwotICAgIH0KLSAgICBlbHNlIGlmKCBpUG9zIDwgMCApCi0gICAgewotICAgICAgICBpUG9zID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEF0IHRoaXMgcG9pbnQsIGlQb3MgaXMgdGhlIGVmZmVjdCBwcm9ncmVzcywgaW4gYSAwIHRvIGlEdXIgYmFzZSAqLwotICAgIHN3aXRjaCggcEZ4LT5BdWRpb0VmZmVjdFR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW46Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcmlnaW5hbCBzYW1wbGVzIGFyZSBzaWduZWQgMTZiaXRzLgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGl0IHRvIHNpZ25lZCAzMmJpdHMgYW5kIG11bHRpcGx5IGl0IGJ5IGlQb3MuCi0gICAgICAgICAgICAqIFNvIHdlIG11c3QgYXNzdXJlIHRoYXQgaVBvcyBpcyBub3QgaGlnaGVyIHRoYXQgMTZiaXRzIG1heC4KLSAgICAgICAgICAgICogaVBvcyBtYXggdmFsdWUgaXMgaUR1ciwgc28gd2UgdGVzdCBpRHVyLiAqLwotICAgICAgICAgICAgd2hpbGUoIGlEdXIgPiBQV1JfRlhQX0ZSQUNUX01BWCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaUR1ciA+Pj0KLSAgICAgICAgICAgICAgICAgICAgMjsgLyoqPCBkaXZpZGUgYnkgMiB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgKGluc3RlYWQgb2YgNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3ZSBoYXZlIGVub3VnaCBkeW5hbWljLi4pICovCi0gICAgICAgICAgICAgICAgaVBvcyA+Pj0gMjsgLyoqPCBpZGVtICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcm9tIGJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpOiBkaXZpZGUgYnkgdHdvICovCi0gICAgICAgICAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyB0byBvcHRpbWl6ZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgKj0gaVBvczsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgLz0gaUR1cjsKLSAgICAgICAgICAgICAgICAqcFBDTWRhdGErKyA9IChNNE9TQV9JbnQxNilpMzJzYW1wbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dDoKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHN3aXRjaCBmcm9tIDAtPkR1ciB0byBEdXItPjAgaW4gb3JkZXIgdG8gZG8gZmFkZU9VVCBpbnN0ZWFkIG9mIGZhZGVJTiAqLwotICAgICAgICAgICAgaVBvcyA9IGlEdXIgLSBpUG9zOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3JpZ2luYWwgc2FtcGxlcyBhcmUgc2lnbmVkIDE2Yml0cy4KLSAgICAgICAgICAgICogV2UgY29udmVydCBpdCB0byBzaWduZWQgMzJiaXRzIGFuZCBtdWx0aXBseSBpdCBieSBpUG9zLgotICAgICAgICAgICAgKiBTbyB3ZSBtdXN0IGFzc3VyZSB0aGF0IGlQb3MgaXMgbm90IGhpZ2hlciB0aGF0IDE2Yml0cyBtYXguCi0gICAgICAgICAgICAqIGlQb3MgbWF4IHZhbHVlIGlzIGlEdXIsIHNvIHdlIHRlc3QgaUR1ci4gKi8KLSAgICAgICAgICAgIHdoaWxlKCBpRHVyID4gUFdSX0ZYUF9GUkFDVF9NQVggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlEdXIgPj49Ci0gICAgICAgICAgICAgICAgICAgIDI7IC8qKjwgZGl2aWRlIGJ5IDIgd291bGQgYmUgbW9yZSBsb2dpY2FsIChpbnN0ZWFkIG9mIDQpLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgd2UgaGF2ZSBlbm91Z2ggZHluYW1pYy4uKSAqLwotICAgICAgICAgICAgICAgIGlQb3MgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJvbSBidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KTogZGl2aWRlIGJ5IHR3byAqLwotICAgICAgICAgICAgdWlQQ01zaXplID4+PSAxOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTG9vcCBvbiBzYW1wbGVzLCBhcHBseSB0aGUgZmFkZSBmYWN0b3Igb24gZWFjaCAqLwotICAgICAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApIC8qKjwgZGVjcmVtZW50aW5nIGNvdW50ZXIgdG8gb3B0aW1pemUgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgPSAqcFBDTWRhdGE7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlICo9IGlQb3M7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlIC89IGlEdXI7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhKysgPSAoTTRPU0FfSW50MTYpaTMyc2FtcGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0OiB1bmtub3duIGF1ZGlvIGVmZmVjdCB0eXBlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRSIsCi0gICAgICAgICAgICAgICAgcEZ4LT5BdWRpb0VmZmVjdFR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgdHJhbnNpdGlvbiBlZmZlY3QgdG8gdHdvIFBDTSBidWZmZXIKLSAqIEBub3RlICAgIFRoZSByZXN1bHQgb2YgdGhlIHRyYW5zaXRpb24gaXMgcHV0IGluIHRoZSBmaXJzdCBidWZmZXIuCi0gKiAgICAgICAgICBJIGtub3cgaXQncyBub3QgYmVhdXRpZnVsLCBidXQgaXQgZml0cyBteSBjdXJyZW50IG5lZWRzLCBhbmQgaXQncyBlZmZpY2llbnQhCi0gKiAgICAgICAgICBTbyB3aHkgYm90aGVyIHdpdGggYSB0aGlyZCBvdXRwdXQgYnVmZmVyPwotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YTEgICAgKElOL09VVCkgRmlyc3QgaW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHBQQ01kYXRhMiAgICAoSU4pIFNlY29uZCBpbnB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pIFNpemUgb2YgYm90aCBQQ00gYnVmZmVycwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX0ludDE2ICpwUENNZGF0YTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGUxLAotICAgICAgICBpMzJzYW1wbGUyOyAvKio8IHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpUG9zMSwgaVBvczI7Ci0gICAgTTRPU0FfSW50MzIgaUR1ciA9IChNNE9TQV9JbnQzMilwQy0+Ci0gICAgICAgIHBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBlbmQgY3V0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICBpUG9zMSA9IHBDLT5wQzEtPmlFbmRUaW1lIC0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8KLSAgICAgICAgKyAwLjUgLSBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvKTsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoIGlQb3MxID4gaUR1ciApCi0gICAgewotICAgICAgICBpUG9zMSA9IGlEdXI7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlQb3MxIDwgMCApCi0gICAgewotICAgICAgICBpUG9zMSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQb3NpdGlvbiBvZiBzZWNvbmQgY2xpcCBpbiB0aGUgdHJhbnNpdGlvbiAqLwotICAgIGlQb3MyID0gaUR1ciAtIGlQb3MxOwotCi0gICAgLyoqCi0gICAgKiBBdCB0aGlzIHBvaW50LCBpUG9zMiBpcyB0aGUgdHJhbnNpdGlvbiBwcm9ncmVzcywgaW4gYSAwIHRvIGlEdXIgYmFzZS4KLSAgICAqIGlQb3MxIGlzIHRoZSB0cmFuc2l0aW9uIHByb2dyZXNzLCBpbiBhIGlEVXIgdG8gMCBiYXNlLiAqLwotICAgIHN3aXRjaCggcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uQXVkaW9UcmFuc2l0aW9uVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGU6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcmlnaW5hbCBzYW1wbGVzIGFyZSBzaWduZWQgMTZiaXRzLgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGl0IHRvIHNpZ25lZCAzMmJpdHMgYW5kIG11bHRpcGx5IGl0IGJ5IGlQb3MuCi0gICAgICAgICAgICAqIFNvIHdlIG11c3QgYXNzdXJlIHRoYXQgaVBvcyBpcyBub3QgaGlnaGVyIHRoYXQgMTZiaXRzIG1heC4KLSAgICAgICAgICAgICogaVBvcyBtYXggdmFsdWUgaXMgaUR1ciwgc28gd2UgdGVzdCBpRHVyLiAqLwotICAgICAgICAgICAgd2hpbGUoIGlEdXIgPiBQV1JfRlhQX0ZSQUNUX01BWCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaUR1ciA+Pj0KLSAgICAgICAgICAgICAgICAgICAgMjsgLyoqPCBkaXZpZGUgYnkgMiB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgKGluc3RlYWQgb2YgNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3ZSBoYXZlIGVub3VnaCBkeW5hbWljLi4pICovCi0gICAgICAgICAgICAgICAgaVBvczEgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgICAgIGlQb3MyID4+PSAyOyAvKio8IGlkZW0gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICAgICAgICAgIHVpUENNc2l6ZSA+Pj0gMTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIExvb3Agb24gc2FtcGxlcywgYXBwbHkgdGhlIGZhZGUgZmFjdG9yIG9uIGVhY2ggKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyBjb3VudGVyIHRvIG9wdGltaXplICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMSA9ICpwUENNZGF0YTE7IC8qKjwgR2V0IGNsaXAxIHNhbXBsZSAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTEgKj0gaVBvczE7ICAgICAvKio8IG11bHRpcGx5IGJ5IGZhZGUgbnVtZXJhdG9yICovCi0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMSAvPSBpRHVyOyAgICAgIC8qKjwgZGl2aWRlIGJ5IGZhZGUgZGVub21pbmF0b3IgKi8KLQotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTIgPSAqcFBDTWRhdGEyOyAvKio8IEdldCBjbGlwMiBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUyICo9IGlQb3MyOyAgICAgLyoqPCBtdWx0aXBseSBieSBmYWRlIG51bWVyYXRvciAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTIgLz0gaUR1cjsgICAgICAvKio8IGRpdmlkZSBieSBmYWRlIGRlbm9taW5hdG9yICovCi0KLSAgICAgICAgICAgICAgICAqcFBDTWRhdGExKysgPSAoTTRPU0FfSW50MTYpKGkzMnNhbXBsZTEKLSAgICAgICAgICAgICAgICAgICAgKyBpMzJzYW1wbGUyKTsgLyoqPCBtaXggdGhlIHR3byBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgcFBDTWRhdGEyKys7IC8qKjwgZG9uJ3QgZm9yZ2V0IHRvIGluY3JlbWVudCB0aGUgc2Vjb25kIGJ1ZmZlciAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZToKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGlzIGlzIGEgc3R1cGlkLW5vbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgTm9uZSB0cmFuc2l0aW9uLi4uCi0gICAgICAgICAgICAqIFdlIGNvcHkgdGhlIFBDTSBmcmFtZXMgKi8KLSAgICAgICAgICAgIGlmKCBpUG9zMSA8IChpRHVyID4+IDEpICkgLyoqPCBzZWNvbmQgaGFsZiBvZiB0cmFuc2l0aW9uICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBQQ00gdG8gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUENNZGF0YTEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcFBDTWRhdGEyLCB1aVBDTXNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHRoZSBvdXRwdXQgbXVzdCBiZSBwdXQgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KLSAgICAgICAgICAgICogRm9yIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBub24tdHJhbnNpdGlvbiBpdCdzIGFscmVhZHkgdGhlIGNhc2UhCi0gICAgICAgICAgICAqIFNvIHdlIGhhdmUgbm90aGluZyB0byBkbyBoZXJlLi4uCi0gICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb246IHVua25vd24gdHJhbnNpdGlvbiB0eXBlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUiLAotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLkF1ZGlvVHJhbnNpdGlvblR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgUmVzZXQgdGhlIGF1ZGlvIGVuY29kZXIgKENyZWF0ZSBpdCBpZiBuZWVkZWQpCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlciggTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUF1ZGlvQml0cmF0ZSApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogSWYgYW4gZW5jb2RlciBhbHJlYWR5IGV4aXN0LCB3ZSBkZXN0cm95IGl0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENfZXdjLT5wQXVkaW9FbmNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAoCi0gICAgICAgICAgICBwQ19ld2MtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLCAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZXMgYSBuZXcgZW5jb2RlciAgKi8KLSAgICBzd2l0Y2goIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgIC8vICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tFVlJDOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IE00VlNTM0dQUF9BTVJfREVGQVVMVF9CSVRSQVRFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BbXJTSUQgPSBNNEVOQ09ERVJfa0Ftck5vU0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQ19ld2MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyOiBpbnZhbGlkIGlucHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3lcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQgSHopLCByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSAocENfZXdjLT51aU5iQ2hhbm5lbHMgPT0gMSkKLSAgICAgICAgICAgICAgICA/IE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0FhY1JlZ3VsTm9uZTsgLy9NNEVOQ09ERVJfa0FhY0JpdFJlc2Vydm9pcgotICAgICAgICAgICAgLyogdW51c2VkICovCi0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYlBOUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAvKiBUT0RPIGNoYW5nZSBpbnRvIGhpZ2hzcGVlZCBhc2FwICovCi0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiBRdWFudGlmeSB2YWx1ZSAoY2VpbCBvbmUpICovCi0gICAgICAgICAgICBpZiggdWlBdWRpb0JpdHJhdGUgPD0gMTYwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDE2MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSAyNDAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gMjQwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYoIHVpQXVkaW9CaXRyYXRlIDw9IDMyMDAwICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAzMjAwMDsKLQotICAgICAgICAgICAgZWxzZSBpZiggdWlBdWRpb0JpdHJhdGUgPD0gNDgwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDQ4MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSA2NDAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gNjQwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSA5NjAwMDsKLQotICAgICAgICAgICAgLyogU3BlY2lhbCByZXF1aXJlbWVudCBvZiBvdXIgZW5jb2RlciAqLwotICAgICAgICAgICAgaWYoICggcENfZXdjLT51aU5iQ2hhbm5lbHMgPT0gMikKLSAgICAgICAgICAgICAgICAmJiAocENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlIDwgMzIwMDApICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAzMjAwMDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IFVuZGVmaW5lZCBvdXRwdXQgYXVkaW8gZm9ybWF0ICglZCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBhdWRpbyBlbmNvZGVyICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjpcCi0gICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCBjYWxsZWQgd2l0aCB1c2VyZGF0YSAweCV4IiwKLSAgICAgICAgcENfU2hlbGxBUEktPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgcENfU2hlbGxBUEktPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotCi0jZWxzZQotCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCgmcENfZXdjLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICBNNE9TQV9OVUxMIC8qIG5vIEhXIGVuY29kZXIgKi8pOwotCi0jZW5kaWYKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQ19ld2MtPnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICZwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLCAmcENfZXdjLT5wQXVkaW9FbmNEU0ksCi0gICAgICAgIE00T1NBX05VTEwgLyogbm8gZ3JhYmJpbmcgKi8pOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0VmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjE5ZjQxMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0VmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM5NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FZGl0VmlkZW8uYwotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZWRpdCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jdW5kZWYgTTRPU0FfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgTTRPU0FfVFJBQ0VfTEVWRUwgMQotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLS8qKgotICogY29tcG9uZW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIiAvKio8IHZpZGVvIGVmZmVjdHMgKi8KLQotLypmb3IgdHJhbnNpdGlvbiBiZWhhdmlvdXIqLwotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgiCi0vKiogRGV0ZXJtaW5lIGFic29sdXRlIHZhbHVlIG9mIGEuICovCi0jZGVmaW5lIE00eFZTU19BQlMoYSkgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLSNkZWZpbmUgWV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHgwMAotI2RlZmluZSBVX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0jZGVmaW5lIFZfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50Q2hlY2tWaWRlb0VmZmVjdHMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aUNsaXBOdW1iZXIgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoCi0gICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwgTTRPU0FfQm9vbCBiU2tpcEZyYW1pbmdFZmZlY3QpOwotCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQgKTsKLQotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBVSApOwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldEgyNjNUaW1lQ291bnRlciggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlDdHMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlDdHNTZWMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdHNTZWMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVdpZHRoLCBNNE9TQV9VSW50MzIgdWlIZWlnaHQgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoCi0gICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVJbiwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUoCi0gICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5wbGFuZSwKLSAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHBsYW5lKTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0KTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSXNDbGlwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Um90YXRlVmlkZW8oTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcm90YXRpb25EZWdyZWUpOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiB2aWRlbyBwcm9jZXNzaW5nCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfSW50MzIgaUN0cywgaU5leHRDdHM7Ci0gICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGU7Ci0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1lOwotICAgIE00T1NBX1VJbnQxNiBvZmZzZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIGVuZCBjdXQuIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcKLSAgICAgKiB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgKi8KLSAgICBpZiAoICgoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBDLT5wQzEtPmlWb2Zmc2V0Ci0gICAgICAgICsgcEMtPmlJbk91dFRpbWVPZmZzZXQpID49IHBDLT5wQzEtPmlFbmRUaW1lICkKLSAgICB7Ci0gICAgICAgIC8qIFJlLWFkanVzdCB2aWRlbyB0byBwcmVjaXNlIGN1dCB0aW1lICovCi0gICAgICAgIHBDLT5pSW5PdXRUaW1lT2Zmc2V0ID0gKChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMpKQotICAgICAgICAgICAgLSBwQy0+cEMxLT5pVm9mZnNldCArIHBDLT5pSW5PdXRUaW1lT2Zmc2V0IC0gcEMtPnBDMS0+aUVuZFRpbWU7Ci0gICAgICAgIGlmICggcEMtPmlJbk91dFRpbWVPZmZzZXQgPCAwICkgewotICAgICAgICAgICAgcEMtPmlJbk91dFRpbWVPZmZzZXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVmlkZW8gaXMgZG9uZSBmb3IgdGhpcyBjbGlwICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbyhwQyk7Ci0KLSAgICAgICAgLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVyciAmJiBlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBEb24ndCBjaGFuZ2UgdGhlIHN0YXRlcyBpZiB3ZSBhcmUgaW4gZGVjb2RlVXBUbygpICovCi0gICAgaWYgKCAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMxLT5Wc3RhdHVzKQotICAgICAgICAmJiAoKCBwQy0+cEMyID09IE00T1NBX05VTEwpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICE9IHBDLT5wQzItPlZzdGF0dXMpKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBNb2RlLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgb3V0cHV0IENUUyAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgICAgICAgICBwQyk7IC8qKjwgVGhpcyBmdW5jdGlvbiBjaGFuZ2UgdGhlIHBDLT5Wc3RhdGUgdmFyaWFibGUhICovCi0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgc3dpdGNoKCBwQy0+VnN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qIF9fX19fX19fX19fX19fX19fICovCi0gICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgIC8qfCBSRUFEX1dSSVRFIE1PREUgfCovCi0gICAgICAgIC8qfF9fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU6Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvIFJFQURfV1JJVEUiKTsKLQotICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSBkZWNvZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIHRvIGJlIHN1cmUKLSAgICAgICAgICAgICAgICAqIHRvIGdldCB0byB0aGUgZ29vZCBwb3NpdGlvbi4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQgIT0gcEMtPnBDMS0+VnN0YXR1cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBKdW1wIHRvIHRhcmdldCB2aWRlbyB0aW1lICh0YyA9IHRvLVQpICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBpQ3RzID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwQy0+cEMxLT5pVm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogbV9wUmVhZGVyLT5tX3BGY3RKdW1wKFYxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogbV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiQSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+VmlkZW9BVS5tX0NUUywgcEMtPnBDMS0+aVZvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gaW4gQkVHSU4gQ1VUIHN0ZXAgLT4gc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnBDMS0+VmlkZW9BVS5tX0NUUyA9PSBpQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+cEMxLT5pVmlkZW9SZW5kZXJDdHMgPj0gaUN0cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gaW4gQkVHSU4gQ1VUIHN0ZXAgLT4gc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgICAgICsgcEMtPnBDMS0+aVZvZmZzZXQgPD0gcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUykgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZW1lbWJlciB0aGUgY2xpcCByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgLy8gUm91bmRpbmcgaXMgdG8gY29tcGVuc2F0ZSByZWFkZXIgaW1wcmVjaXNpb24gKG1fQ1RTIGlzIGFjdHVhbGx5IGFuIGludGVnZXIpCi0gICAgICAgICAgICAgICAgaUN0cyA9ICgoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpIC0gcEMtPnBDMS0+aVZvZmZzZXQgLSAxOwotICAgICAgICAgICAgICAgIGlOZXh0Q3RzID0gaUN0cyArICgoTTRPU0FfSW50MzIpcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKSArIDE7Ci0gICAgICAgICAgICAgICAgLyogQXZvaWQgdG8gd3JpdGUgYSBsYXN0IGZyYW1lIG9mIGR1cmF0aW9uIDAgKi8KLSAgICAgICAgICAgICAgICBpZiggaU5leHRDdHMgPiBwQy0+cEMxLT5pRW5kVGltZSApCi0gICAgICAgICAgICAgICAgICAgIGlOZXh0Q3RzID0gcEMtPnBDMS0+aUVuZFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHRoZSBBVSBpcyBnb29kIHRvIGJlIHdyaXR0ZW4sIHdyaXRlIGl0LCBlbHNlIGp1c3Qgc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IGJTa2lwRnJhbWUpCi0gICAgICAgICAgICAgICAgICAgICYmICgoIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPj0gaUN0cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPCBpTmV4dEN0cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5wQzEtPlZpZGVvQVUubV9zaXplID4gMCkpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoVmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQ29weSB0aGUgaW5wdXQgQVUgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuYXR0cmlidXRlID0gcEMtPnBDMS0+VmlkZW9BVS5tX2F0dHJpYnV0ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUyA9IChNNE9TQV9UaW1lKXBDLT5wQzEtPlZpZGVvQVUubV9DVFMgKwotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1RpbWUpcEMtPnBDMS0+aVZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgLyogZm9yIGguMjY0IHN0cmVhbSBkbyBub3QgcmVhZCB0aGUgMXN0IDQgYnl0ZXMgYXMgdGhleSBhcmUgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3JzICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YyApCi0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSA0OwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPnBDMS0+VmlkZW9BVS5tX3NpemUgLSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA+IHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogUkVBRF9XUklURTogQVUgc2l6ZSBncmVhdGVyIHRoYW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEF1U2l6ZSAoJWQ+JWQpISByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplLCBwQy0+ZXdjLnVpVmlkZW9NYXhBdVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPnBDMS0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSB0aW1lIGluZm8gZm9yIHRoZSBDb3VudGVyIFRpbWUgU3lzdGVtIHRvIGJlIGVxdWFsIHRvIHRoZSBiaXQKLSAgICAgICAgICAgICAgICAgICAgLXN0cmVhbSB0aW1lKi8KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKHBDLCAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkIgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbHUgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUywgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLCB0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCBuZXh0IEFVIGZvciBuZXh0IHN0ZXAgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBDMS0+cFZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5wQzEtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICVsZCBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTLCBwQy0+cEMxLT5pVm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjaWRlIHdldGhlciB0byByZWFkIG9yIHRvIGluY3JlbWVudCB0aW1lIGluY3JlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPj0gaU5leHRDdHMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypJbmNyZW1lbnQgdGltZSBieSB0aGUgZW5jb2RpbmcgcGVyaW9kIChOT19NT1JFX0FVIG9yIHJlYWRlciBpbiBhZHZhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3dpdGNoIChmcm9tIEFGVEVSX0NVVCkgdG8gbm9ybWFsIG1vZGUgYmVjYXVzZSB0aW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBubyBtb3JlIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIG90aGVyIGNhc2VzIChyZWFkZXIgbGF0ZSksIGp1c3QgbGV0IHRoZSByZWFkZXIgY2F0Y2ggdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRWVG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBDMS0+cFZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiRCAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMsIHBDLT5wQzEtPmlWb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBERUNPREVfRU5DT0RFIE1PREUgfCovCi0gICAgICAgICAgICAvKnwgICBCRUdJTl9DVVQgTU9ERSAgIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERToKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvIERFQ09ERV9FTkNPREUgLyBCRUdJTl9DVVQiKTsKLQotICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYlNldEltYWdlRGF0YSkpIHsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4KHBDLCBwQy0+cEMxKTsKLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAod2lsbCBqdW1wIHRvIHRoZSBwcmV2aW91cyBSQVAgaWYgbmVlZGVkICkgKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKHBDLT5wQzEsIChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cyk7Ci0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMgcmV0dXJucyBlcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIElmIHRoZSBkZWNvZGluZyBpcyBub3QgY29tcGxldGVkLCBkbyBvbmUgbW9yZSBzdGVwIHdpdGggdGltZSBmcm96ZW4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMxLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHZpZGVvIHByZS1wcm9jZXNzaW5nIGVycm9yIGJlZm9yZSBjYWxsaW5nIHRoZSBlbmNvZGVyICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRSArKysrIGVuY29kZSBBVSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIGZyYW1lKHJlbmRlcmluZyxmaWx0ZXJpbmcgYW5kIHdyaXRpbmcgd2lsbCBiZSBkb25lCi0gICAgICAgICAgICAgICAgIGluIGVuY29kZXIgY2FsbGJhY2tzKSovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgKQotICAgICAgICAgICAgICAgICAgICBGcmFtZU1vZGUgPSBNNEVOQ09ERVJfa0lGcmFtZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIEZyYW1lTW9kZSA9IE00RU5DT0RFUl9rTm9ybWFsRnJhbWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzLCBGcmFtZU1vZGUpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgaGFkIGEgVlBQIGVycm9yLi4uICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSwgcmV0dXJuaW5nIFZwcEVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBwQy0+ZXdjLlZwcEVycm9yICkKLSAgICAgICAgICAgICAgICAgICAgewotI2VuZGlmIC8vTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQy0+ZXdjLlZwcEVycm9yOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL000VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIC8qKjwgLi4ub3IgYW4gZW5jb2RlciBlcnJvciAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DKSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgZmlsZSBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUKLSAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRpbWUgYnkgdGhlIGVuY29kaW5nIHBlcmlvZCAoZm9yIGJlZ2luIGN1dCwgZG8gbm90IGluY3JlbWVudCB0byBub3QKLSAgICAgICAgICAgICAgICBsb29zZSBQLWZyYW1lcykgKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID09IHBDLT5Wc3RhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kSW5wdXRWaWRDdHMgKz0gcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBUUkFOU0lUSU9OIE1PREUgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyBUUkFOU0lUSU9OIik7Ci0KLSAgICAgICAgICAgICAgICAvKiBEb24ndCBkZWNvZGUgbW9yZSB0aGFuIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAhKCggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMxLT5Wc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMyLT5Wc3RhdHVzKSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBjbGlwMSB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OChwQywgcEMtPnBDMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0cyhwQy0+cEMxLAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludERlY29kZVZpZGVvVXBUb0N0cyhDMSkgcmV0dXJucyBlcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZGVjb2RpbmcgaXMgbm90IGNvbXBsZXRlZCwgZG8gb25lIG1vcmUgc3RlcCB3aXRoIHRpbWUgZnJvemVuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDLT5wQzEtPlZzdGF0dXMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIERvbid0IGRlY29kZSBtb3JlIHRoYW4gbmVlZGVkICovCi0gICAgICAgICAgICAgICAgaWYoICEoKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICE9IHBDLT5wQzItPlZzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDLT5wQzEtPlZzdGF0dXMpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBEZWNvZGUgdGhlIGNsaXAyIHZpZGVvIHVwIHRvIHRoZSB0YXJnZXQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwQy0+cEMyLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4KHBDLCBwQy0+cEMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggZXJyPSV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHMocEMtPnBDMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMoQzIpIHJldHVybnMgZXJyPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGRlY29kaW5nIGlzIG5vdCBjb21wbGV0ZWQsIGRvIG9uZSBtb3JlIHN0ZXAgd2l0aCB0aW1lIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMyLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSB2aWRlbyBwcmUtcHJvY2Vzc2luZyBlcnJvciBiZWZvcmUgY2FsbGluZyB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkYgKioqKiBibGVuZCBBVXMiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmcmFtZSAocmVuZGVyaW5nLCBmaWx0ZXJpbmcgYW5kIHdyaXRpbmcgd2lsbCBiZSBkb25lCi0gICAgICAgICAgICAgICAgaW4gZW5jb2RlciBjYWxsYmFja3MgKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cywgTTRFTkNPREVSX2tOb3JtYWxGcmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIGVuY29kZSByZXR1cm5zIGEgcHJvY2VzcyBmcmFtZSBlcnJvciwgaXQgaXMgbGlrZWx5IHRvIGJlIGEgVlBQIGVycm9yICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSwgcmV0dXJuaW5nIFZwcEVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBwQy0+ZXdjLlZwcEVycm9yICkKLSAgICAgICAgICAgICAgICAgICAgewotCi0jZW5kaWYgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBDLT5ld2MuVnBwRXJyb3I7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKSAvKio8IC4uLm9yIGFuIGVuY29kZXIgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAoKE00T1NBX1VJbnQzMilNNEVSUl9BTExPQykgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgIFRoZSBlZGl0aW5nIGlzIHRoZW4gZmluaXNoZWQsIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIGlzCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJbmNyZW1lbnQgdGltZSBieSB0aGUgZW5jb2RpbmcgcGVyaW9kICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArPSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBFUlJPUiBDQVNFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19ffCovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogaW52YWxpZCBpbnRlcm5hbCBzdGF0ZSAoMHgleCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSgpCi0gKiBAYnJpZWYgICAgQ2hlY2sgd2hpY2ggdmlkZW8gcHJvY2VzcyBtb2RlIHdlIG11c3QgdXNlLCBkZXBlbmRpbmcgb24gdGhlIG91dHB1dCBDVFMuCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgY29uc3QgTTRPU0FfSW50MzIgIHQgPSAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgLyoqPCBUcmFuc2l0aW9uIGR1cmF0aW9uICovCi0gICAgY29uc3QgTTRPU0FfSW50MzIgVEQgPSBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgIE00T1NBX0ludDMyIGlUbXA7Ci0KLSAgICBjb25zdCBNNFZTUzNHUFBfRWRpdFZpZGVvU3RhdGUgcHJldmlvdXNWc3RhdGUgPSBwQy0+VnN0YXRlOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBDbGlwMSBpcyBvbiBpdHMgYmVnaW4gY3V0LCBvciBpbiBhbiBlZmZlY3Qgem9uZSAqLwotICAgIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyhwQywgMSk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiB3aXRoIG5leHQgY2xpcCAqLwotICAgIGlmKCAoIFREID4gMCkgJiYgKCggdCAtIHBDLT5wQzEtPmlWb2Zmc2V0KSA+PSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCkpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTjsKLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBPcGVuIHNlY29uZCBjbGlwIGZvciB0cmFuc2l0aW9uLCBpZiBub3QgeWV0IG9wZW5lZCAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBDMS0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzIsCi0gICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAgKyAxXSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9lZGl0T3BlbkNsaXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEFkZCBjdXJyZW50IHZpZGVvIG91dHB1dCBDVFMgdG8gdGhlIGNsaXAgb2Zmc2V0Ci0gICAgICAgICAgICAqIChhdWRpbyBvdXRwdXQgQ1RTIGlzIG5vdCB5ZXQgYXQgdGhlIHRyYW5zaXRpb24sIHNvIGF1ZGlvCi0gICAgICAgICAgICAqICBvZmZzZXQgY2FuJ3QgYmUgdXBkYXRlZCB5ZXQpLiAqLwotICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIHBDLT5wQzItPmlWb2Zmc2V0ICs9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAyMDA1LTAzLTI0OiBCdWdGaXggZm9yIGF1ZGlvLXZpZGVvIHN5bmNocm86Ci0gICAgICAgICAgICAqIFVwZGF0ZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGR1ZSB0byB0aGUgYWN0dWFsIHZpZGVvIHRyYW5zaXRpb24gYmVnaW5uaW5nIHRpbWUuCi0gICAgICAgICAgICAqIEl0IHdpbGwgYXZvaWQgZGVzeW5jaHJvbml6YXRpb24gd2hlbiBkb2luZyB0aGUgYXVkaW8gdHJhbnNpdGlvbi4gKi8KLSAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIGlUbXAgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKVwKLSAgICAgICAgICAgICAtIChwQy0+cEMxLT5pRW5kVGltZSAtIFREICsgcEMtPnBDMS0+aVZvZmZzZXQpOwotICAgICAgICAgICAgaWYgKGlUbXAgPCAoTTRPU0FfSW50MzIpcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb24pCi0gICAgICAgICAgICAvKio8IFRlc3QgaW4gY2FzZSBvZiBhIHZlcnkgc2hvcnQgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbiAtPSBpVG1wOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBEb24ndCBmb3JnZXQgdG8gYWxzbyBjb3JyZWN0IHRoZSB0b3RhbCBkdXJhdGlvbiB1c2VkIGZvciB0aGUgcHJvZ3Jlc3MgYmFyCi0gICAgICAgICAgICAgICAgKiAoaXQgd2FzIGNvbXB1dGVkIHdpdGggdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gZHVyYXRpb24pLiAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9IGlUbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKio8IE5vICJlbHNlIiBoZXJlIGJlY2F1c2UgaXQncyBoYXJkIHByZWRpY3QgdGhlIGVmZmVjdCBvZiAwIGR1cmF0aW9uIHRyYW5zaXRpb24uLi4qLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgZWZmZWN0cyBmb3IgY2xpcDIgKi8KLSAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKHBDLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIG5vdCBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gZWZmZWN0IHdlIGdvIHRvIGRlY29kZS9lbmNvZGUgbW9kZSAqLwotICAgICAgICBpZigocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHx8IChwQy0+bmJBY3RpdmVFZmZlY3RzMSA+IDApIHx8Ci0gICAgICAgICAgICAocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgfHwKLSAgICAgICAgICAgIChwQy0+cEMxLT5wU2V0dGluZ3MtPmJUcmFuc2NvZGluZ1JlcXVpcmVkID09IE00T1NBX1RSVUUpKSB7Ci0gICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFOwotICAgICAgICB9Ci0gICAgICAgIC8qIFdlIGRvIGEgYmVnaW4gY3V0LCBleGNlcHQgaWYgYWxyZWFkeSBkb25lICh0aW1lIGlzIG5vdCBwcm9ncmVzc2luZyBiZWNhdXNlIHdlIHdhbnQKLSAgICAgICAgdG8gY2F0Y2ggYWxsIFAtZnJhbWVzIGFmdGVyIHRoZSBjdXQpICovCi0gICAgICAgIGVsc2UgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJDbGlwMUF0QmVnaW5DdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREU7Ci0gICAgICAgICAgICAgICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVCA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpICkgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIEVsc2Ugd2UgYXJlIGluIGRlZmF1bHQgY29weS9wYXN0ZSBtb2RlICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgICAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUID09IHByZXZpb3VzVnN0YXRlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudEJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICAvKiBEbyB3ZSBuZWVkIHRvIHJlZW5jb2RlIHRoZSB2aWRlbyB0byBkb3duZ3JhZGUgdGhlIGJpdHJhdGUgb3Igbm90ID8gKi8KLSAgICAgICAgICAgICAgICAvKiBMZXQncyBjb21wdXRlIHRoZSBjaXJyZW50IGJpdHJhdGUgb2YgdGhlIGN1cnJlbnQgZWRpdGVkIGNsaXAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLCAmY3VycmVudEJpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGdldHRpbmcgbmV4dCBiaXRyYXRlIG9mIGVkaXRlZCBjbGlwOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogUmVtb3ZlIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBjdXJyZW50Qml0cmF0ZSAtPSAxMjIwMDsKLQotICAgICAgICAgICAgICAgIC8qIFRlc3QgaWYgd2UgZ28gaW50byBjb3B5L3Bhc3RlIG1vZGUgb3IgaW50byBkZWNvZGUvZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBpZiggY3VycmVudEJpdHJhdGUgPiBwQy0+dWlNTVNWaWRlb0JpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCEoKHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID09IE00T1NBX1RSVUUpICYmCi0gICAgICAgICAgICAgICAgICAgIChwQy0+VnN0YXRlID09IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSkpICYmCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUZXN0IGlmIHdlIGdvIGludG8gY29weS9wYXN0ZSBtb2RlIG9yIGludG8gZGVjb2RlL2VuY29kZSBtb2RlCi0gICAgICAgICAgICAgICAgICogSWYgYW4gZXh0ZXJuYWwgZWZmZWN0IGhhcyBiZWVuIGFwcGxpZWQgb24gdGhlIGN1cnJlbnQgY2xpcAotICAgICAgICAgICAgICAgICAqIHRoZW4gY29udGludWUgdG8gYmUgaW4gZGVjb2RlL2VuY29kZSBtb2RlIHRpbGwgZW5kIG9mCi0gICAgICAgICAgICAgICAgICogY2xpcCB0byBhdm9pZCBILjI2NCBkaXN0b3J0aW9uLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGNyZWF0ZSBhbiBlbmNvZGVyICovCi0gICAgaWYoICggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVAotICAgICAgICA9PSBwcmV2aW91c1ZzdGF0ZSkpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICYmICgoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwQy0+VnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcEMtPlZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTgotICAgICAgICA9PSBwQy0+VnN0YXRlKSkgLyoqPCBlbmNvZGUgbW9kZSAqLwotICAgICAgICAmJiBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciwgaWYgbm90IGNyZWF0ZWQgYWxyZWFkeSovCi0gICAgICAgIGlmIChwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9PSBNNFZTUzNHUFBfa05vRW5jb2RlcikgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIgXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+YklzTU1TID09IE00T1NBX1RSVUUgJiYgcEMtPmV3Yy5wRW5jQ29udGV4dCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBXaGVuIHdlIGdvIGZyb20gZmlsdGVyaW5nIHRvIHJlYWQvd3JpdGUsIHdlIG11c3QgYWN0IGxpa2UgYSBiZWdpbiBjdXQsCi0gICAgKiBiZWNhdXNlIHRoZSBsYXN0IGZpbHRlcmVkIGltYWdlIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgb3JpZ2luYWwgaW1hZ2UuICovCi0gICAgZWxzZSBpZiggKCAoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTgotICAgICAgICA9PSBwcmV2aW91c1ZzdGF0ZSkpIC8qKjwgZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgJiYgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSA9PSBwQy0+VnN0YXRlKSAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAmJiAocEMtPmJFbmNvZGVUaWxsRW9GID09IE00T1NBX0ZBTFNFKSApCi0gICAgewotICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBkZXN0cm95IGFuIGVuY29kZXIgKi8KLSAgICBlbHNlIGlmKCAoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04KLSAgICAgICAgPT0gcHJldmlvdXNWc3RhdGUpKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgICAgICYmICgoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSA9PSBwQy0+VnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQKLSAgICAgICAgPT0gcEMtPlZzdGF0ZSkpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICYmIHBDLT5iSXNNTVMgPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVzdHJveSB0aGUgcHJldmlvdXNseSBjcmVhdGVkIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3RhcnRBVSgpCi0gKiBAYnJpZWYgICAgU3RhcnRBVSB3cml0ZXItbGlrZSBpbnRlcmZhY2UgdXNlZCBmb3IgdGhlIFZTUyAzR1BQIG9ubHkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6IChJTikgSXQgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdCBpcyByZWxhdGVkLgotICogQHBhcmFtICAgIHBBVTogICAgICAoSU4vT1VUKSBBY2Nlc3MgVW5pdCB0byBiZSBwcmVwYXJlZC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTdGFydEFVKCBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpTWF4QXVTaXplOwotCi0gICAgLyoqCi0gICAgKiBHaXZlbiBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCBwQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdGFydEFVOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFN0YXJ0QVU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVKCkKLSAqIEBicmllZiAgICBQcm9jZXNzQVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFByb2Nlc3NBVSggTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIEdpdmVuIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIFZTUzNHUFAgY29udGV4dCAqLwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgKiBGaXggdGhlIGVuY29kZWQgQVUgdGltZSAqLwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzID0gcEFVLT5DVFM7Ci0gICAgLyoqCi0gICAgKiBVcGRhdGUgdGltZSBpbmZvIGZvciB0aGUgQ291bnRlciBUaW1lIFN5c3RlbSB0byBiZSBlcXVhbCB0byB0aGUgYml0LXN0cmVhbSB0aW1lICovCi0gICAgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKHBDLCBwQVUpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCBwQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRQcm9jZXNzQVU6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRQcm9jZXNzQVU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRWUFAoKQotICogQGJyaWVmICAgIFdlIGltcGxlbWVudCBvdXIgb3duIFZpZGVvUHJlUHJvY2Vzc2luZyBmdW5jdGlvbgotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50VlBQKCBNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNF9NZWRpYVRpbWUgdHM7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBUbXAgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwTGFzdERlY29kZWRGcmFtZSA9IE00T1NBX05VTEwgOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwRGVjb2RlclJlbmRlckZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwVGVtcDFbM10scFRlbXAyWzNdOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBUZW1wUGxhbmVDbGlwMVszXSxwVGVtcFBsYW5lQ2xpcDJbM107Ci0gICAgTTRPU0FfVUludDMyICBpID0gMCwgeXV2RnJhbWVXaWR0aCA9IDAsIHl1dkZyYW1lSGVpZ2h0ID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAvKioKLSAgICAqIFZQUCBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wMSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcDIsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0gICAgbWVtc2V0KCh2b2lkICopcFRlbXBQbGFuZUNsaXAxLCAwLCAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSkpOwotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wUGxhbmVDbGlwMiwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgVlBQIGVycm9yIHJlbWVtYmVyZWQgaW4gY29udGV4dCAqLwotICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBBdCB0aGUgZW5kIG9mIHRoZSBlZGl0aW5nLCB3ZSBtYXkgYmUgY2FsbGVkIHdoZW4gbm8gbW9yZSBjbGlwIGlzIGxvYWRlZC4KLSAgICAqIChiZWNhdXNlIHRvIGNsb3NlIHRoZSBlbmNvZGVyIHByb3Blcmx5IGl0IG11c3QgYmUgc3RlcHBlZCBvbmUgb3IgdHdpY2UuLi4pICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBtdXN0IGZpbGwgdGhlIGlucHV0IG9mIHRoZSBlbmNvZGVyIHdpdGggYSBkdW1teSBpbWFnZSwgYmVjYXVzZQotICAgICAgICAqIGVuY29kaW5nIG5vaXNlIGxlYWRzIHRvIGEgaHVnZSB2aWRlbyBBVSwgYW5kIHRodXMgYSB3cml0ZXIgYnVmZmVyIG92ZXJmbG93LiAqLwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMF0ucGFjX2RhdGEsMCwKLSAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3N0cmlkZSAqIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfc3RyaWRlICogcFBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICBwUGxhbmVPdXRbMl0udV9zdHJpZGUgKiBwUGxhbmVPdXRbMl0udV9oZWlnaHQpOwotCi0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiAoYWJvcnQpIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICoqKioqKioqKioqKioqKiogVHJhbnNpdGlvbiBjYXNlICoqKioqKioqKioqKioqKiovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJUcmFuc2l0aW9uRWZmZWN0ICkKLSAgICB7Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMSkgcmV0dXJucyAweCV4LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7IC8qKjwgUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuLi4pICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCgyKSByZXR1cm5zIDB4JXgsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYxLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMykgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoNCkgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYzLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMykgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcDEgYmFzZTogdHMgPSB0byAtIE9mZnNldCAqLwotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICB0cyA9IHBDLT5ld2MuZElucHV0VmlkQ3RzIC0gcEMtPnBDMS0+aVZvZmZzZXQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyIENsaXAxICovCi0gICAgICAgIGlmKCBwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QocEMsIHBDLT5wQzEsIHRzLCBNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQbGFuZUNsaXAxLCBwVGVtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQpOwotICAgICAgICAgICAgaWYgKChNNE5PX0VSUk9SICE9IGVycikgJiYKLSAgICAgICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICE9IGVycikpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAvKiogUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICogZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKHBDLT5wQzEtPmlzUmVuZGVyRHVwID09IE00T1NBX1RSVUUpIHx8Ci0gICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FID09IGVycikpIHsKLSAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzBdLnVfaGVpZ2h0ICogcFRtcFswXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsxXS51X2hlaWdodCAqIHBUbXBbMV0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMl0udV9oZWlnaHQgKiBwVG1wWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgZXJyLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW4gdGhlIGNsaXAyIGJhc2U6IHRzID0gdG8gLSBPZmZzZXQgKi8KLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgdHMgPSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAtIHBDLT5wQzItPmlWb2Zmc2V0OwotICAgICAgICAvKioKLSAgICAgICAgKiBSZW5kZXIgQ2xpcDIgKi8KLSAgICAgICAgaWYoIHBDLT5wQzItPmlzUmVuZGVyRHVwID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KHBDLCBwQy0+cEMyLCB0cywgTTRPU0FfRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBsYW5lQ2xpcDIsIHBUZW1wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dCk7Ci0gICAgICAgICAgICBpZiAoKE00Tk9fRVJST1IgIT0gZXJyKSAmJgotICAgICAgICAgICAgICAgICAoTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgIT0gZXJyKSkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIC8qKiBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgKiBlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4qLwotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgocEMtPnBDMi0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgICAoTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgPT0gZXJyKSkgewotICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYyOwotICAgICAgICAgICAgaWYgKHBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMi0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMF0udV9oZWlnaHQgKiBwVG1wWzBdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzFdLnVfaGVpZ2h0ICogcFRtcFsxXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsyXS51X2hlaWdodCAqIHBUbXBbMl0udV93aWR0aCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygiQ2FuIG5vdCBmaW5kIGFuIGlucHV0IGZyYW1lLiBTZXQgZXJyb3IgMHgleCBpbiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmUgPSBwVG1wOwotICAgICAgICB9Ci0KLQotICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uKHBDLCBwVG1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiByZXR1cm5zIDB4JXgsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgIHJldHVybiAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuLi4pICovCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChpPTA7IGkgPCAzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBUZW1wUGxhbmVDbGlwMltpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcFBsYW5lQ2xpcDJbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMltpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHBUZW1wUGxhbmVDbGlwMVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcFBsYW5lQ2xpcDFbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwVGVtcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocFRlbXAxW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMVtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqKioqKioqKioqKioqKioqIE5vIFRyYW5zaXRpb24gY2FzZSAqKioqKioqKioqKioqKioqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiBOTyB0cmFuc2l0aW9uIGNhc2UiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcCBiYXNlOiB0cyA9IHRvIC0gT2Zmc2V0ICovCi0gICAgICAgIHRzID0gcEMtPmV3Yy5kSW5wdXRWaWRDdHMgLSBwQy0+cEMxLT5pVm9mZnNldDsKLSAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyICovCi0gICAgICAgIGlmIChwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWUFA6IHJlbmRlcmR1cCBmYWxzZSIpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICAgQ2hlY2sgaWYgcmVzaXppbmcgaXMgbmVlZGVkICovCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgIGlmICgocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9GQUxTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX0ZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RSZW5kZXIoKSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdW4tcm90YXRlZCBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB5dXZGcmFtZUhlaWdodCA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVZpZGVvKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuIGludGVybWVkaWF0ZQotICAgICAgICAgICAgICAgICAgICAqIGltYWdlIHBsYW5lICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdmlkZW8gZnJhbWUgbmVlZCB0byBiZSByZXNpemVkLCB0aGVuIGFwcGx5IHRoZSBvdmVybGF5IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmcmFtZSB3YXMgcmVuZGVyZWQgd2l0aCByZW5kZXJpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLCBwVGVtcDEsIGJTa2lwRnJhbWVFZmZlY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoKSBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lPSBwVGVtcDE7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFByZXBhcmUgb3ZlcmxheSB0ZW1wb3JhcnkgYnVmZmVyIGlmIG92ZXJsYXkgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCwgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBEbyByZW5kZXJpbmcgbW9kZS4gKi8KLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSwgcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBBcHBseSBvdmVybGF5IGlmIG92ZXJsYXkgaXMgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBUbXA7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXNldCBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0IGZvciByZXNpemUgZnJhbWUgcGxhbmUKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzICYmCi0gICAgICAgICAgICAgICAgICAgIDE4MCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFlVVjQyMFBsYW5lKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCwgeXV2RnJhbWVIZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogTk8gcmVzaXplIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAqIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcFRlbXAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSGVyZSB3ZSBkbyBub3Qgc2tpcCB0aGUgb3ZlcmxheSBlZmZlY3Qgc2luY2UKLSAgICAgICAgICAgICAgICAgICAgICogb3ZlcmxheSBhbmQgdmlkZW8gZnJhbWUgYXJlIGJvdGggb2Ygc2FtZSByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBQbGFuZU91dCxiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgICAgICBwQy0+cEMxLT5pVmlkZW9SZW5kZXJDdHMgPSAoTTRPU0FfSW50MzIpdHM7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZW5kZXJkdXAgdHJ1ZSIpOwotCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmUgIT0gTTRPU0FfTlVMTCkgewotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ICogXAotICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X2hlaWdodCAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9FUlJfTk9fVkFMSURfVklEX0ZSQU1FOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygiQ2FuIG5vdCBmaW5kIGFuIGlucHV0IGZyYW1lLiBTZXQgZXJyb3IgMHgleCBpbiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgX19GSUxFX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSWYgd2UgZG8gbW9kaWZ5IHRoZSBpbWFnZSwgd2UgbmVlZCBhbgotICAgICAgICAgICAgICAgICAgICAqIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdmlkZW8gZnJhbWUgbmVlZCB0byBiZSByZXNpemVkLCB0aGVuIGFwcGx5IHRoZSBvdmVybGF5IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmcmFtZSB3YXMgcmVuZGVyZWQgd2l0aCByZW5kZXJpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUscFRlbXAxLCBiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZT0gcFRlbXAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUgPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogUHJlcGFyZSBvdmVybGF5IHRlbXBvcmFyeSBidWZmZXIgaWYgb3ZlcmxheSBleGlzdCAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcDIsIHBDLT5ld2MudWlWaWRlb1dpZHRoLCBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCwgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRG8gcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogQXBwbHkgb3ZlcmxheSBpZiBvdmVybGF5IGlzIGV4aXN0ICovCi0gICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAyLCBwVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUpIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgcExhc3REZWNvZGVkRnJhbWUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVswXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzBdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVsxXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzFdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVsyXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEhlcmUgd2UgZG8gbm90IHNraXAgdGhlIG92ZXJsYXkgZWZmZWN0IHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAqIG92ZXJsYXkgYW5kIHZpZGVvIGFyZSBib3RoIG9mIHNhbWUgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1lRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExhc3REZWNvZGVkRnJhbWUsIHBUbXAsYlNraXBGcmFtZUVmZmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludFZQUDogUmVuZGVyZWQgYXQgQ1RTICUuM2YiLCB0cyk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXAxW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMVtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwVGVtcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSgpCi0gKiBAYnJpZWYgICAgQXBwbHkgdmlkZW8gb3ZlcmxheSBmcm9tIHBQbGFuZUluIHRvIHBQbGFuZU91dAotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcElucHV0UGxhbmVzICAgIChJTikgSW5wdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHBhcmFtICAgIHBPdXRwdXRQbGFuZXMgICAoSU4vT1VUKSBPdXRwdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNE9TQV9Eb3VibGUgVmlkZW9FZmZlY3RUaW1lOwotICAgIE00T1NBX0RvdWJsZSBQZXJjZW50YWdlRG9uZTsKLSAgICBNNE9TQV9VSW50OCBOdW1BY3RpdmVFZmZlY3RzID0wOwotICAgIE00T1NBX1VJbnQzMiBDdHMgPSAwOwotICAgIE00T1NBX0ludDMyIG5leHRFZmZlY3RUaW1lOwotICAgIE00T1NBX0ludDMyIHRtcDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBwQ2xpcCA9IHBDLT5wQzE7Ci0gICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgTnVtQWN0aXZlRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHMxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgIH0KLSAgICBmb3IgKGk9MDsgaTxOdW1BY3RpdmVFZmZlY3RzOyBpKyspIHsKLSAgICAgICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgKwotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uIC0gcEZ4LT51aVN0YXJ0VGltZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0W2ldXSk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBWaWRlb0VmZmVjdFRpbWUgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gdGhlIGZyYW1pbmcob3ZlcmxheSkgZWZmZWN0IG9ubHksCi0gICAgICAgICAqIHNraXAgb3RoZXIgY29sb3IgZWZmZWN0IHdoaWNoIGhhZCBiZWVuIGFwcGxpZWQgKi8KLSAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRvIGNhbGN1bGF0ZSAlLCBzdWJzdHJhY3QgdGltZUluY3JlbWVudCBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoCi0gICAgICAgICAqIG9uIHRoZSBsYXN0IGZyYW1lIHdoaWNoIGlzIHByZXNlbnRlZCBmcm9tIENUUyA9IGVvZi10aW1lSW5jcmVtZW50IHRpbGwgQ1RTID0gZW9mICovCi0gICAgICAgIFBlcmNlbnRhZ2VEb25lID0gVmlkZW9FZmZlY3RUaW1lIC8gKChNNE9TQV9GbG9hdClwRngtPnVpRHVyYXRpb24pOwotCi0gICAgICAgIGlmIChQZXJjZW50YWdlRG9uZSA8IDAuMCkgewotICAgICAgICAgICAgUGVyY2VudGFnZURvbmUgPSAwLjA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFBlcmNlbnRhZ2VEb25lID4gMS4wKSB7Ci0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDEuMDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDAwKSAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKFBlcmNlbnRhZ2VEb25lICogMTAwMCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICBleHRQcm9ncmVzcy51aVByb2dyZXNzID0gKE00T1NBX1VJbnQzMil0bXA7Ci0gICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgIGV4dFByb2dyZXNzLnVpQ2xpcFRpbWUgPSBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgLSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgbmV4dEVmZmVjdFRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzIFwKLSAgICAgICAgICAgICsgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKTsKLSAgICAgICAgaWYgKG5leHRFZmZlY3RUaW1lID49IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+dWlEdXJhdGlvbikpIHsKLSAgICAgICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBGeC0+RXh0VmlkZW9FZmZlY3RGY3QocEZ4LT5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgcFBsYW5lSW4sIHBQbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgcEZ4LT5WaWRlb0VmZmVjdFR5cGUgLSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5OiBcCi0gICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5OiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoKQotICogQGJyaWVmICAgIEFwcGx5IHZpZGVvIGVmZmVjdCBmcm9tIHBQbGFuZUluIHRvIHBQbGFuZU91dAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICB1aUNsaXAxb3JDbGlwMiAgICAoSU4vT1VUKSAxIGZvciBmaXJzdCBjbGlwLCAyIGZvciBzZWNvbmQgY2xpcAotICogQHBhcmFtICAgIHBJbnB1dFBsYW5lcyAgICAoSU4pIElucHV0IHJhdyBZVVY0MjAgaW1hZ2UKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgIChJTi9PVVQpIE91dHB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcGFyYW0gICAgYlNraXBGcmFtaW5nRWZmZWN0IChJTikgc2tpcCBmcmFtaW5nIGVmZmVjdCBmbGFnCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1pbmdFZmZlY3QpIHsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzIGV4dFByb2dyZXNzOwotCi0gICAgTTRPU0FfRG91YmxlIFZpZGVvRWZmZWN0VGltZTsKLSAgICBNNE9TQV9Eb3VibGUgUGVyY2VudGFnZURvbmU7Ci0gICAgTTRPU0FfSW50MzIgdG1wOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZVRlbXBJbjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lVGVtcE91dDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgcFRlbXBZdXZQbGFuZVszXTsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQ4IE51bUFjdGl2ZUVmZmVjdHMgPTA7Ci0KLQotICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICBpZiAocEMtPmJJc3NlY29uZENsaXAgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTnVtQWN0aXZlRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHM7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkICopcFRlbXBZdXZQbGFuZSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGVtcG9yYXJ5IHBsYW5lIGlmIG5lZWRlZCBSQyAqLwotICAgIGlmIChOdW1BY3RpdmVFZmZlY3RzID4gMSkgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXBZdXZQbGFuZSwgcFBsYW5lT3V0LT51X3dpZHRoLAotICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0LT51X2hlaWdodCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoNCkgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE51bUFjdGl2ZUVmZmVjdHMgICUgMiA9PSAwKQotICAgIHsKLSAgICAgICAgcFBsYW5lVGVtcEluID0gcFBsYW5lSW47Ci0gICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwVGVtcFl1dlBsYW5lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwUGxhbmVUZW1wSW4gPSBwUGxhbmVJbjsKLSAgICAgICAgcFBsYW5lVGVtcE91dCA9IHBQbGFuZU91dDsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxOdW1BY3RpdmVFZmZlY3RzOyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPmJJc3NlY29uZENsaXAgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgewotCi0KLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVRyYW5zaXRpb25EdXJhdGlvbi0gcEZ4LT51aVN0YXJ0VGltZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0W2ldXSk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBWaWRlb0VmZmVjdFRpbWUgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyogVG8gY2FsY3VsYXRlICUsIHN1YnN0cmFjdCB0aW1lSW5jcmVtZW50IGJlY2F1c2UgZWZmZWN0IHNob3VsZCBmaW5pc2ggb24gdGhlIGxhc3QgZnJhbWUqLwotICAgICAgICAvKiB3aGljaCBpcyBwcmVzZW50ZWQgZnJvbSBDVFMgPSBlb2YtdGltZUluY3JlbWVudCB0aWxsIENUUyA9IGVvZiAqLwotICAgICAgICBQZXJjZW50YWdlRG9uZSA9IFZpZGVvRWZmZWN0VGltZQotICAgICAgICAgICAgLyAoKE00T1NBX0Zsb2F0KXBGeC0+dWlEdXJhdGlvbi8qLSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24qLyk7Ci0KLSAgICAgICAgaWYoIFBlcmNlbnRhZ2VEb25lIDwgMC4wICkKLSAgICAgICAgICAgIFBlcmNlbnRhZ2VEb25lID0gMC4wOwotCi0gICAgICAgIGlmKCBQZXJjZW50YWdlRG9uZSA+IDEuMCApCi0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDEuMDsKLQotICAgICAgICBzd2l0Y2goIHBGeC0+VmlkZW9FZmZlY3RUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrOgotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29tcHV0ZSB3aGVyZSB3ZSBhcmUgaW4gdGhlIGVmZmVjdCAoc2NhbGUgaXMgMC0+MTAyNCkuICovCi0gICAgICAgICAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKShQZXJjZW50YWdlRG9uZSAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcEluLAotICAgICAgICAgICAgICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUgKilwUGxhbmVUZW1wT3V0LCB0bXAsIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJucyBlcnJvciAweCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjazoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpICovCi0gICAgICAgICAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKSgoIDEuMCAtIFBlcmNlbnRhZ2VEb25lKSAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcEluLAotICAgICAgICAgICAgICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUgKilwUGxhbmVUZW1wT3V0LCB0bXAsIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJucyBlcnJvciAweCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiggcEZ4LT5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICAgICAgPj0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG5leHRFZmZlY3RUaW1lOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMDApICovCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoUGVyY2VudGFnZURvbmUgKiAxMDAwKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIHByb2dyZXNzIGluZm8gcHJvdmlkZWQgdG8gdGhlIGV4dGVybmFsIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKXRtcDsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlPdXRwdXRUaW1lID0gKE00T1NBX1VJbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0czsKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSAtIHBDbGlwLT5pVm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MuYklzTGFzdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0VGltZSA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMgXAotICAgICAgICAgICAgICAgICAgICAgICAgKyBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZihuZXh0RWZmZWN0VGltZSA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy5iSXNMYXN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlIHNraXAgdGhlIGZyYW1pbmcgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgKiBkbyB0aGUgZnJhbWluZyBlZmZlY3QgYWZ0ZXIgYXBwbHkgcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWluZ0VmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFBsYW5lVGVtcE91dFswXS5wYWNfZGF0YSwgcFBsYW5lVGVtcEluWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJblswXS51X2hlaWdodCAqIHBQbGFuZVRlbXBJblswXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUGxhbmVUZW1wT3V0WzFdLnBhY19kYXRhLCBwUGxhbmVUZW1wSW5bMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lVGVtcEluWzFdLnVfaGVpZ2h0ICogcFBsYW5lVGVtcEluWzFdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBQbGFuZVRlbXBPdXRbMl0ucGFjX2RhdGEsIHBQbGFuZVRlbXBJblsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wSW5bMl0udV9oZWlnaHQgKiBwUGxhbmVUZW1wSW5bMl0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBGeC0+RXh0VmlkZW9FZmZlY3RGY3QocEZ4LT5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJbiwgcFBsYW5lVGVtcE91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGeC0+VmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogdW5rbm93biBlZmZlY3QgdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRngtPlZpZGVvRWZmZWN0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJDIFVwZGF0ZXMgcFRlbXBQbGFuZUluIGFuZCBwVGVtcFBsYW5lT3V0IGRlcGVuZGluZyBvbiBjdXJyZW50IGVmZmVjdCAqLwotICAgICAgICBpZiAoKChpICUgMiA9PSAwKSAmJiAoTnVtQWN0aXZlRWZmZWN0cyAgJSAyID09IDApKQotICAgICAgICAgICAgfHwgKChpICUgMiAhPSAwKSAmJiAoTnVtQWN0aXZlRWZmZWN0cyAlIDIgIT0gMCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGxhbmVUZW1wSW4gPSBwVGVtcFl1dlBsYW5lOwotICAgICAgICAgICAgcFBsYW5lVGVtcE91dCA9IHBQbGFuZU91dDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBJbiA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwVGVtcFl1dlBsYW5lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgaWYocFRlbXBZdXZQbGFuZVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBUZW1wWXV2UGxhbmVbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcFRlbXBZdXZQbGFuZVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgdmlkZW8gdHJhbnNpdGlvbiBlZmZlY3QgcEMxK3BDMi0+cFBsYW5lT3V0Ci0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgIChJTi9PVVQpIE91dHB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlQcm9ncmVzczsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgY29uc3QgTTRPU0FfSW50MzIgaUR1ciA9IChNNE9TQV9JbnQzMilwQy0+Ci0gICAgICAgIHBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBlbmQgY3V0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoKE00T1NBX0RvdWJsZSlwQy0+cEMxLT5pRW5kVGltZSkgLSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArCi0gICAgICAgICgoTTRPU0FfRG91YmxlKXBDLT5wQzEtPmlWb2Zmc2V0KTsKLSAgICAvKioKLSAgICAqIFdlIG11c3QgcmVtb3ZlIHRoZSBkdXJhdGlvbiBvZiBvbmUgZnJhbWUsIGVsc2Ugd2Ugd291bGQgYWxtb3N0IG5ldmVyIHJlYWNoIHRoZSBlbmQKLSAgICAqIChJdCdzIGtpbmQgb2YgYSAicGlsZSBhbmQgaW50ZXJ2YWxzIiBpc3N1ZSkuICovCi0gICAgaVByb2dyZXNzIC09IChNNE9TQV9JbnQzMilwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0KLSAgICBpZiggaVByb2dyZXNzIDwgMCApIC8qKjwgU2FuaXR5IGNoZWNrcyAqLwotICAgIHsKLSAgICAgICAgaVByb2dyZXNzID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uLCBvbiBhIGJhc2UgMTAwMCAqLwotICAgIGlQcm9ncmVzcyA9ICggKCBpRHVyIC0gaVByb2dyZXNzKSAqIDEwMDApIC8gaUR1cjsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrcyAqLwotICAgIGlmKCBpUHJvZ3Jlc3MgPCAwICkKLSAgICB7Ci0gICAgICAgIGlQcm9ncmVzcyA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlQcm9ncmVzcyA+IDEwMDAgKQotICAgIHsKLSAgICAgICAgaVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0KLSAgICBzd2l0Y2goIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlRyYW5zaXRpb25CZWhhdmlvdXIgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TcGVlZFVwOgotICAgICAgICAgICAgaVByb2dyZXNzID0gKCBpUHJvZ3Jlc3MgKiBpUHJvZ3Jlc3MpIC8gMTAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfTGluZWFyOgotICAgICAgICAgICAgLypkbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWREb3duOgotICAgICAgICAgICAgaVByb2dyZXNzID0gKE00T1NBX0ludDMyKShzcXJ0KGlQcm9ncmVzcyAqIDEwMDApKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU2xvd01pZGRsZToKLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoc3FydChpUHJvZ3Jlc3MgKiA1MDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKCggKCAoIGlQcm9ncmVzcyAtIDUwMCkgKiAoaVByb2dyZXNzIC0gNTAwKSkKLSAgICAgICAgICAgICAgICAgICAgLyA1MDApICsgNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfRmFzdE1pZGRsZToKLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoKCBpUHJvZ3Jlc3MgKiBpUHJvZ3Jlc3MpIC8gNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKHNxcnQoKCBpUHJvZ3Jlc3MgLSA1MDApICogNTAwKSArIDUwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLypkbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaCggcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uVmlkZW9UcmFuc2l0aW9uVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQXBwbHkgdGhlIHRyYW5zaXRpb24gZWZmZWN0ICovCi0gICAgICAgICAgICBlcnIgPSBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwKE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcEMtPnl1djEsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcEMtPnl1djIsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lT3V0LCBpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1RSQU5TSVRJT05fRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9UUkFOU0lUSU9OX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhpcyBpcyBhIHN0dXBpZC1ub24gb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIE5vbmUgdHJhbnNpdGlvbi4uLgotICAgICAgICAgICAgKiBXZSBjb3B5IHRoZSBZVVYgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKSAvKio8IGZpcnN0IGhhbGYgb2YgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQbGFuZSA9IHBDLT55dXYxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IHNlY29uZCBoYWxmIG9mIHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGxhbmUgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBZVVYgZnJhbWVzICovCi0gICAgICAgICAgICBpID0gMzsKLQotICAgICAgICAgICAgd2hpbGUoIGktLSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFtpXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilwUGxhbmVbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtpXS51X3N0cmlkZSAqIHBQbGFuZU91dFtpXS51X2hlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYoIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICA+PSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKWlQcm9ncmVzczsKLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSAtIHBDLT5wQzEtPmlWb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLkV4dFZpZGVvVHJhbnNpdGlvbkZjdCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+eXV2MSwgcEMtPnl1djIsIHBQbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT4KLSAgICAgICAgICAgICAgICAgICAgdWlDdXJyZW50Q2xpcF0uVmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgICAtIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCB2aWRlbyB0cmFuc2l0aW9uIGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uOiB1bmtub3duIHRyYW5zaXRpb24gdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fVFJBTlNJVElPTl9UWVBFOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb246IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50VXBkYXRlVGltZUluZm8oKQotICogQGJyaWVmICAgIFVwZGF0ZSBiaXQgc3RyZWFtIHRpbWUgaW5mbyBieSBDb3VudGVyIFRpbWUgU3lzdGVtIHRvIGJlIGNvbXBsaWFudCB3aXRoCi0gKiAgICAgICAgICBwbGF5ZXJzIHVzaW5nIGJpdCBzdHJlYW0gdGltZSBpbmZvCi0gKiBAbm90ZSAgICBIMjYzIHVzZXMgYW4gYWJzb2x1dGUgdGltZSBjb3VudGVyIHVubGlrZSBNUEVHNCB3aGljaCB1c2VzIEdyb3VwIE9mIFZvcHMKLSAqICAgICAgICAgIChHT1YsIHNlZSB0aGUgc3RhbmRhcmQpCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgICAgICAgICAgKElOL09VVCkgcmV0dXJucyB0aW1lIHVwZGF0ZWQgdmlkZW8gQVUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9mZnNldCBiZXR3ZWVuIHN5c3RlbSBhbmQgdmlkZW8gdGltZSAoTVBFRzQgb25seSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGNsaXAgKE1QRUc0IG9ubHkpCi0gKiBAcmV0dXJuICAgIG5vdGhpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBVSApCi17Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0gICAgTTRPU0FfVUludDMyIHVpQ3RzID0gMDsKLSAgICBNNE9TQV9NZW1BZGRyOCBwVG1wOwotICAgIE00T1NBX1VJbnQzMiB1aUFkZDsKLSAgICBNNE9TQV9VSW50MzIgdWlDdXJyR292OwotICAgIE00T1NBX0ludDggaURpZmY7Ci0KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCA9IHBDLT5wQzE7Ci0gICAgTTRPU0FfSW50MzIgKnBPZmZzZXQgPSAmKHBDLT5ld2MuaU1wZWc0R292T2Zmc2V0KTsKLQotICAgIC8qKgotICAgICogU2V0IEgyNjMgdGltZSBjb3VudGVyIGZyb20gc3lzdGVtIHRpbWUgKi8KLSAgICBpZiggTTRTWVNfa0gyNjMgPT0gcEFVLT5zdHJlYW0tPnN0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgdWlUbXAgPSAoTTRPU0FfVUludDgpKChNNE9TQV9VSW50MzIpKCAoIHBBVS0+Q1RTICogMzApIC8gMTAwMSArIDAuNSkKLSAgICAgICAgICAgICUgTTRWU1MzR1BQX0VESVRfSDI2M19NT0RVTE9fVElNRSk7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoKE00T1NBX01lbUFkZHI4KShwQVUtPmRhdGFBZGRyZXNzKSwKLSAgICAgICAgICAgIHVpVG1wKTsKLSAgICB9Ci0gICAgLyoKLSAgICAqIFNldCBNUEVHNCBHT1YgdGltZSBjb3VudGVyIHJlZ2FyZGluZyB2aWRlbyBhbmQgc3lzdGVtIHRpbWUgKi8KLSAgICBlbHNlIGlmKCBNNFNZU19rTVBFR180ID09IHBBVS0+c3RyZWFtLT5zdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICogSWYgR09WLgotICAgICAgICAqIGJld2FyZSBvZiBsaXR0bGUvYmlnIGVuZGlhbiEgKi8KLSAgICAgICAgLyogY29ycmVjdGlvbjogcmVhZCA4IGJpdHMgYmxvY2sgaW5zdGVhZCBvZiBvbmUgMzIgYml0cyBibG9jayAqLwotICAgICAgICBNNE9TQV9VSW50OCAqdGVtcDggPSAoTTRPU0FfVUludDggKikocEFVLT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wMzIgPSAwOwotCi0gICAgICAgIHRlbXAzMiA9ICggMHgwMDAwMDBmZiAmIChNNE9TQV9VSW50MzIpKCp0ZW1wOCkpCi0gICAgICAgICAgICArICgweDAwMDBmZjAwICYgKChNNE9TQV9VSW50MzIpKCoodGVtcDggKyAxKSkpIDw8IDgpCi0gICAgICAgICAgICArICgweDAwZmYwMDAwICYgKChNNE9TQV9VSW50MzIpKCoodGVtcDggKyAyKSkpIDw8IDE2KQotICAgICAgICAgICAgKyAoMHhmZjAwMDAwMCAmICgoTTRPU0FfVUludDMyKSgqKHRlbXA4ICsgMykpKSA8PCAyNCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIlJDOiBUZW1wMzI6IDB4JXgsIGRhdGFBZGRyZXNzOiAweCV4XG4iLCB0ZW1wMzIsCi0gICAgICAgICAgICAqKHBBVS0+ZGF0YUFkZHJlc3MpKTsKLQotICAgICAgICBpZiggTTRWU1MzR1BQX0VESVRfR09WX0hFQURFUiA9PSB0ZW1wMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG1wID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBBVS0+ZGF0YUFkZHJlc3MKLSAgICAgICAgICAgICAgICArIDEpOyAvKio8IEp1bXAgdG8gdGhlIHRpbWUgY29kZSAoanVzdCBhZnRlciB0aGUgMzIgYml0cyBoZWFkZXIpICovCi0gICAgICAgICAgICB1aUFkZCA9IChNNE9TQV9VSW50MzIpKHBBVS0+Q1RTKSsoICpwT2Zmc2V0KTsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX0ZBTFNFOiAvKjwgSU5JVCAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlbyB0aW1lID0gY2VpbCAoc3lzdGVtIHRpbWUgKyBvZmZzZXQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUN0cyA9ICggdWlBZGQgKyA5OTkpIC8gMTAwMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IHVwZGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKCAqcE9mZnNldCkgKz0gKCggdWlDdHMgKiAxMDAwKSAtIHVpQWRkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCA9IHVpQ3RzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGF0ZSB0byAnZmlyc3QnICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0FfVFJVRTogLyo8IFVQREFURSAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgY3VycmVudCBHb3YgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdihwVG1wLCAmdWlDdXJyR292KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW8gdGltZSA9IGZsb29yIG9yIGNlaWwgKHN5c3RlbSB0aW1lICsgb2Zmc2V0KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlDdHMgPSAodWlBZGQgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlEaWZmID0gKE00T1NBX0ludDgpKHVpQ3VyckdvdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlR2V0IC0gdWlDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNlaWxpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpRGlmZiA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ3RzICs9IChNNE9TQV9VSW50MzIpKGlEaWZmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCB1cGRhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICpwT2Zmc2V0KSArPSAoKCB1aUN0cyAqIDEwMDApIC0gdWlBZGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlR2V0ID0gdWlDdXJyR292OwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlU2V0ID0gdWlDdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdihwVG1wLCB1aUN0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCB2aWRlbyBlZmZlY3QgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50IHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApCi17Ci0gICAgTTRPU0FfVUludDggdWlDbGlwSW5kZXg7Ci0gICAgTTRPU0FfVUludDggdWlGeEluZGV4LCBpOwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRPU0FfSW50MzIgT2ZmLCBCQywgRUM7Ci0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBNNE9TQV9JbnQzMiB0ID0gKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotCi0gICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcDsKLSAgICBpZiAodWlDbGlwTnVtYmVyID09IDEpIHsKLSAgICAgICAgcENsaXAgPSBwQy0+cEMxOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBTaG9ydGN1dHMgZm9yIGNvZGUgcmVhZGFiaWxpdHkgKi8KLSAgICBPZmYgPSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgQkMgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgRUMgPSBwQ2xpcC0+aUVuZFRpbWU7Ci0KLSAgICBpID0gMDsKLQotICAgIGZvciAoIHVpRnhJbmRleCA9IDA7IHVpRnhJbmRleCA8IHBDLT5uYkVmZmVjdHM7IHVpRnhJbmRleCsrICkKLSAgICB7Ci0gICAgICAgIC8qKiBTaG9ydGN1dCwgcmV2ZXJzZSBvcmRlciBiZWNhdXNlIG9mIHByaW9yaXR5IGJldHdlZW4gZWZmZWN0cyhFbmRFZmZlY3QgYWx3YXlzIGNsZWFuICkqLwotICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPm5iRWZmZWN0cyAtIDEgLSB1aUZ4SW5kZXhdKTsKLQotICAgICAgICBpZiggTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfTm9uZSAhPSBwRngtPlZpZGVvRWZmZWN0VHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhY3R1YWxseSBhIHZpZGVvIGVmZmVjdCAqLwotCi0gICAgICAgICAgICAgaWYodWlDbGlwTnVtYmVyID09MSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgYWZ0ZXIgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGVmZmVjdD8KLSAgICAgICAgICAgICAgICAgKiBvciBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICggKHQgPj0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHQgPD0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFjdGl2ZSBlZmZlY3QocykgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdFtpXSA9IHBDLT5uYkVmZmVjdHMtMS11aUZ4SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjb3VudGVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogRm9yIGFsbCBleHRlcm5hbCBlZmZlY3RzIHNldCB0aGlzIGZsYWcgdG8gdHJ1ZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEZ4LT5WaWRlb0VmZmVjdFR5cGUgPiBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPyAqLwotICAgICAgICAgICAgICAgIGlmICggKChNNE9TQV9JbnQzMikodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUpKQotICAgICAgICAgICAgICAgICAgICAmJiAoIChNNE9TQV9JbnQzMikodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICA8PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKSApIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFNldCB0aGUgYWN0aXZlIGVmZmVjdChzKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXSA9IHBDLT5uYkVmZmVjdHMtMS11aUZ4SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjb3VudGVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEZvciBhbGwgZXh0ZXJuYWwgZWZmZWN0cyBzZXQgdGhpcyBmbGFnIHRvIHRydWUuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBGeC0+VmlkZW9FZmZlY3RUeXBlID4gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgdGhpcmQgZWZmZWN0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiB0aGUgc2Vjb25kIG9uZSwgdGhlbiB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgICAgICAgICAgICAgKiBIZW5jZSwgYXMgc29vbiBhcyB3ZSBmb3VuZCBhbiBhY3RpdmUgZWZmZWN0LCB3ZSBjYW4gZ2V0IG91dCBvZiB0aGlzIGxvb3AgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTRWSURFT0VESVRJTkdfa0gyNjQgIT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgTXBlZzQgYW5kIEgyNjMgY2xpcHMsIGZ1bGwgZGVjb2RlIGVuY29kZSBub3QgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZigxPT11aUNsaXBOdW1iZXIpCi0gICAgewotICAgIC8qKgotICAgICAqIFNhdmUgbnVtYmVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSBpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzMSA9IGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGFuZ2UgdGhlIGFic29sdXQgdGltZSB0byBjbGlwIHJlbGF0ZWQgdGltZSAqLwotICAgIHQgLT0gT2ZmOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgb24gdGhlIGJlZ2luIGN1dCAoZm9yIGNsaXAxIG9ubHkpICovCi0gICAgaWYoICggMCAhPSBCQykgJiYgKHQgPT0gQkMpICYmICgxID09IHVpQ2xpcE51bWJlcikgKQotICAgIHsKLSAgICAgICAgcEMtPmJDbGlwMUF0QmVnaW5DdXQgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+YkNsaXAxQXRCZWdpbkN1dCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgRW5jUGFyYW1zOwotCi0gICAgLyoqCi0gICAgKiBTaW11bGF0ZSBhIHdyaXRlciBpbnRlcmZhY2Ugd2l0aCBvdXIgc3BlY2lmaWMgZnVuY3Rpb24gKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFByb2Nlc3NBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVU7IC8qKjwgVGhpcyBmdW5jdGlvbiBpcyBWU1MgM0dQUCBzcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wU3RhcnRBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTdGFydEFVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgZm9sbG93IHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBXcml0ZXJDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQpCi0gICAgICAgIHBDOyAvKio8IFdlIGdpdmUgdGhlIGludGVybmFsIGNvbnRleHQgYXMgd3JpdGVyIGNvbnRleHQgKi8KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSwgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBzZXRDdXJyZW50RW5jb2RlciByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgZW5jb2RlciBzaGVsbCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBWU1Mgc2V0dGluZ3MgKi8KLQotICAgIC8qIENvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoID0gcEMtPmV3Yy51aVZpZGVvV2lkdGg7Ci0gICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPmV3Yy51aVZpZGVvSGVpZ2h0OwotICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZTsKLQotICAgIGlmKCBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIHN0cmljdCByZWd1bGF0aW9uIGluIHZpZGVvIGVkaXRvciAqLwotICAgICAgICAvKiBCZWNhdXNlIG9mIHRoZSBlZmZlY3RzIGFuZCB0cmFuc2l0aW9ucyB3ZSBzaG91bGQgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSAqLwotICAgICAgICAvKiBBbHNvIGl0IHByZXZlbnRzIHRvIGRyb3AgaW1wb3J0YW50IGZyYW1lcyAod2l0aCBhIGJhZCByZXN1bHQgb24gc2hlZHVsaW5nIGFuZAotICAgICAgICBibG9jayBlZmZldGNzKSAqLwotICAgICAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgICAgICAvLyBWYXJpYWJsZSBmcmFtZXJhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBTdGFnZUZyaWdodCBlbmNvZGVycwotICAgICAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2szMF9GUFM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEluIGNhc2Ugb2YgTU1TIG1vZGUsIHdlIG5lZWQgdG8gZW5hYmxlIGJpdHJhdGUgcmVndWxhdGlvbiB0byBiZSBzdXJlICovCi0gICAgICAgIC8qIHRvIHJlYWNoIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZSBzaXplICovCi0gICAgICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfVFJVRTsKLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IHBDLT5NTVN2aWRlb0ZyYW1lcmF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKGRlZmF1bHRzKSAqLwotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgPSAwOyAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7ICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzID0gMDsgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgICAvKiBpbml0aWFsIFFQID0gMTAgKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmV3Yy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgc3dpdGNoICggcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUEVHNDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDg7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gKE00T1NBX1VJbnQ4KSgoIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbgotICAgICAgICAgICAgICAgICogcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlKSAvIDEwMDAuMCArIDAuNSk7Ci0KLSAgICAgICAgICAgIGlmKCBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID09IDAgKQotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IE00U1lTX0gyNjQiKTsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2NDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgLy9FbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRWSURFT0VESVRJTkdfazVfRlBTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBVbmtub3duIHZpZGVvU3RyZWFtVHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aU1NU1ZpZGVvQml0cmF0ZTsgLyogUkMgKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gMDsgLyogV2UgbGV0IHRoZSBlbmNvZGVyIGNob29zZSB0aGUgdGltZXNjYWxlICovCi0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IGNhbGxpbmcgZW5jb2RlciBwRmN0SW5pdCIpOwotICAgIC8qKgotICAgICogSW5pdCB0aGUgdmlkZW8gZW5jb2RlciAoYWR2YW5jZWQgc2V0dGluZ3MgdmVyc2lvbiBvZiB0aGUgZW5jb2RlciBPcGVuIGZ1bmN0aW9uKSAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UsIE00VlNTM0dQUF9pbnRWUFAsIHBDLAotICAgICAgICBwQy0+U2hlbGxBUEkucEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSwKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RPcGVuIik7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdFN0YXJ0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmc7Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgRGVzdHJveSB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgewotICAgICAgICBpZiggTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZyA9PSBwQy0+ZXdjLmVuY29kZXJTdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgICAgICBpZiggTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZCA9PSBwQy0+ZXdjLmVuY29kZXJTdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rTm9FbmNvZGVyOwotICAgICAgICAvKioKLSAgICAgICAgKiBSZXNldCB2YXJpYWJsZSAqLwotICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldEgyNjNUaW1lQ291bnRlcigpCi0gKiBAYnJpZWYgICAgTW9kaWZ5IHRoZSB0aW1lIGNvdW50ZXIgb2YgdGhlIGdpdmVuIEgyNjMgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4vT1VUKSBIMjYzIFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHVpQ3RzICAgICAgICAgICAgKElOKSAgICAgTmV3IHRpbWUgY291bnRlciB2YWx1ZQotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ3RzICkKLXsKLSAgICAvKgotICAgICogIFRoZSBIMjYzIHRpbWUgY291bnRlciBpcyA4IGJpdHMgbG9jYXRlZCBvbiB0aGUgIngiIGJlbG93OgotICAgICoKLSAgICAqICAgfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfAotICAgICogICAgPz8/Pz8/Pz8gPz8/Pz8/Pz8gPz8/Pz8/eHggeHh4eHh4Pz8KLSAgICAqLwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgMiBiaXRzIG9uIHRoZSB0aGlyZCBieXRlICovCi0gICAgcEF1RGF0YUJ1ZmZlclsyXSA9ICggcEF1RGF0YUJ1ZmZlclsyXSAmIDB4RkMpIHwgKCggdWlDdHMgPj4gNikgJiAweDMpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgNiBiaXRzIG9uIHRoZSBmb3VydGggYnl0ZSAqLwotICAgIHBBdURhdGFCdWZmZXJbM10gPSAoICggdWlDdHMgPDwgMikgJiAweEZDKSB8IChwQXVEYXRhQnVmZmVyWzNdICYgMHgzKTsKLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdigpCi0gKiBAYnJpZWYgICAgTW9kaWZ5IHRoZSB0aW1lIGluZm8gZnJvbSBHcm91cCBPZiBWT1AgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4pICAgIE1QRUc0IFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHVpQ3RzU2VjICAgICAgICAgICAgKElOKSAgICAgTmV3IEdPViB0aW1lIGluZm8gaW4gc2Vjb25kIHVuaXQKLSAqIEByZXR1cm4gICAgbm90aGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQ3RzU2VjICkKLXsKLSAgICAvKgotICAgICogIFRoZSBNUEVHLTQgdGltZSBjb2RlIGxlbmd0aCBpcyAxOCBiaXRzOgotICAgICoKLSAgICAqICAgICBoaCAgICAgbW0gICAgbWFya2VyICAgIHNzCi0gICAgKiAgICB4eHh4eHx4eHggeHh4ICAgICAxICAgIHh4eHggeHggPz8/Pz8/Ci0gICAgKiAgIHwtLS0tLSAtLS18LS0tICAgICAtICAgIC0tLS18LS0gLS0tLS0tfAotICAgICovCi0gICAgTTRPU0FfVUludDggdWlIaDsKLSAgICBNNE9TQV9VSW50OCB1aU1tOwotICAgIE00T1NBX1VJbnQ4IHVpU3M7Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIHRoZSAyIGxhc3QgYml0cyBzcyAqLwotICAgIHVpU3MgPSAoTTRPU0FfVUludDgpKHVpQ3RzU2VjICUgNjApOyAvKio8IG1vZHVsbyBwYXJ0ICovCi0gICAgcEF1RGF0YUJ1ZmZlclsyXSA9ICgoICggdWlTcyAmIDB4MDMpIDw8IDYpIHwgKHBBdURhdGFCdWZmZXJbMl0gJiAweDNGKSk7Ci0KLSAgICBpZiggdWlDdHNTZWMgPCA2MCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgMyBsYXN0IGJpdHMgb2YgbW0sIHRoZSBtYXJrZXIgYml0ICgweDEwICovCi0gICAgICAgIHBBdURhdGFCdWZmZXJbMV0gPSAoKCAweDEwKSB8ICh1aVNzID4+IDIpKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgNSBiaXRzIG9mIGhoIGFuZCAzIG9mIG1tIChvdXQgb2YgNikgKi8KLSAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIHRoZSAzIGxhc3QgYml0cyBvZiBtbSwgdGhlIG1hcmtlciBiaXQgKDB4MTAgKi8KLSAgICAgICAgdWlUbXAgPSAoTTRPU0FfVUludDgpKHVpQ3RzU2VjIC8gNjApOyAvKio8IGludGVnZXIgcGFydCAqLwotICAgICAgICB1aU1tID0gKE00T1NBX1VJbnQ4KSh1aVRtcCAlIDYwKTsKLSAgICAgICAgcEF1RGF0YUJ1ZmZlclsxXSA9ICgoIHVpTW0gPDwgNSkgfCAoMHgxMCkgfCAodWlTcyA+PiAyKSk7Ci0KLSAgICAgICAgaWYoIHVpVG1wIDwgNjAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV3JpdGUgdGhlIDUgYml0cyBvZiBoaCBhbmQgMyBvZiBtbSAob3V0IG9mIDYpICovCi0gICAgICAgICAgICBwQXVEYXRhQnVmZmVyWzBdID0gKCh1aU1tID4+IDMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXcml0ZSB0aGUgNSBiaXRzIG9mIGhoIGFuZCAzIG9mIG1tIChvdXQgb2YgNikgKi8KLSAgICAgICAgICAgIHVpSGggPSAoTTRPU0FfVUludDgpKHVpVG1wIC8gNjApOwotICAgICAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9ICgoIHVpSGggPDwgMykgfCAodWlNbSA+PiAzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEdldE1QRUc0R292KCkKLSAqIEBicmllZiAgICBHZXQgdGhlIHRpbWUgaW5mbyBmcm9tIEdyb3VwIE9mIFZPUCB2aWRlbyBBVQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQXVEYXRhQnVmZmVyICAgIChJTikgICAgTVBFRzQgVmlkZW8gQVUgdG8gbW9kaWZ5Ci0gKiBAcGFyYW0gICAgcEN0c1NlYyAgICAgICAgICAgIChPVVQpICAgIEN1cnJlbnQgR09WIHRpbWUgaW5mbyBpbiBzZWNvbmQgdW5pdAotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdHNTZWMgKQotewotICAgIC8qCi0gICAgKiAgVGhlIE1QRUctNCB0aW1lIGNvZGUgbGVuZ3RoIGlzIDE4IGJpdHM6Ci0gICAgKgotICAgICogICAgIGhoICAgICBtbSAgICBtYXJrZXIgICAgc3MKLSAgICAqICAgIHh4eHh4fHh4eCB4eHggICAgIDEgICAgeHh4eCB4eCA/Pz8/Pz8KLSAgICAqICAgfC0tLS0tIC0tLXwtLS0gICAgIC0gICAgLS0tLXwtLSAtLS0tLS18Ci0gICAgKi8KLSAgICBNNE9TQV9VSW50OCB1aUhoOwotICAgIE00T1NBX1VJbnQ4IHVpTW07Ci0gICAgTTRPU0FfVUludDggdWlTczsKLSAgICBNNE9TQV9VSW50OCB1aVRtcDsKLSAgICBNNE9TQV9VSW50MzIgdWlDdHNTZWM7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgc3MgKi8KLSAgICB1aVNzID0gKCggcEF1RGF0YUJ1ZmZlclsyXSAmIDB4QzApID4+IDYpOwotICAgIHVpVG1wID0gKCggcEF1RGF0YUJ1ZmZlclsxXSAmIDB4MEYpIDw8IDIpOwotICAgIHVpQ3RzU2VjID0gdWlTcyArIHVpVG1wOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIG1tICovCi0gICAgdWlNbSA9ICgoIHBBdURhdGFCdWZmZXJbMV0gJiAweEUwKSA+PiA1KTsKLSAgICB1aVRtcCA9ICgoIHBBdURhdGFCdWZmZXJbMF0gJiAweDA3KSA8PCAzKTsKLSAgICB1aU1tID0gdWlNbSArIHVpVG1wOwotICAgIHVpQ3RzU2VjID0gKCB1aU1tICogNjApICsgdWlDdHNTZWM7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgaGggKi8KLSAgICB1aUhoID0gKCggcEF1RGF0YUJ1ZmZlclswXSAmIDB4RjgpID4+IDMpOwotCi0gICAgaWYoIHVpSGggKQotICAgIHsKLSAgICAgICAgdWlDdHNTZWMgPSAoIHVpSGggKiAzNjAwKSArIHVpQ3RzU2VjOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBpbiBzZWMgKi8KLSAgICAqcEN0c1NlYyA9IHVpQ3RzU2VjOwotCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoKQotICogQGJyaWVmICAgIEFsbG9jYXRlIHRoZSB0aHJlZSBZVVYgNDoyOjAgcGxhbmVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBQbGFuZXMgICAgKElOL09VVCkgdmFsaWQgcG9pbnRlciB0byAzIE00VklGSV9JbWFnZVBsYW5lIHN0cnVjdHVyZXMKLSAqIEBwYXJhbSAgICB1aVdpZHRoICAgIChJTikgICAgIEltYWdlIHdpZHRoCi0gKiBAcGFyYW0gICAgdWlIZWlnaHQoSU4pICAgICBJbWFnZSBoZWlnaHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpV2lkdGgsIE00T1NBX1VJbnQzMiB1aUhlaWdodCApCi17Ci0gICAgaWYgKHBQbGFuZXMgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiBJbnZhbGlkIHBQbGFuZXMgcG9pbnRlciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICAvKiBpZiB0aGUgYnVmZmVyIGlzIG5vdCBOVUxMIGFuZCBzYW1lIHNpemUgd2l0aCB0YXJnZXQgc2l6ZSwKLSAgICAgKiBkbyBub3QgbWFsbG9jIGFnYWluKi8KLSAgICBpZiAocFBsYW5lc1swXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMICYmCi0gICAgICAgIHBQbGFuZXNbMF0udV93aWR0aCA9PSB1aVdpZHRoICYmCi0gICAgICAgIHBQbGFuZXNbMF0udV9oZWlnaHQgPT0gdWlIZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcFBsYW5lc1swXS51X3dpZHRoID0gdWlXaWR0aDsKLSAgICBwUGxhbmVzWzBdLnVfaGVpZ2h0ID0gdWlIZWlnaHQ7Ci0gICAgcFBsYW5lc1swXS51X3N0cmlkZSA9IHVpV2lkdGg7Ci0gICAgcFBsYW5lc1swXS51X3RvcGxlZnQgPSAwOwotCi0gICAgaWYgKHBQbGFuZXNbMF0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMF0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1swXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMF0udV9oZWlnaHQsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFBsYW5lc1swXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1swXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzBdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcFBsYW5lc1sxXS51X3dpZHRoID0gcFBsYW5lc1swXS51X3dpZHRoID4+IDE7Ci0gICAgcFBsYW5lc1sxXS51X2hlaWdodCA9IHBQbGFuZXNbMF0udV9oZWlnaHQgPj4gMTsKLSAgICBwUGxhbmVzWzFdLnVfc3RyaWRlID0gcFBsYW5lc1sxXS51X3dpZHRoOwotICAgIHBQbGFuZXNbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBpZiAocFBsYW5lc1sxXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocFBsYW5lc1sxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBQbGFuZXNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBwUGxhbmVzWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwUGxhbmVzWzFdLnVfc3RyaWRlCi0gICAgICAgICogcFBsYW5lc1sxXS51X2hlaWdodCwgTTRWU1MzR1BQLChNNE9TQV9DaGFyICopICJwUGxhbmVzWzFdLnBhY19kYXRhIik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwUGxhbmVzWzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMDogdW5hYmxlIHRvIGFsbG9jYXRlIHBQbGFuZXNbMV0ucGFjX2RhdGEsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilwUGxhbmVzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwUGxhbmVzWzJdLnVfd2lkdGggPSBwUGxhbmVzWzFdLnVfd2lkdGg7Ci0gICAgcFBsYW5lc1syXS51X2hlaWdodCA9IHBQbGFuZXNbMV0udV9oZWlnaHQ7Ci0gICAgcFBsYW5lc1syXS51X3N0cmlkZSA9IHBQbGFuZXNbMl0udV93aWR0aDsKLSAgICBwUGxhbmVzWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgaWYgKHBQbGFuZXNbMl0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMl0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1syXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1syXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMl0udV9oZWlnaHQsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFBsYW5lc1syXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1syXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzJdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICBmcmVlKCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilwUGxhbmVzWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQbGFuZXNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSwgMCwgcFBsYW5lc1swXS51X3N0cmlkZSpwUGxhbmVzWzBdLnVfaGVpZ2h0KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVzWzFdLnBhY19kYXRhLCAwLCBwUGxhbmVzWzFdLnVfc3RyaWRlKnBQbGFuZXNbMV0udV9oZWlnaHQpOwotICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZXNbMl0ucGFjX2RhdGEsIDAsIHBQbGFuZXNbMl0udV9zdHJpZGUqcFBsYW5lc1syXS51X2hlaWdodCk7Ci0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQpOwotKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhbmQgcmVzaXplcyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotKiBAbm90ZQotKiBAcGFyYW0gICAgcEZpbGVJbiAgICAgICAgIChJTikgVGhlIEFSR0I4ODggaW5wdXQgZmlsZQotKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyICAgIChJTikgUG9pbnRlciBvbiBmaWxlc3lzdGVtIGZ1bmN0aW9ucwotKiBAcGFyYW0gICAgcEltYWdlUGxhbmVzICAgIChJTi9PVVQpIFBvaW50ZXIgb24gWVVWNDIwIG91dHB1dCBwbGFuZXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCB0byBvdXRwdXQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotKiBAcGFyYW0gd2lkdGggICAgICAgKElOKSB3aWR0aCBvZiB0aGUgQVJHQjg4ODgKLSogQHBhcmFtIGhlaWdodCAgICAgIChJTikgaGVpZ2h0IG9mIHRoZSBBUkdCODg4OAotKiBAcmV0dXJuICAgTTROT19FUlJPUjogTm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX0FMTE9DOiBtZW1vcnkgZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkgewotICAgIE00T1NBX0NvbnRleHQgcEFSR0JJbjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSByZ2JQbGFuZTEgLHJnYlBsYW5lMjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2IgPSB3aWR0aCAqIGhlaWdodCAqIDQ7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9yZ2I4ODggPSB3aWR0aCAqIGhlaWdodCAqIDM7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLGo9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9VSW50OCAqcEFyZ2JQbGFuZSA9Ci0gICAgICAgIChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiYXJnYiBkYXRhIik7Ci0gICAgaWYgKHBBcmdiUGxhbmUgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjA6IFwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEFSR0IgcGxhbmUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEdldCBmaWxlIHNpemUgKi8KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRmlsZUluLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgOiBcCi0gICAgICAgICAgICBDYW4gbm90IG9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGVJbiwgZXJyKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcEFyZ2JQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBBcmdiUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgQ2FuIG5vdCByZWFkIEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICBwQXJnYlBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIGVyciA9IHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNFZTUzNHUFBfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBcCi0gICAgICAgICAgICBDYW4gbm90IGNsb3NlIEFSR0I4ODg4ICBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICBwQXJnYlBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIHJnYlBsYW5lMS5wYWNfZGF0YSA9Ci0gICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfcmdiODg4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIlJHQjg4OCBwbGFuZTEiKTsKLSAgICBpZihyZ2JQbGFuZTEucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmdiIHBsYW5lMSIpOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcmdiUGxhbmUxLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHJnYlBsYW5lMS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcmdiUGxhbmUxLnVfc3RyaWRlID0gd2lkdGgqMzsKLSAgICByZ2JQbGFuZTEudV90b3BsZWZ0ID0gMDsKLQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpKyspIHsKLSAgICAgICAgaWYgKChpICUgNCkgPT0gMCkgY29udGludWU7Ci0gICAgICAgIHJnYlBsYW5lMS5wYWNfZGF0YVtqXSA9IHBBcmdiUGxhbmVbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgZnJlZShwQXJnYlBsYW5lKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHJlc2l6aW5nIGlzIHJlcXVpcmVkIHdpdGggY29sb3IgY29udmVyc2lvbiAqLwotICAgIGlmKHdpZHRoICE9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCB8fCBoZWlnaHQgIT0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkgewotCi0gICAgICAgIGZyYW1lU2l6ZV9yZ2I4ODggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0ICogMzsKLSAgICAgICAgcmdiUGxhbmUyLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfcmdiODg4LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJyZ2IgUGxhbmUyIik7Ci0gICAgICAgIGlmKHJnYlBsYW5lMi5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmdiIHBsYW5lMiIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHJnYlBsYW5lMi51X2hlaWdodCA9ICBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZTIudV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgcmdiUGxhbmUyLnVfc3RyaWRlID0gcEltYWdlUGxhbmVzLT51X3dpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lMi51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgIC8qIFJlc2l6aW5nICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JQbGFuZTEsICZyZ2JQbGFuZTIpOwotICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3IgcmVzaXppbmcgUkdCODg4IHRvIFJHQjg4ODogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUyLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKkNvbnZlcnRpbmcgUmVzaXplZCBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUyLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3IgY29udmVydGluZyBmcm9tIFJHQjg4OCB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gTTRWSUZJX1JHQjg4OHRvWVVWNDIwKE00T1NBX05VTEwsICZyZ2JQbGFuZTEsIHBJbWFnZVBsYW5lcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgfQotY2xlYW51cDoKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgZXhpdCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwbGFuZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBSVJfUGFyYW1zIGFpclBhcmFtczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXNUZW1wWzNdOwotICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLQotICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQmxhY2tCb3JkZXJzKSB7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRwbGFuZVswXS5wYWNfZGF0YSwgWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAocE91dHBsYW5lWzBdLnVfaGVpZ2h0KnBPdXRwbGFuZVswXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0cGxhbmVbMV0ucGFjX2RhdGEsIFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgKHBPdXRwbGFuZVsxXS51X2hlaWdodCpwT3V0cGxhbmVbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dHBsYW5lWzJdLnBhY19kYXRhLCBWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgIChwT3V0cGxhbmVbMl0udV9oZWlnaHQqcE91dHBsYW5lWzJdLnVfc3RyaWRlKSk7Ci0gICAgfQotCi0gICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tSZXNpemluZykgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSByZXNpemUgZmlsdGVyLgotICAgICAgICAqIEZyb20gdGhlIGludGVybWVkaWF0ZSBmcmFtZSB0byB0aGUgZW5jb2RlciBpbWFnZSBwbGFuZSAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wbGFuZSwgcE91dHBsYW5lKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgIE00VmlGaWxSZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVkgPQotICAgICAgICAgICAgcE91dHBsYW5lWzBdLnBhY19kYXRhICsgcE91dHBsYW5lWzBdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVUgPQotICAgICAgICAgICAgcE91dHBsYW5lWzFdLnBhY19kYXRhICsgcE91dHBsYW5lWzFdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVYgPQotICAgICAgICAgICAgcE91dHBsYW5lWzJdLnBhY19kYXRhICsgcE91dHBsYW5lWzJdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWSA9IE00T1NBX05VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVUgPSBNNE9TQV9OVUxMOwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVWID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKiBUbyBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgICAgIC8qIEluaXRpYWxpemUgQUlSIFBhcmFtcyovCi0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwSW5wbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcElucGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBPdXRwbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIGFpclBhcmFtcy5tX2JPdXRwdXRTdHJpcGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgIC8qKgotICAgICAgICBNZWRpYSByZW5kZXJpbmc6IEJsYWNrIGJvcmRlcnMqLwotICAgICAgICBpZiAocmVuZGVyaW5nTW9kZSA9PSBNNHhWU1Nfa0JsYWNrQm9yZGVycykgewotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gcE91dHBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcE91dHBsYW5lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBwT3V0cGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBwT3V0cGxhbmVbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlID0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IHBPdXRwbGFuZVsyXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IHBPdXRwbGFuZVsyXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUgPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBbGxvY2F0ZXMgcGxhbiBpbiBsb2NhbCBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJwSW1hZ2VQbGFuZVRlbXAgWSIpIDsKLSAgICAgICAgICAgIGlmIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogQWxsb2MgRXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFUiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFYiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEluUGxhbmVZID0gcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICBwSW5QbGFuZVUgPSBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhIDsKLSAgICAgICAgICAgIHBJblBsYW5lViA9IHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhLCBZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhLCBVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLCBWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlKSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQgPQotICAgICAgICAgICAgICAgIChwSW5wbGFuZS0+dV9oZWlnaHQgKiBwT3V0cGxhbmUtPnVfd2lkdGgpIC9wSW5wbGFuZS0+dV93aWR0aDsKLQotICAgICAgICAgICAgaWYgKGhlaWdodCA8PSBwT3V0cGxhbmUtPnVfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIHRoZSBib3R0b20gc2lkZSAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIE51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wICovCi0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkgKgotICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpICoKLSAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpICoKLSAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwSW5wbGFuZS0+dV93aWR0aCAqIHBPdXRwbGFuZS0+dV9oZWlnaHQpL3BJbnBsYW5lLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoIC0KLSAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4gKi8KLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50ICovCi0gICAgICAgICAgICBpZiAoYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09Ci0gICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkgewotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBsYW5lVGVtcCA9IHBJbWFnZVBsYW5lc1RlbXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTWVkaWEgcmVuZGVyaW5nOiBDcm9wcGluZyovCi0gICAgICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQ3JvcHBpbmcpIHsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcE91dHBsYW5lLT51X3dpZHRoOwotICAgICAgICAgICAgaWYgKChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA8Ci0gICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAvKiBIZWlnaHQgd2lsbCBiZSBjcm9wcGVkICovCi0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKgotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikoKHBJbnBsYW5lLT51X2hlaWdodCAtCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIFdpZHRoIHdpbGwgYmUgY3JvcHBlZCAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKSgocElucGxhbmUtPnVfd2lkdGggLQotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKT4+MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGxhbmVUZW1wID0gcE91dHBsYW5lOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9haXJfY29udGV4dCkgewotICAgICAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZwQy0+bV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmYWlyUGFyYW1zKTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfZ2V0KHBDLT5tX2Fpcl9jb250ZXh0LCBwSW5wbGFuZSwgcFBsYW5lVGVtcCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPHBPdXRwbGFuZVswXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lWSwgKHZvaWQgKilwSW5QbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0cGxhbmVbMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVZICs9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVkgKz0gcE91dHBsYW5lWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpPTA7IGk8cE91dHBsYW5lWzFdLnVfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVVLCAodm9pZCAqKXBJblBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwbGFuZVsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVUgKz0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lVSArPSBwT3V0cGxhbmVbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxwT3V0cGxhbmVbMl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVYsICh2b2lkICopcEluUGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgcE91dHBsYW5lWzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVWICs9IHBPdXRwbGFuZVsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLWNsZWFuVXA6Ci0gICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCkgewotCi0gICAgTTRPU0FfRVJSIGVycj0gTTROT19FUlJPUjsKLQotICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgWVVWIHBsYW5lCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgPQotICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciopInBQbGFuZVl1diIpOwotCi0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2ID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQ7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV9zdHJpZGUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSA9Ci0gICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ICogcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCAqIDEuNSwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X2hlaWdodCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ID4+MTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3dpZHRoID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnVfc3RyaWRlID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKAotICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSArCi0gICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGgpOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV9oZWlnaHQgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV93aWR0aCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS51X3N0cmlkZSA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfd2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0ucGFjX2RhdGEgKwotICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3dpZHRoKTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwICgKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnBGaWxlLAotICAgICAgICBwQy0+cE9zYUZpbGVSZWFkUHRyLAotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1diwKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNXaWR0aCwKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBZVVYgZGF0YSB0byB0aGUgZGVjb2RlciB1c2luZyBzZXRvcHRpb24KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uICgKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0RlY1l1dkRhdGEsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhID0gTTRPU0FfVFJVRTsKLQotICAgIC8vIEFsbG9jYXRlIFl1diBwbGFuZSB3aXRoIGVmZmVjdAotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9Ci0gICAgIChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJwUGxhbmVZdXZXaXRoRWZmZWN0Iik7Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA9IHBDLT5ld2MudWlWaWRlb0hlaWdodDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZSA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhID0KLSAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ICogcEMtPmV3Yy51aVZpZGVvV2lkdGggKiAxLjUsCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImltYWdlQ2xpcCBZVVYgZGF0YSIpOwotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzFdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3dpZHRoKTsKLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzJdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzFdLnBhY19kYXRhICsKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoKTsKLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91cywKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSXNDbGlwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50OCBudW1FZmZlY3RzID0gMDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcERlY29kZXJSZW5kZXJGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHl1dkZyYW1lV2lkdGggPSAwLCB5dXZGcmFtZUhlaWdodCA9IDA7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBUbXAgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBUZW1wWzNdOwotICAgIE00T1NBX1VJbnQ4IGkgPSAwOwotICAgIE00T1NBX0Jvb2wgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcCwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICAvKiBSZXNpemUgb3Igcm90YXRlIGNhc2UgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIElmIHdlIGRvIG1vZGlmeSB0aGUgaW1hZ2UsIHdlIG5lZWQgYW4gaW50ZXJtZWRpYXRlIGltYWdlIHBsYW5lICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAocENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX0ZBTFNFKSkgewotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0LCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSAhPQotICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgaWYgKDAgIT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2F2ZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHVuLXJvdGF0ZWQgZnJhbWUKLSAgICAgICAgICAgICAgICB5dXZGcmFtZVdpZHRoID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHl1dkZyYW1lSGVpZ2h0ID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Um90YXRlVmlkZW8ocENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVZpZGVvKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogU2V0IHRoZSBuZXcgdmlkZW8gc2l6ZSBmb3IgdGVtcG9yYXJ5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHMxOwotICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBudW1FZmZlY3RzID4gMCkgewotICAgICAgICAgICAgcENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIC8qIElmIHZpZGVvIGZyYW1lIG5lZWQgdG8gYmUgcmVzaXplZCBvciByb3RhdGVkLAotICAgICAgICAgICAgICogdGhlbiBhcHBseSB0aGUgb3ZlcmxheSBhZnRlciB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkIHdpdGggcmVuZGVyaW5nIG1vZGUuCi0gICAgICAgICAgICAgKiBIZXJlIHNraXAgdGhlIGZyYW1pbmcob3ZlcmxheSkgZWZmZWN0IHdoZW4gYXBwbHlpbmcgdmlkZW8gRWZmZWN0LiAqLwotICAgICAgICAgICAgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsIHBSZXNpemVQbGFuZSwgYlNraXBGcmFtaW5nRWZmZWN0KTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KCkgZXJyIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lPSBwUmVzaXplUGxhbmU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgfQotICAgICAgICAvKiBEbyByZW5kZXJpbmcgbW9kZSAqLwotICAgICAgICBpZiAoKHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9UUlVFKSB8fAotICAgICAgICAgICAgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSAhPQotICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpIHsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUgKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBUbXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfd2lkdGgsIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBUZW1wOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZSAocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+eFZTUy5NZWRpYVJlbmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUscFRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBBcHBseSBvdmVybGF5IGlmIG92ZXJsYXkgZXhpc3QqLwotICAgICAgICAgICAgaWYgKGJJc0NsaXAxID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwgcEMtPnl1djEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPmxhc3REZWNvZGVkUGxhbmUgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsIHBDLT55dXYyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkpIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocFRlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmxhc3REZWNvZGVkUGxhbmUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZnJlZSB0aGUgdGVtcCBidWZmZXIKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAocEMtPm5iQWN0aXZlRWZmZWN0cyA9PSAwKSAmJgotICAgICAgICAgICAgIChwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkpIHsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+eXV2MSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91cywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnl1djIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCBkZWNvZGVyIHNldE9wdGlvbiBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCBmb3IgcmVzaXplIGZyYW1lIHBsYW5lCi0gICAgICAgIGlmICgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyAmJgotICAgICAgICAgICAgMTgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUocENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZGcmFtZVdpZHRoLCB5dXZGcmFtZUhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIE5vIHJvdGF0ZSBvciBubyByZXNpemUgY2FzZSovCi0gICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICBudW1FZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG51bUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLCBwUGxhbmVOb1Jlc2l6ZSwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBSZW5kZXIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiU2tpcEZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywgcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnl1djEsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywgcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnl1djIsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0IGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLCBwVG1wLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIFJlbmRlciByZXR1cm5zIGVycm9yIDB4JXgsIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotICAgICAgICBwQ2xpcEN0eHQtPmlWaWRlb1JlbmRlckN0cyA9IChNNE9TQV9JbnQzMil0czsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHJvdGF0aW9uRGVncmVlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBvdXRQbGFuZVszXTsKLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZSAhPSAxODApIHsKLSAgICAgICAgLy8gU3dhcCB3aWR0aCBhbmQgaGVpZ2h0IG9mIGluIHBsYW5lCi0gICAgICAgIG91dFBsYW5lWzBdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodDsKLSAgICAgICAgb3V0UGxhbmVbMF0udV9oZWlnaHQgPSBwUGxhbmVJblswXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVswXS51X3N0cmlkZSA9IG91dFBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgIG91dFBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIG91dFBsYW5lWzBdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKG91dFBsYW5lWzBdLnVfc3RyaWRlKm91dFBsYW5lWzBdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIm91dCBZIHBsYW5lIGZvciByb3RhdGlvbiIpKTsKLSAgICAgICAgaWYgKG91dFBsYW5lWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG91dFBsYW5lWzFdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodC8yOwotICAgICAgICBvdXRQbGFuZVsxXS51X2hlaWdodCA9IHBQbGFuZUluWzBdLnVfd2lkdGgvMjsKLSAgICAgICAgb3V0UGxhbmVbMV0udV9zdHJpZGUgPSBvdXRQbGFuZVsxXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBvdXRQbGFuZVsxXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIChvdXRQbGFuZVsxXS51X3N0cmlkZSpvdXRQbGFuZVsxXS51X2hlaWdodCksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJvdXQgVSBwbGFuZSBmb3Igcm90YXRpb24iKSk7Ci0gICAgICAgIGlmIChvdXRQbGFuZVsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0UGxhbmVbMl0udV93aWR0aCA9IHBQbGFuZUluWzBdLnVfaGVpZ2h0LzI7Ci0gICAgICAgIG91dFBsYW5lWzJdLnVfaGVpZ2h0ID0gcFBsYW5lSW5bMF0udV93aWR0aC8yOwotICAgICAgICBvdXRQbGFuZVsyXS51X3N0cmlkZSA9IG91dFBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgIG91dFBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIG91dFBsYW5lWzJdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKG91dFBsYW5lWzJdLnVfc3RyaWRlKm91dFBsYW5lWzJdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIm91dCBWIHBsYW5lIGZvciByb3RhdGlvbiIpKTsKLSAgICAgICAgaWYgKG91dFBsYW5lWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoKHJvdGF0aW9uRGVncmVlKSB7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBvdXRQbGFuZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIC8vIEluIHBsYW5lIHJvdGF0aW9uLCBzbyBwbGFuZU91dCA9IHBsYW5lSW4KLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwUGxhbmVJbiwgcFBsYW5lSW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyNzA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBMZWZ0WVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcFBsYW5lSW4sIG91dFBsYW5lKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiaW52YWxpZCByb3RhdGlvbiBwYXJhbSAlZCIsIChpbnQpcm90YXRpb25EZWdyZWUpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlICE9IDE4MCkgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVJblswXS5wYWNfZGF0YSwgMCwKLSAgICAgICAgICAgIChwUGxhbmVJblswXS51X3dpZHRoKnBQbGFuZUluWzBdLnVfaGVpZ2h0KSk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZUluWzFdLnBhY19kYXRhLCAwLAotICAgICAgICAgICAgKHBQbGFuZUluWzFdLnVfd2lkdGgqcFBsYW5lSW5bMV0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lSW5bMl0ucGFjX2RhdGEsIDAsCi0gICAgICAgICAgICAocFBsYW5lSW5bMl0udV93aWR0aCpwUGxhbmVJblsyXS51X2hlaWdodCkpOwotICAgICAgICAvLyBDb3B5IFksIFUgYW5kIFYgcGxhbmVzCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZUluWzBdLnBhY19kYXRhLCAodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgKHBQbGFuZUluWzBdLnVfd2lkdGgqcFBsYW5lSW5bMF0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lSW5bMV0ucGFjX2RhdGEsICh2b2lkICopb3V0UGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAocFBsYW5lSW5bMV0udV93aWR0aCpwUGxhbmVJblsxXS51X2hlaWdodCkpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVJblsyXS5wYWNfZGF0YSwgKHZvaWQgKilvdXRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgIChwUGxhbmVJblsyXS51X3dpZHRoKnBQbGFuZUluWzJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzJdLnBhY19kYXRhKTsKLQotICAgICAgICAvLyBTd2FwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbiBwbGFuZQotICAgICAgICB1aW50MzJfdCB0ZW1wID0gMDsKLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzBdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzBdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMF0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblswXS51X3N0cmlkZSA9IHBQbGFuZUluWzBdLnVfd2lkdGg7Ci0KLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzFdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzFdLnVfd2lkdGggPSBwUGxhbmVJblsxXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMV0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblsxXS51X3N0cmlkZSA9IHBQbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzJdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzJdLnVfd2lkdGggPSBwUGxhbmVJblsyXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMl0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblsyXS51X3N0cmlkZSA9IHBQbGFuZUluWzJdLnVfd2lkdGg7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmIChwbGFuZUluID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5VTEwgaW4gcGxhbmUsIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcGxhbmVJblswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVJblswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICBwbGFuZUluWzBdLnVfc3RyaWRlID0gcGxhbmVJblswXS51X3dpZHRoOwotCi0gICAgcGxhbmVJblsxXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZUluWzFdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVJblsxXS51X3N0cmlkZSA9IHBsYW5lSW5bMV0udV93aWR0aDsKLQotICAgIHBsYW5lSW5bMl0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVJblsyXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lSW5bMl0udV9zdHJpZGUgPSBwbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMzBmNzA1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwotICogQGJyaWVmICAgIE1lZGlhIHJlYWRlcnMgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzdWJzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIG1lZGlhCi0gKiAgICAgICAgICAgIHJlYWRlcnMgYW5kIGRlY29kZXJzIGZvciB0aGUgVlNTLiBQb3RlbnRpYWwgc3VwcG9ydCBjYW4KLSAqICAgICAgICAgICAgYmUgYWN0aXZhdGVkIG9yIGRlLWFjdGl2YXRlZAotICogICAgICAgICAgICB1c2luZyBjb21waWxhdGlvbiBmbGFncyBzZXQgaW4gdGhlIHByb2plY3RzIHNldHRpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiICAgICAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgVlNTIHNwZWNpZmljIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiICAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gbW9kdWxlICovCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qIFJlYWRlciByZWdpc3RyYXRpb24gOiBhdCBsZWFzdCBvbmUgcmVhZGVyIG11c3QgYmUgZGVmaW5lZCAqLwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19OVUxMCi0jZXJyb3IgIm5vIHJlYWRlciByZWdpc3RlcmVkIgotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTSAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0vKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBNUEVHNCBkZWNvZGVyICovCi0jaWYgIWRlZmluZWQoTTRWU1NfU1VQUE9SVF9WSURFQ18zR1ApICYmICFkZWZpbmVkKE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUykKLSNlcnJvciAiV2FpdCwgd2hhdD8iCi0vKiAiSGV5LCB0aGlzIGlzIHRoZSBWU1MzR1BQIHNwZWFraW5nLiBQcmF5IHRlbGwsIGhvdyB0aGUgaGVjayBkbyB5b3UgZXhwZWN0IG1lIHRvIGJlIGFibGUgdG8gZG8KLWFueSBlZGl0aW5nIHdpdGhvdXQgYSBidWlsdC1pbiB2aWRlbyBkZWNvZGVyLCBub3IgdGhlIHBvc3NpYmlsaXR5IHRvIHJlY2VpdmUgYW4gZXh0ZXJuYWwgb25lPyEKLVNlcmlvdXNseSwgSSdkIGxvdmUgdG8ga25vdy4iICovCi0jZW5kaWYKLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCByZWFkZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotI2luY2x1ZGUgIk00UkVBREVSX0Ftci5oIgotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNcDNSZWFkZXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTQotI2luY2x1ZGUgIk00UkVBREVSX1BjbS5oIgotI2VuZGlmCi0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgYXVkaW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgiCi0jaW5jbHVkZSAiTTRERUNPREVSX051bGwuaCIKLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwKLSNpbmNsdWRlICJNNEFEX051bGwuaCIKLSNlbmRpZgotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKiBXcml0ZXIgcmVnaXN0cmF0aW9uIDogYXQgbGVhc3Qgb25lIHdyaXRlciBtdXN0IGJlIGRlZmluZWQgKi8KLS8vI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotI2Vycm9yICJubyB3cml0ZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0vLyNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIgKi8KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCB3cml0ZXIgdG8gc3Vic2NyaWJlICovCi0vLyNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLS8qZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9BTVJfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi1NNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi1NNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ki8KLS8vI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICBhdWRpbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKVwKLSAgICByZXR1cm4gKChNNE9TQV9FUlIpKHJldHZhbCkpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYygpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgVlNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFJFQURFUl9NZWRpYVR5cGUgICAgICAgICAgcmVhZGVyTWVkaWFUeXBlOwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICBwUmVhZGVyRGF0YUludGVyZmFjZTsKLQotICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlICAgICB3cml0ZXJNZWRpYVR5cGU7Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgIHBXcml0ZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlOwotCi0gICAgTTRBRF9UeXBlICAgICAgICAgICAgICAgICAgIGF1ZGlvRGVjb2RlclR5cGU7Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0ICAgICAgIGF1ZGlvQ29kZWNUeXBlOwotICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSogcEF1ZGlvQ29kZWNJbnRlcmZhY2U7Ci0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2U7Ci0KLSAgICBNNERFQ09ERVJfVmlkZW9UeXBlICAgICAgICAgdmlkZW9EZWNvZGVyVHlwZTsKLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICAgICAgdmlkZW9Db2RlY1R5cGU7Ci0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogIHBWaWRlb0NvZGVjSW50ZXJmYWNlOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICBwVmlkZW9EZWNvZGVySW50ZXJmYWNlOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCk7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIDNHUCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUAotICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1AgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQICovCi0KLSAgICAvKiAtLS0gQU1SIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0gICAgZXJyID0gTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBTVIgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICovCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKCAmcmVhZGVyTWVkaWFUeXBlLCAmcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX01QMyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QMyByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLQotICAgIC8qIC0tLSBQQ00gLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSAgICBlcnIgPSBNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlcyggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTSBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIFBDTSByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00gKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0ICYgSDI2MyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KCZ2aWRlb0RlY29kZXJUeXBlLCAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX01QRUc0IGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVBFRzQgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERUNfM0dQICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVPX0FWQwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KCZ2aWRlb0RlY29kZXJUeXBlLCAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX0gyNjQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBIMjY0IGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFQ19OVUxMCi0gICAgZXJyID0gTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlKAotICAgICAgICAgICAgICAmdmlkZW9EZWNvZGVyVHlwZSwgJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWRCBOVUxMIERlY29kZXIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBcCi0gICAgICAgIGNhbid0IHJlZ2lzdGVyIHZpZGVvIE5VTEwgZGVjb2RlciIpOwotI2VuZGlmCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1STkIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00IEFNUk5CIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQU1STkIgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfQU1STkIgKi8KLQotICAgIC8qIC0tLSBBQUMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvRGVjb2RlclR5cGUsICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTQgQUFDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQUFDIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMygmYXVkaW9EZWNvZGVyVHlwZSwgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNCBNUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCBwQ29udGV4dCwgYXVkaW9EZWNvZGVyVHlwZSwgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBNUDMgZGVjb2RlciIpOwotI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX01QMyAqLwotCi0KLSAgICAvKiAtLS0gTlVMTCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTAotICAgIGVyciA9IE00QURfTlVMTF9nZXRJbnRlcmZhY2UoICZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgTlVMTCBEZWNvZGVyIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgRVZSQyBkZWNvZGVyIik7Ci0jZW5kaWYgIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotCi0gICAgLyogLS0tIDNHUFAgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi0gICAgLyogcmV0cmlldmVzIHRoZSAzR1BQIHdyaXRlciBtZWRpYSB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoICZ3cml0ZXJNZWRpYVR5cGUsICZwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFdyaXRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFdSSVRFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCBwQ29udGV4dCwgd3JpdGVyTWVkaWFUeXBlLCBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1BQIHdyaXRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0IC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgLyogcmV0cmlldmVzIHRoZSBNUEVHNCBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9NUEVHNCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gTVBFRzQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0gICAgLyogLS0tIEgyNjMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9IMjYzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLCBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjYzIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjQgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBNNEgyNjRFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLCBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjY0IGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDICovCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIGF1ZGlvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBBTVIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQU1SCi0gICAgLyogcmV0cmlldmVzIHRoZSBBTVIgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFNUiBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEFBQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFBQyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQyAqLwotCi0gICAgLyogLS0tIEVWUkMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfRVZSQwotICAgIC8qIHJldHJpZXZlcyB0aGUgRVZSQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBNNEVWUkNfZ2V0SW50ZXJmYWNlcyggJmF1ZGlvQ29kZWNUeXBlLCAmcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEVWUkMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEVWUkMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9FVlJDICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICBwQ29udGV4dC0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlID0gTTRPU0FfVFJVRTsgICAvKiB3aGVuIE5YUCBTVyBjb2RlY3MgYXJlIHJlZ2lzdGVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGFsbG93IHVucmVnaXN0cmF0aW9uKi8KLSNlbmRpZgotCi0KLSAgICByZXR1cm4gZXJyOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjU0MTBiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX0FQSS5jCi0gKiBAYnJpZWYgICAgQVBJIG9mIGVYdGVuZGVkIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIChWaWRlbyBTdHVkaW8gMi4xKQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqIE9TQUwgbWFpbiB0eXBlcyBhbmQgZXJyb3JzICoqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0vLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIgotCi0vKioKLSAqIFZTUyAzR1BQIEFQSSBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioKLUJlZ2luIG9mIHhWU1MgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0ludGVybmFsLmgiCi0KLS8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX0luaXQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zKiBwUGFyYW1zKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSB4VlNTCi0gKiBAbm90ZSAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIHhWU1MgZWRpdCBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwYXJhbXMgICAgICAgICAgICAgICAgKElOKSBQYXJhbWV0ZXJzIG1hbmRhdG9yeSBmb3IgeFZTUwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNHhWU1NfSW5pdCggTTRPU0FfQ29udGV4dCAqcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zICpwUGFyYW1zICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwLCBpOwotCi0gICAgaWYoIHBQYXJhbXMgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGFyYW1ldGVyIHN0cnVjdHVyZSBmb3IgTTR4VlNTX0luaXQgZnVuY3Rpb24gaXMgTlVMTCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwUGFyYW1zLT5wRmlsZVJlYWRQdHIgPT0gTTRPU0FfTlVMTAotICAgICAgICB8fCBwUGFyYW1zLT5wRmlsZVdyaXRlUHRyID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAicEZpbGVSZWFkUHRyIG9yIHBGaWxlV3JpdGVQdHIgaW4gTTR4VlNTX0luaXRQYXJhbXMgc3RydWN0dXJlIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19Db250ZXh0KSwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgeFZTUyBsYXllciIpOwotCi0gICAgaWYoIHhWU1NfY29udGV4dCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIGZpbGUgcmVhZC93cml0ZSBmdW5jdGlvbnMgcG9pbnRlcnMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciA9IHBQYXJhbXMtPnBGaWxlUmVhZFB0cjsKLSAgICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIgPSBwUGFyYW1zLT5wRmlsZVdyaXRlUHRyOwotCi0gICAgLypVVEYgQ29udmVyc2lvbiBzdXBwb3J0OiBjb3B5IGNvbnZlcnNpb24gZnVuY3Rpb25zIHBvaW50ZXJzIGFuZCBhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5Ci0gICAgIGJ1ZmZlciovCi0gICAgaWYoIHBQYXJhbXMtPnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBpZiggcFBhcmFtcy0+cENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCA9Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cENvbnZGcm9tVVRGOEZjdDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgPQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBDb252VG9VVEY4RmN0OwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSA9Ci0gICAgICAgICAgICAgICAgVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkU7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkUKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50OCksCi0gICAgICAgICAgICAgICAgTTRWQSwgKE00T1NBX0NoYXIgKikiTTR4VlNTX0luaXQ6IFVURiBjb252ZXJzaW9uIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX0luaXQ6IG9uZSBVVEYgY29udmVyc2lvbiBwb2ludGVyIGlzIG51bGwgYW5kIHRoZSBvdGhlclwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBudWxsIik7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgPQotICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcFBhcmFtcy0+cFRlbXBQYXRoICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgLypObyBuZWVkIHRvIGNvbnZlcnQgaW50byBVVEY4IGFzIGFsbCBpbnB1dCBvZiB4VlNTIGFyZSBpbiBVVEY4Ci0gICAgICAgICh0aGUgY29udmVyc2lvbiBjdXN0b21lciBmb3JtYXQgaW50byBVVEY4Ci0gICAgICAgIGlzIGRvbmUgaW4gVkEvVkFMKSovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCAodm9pZCAqKXBQYXJhbXMtPnBUZW1wUGF0aCwKLSAgICAgICAgICAgIHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSk7Ci0gICAgICAgIC8qIFRPRE86IENoZWNrIHRoYXQgbm8gcHJldmlvdXMgeFZTUyB0ZW1wb3JhcnkgZmlsZXMgYXJlIHByZXNlbnQgPyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIGlzIE5VTEwiKTsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQpOwotICAgICAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0KLSAgICAgICAgKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MpLAotICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb3B5IG9mIFZTUyBzdHJ1Y3R1cmUiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgcG9pbnRlcnMgaW4gcFNldHRpbmdzICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOyAvKiBSQyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBUaGlzIGlzIHVzZWQgdG8ga25vdyBpZiB0aGUgdXNlciBoYXMgYWRkZWQgb3IgcmVtb3ZlZCBzb21lIG1lZGlhcyAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0gMDsKLQotICAgIC8qICJTdGF0ZSBtYWNoaW5lIiAqLwotICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPSAwOwotICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIFB0bzNHUFAgYW5kIE1DUyBsaXN0cyAqLwotICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9IE00T1NBX05VTEw7Ci0KLSAgICB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXggPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IDA7Ci0KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLypGQjogaW5pdGlhbGl6ZSB0byBhdm9pZCBjcmFzaCB3aGVuIGVycm9yIGR1cmluZyB0aGUgZWRpdGluZyovCi0gICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIHN0YXRlIGlmIGFsbCBpbml0aWFsaXphdGlvbnMgYXJlIGNvcnJlY3RzICovCi0gICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkOwotCi0gICAgLyogaW5pdGlhbGl6ZSBNQ1MgY29udGV4dCovCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0geFZTU19jb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBnaXZlbiBlZGl0aW5nIHN0cnVjdHVyZSBpbiBvcmRlciB0bwotICogICAgICAgICAgICAgICAgbWluaW1pemUgdGhlIHRyYW5zY29kaW5nIHRpbWUuCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgYW5hbHlzZXMgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBpZiBuZWVkZWQsIGNoYW5nZXMgdGhlCi0gKiAgICAgICAgICAgICAgICBvdXRwdXQgcGFyYW1ldGVycyAoVmlkZW8gY29kZWMsIHZpZGVvIHNpemUsIGF1ZGlvIGNvZGVjLAotICogICAgICAgICAgICAgICAgYXVkaW8gbmIgb2YgY2hhbm5lbHMpIHRvIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUoIE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBmaWxlUHJvcGVydGllczsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX0Jvb2wgYkF1ZGlvVHJhbnNpdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYklzQkdNUmVwbGFjZSA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkZvdW5kOwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0NvbmZpZ1s5XSA9Ci0gICAgewotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi0gICAgfTsKLSAgICAvKiogSW5kZXggPC0+IFZpZGVvIGNvbmZpZyAqKi8KLSAgICAvKiAwOiAgICAgICAgSDI2MyAgU1FDSUYgICAgICAgICovCi0gICAgLyogMTogICAgICAgIEgyNjMgIFFDSUYgICAgICAgICovCi0gICAgLyogMjogICAgICAgIEgyNjMgIENJRiAgICAgICAgKi8KLSAgICAvKiAzOiAgICAgICAgTVBFRzQgU1FDSUYgICAgICAgICovCi0gICAgLyogNDogICAgICAgIE1QRUc0IFFRVkdBICAgICAgICAqLwotICAgIC8qIDU6ICAgICAgICBNUEVHNCBRQ0lGICAgICAgICAqLwotICAgIC8qIDY6ICAgICAgICBNUEVHNCBRVkdBICAgICAgICAqLwotICAgIC8qIDc6ICAgICAgICBNUEVHNCBDSUYgICAgICAgICovCi0gICAgLyogODogICAgICAgIE1QRUc0IFZHQSAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBNNE9TQV9VSW50MzIgYXVkaW9Db25maWdbM10gPQotICAgIHsKLSAgICAgICAgMCwgMCwgMAotICAgIH07Ci0gICAgLyoqIEluZGV4IDwtPiBBdWRpbyBjb25maWcgKiovCi0gICAgLyogMDogICAgQU1SICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIDE6ICAgIEFBQyAgICAxNmtIeiBtb25vICAgICAgICAqLwotICAgIC8qIDI6ICAgIEFBQyAxNmtIeiBzdGVyZW8gICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgXAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBudW1iZXIgb2YgY2xpcHMgKi8KLSAgICBpZiggcFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPT0gMCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGhlIG51bWJlciBvZiBpbnB1dCBjbGlwIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgISIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgYmFja2dyb3VuZCBtdXNpYywgYW5kIGlmIGl0cyBhdWRpbyB3aWxsIHJlcGxhY2UgaW5wdXQgY2xpcCBhdWRpbyAqLwotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID09IDEwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJJc0JHTVJlcGxhY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUGFyc2UgYWxsIGNsaXBzLCBhbmQgZ2l2ZSBvY2N1cmVuY2VzIG9mIGVhY2ggY29tYmluYXRpb24gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgLyogV2UgaWdub3JlIEpQRyBpbnB1dCBmaWxlcyBhcyB0aGV5IGFyZSBhbHdheXMgdHJhbnNjb2RlZCAqLwotICAgICAgICBpZiggcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmQ29udmVydGVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19SZWR1Y2VUcmFuc2NvZGU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIHV0ZiBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIC8vZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgIC8vICAgICAmZmlsZVByb3BlcnRpZXMpOwotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDaGVjayBiZXN0IHZpZGVvIHNldHRpbmdzICovCi0gICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDEyOAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gOTYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbMF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzNdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDE2MAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gMTIwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzRdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDE3NgotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gMTQ0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjYzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzFdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s1XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAzMjAKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDI0MCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s2XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAzNTIKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDI4OCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2MyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1syXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbN10gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGggPT0gNjQwCi0gICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9PSA0ODAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbOF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgQkdNIHRoYXQgcmVwbGFjZXMgZXhpc3RpbmcgYXVkaW8gdHJhY2ssIHdlIGRvIG5vdCBjYXJlIGFib3V0Ci0gICAgICAgICAgICBhdWRpbyB0cmFjayBhcyBpdCB3aWxsIGJlIHJlcGxhY2VkICovCi0gICAgICAgICAgICAvKiBJZiBub3QsIHdlIHRyeSB0byBtaW5pbWl6ZSBhdWRpbyByZWVuY29kaW5nICovCi0gICAgICAgICAgICBpZiggYklzQkdNUmVwbGFjZSA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDE2MDAwICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMV0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDE2MDAwICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMl0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhdWRpb0NvbmZpZ1swXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgYmVzdCBvdXRwdXQgdmlkZW8gZm9ybWF0ICh0aGUgbW9zdCBvY2N1cmluZyBjb21iaW5hdGlvbikgKi8KLSAgICBqID0gMDsKLSAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgOTsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCB2aWRlb0NvbmZpZ1tpXSA+PSB2aWRlb0NvbmZpZ1tqXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBiRm91bmQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBqICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tIMjYzOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rU1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa0NJRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rU1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FRVkdBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRVkdBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1ZHQTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgYmVzdCBvdXRwdXQgYXVkaW8gZm9ybWF0ICh0aGUgbW9zdCBvY2N1cmluZyBjb21iaW5hdGlvbikgKi8KLSAgICBqID0gMDsKLSAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgMzsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBhdWRpb0NvbmZpZ1tpXSA+PSBhdWRpb0NvbmZpZ1tqXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBiRm91bmQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBqICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rQUFDOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TZW5kQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncykKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnaXZlcyB0byB0aGUgeFZTUyBhbiBlZGl0aW5nIHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgcHJlcGFyZSBlZGl0aW9uCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19Jbml0LCBhZnRlcgotICogICAgICAgICAgICAgICAgTTR4VlNTX0Nsb3NlQ29tbWFuZCwgb3IgYWZ0ZXIgTTR4VlNTX1ByZXZpZXdTdG9wLgotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIEVkaXRpb24gc2V0dGluZ3MgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1NlbmRDb21tYW5kKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX1VJbnQ4IG5iT2ZTYW1lQ2xpcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9Cb29sIGlzTmV3QkdNID0gTTRPU0FfVFJVRTsKLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQdG8zR1BQX2xhc3QgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19NQ1NfcGFyYW1zICpwTUNTX2xhc3QgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgaGVpZ2h0LCBzYW1wbGluZ0ZyZXE7Ci0gICAgTTRPU0FfQm9vbCBiSXNUcmFuc2NvZGluZyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0ludDMyIHRvdGFsRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dFNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0gMDsKLSAgICBNNE9TQV9JbnQ4IG1hc3RlckNsaXAgPSAtMTsKLQotICAgIGkgPSAwOwotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgXAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TZW5kQ29tbWFuZCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFN0YXRlIGlzIGJhY2sgdG8gaW5pdGlhbGl6ZWQgdG8gYWxsb3cgY2FsbCBvZiBjbGVhbnVwIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQ7Ci0KLSAgICAvKiBDaGVjayBpZiBhIHByZXZpb3VzIHNlbmRDb21tYW5kIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPnByZXZpb3VzQ2xpcE51bWJlciAhPSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0ID0gMDsKLQotICAgICAgICAvKiBDb21wYXJlIEJHTSBpbnB1dCAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgXAotICAgICAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0KLSAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGF1ZGlvIG91dHB1dCBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9PQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IEJHTSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUsIHNvLCBubyBuZWVkIHRvIHJlZGVjb2RlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIkJHTSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUsIG5vdGhpbmcgdG8gZGVjb2RlIik7Ci0gICAgICAgICAgICAgICAgICAgIGlzTmV3QkdNID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgb3V0cHV0IHNldHRpbmdzIGhhdmUgY2hhbmdlZCAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWwKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIGl0IGlzIHRoZSBjYXNlLCB3ZSBjYW4ndCByZXVzZSBhbHJlYWR5IHRyYW5zY29kZWQvY29udmVydGVkIGZpbGVzICovCi0gICAgICAgICAgICAvKiBzbywgd2UgZGVsZXRlIHRoZXNlIGZpbGVzIGFuZCByZW1vdmUgdGhlbSBmcm9tIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtc19zYXV2OwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZUluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfc2F1djsKLSAgICAgICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19iZ20gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlLCB3ZSBkbyBub3QgZGVsZXRlIEJHTSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+aXNCR00gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfYmdtID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qUFIgUDRNRTAwMDAzMTgyIGluaXRpYWxpemUgdGhpcyBwb2ludGVyIGJlY2F1c2UgdGhlIGZvbGxvd2luZyBwYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgd2lsbCBiZSBkZWFsbG9jYXRlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFBhcmFtcy0+aXNCR00gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19iZ20tPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtc19iZ207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBNYXliZSBuZWVkIHRvIGltcGxlbWVudCBmcmFtZXJhdGUgY2hhbmdpbmcgKi8KLSAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVW5hbGxvY2F0ZSBwcmV2aW91cyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7Ci0KLSAgICAgICAgLypVbmFsbG9jYXRlIG91dHB1dCBmaWxlIHBhdGgqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBDbGlwcyByZWdpc3RlcmluZwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBDb3B5IHNldHRpbmdzIGZyb20gdXNlciBnaXZlbiBzdHJ1Y3R1cmUgdG8gb3VyICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgLyp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlOyovCi0gICAgLypGQjogVkFMIENSIFA0TUUwMDAwMzA3NgotICAgIFRoZSBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIGJpdHJhdGUgYXJlIGdpdmVuIGJ5IHRoZSB1c2VyIGluIHRoZSBlZGl0aW9uIHNldHRpbmdzIHN0cnVjdHVyZSovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5QVFZvbExldmVsID0gcFNldHRpbmdzLT5QVFZvbExldmVsOwotCi0gICAgLypGQjogYnVnIGZpeCBpZiB0aGUgb3V0cHV0IHBhdGggaXMgZ2l2ZW4gaW4gTTR4VlNTX3NlbmRDb21tYW5kKi8KLQotICAgIGlmKCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgcFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotICAgICAgICAvKkFzIGFsbCBpbnB1dHMgb2YgdGhlIHhWU1MgYXJlIGluIFVURjgsIGNvbnZlcnQgdGhlIG91dHB1dCBmaWxlIHBhdGggaW50byB0aGUKLSAgICAgICAgY3VzdG9tZXIgZm9ybWF0Ki8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU2VuZENvbW1hbmQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBsZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAocFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm91dHB1dCBmaWxlIHBhdGgiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSArIDEpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSAwOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyID0gcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlID0gcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0KLSAgICAgICAgMDsgLyogV2l0aCBWU1MgMi4wLCB0aGlzIG5ldyBwYXJhbSBpcyBtYW5kYXRvcnkgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdDsgLyogQ1IgdGV4dCBoYW5kbGluZyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplOwotCi0gICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAhPSAwIFwKLSAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ICE9IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19TZW5kQ29tbWFuZDogSW1wb3NzaWJsZSB0byBsaW1pdCBmaWxlXAotICAgICAgICAgICAgICAgICAgICAgICBzaXplIHdpdGggb3RoZXIgYXVkaW8gb3V0cHV0IHRoYW4gQUFDIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwgPSAwOwotICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgPSAwOwotCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ICE9IE00VklERU9FRElUSU5HX2tNUEVHNAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAhPSBNNFZJREVPRURJVElOR19rSDI2MwotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAhPSBNNFZJREVPRURJVElOR19rSDI2NCApCi0gICAgewotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotICAgIH0KLQotICAgIC8qIEdldCBvdXRwdXQgd2lkdGgvaGVpZ2h0ICovCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDEyODsKLSAgICAgICAgICAgIGhlaWdodCA9IDk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDE2MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDMyMDsKLSAgICAgICAgICAgIGhlaWdodCA9IDI0MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIHdpZHRoID0gMzUyOwotICAgICAgICAgICAgaGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgd2lkdGggPSA2NDA7Ci0gICAgICAgICAgICBoZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgICAgIHdpZHRoID0gODAwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgIHdpZHRoID0gNzIwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiAtUFIgTFY1ODA3ICovCi0gICAgICAgICAgICAvKiArQ1IgR29vZ2xlICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDM2MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0KLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLQotICAgICAgICAgICAgd2lkdGggPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLQotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBoZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICAgICAgICAgIHdpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIHdpZHRoID0gOTYwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICAgICAgd2lkdGggPSAxOTIwOwotICAgICAgICAgICAgaGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogLUNSIEdvb2dsZSAqLwotICAgICAgICBkZWZhdWx0OiAvKiBJZiBvdXRwdXQgdmlkZW8gc2l6ZSBpcyBub3QgZ2l2ZW4sIHdlIHRha2UgUUNJRiBzaXplICovCi0gICAgICAgICAgICB3aWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBHZXQgb3V0cHV0IFNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMTYwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAyMjA1MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDI0MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMzIwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA0NDEwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDQ4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA4MDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAxNjAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgY2xpcC90cmFuc2l0aW9ucyBpZiBjbGlwIG51bWJlciBpcyBub3QgbnVsbCAuLi4gKi8KLSAgICBpZiggMCA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPQotICAgICAgICAgICAgKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikqeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MsIGNvcHkgb2YgcENsaXBMaXN0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKiBTZXQgY2xpcCBsaXN0IHRvIE5VTEwgKi8KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCwwLAotICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgICAgICp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqKiApIFwKLSAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICooeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSBcCi0gICAgICAgICAgICAgICAgInhWU1MsIGNvcHkgb2YgcFRyYW5zaXRpb25MaXN0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogU2V0IHRyYW5zaXRpb24gbGlzdCB0byBOVUxMICovCi0gICAgICAgICAgICBtZW1zZXQoCi0gICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0LDAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikKLSAgICAgICAgICAgICAgICAqKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBlbHNlLCB0aGVyZSBpcyBhIHBiIGluIHRoZSBpbnB1dCBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gY2xpcCBpbiB0aGlzIHNldHRpbmdzIGxpc3QgISEiKTsKLSAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgIC8qKi8KLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBSQyBBbGxvY2F0ZSBlZmZlY3RzIHNldHRpbmdzICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotCi0gICAgaWYoIDAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzICkKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHMgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImVmZmVjdHMgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKkZCIGJ1ZyBmaXggMTkuMDMuMjAwODogdGhlc2UgcG9pbnRlcnMgd2VyZSBub3QgaW5pdGlhbGl6ZWQgLT4gY3Jhc2ggd2hlbiBmcmVlKi8KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggPQotICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0KLSAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqLwotICAgIH0KLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnRhcmdldGVkVGltZXNjYWxlID09IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHBUYXJnZXRlZFRpbWVTY2FsZSA9IDA7Ci0KLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGUoeFZTU19jb250ZXh0LCBwU2V0dGluZ3MsCi0gICAgICAgICAgICAmcFRhcmdldGVkVGltZVNjYWxlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgfHwgcFRhcmdldGVkVGltZVNjYWxlID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IHBUYXJnZXRlZFRpbWVTY2FsZTsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRvdGFsIGR1cmF0aW9uIHZhcmlhYmxlICovCi0gICAgdG90YWxEdXJhdGlvbiA9IDA7Ci0KLSAgICAvKiBQYXJzaW5nIGxpc3Qgb2YgY2xpcHMgZ2l2ZW4gYnkgYXBwbGljYXRpb24sIGFuZCBwcmVwYXJlIGFuYWx5emluZyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qIEFsbG9jYXRlIGN1cnJlbnQgY2xpcCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIFwKLSAgICAgICAgICAgIChzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyksIE00VlMsIChNNE9TQV9DaGFyICopImNsaXAgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29weSBjbGlwIHNldHRpbmdzIGZyb20gZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciB4VlNTX2NvbnRleHQgc3RydWN0dXJlICovCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyByZXR1cm4gZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIGlmKCBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZXh0ZXJuYWwgZWZmZWN0IGNvbnRleHQgdG8gTlVMTCwgdG8ga25vdyBpZiBpbnB1dCBqcGcgaGFzIGFscmVhZHkgYmVlbgotICAgICAgICAgICAgZGVjb2RlZCBvciBub3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT5WaWRlb1RyYW5zaXRpb25UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdHJhbnNpdGlvbiB0eXBlIGlzIGFscGhhIG1hZ2ljLCB3ZSBuZWVkIHRvIGRlY29kZSBpbnB1dCBmaWxlICovCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYzoKLSAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgb3VyIGFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSB0byBoYXZlIGEgY29weSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgb25lICovCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIklucHV0IEFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBhbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgdG91IG91cgotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBvdXIgYWxwaGEgbWFnaWMgaW5wdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGggPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+cEFscGhhRmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICArIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJBbHBoYSBtYWdpYyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBhbHBoYSBtYWdpYyBmaWxlbmFtZSB0byBvdXIgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTkNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLCBzdHJsZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoKSArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIGFsbCB0cmFuc2l0aW9uIHRvIGtub3cgaWYgdGhlIGlucHV0IGpwZyBoYXMgYWxyZWFkeSBiZWVuIGRlY29kZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCBpOyBqKysgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtqXS0+VmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLCAoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFscGhhU2V0dGluZ3M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgMSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5wUGxhbmUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSktPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MudHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+YmxlbmRpbmdQZXJjZW50ID4gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+YmxlbmRpbmdQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAxMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQpICogMjU1IC8gMjAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPmlzcmV2ZXJzZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5pc3JldmVyc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgdGhlIGlucHV0IGpwZyBmaWxlIGZvciBhbHBoYSBtYWdpYyBoYXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVlbiBkZWNvZGVkIC0+IG5vIG5lZGQgdG8gZGVjb2RlIGl0IGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQWxwaGFNYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGpwZyBoYXMgbm90IGJlZW4gZGVjb2RlZCB5ZXQgLi4uICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0Ci0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKm91dHB1dFBsYW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyAqYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBnZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aF9BUkdCODg4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHRfQVJHQjg4OCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+aGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUcmFuc2l0aW9uTGlzdE00eFZTU19TZW5kQ29tbWFuZCB3aWR0aCBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhfQVJHQjg4OCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRyYW5zaXRpb25MaXN0TTR4VlNTX1NlbmRDb21tYW5kIGhlaWdodCEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodF9BUkdCODg4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRwdXQgcGxhbmUgZm9yIEFscGhhIG1hZ2ljIHRyYW5zaXRpb24iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG91dHB1dFBsYW5lID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV9zdHJpZGUgPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCggd2lkdGggKiBoZWlnaHQgKiAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jIGZvciB0aGUgQWxwaGEgbWFnaWMgcGFjX2RhdGEgb3V0cHV0IFlVViIpOwotICAgICAgICAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggb3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXRwdXRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfd2lkdGggPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMV0udV9oZWlnaHQgPSBoZWlnaHQgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS51X3N0cmlkZSA9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSA9IG91dHB1dFBsYW5lWzBdLnBhY19kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXRQbGFuZVswXS51X3dpZHRoICogb3V0cHV0UGxhbmVbMF0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X3dpZHRoID0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0ID0gaGVpZ2h0ID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0udV9zdHJpZGUgPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEgPSBvdXRwdXRQbGFuZVsxXS5wYWNfZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0UGxhbmVbMV0udV93aWR0aCAqIG91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5wQWxwaGFGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgRW5kIG9mIHRoZSBjb252ZXJzaW9uLCB1c2UgdGhlIGRlY29kZWQgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBjb252ZXJ0ICsgcmVzaXppbmcgZnJvbSBBUkdCODg4OCB0byB5dXY0MjAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCBvdXRwdXRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aF9BUkdCODg4LCBoZWlnaHRfQVJHQjg4OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXRwdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0cHV0UGxhbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBkZWNvZGluZyBhbHBoYSBtYWdpYyBKUEVHOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhbHBoYSBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopIkFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSAyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPnBQbGFuZSA9IG91dHB1dFBsYW5lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50ID4gMCAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQgPD0gMTAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50KSAqIDI1NSAvIDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5pc3JldmVyc2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzcmV2ZXJzZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGFscGhhU2V0dGluZ3MtPmJsZW5kaW5ndGhyZXNob2xkID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPSBNNHhWU1NfQWxwaGFNYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgKnNsaWRlU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZVNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKikiSW50ZXJuYWwgc2xpZGUgdHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBzbGlkZVNldHRpbmdzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBKdXN0IGNvcHkgdGhlIGxvbmUgcGFyYW1ldGVyIGZyb20gdGhlIGlucHV0IHNldHRpbmdzIHRvIHRoZSBpbnRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlU2V0dGluZ3MtPmRpcmVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MudHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncy0+ZGlyZWN0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBuZWVkIHRvIGtlZXAgb3VyIGNvcHkgb2YgdGhlIHNldHRpbmdzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0gJk00eFZTU19TbGlkZVRyYW5zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IHNsaWRlU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9GYWRlQmxhY2s6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9ICZNNHhWU1NfRmFkZUJsYWNrVHJhbnNpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5FeHRWaWRlb1RyYW5zaXRpb25GY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0OwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9UcmFuc2l0aW9uVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2gKLQotICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsX2R1cmF0aW9uIHdpdGggdHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgICAgICAgICAgdG90YWxEdXJhdGlvbiAtPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09Ci0gICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb20pIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF9pbWdbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfaW1nX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEFSR0JGaWxlSW47Ci0gICAgICAgICAgICAgICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0KLSAgICAgICAgICAgICAgICAvKiBQYXJzZSBQdG8zR1BQIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgUHRvM2dwcCBQYXJhbSBjaGFpbmVkIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZUluKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDbXBSZXN1bHQgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuTWVkaWFSZW5kZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyApCi0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBKUEcgZmlsZW5hbWUgd2l0aCBleGlzdGluZyAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlcGxhY2VBUkdCXzNHUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUsIGluIGNhc2Ugc29tZSBwaWN0dXJlcyBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBiZXR3ZWVuIHR3byAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsbHMgdG8gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0X2ltZywgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsIChNNE9TQV9DaGFyICopIiVzaW1nJWQuM2dwIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF9pbWdfdG1wLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSwgIiVzaW1nJWQudG1wIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICNlbmRpZiAvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4Kys7Ci0KLSAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBsYXN0IGVsZW1lbnQgUHRvM0dQUCBwYXJhbXMgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9IChNNHhWU1NfUHRvM0dQUF9wYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19QdG8zR1BQX3BhcmFtcyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkVsZW1lbnQgb2YgUHRvM0dQUCBQYXJhbXMiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBQcm9ibGVtIHdoZW4gYWxsb2NhdGluZyBvbmUgZWxlbWVudCBQdG8zR1BQIFBhcmFtcyIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZXMgcGZpbGV4eHggbWVtYmVycyBvZiBwUGFyYW1zIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGNvcnJlY3RseSAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9IE00eFZTU19rUmVzaXppbmc7Ci0KLSAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOmdldCB0aGUgd2lkdGggYW5kIGhlaWdodCAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmhlaWdodCA9IHBTZXR0aW5ncy0+cENsaXBMaXN0WwotICAgICAgICAgICAgICAgICAgICBpXS0+Q2xpcFByb3BlcnRpZXMudWlTdGlsbFBpY0hlaWdodDsgLy9BUkdCX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+d2lkdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgICAgIGldLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGg7IC8vQVJHQl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJDTElQIE00eFZTU19TZW5kQ29tbWFuZCBBUkdCODg4OCBIID0gJWQiLCBwUGFyYW1zLT5oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIkNMSVAgTTR4VlNTX1NlbmRDb21tYW5kIEFSR0I4ODg4IFcgPSAlZCIsIHBQYXJhbXMtPndpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgeFZTUyBjb250ZXh0IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgZWxlbWVudCBpbiBjYXNlIG9mIG90aGVyIGZpbGUgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQdG8zR1BQX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0LT5wTmV4dCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgc2F2ZSBvZiBsYXN0IGVsZW1lbnQgb2YgdGhlIGNoYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFB0bzNHUFBfbGFzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgdGhlIGxhc3QgTTR4VlNTX1B0bzNHUFBfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBkdXJhdGlvbiBpcyBmaWxsZWQsIGxldCdzIHVzZSBpdCBpbnN0ZWFkIG9mIEVuZEN1dFRpbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24gIT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPklucHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwgKE00T1NBX1ZvaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogcENvbnZGcm9tVVRGOEZjdCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayB0aGF0IEpQRyBmaWxlIGlzIHByZXNlbnQgb24gdGhlIEZTIChQNE1FMDAwMDI5NzQpIGJ5IGp1c3Qgb3BlbmluZwotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjbG9zaW5nIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5vcGVuUmVhZCgmcEFSR0JGaWxlSW4sIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBvcGVuIGlucHV0IGpwZyBmaWxlICVzLCBlcnJvcjogMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JGaWxlSW4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBjbG9zZSBpbnB1dCBqcGcgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF9pbWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF9pbWcsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlB0bzNHUFAgUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVPdXQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCi0KLSAgICAjaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfaW1nX3RtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0X2ltZ190bXAsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJQdG8zR1BQIFBhcmFtczogZmlsZSB0ZW1wIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZVRlbXAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZVRlbXAsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0gICAgI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgUGFuQW5kWm9vbSBzZXR0aW5ncyBpZiBuZWVkZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLmlzUGFuWm9vbSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNQYW5ab29tID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBQYW4gJiBab29tIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGIgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWIgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFliOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzUGFuWm9vbSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyorIFBSIE5vOiBibHJueHBzdyMyMjMqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypJbnRpYWxpemluZyB0aGUgVmlkZW8gRnJhbWUgUmF0ZSBhcyBpdCBtYXkgbm90IGJlIGludGlhbGl6ZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypPdGhlciBjaGFuZ2VzIG1hZGUgaXMgQCBNNHhWU1NfSW50ZXJuYWwuYyBAIGxpbmUgMTUxOCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDMzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gNDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA1MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDY2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA4MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAxMzM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk1ha2luZyBEZWZhdWx0IEZyYW1lIFJhdGUgQCAxNSBGUFMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA2NjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKi1QUiBObzogYmxybnhwc3cjMjIzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tDcm9wcGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKys7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBiVHJhbnNjb2RpbmdSZXF1aXJlZCB0byBUUlVFIHRvIGluZGljYXRlIHRoZSBrZW5idXJuIHZpZGVvIGhhcwotICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWVuIGdlbmVyYXRlZCBpbiBhbmFseXNpcyBwaGFzZSwgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgdGFuc2NvZGVkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGluIHNhdmluZyBwaGFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsKLQotICAgIHJlcGxhY2VBUkdCXzNHUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPSBwUGFyYW1zLT5kdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjaW5nIGluIFZTUyBzdHJ1Y3R1cmUgdGhlIEpQRyBmaWxlIGJ5IHRoZSAzZ3AgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byBVVEY4LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwUGFyYW1zLT5wRmlsZU91dDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFBhcmFtcy0+cEZpbGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSksIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgZmlsZSBwYXRoIG9mIEFSR0IgdG8gM2dwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCAobGVuZ3RoICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGMTYgY29udmVyc2lvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDNHUCBpbnB1dCBmaWxlIHR5cGUgY2FzZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000ViApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKiBOZWVkIHRvIGNhbGwgTUNTIGluIGNhc2UgM0dQIHZpZGVvL2F1ZGlvIHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZQotICAgICAgICAgICAgKEgyNjMvTVBFRzQgb3IgQU1STkIvQUFDKSAqLwotICAgICAgICAgICAgLyogPT4gTmVlZCB0byBmaWxsIE1DU19QYXJhbXMgc3RydWN0dXJlIHdpdGggdGhlIHJpZ2h0IHBhcmFtZXRlcnMgISAqLwotICAgICAgICAgICAgLyogTmVlZCBhbHNvIHRvIHBhcnNlIE1DUyBwYXJhbXMgc3RydWN0IHRvIGNoZWNrIGlmIGZpbGUgaGFzIGFscmVhZHkgYmVlbiB0cmFuc2NvZGVkICovCi0KLSAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXM7Ci0gICAgICAgICAgICBNNE9TQV9Cb29sIGF1ZGlvSXNEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgdmlkZW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgTTRPU0FfQm9vbCBiQXVkaW9Nb25vOwotICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBmaWxlIHByb3BlcnRpZXMgc3RydWN0dXJlICovCi0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKSAmZmlsZVByb3BlcnRpZXMsMCwKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMpKTsKLQotICAgICAgICAgICAgLy9maWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotCi0gICAgICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBwZXJjZW50YWdlIGN1dCB0aW1lICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IDEwMCB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5DdXRQZXJjZW50ID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGVzZSBwZXJjZW50YWdlIGN1dCB0aW1lIGhhdmUgcHJvYmFibHkgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgICAgICAvKiBMZXQncyBub3QgdXNlIHRoZW0gYnkgc2V0dGluZyB0aGVtIHRvIDAgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRW5kQ3V0UGVyY2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUJlZ2luQ3V0UGVyY2VudCA9Ci0gICAgICAgICAgICAgICAgICAgIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgJmZpbGVQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gY29udmVydGVkICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgTUNTIFBhcmFtIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIFVURjgsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVJbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBJZiBpbnB1dCBmaWxlbmFtZXMgYXJlIHRoZSBzYW1lLCBhbmQgaWYgdGhpcyBpcyBub3QgYSBCR00sIHdlIGNhbiByZXVzZQotICAgICAgICAgICAgICAgICAgICB0aGUgdHJhbnNjb2RlZCBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgJiYgcFBhcmFtcy0+aXNCR00gPT0gTTRPU0FfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFBhcmFtcy0+RW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFBhcmFtcy0+RW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUgPT0gMTAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIDNHUCBmaWxlbmFtZSB3aXRoIHRyYW5zY29kZWQgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVwbGFjZTNHUF8zR1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOdWxsQXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIDNHUCBmaWxlbmFtZSB3aXRoIHRyYW5zY29kZWQgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXBsYWNlM0dQXzNHUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUsIGluIGNhc2Ugc29tZSAzR1AgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkCi0gICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdHdvICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGNhbGxzIHRvIE00eFZTU19zZW5kQ29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIHBlcmNlbnRhZ2UgaW5mb3JtYXRpb24gbGV0J3MgdXNlIGl0Li4uICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQgIT0gMAotICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlCZWdpbkN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBwZXJjZW50YWdlIGluZm9ybWF0aW9uIGFyZSBub3QgY29ycmVjdCBhbmQgaWYgZHVyYXRpb24gZmllbGQgaXMgbm90IGZpbGxlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICA8PSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudCkKLSAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBCYWQgcGVyY2VudGFnZSBmb3IgYmVnaW4gYW5kIGVuZCBjdXQgdGltZSAhIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFdlIHRyYW5zZm9ybSB0aGUgcGVyY2VudGFnZSBpbnRvIGFic29sdXRlIHRpbWUgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA9IChNNE9TQV9VSW50MzIpKAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICAqIGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC8gMTAwKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPSAoTTRPU0FfVUludDMyKSgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICogZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLyAxMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogLi4uT3RoZXJ3aXNlLCB3ZSB1c2UgYWJzb2x1dGUgdGltZS4gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBlbmRDdXRUaW1lID09IDAsIGl0IG1lYW5zIGFsbCB0aGUgZmlsZSBpcyB0YWtlbi4gTGV0J3MgY2hhbmdlIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgZHVyYXRpb24sIHRvIGFjY3VyYXRlIHByZXZpZXcuICovCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9PSAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA+IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIGR1cmF0aW9uIGZpZWxkIGlzIGZpbGxlZCwgaXQgaGFzIHByaW9yaXR5IG9uIG90aGVyIGZpZWxkcyBvbiBFbmRDdXRUaW1lLAotICAgICAgICAgICAgIHNvIGxldCdzIHVzZSBpdCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbiAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAreFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA+IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIG91dHB1dCB2aWRlbyBmb3JtYXQgaXMgbm90IHNldCwgd2UgdGFrZSB2aWRlbyBmb3JtYXQgb2YgdGhlIGZpcnN0IDNHUCB2aWRlbyAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICAvL000T1NBX1RSQUNFMl8xKCJPdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIHNldCBpdCB0byBjdXJyZW50IGNsaXA6ICVkIiwKLSAgICAgICAgICAgICAgICAvLyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJPdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIGFuIGVycm9yIHBhcmFtZXRlciBpcyByZXR1cm5lZC4iKTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKAotICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IGF1ZGlvIGZvcm1hdCBpcyBub3Qgc2V0IC0+IHJlbW92ZSBhdWRpbyB0cmFjayBvZiBjbGlwOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJBdWRpb01vbm8gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQUFDCi0gICAgICAgICAgICAgICAgJiYgKGZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gc2FtcGxpbmdGcmVxCi0gICAgICAgICAgICAgICAgfHwgYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8pKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgLyogSWYgd2Ugd2FudCB0byByZXBsYWNlIGF1ZGlvLCB0aGVyZSBpcyBubyBuZWVkIHRvIHRyYW5zY29kZSBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogdGVtcCBmaXggOlBUIHZvbHVtZSBub3QgaGVyYWQgaW4gdGhlIHNlY29uZCBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCAvKihwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9PSAxMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCovCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKSAvKjExLzEyLzIwMDggQ1IgMzI4MyBWQUwgZm9yIHRoZSBNTVMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBjYXNlLCB3ZSBuZWVkIHRvIHRyYW5zY29kZSBleGNlcHQgdGhlIG1lZGlhIHdpdGhvdXQgYXVkaW8qLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0lzRGlmZmVyZW50ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEhlcmUgY2hlY2sgdGhlIGNsaXAgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwsIGlmIGl0IGV4Y2VlZHMKLSAgICAgICAgICAgICAqIHRoZSBwcm9maWxlIGFuZCBsZXZlbCBvZiBleHBvcnQgZmlsZSwgdGhlbiB0aGUgZmlsZSBuZWVkcwotICAgICAgICAgICAgICogdG8gYmUgdHJhbnNjb2RlZChkbyBub3QgZG8gY29tcHJlc3MgZG9tYWluIHRyaW0pLgotICAgICAgICAgICAgICogQWxzbyBmb3IgTVBFRzQgZm9tYXJ0LCBhbHdheXMgZG8gdHJhbnNjb2Rpbmcgc2luY2UgSFcgZW5jb2RlcgotICAgICAgICAgICAgICogbWF5IHVzZSBkaWZmZXJlbnQgdGltZSBzY2FsZSB2YWx1ZSB0aGFuIHRoZSBpbnB1dCBjbGlwKi8KLSAgICAgICAgICAgaWYgKChmaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA+Ci0gICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUpIHx8Ci0gICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCA+Ci0gICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsKSB8fAotICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSkgewotICAgICAgICAgICAgICAgLyogU2V0IGJUcmFuc2NvZGluZ1JlcXVpcmVkIHRvIFRSVUUgdG8gaW5kaWNhdGUgdGhlIHZpZGVvIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAqIHRyYW5zY29kZWQgaW4gTUNTLiAqLwotICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICB2aWRlb0lzRGlmZmVyZW50ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggdmlkZW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFIHx8IGF1ZGlvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLQotICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0XzNncCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsIChNNE9TQV9DaGFyICopIiVzdmlkJWQuM2dwIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0XzNncF90bXAsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxLCAiJXN2aWQlZC50bXAiLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRPU0FfY2hyU1ByaW50ZjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCsrOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJFbGVtZW50IG9mIE1DUyBQYXJhbXMgKGZvciAzR1ApIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogUHJvYmxlbSB3aGVuIGFsbG9jYXRpbmcgb25lIGVsZW1lbnQgTUNTIFBhcmFtcyIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0gTTR4VlNTX2tSZXNpemluZzsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT52aWRlb2NsaXBudW1iZXIgPSBpOyAvLyBJbmRpY2F0ZXMgdmlkZW8gY2xpcCBpbmRleAotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSB4VlNTIGNvbnRleHQgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICBwTUNTX2xhc3QtPnBOZXh0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgZWxlbWVudCBpbiBjYXNlIG9mIG90aGVyIGZpbGUgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgIHBNQ1NfbGFzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19NQ1NfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5JbnB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvVGltZXNjYWxlID0geFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZTsKLQotICAgICAgICAgICAgICAgIC8qIFdlIGRvIG5vdCBuZWVkIHRvIHJlZW5jb2RlIHZpZGVvIGlmIGl0cyBwYXJhbWV0ZXJzIGRvIG5vdCBkaWZmZXIgKi8KLSAgICAgICAgICAgICAgICAvKiBmcm9tIG91dHB1dCBzZXR0aW5ncyBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgaWYoIHZpZGVvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKkZCOiBWQUwgQ1IgUDRNRTAwMDAzMDc2Ci0gICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gYml0cmF0ZSBpcyBub3cgZGlyZWN0bHkgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gdGhlIGVkaXRpb24KLSAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mgc3RydWN0dXJlIElmIHRoZSBiaXRyYXRlIGdpdmVuIGJ5IHRoZSB1c2VyIGlzIGlycmVsZXZhbnQKLSAgICAgICAgICAgICAgICAgICAgKHRoZSBNQ1MgbWluaW11bSBhbmQgbWF4aW11bSB2aWRlbyBiaXRyYXRlIGFyZSB1c2VkKSwKLSAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB2aWRlbyBiaXRyYXRlIGlzIGhhcmRjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIG91dHB1dCB2aWRlbyBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPj0gTTRWSURFT0VESVRJTkdfazE2X0tCUFMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazhfTUJQUyApIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s0OF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxMjhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNTEyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogU2hvdWxkIG5vdCBoYXBwZW4gISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5vdXRwdXRWaWRlb1Byb2ZpbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa051bGxWaWRlbzsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazE1X0ZQUzsgLyogTXVzdCBiZSBzZXQsIG90aGVyd2lzZSwgTUNTIHJldHVybnMgYW4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggYXVkaW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0OwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOb25lQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBhdWRpbyBiaXRyYXRlIGluIHRoZSBBQUMgY2FzZSBpcyBub3cgZGlyZWN0bHkgZ2l2ZW4gYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgaW4gdGhlIGVkaXRpb24gc2V0dGluZ3Mgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBiaXRyYXRlIGdpdmVuIGJ5IHRoZSB1c2VyIGlzIGlycmVsZXZhbnQgb3IgdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgTUNTIG1pbmltdW0gYW5kIG1heGltdW0gYXVkaW8gYml0cmF0ZSBhcmUgdXNlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpcyBoYXJkIGNvZGVkIGFjY29yZGluZyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgYXVkaW8gYml0cmF0ZSBpcyBjb3JyZWN0bHkgZGVmaW5lZCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DUyB2YWx1ZXMgZm9yIEFBQyBNb25vIGFyZSBtaW46IDE2a2JwcyBhbmQgbWF4OiAxOTIga2JwcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypTdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMzJrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2szMl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgYXVkaW8gYml0cmF0ZSBpcyBoYXJkIGNvZGVkIGFjY29yZGluZyB0byB0aGUgb3V0cHV0IGF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBmcmVxdWVuY3kqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2syNF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJpdHJhdGUgaGF2ZSB0byBiZSBkb3VibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfazgwMDBfQVNGICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJldmVudCBmcm9tIHVuYWxsb3dlZCBzYW1wbGluZyBmcmVxdWVuY2llcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBTaG91bGQgbm90IGhhcHBlbiAhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FNUl9OQjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa051bGxBdWRpbzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIGluIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlSW4sICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3AsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVPdXQsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KLQotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gb3V0XzNncF90bXA7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0XzNncF90bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIDNHUCBQYXJhbXM6IGZpbGUgdGVtcCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlVGVtcCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAvKkZCIDIwMDgvMTAvMjAga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8sIGFkZCBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyKi8KLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rQ3JvcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tSZXNpemluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLypGQjogdHJhbnNjb2RpbmcgcGVyIHBhcnRzKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5CZWdpbkN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5FbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzQkdNID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICAgICAgICAgIGJJc1RyYW5zY29kaW5nID0gTTRPU0FfVFJVRTsKLQotcmVwbGFjZTNHUF8zR1A6Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgLSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAgICAgICAgIC8qIFJlcGxhY2luZyBpbiBWU1Mgc3RydWN0dXJlIHRoZSBvcmlnaW5hbCAzR1AgZmlsZSBieSB0aGUgdHJhbnNjb2RlZCAzR1AgZmlsZSAqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVPdXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBmaWxlIHBhdGggb2YgM2dwIHRvIDNncCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCAobGVuZ3RoICsgMSkpOwotICAgICAgICAgICAgICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSBiZWNhdXNlIG9mIFVURiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLQotICAgICAgICAgICAgICAgIC8qIFdlIGRlZmluZSBtYXN0ZXIgY2xpcCBhcyBmaXJzdCAzR1AgaW5wdXQgY2xpcCAqLwotICAgICAgICAgICAgICAgIC8qaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9PSAwICYmIGZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdG90YWwgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAtIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogV2UgZGVmaW5lIG1hc3RlciBjbGlwIGFzIGZpcnN0IDNHUCBpbnB1dCBjbGlwICovCi0gICAgICAgICAgICBpZiggbWFzdGVyQ2xpcCA9PSAtMQotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICBPdGhlciBpbnB1dCBmaWxlIHR5cGUgY2FzZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBmaWxlIHR5cGUgYXMgaW5wdXQgY2xpcCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiBQYXJzZSBhbGwgZWZmZWN0cyB0byBtYWtlIHNvbWUgYWRqdXN0bWVudCBmb3IgZnJhbWluZywgKgotICAgICogdGV4dCBhbmQgdG8gdHJhbnNmb3JtIHJlbGF0aXZlIHRpbWUgaW50byBhYnNvbHV0ZSB0aW1lICoKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGZvciAoIGogPSAwOyBqIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsgaisrICkKLSAgICB7Ci0gICAgICAgIC8qIENvcHkgZWZmZWN0IHRvICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICh2b2lkICopICYocFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBlZmZlY3QgcGVyY2VudGFnZSB0aW1lICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRHVyYXRpb25QZXJjZW50ID4gMTAwCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpU3RhcnRQZXJjZW50ID4gMTAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlc2UgcGVyY2VudGFnZSB0aW1lIGhhdmUgcHJvYmFibHkgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgIC8qIExldCdzIG5vdCB1c2UgdGhlbSBieSBzZXR0aW5nIHRoZW0gdG8gMCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aUR1cmF0aW9uUGVyY2VudCA9IDA7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpU3RhcnRQZXJjZW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHdlIGhhdmUgcGVyY2VudGFnZSBpbmZvcm1hdGlvbiBsZXQncyB1c2UgaXQuLi4gT3RoZXJ3aXNlLCB3ZSB1c2UgYWJzb2x1dGUgdGltZS4gKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lID0gKE00T1NBX1VJbnQzMikodG90YWxEdXJhdGlvbgotICAgICAgICAgICAgICAgICogeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVN0YXJ0UGVyY2VudAotICAgICAgICAgICAgICAgIC8gMTAwKTsKLSAgICAgICAgICAgIC8qIFRoZSBwZXJjZW50YWdlIG9mIGVmZmVjdCBkdXJhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZHVyYXRpb24gb2YgdGhlIGNsaXAgLQotICAgICAgICAgICAgc3RhcnQgdGltZSAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIEVmZmVjdHNbal0udWlEdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHRvdGFsRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQKLSAgICAgICAgICAgICAgICAvIDEwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIGZyYW1pbmcgZWZmZWN0LCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZyYW1pbmcgZWZmZWN0IHN0cnVjdHVyZSAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nICkKLSAgICAgICAgewotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgIE00eFZTU19GcmFtaW5nQ29udGV4dCAqZnJhbWluZ0N0eDsKLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0jZWxzZQotCi0gICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqZnJhbWluZ0N0eDsKLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgICAgICAgICBNNE9TQV9DaGFyICpwRXh0MiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgcmVzdWx0MSwgcmVzdWx0MjsKLQotICAgICAgICAgICAgLyogQ29weSBmcmFtaW5nIGZpbGUgcGF0aCAqLwotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICsgMSwgTTRWUywgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLCBzdHJsZW4oCi0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpICsgMSk7Ci0KLSAgICAgICAgICAgICAgICBwRXh0MiA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nQ29udGV4dCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5iRWZmZWN0UmVzaXplID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLmJSZXNpemU7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBGaWxlUmVhZFB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEZpbGVXcml0ZVB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cjsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmVmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS51aUR1cmF0aW9uOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9Jc0ZpbGVHaWYgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9hbmltYXRlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiBPdXRwdXQgcmF0aW8gZm9yIHRoZSBlZmZlY3QgaXMgc3RvcmVkIGluIHVpRmlmdGllc091dEZyYW1lUmF0ZSBwYXJhbWV0ZXJzIG9mIHRoZQotICAgICAgICAgICAgZXh0ZW5kZWQgeFZTUyBlZmZlY3RzIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlCi0gICAgICAgICAgICAgICAgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+ZnJhbWVEdXJhdGlvblJhdGlvID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0Zsb2F0KSgoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpRmlmdGllc091dEZyYW1lUmF0ZSkgLyAxMDAwLjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmZyYW1lRHVyYXRpb25SYXRpbyA9IDEuMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyovCi0gICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBhbHBoYSBibGVuZGluZyBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0cyovCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPSAxMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZSA9IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0ID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAwCi0gICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKkFsbG9jYXRlIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypGaWxsIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lCi0gICAgICAgICAgICAgICAgICAgICsgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAwIC0gZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0jZWxzZQotCi0gICAgICAgICAgICBmcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0KLSAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHg7Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgICAgICAgICAgaWYoIHBFeHQyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlY29kZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB0byB0aGUgZWZmZWN0LCBhbmQgZmlsbCBmcmFtaW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIHBFeHQyICs9IChzdHJsZW4oKGNvbnN0IGNoYXIgKilwRXh0MikgLSA0KTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdDEgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwRXh0MiwoY29uc3QgY2hhciAqKSIucmdiIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0MiA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBFeHQyLChjb25zdCBjaGFyICopIi5SR0IiKTsKLQotICAgICAgICAgICAgICAgIGlmKCAwID09IHJlc3VsdDEgfHwgMCA9PSByZXN1bHQyICkKLSAgICAgICAgICAgICAgICB7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGOiBDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBTUFMgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLyogT25seSB1c2VkIGJ5IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLSAgICAgICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPndpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1Mud2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJGUkFNTUlORyBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+d2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRlJBTU1JTkcgQkVGT1JFIE00eFZTU19TZW5kQ29tbWFuZCAgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPmhlaWdodCk7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJGUkFNSU5HIFdJRFRIIEJFRk9SRSBNNHhWU1NfU2VuZENvbW1hbmQgICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT53aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJGUkFNSU5HIEhFSUdIVCBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+aGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVQTkcgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFNQUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE5vdCBzdXBwb3J0ZWQgc3RpbGwgcGljdHVyZSBmb3JtYXQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBQbGFuZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF94OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLQotICAgICAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgJiB+MTsKLSAgICAgICAgICAgICAgICAvKiBJbnB1dCBSR0IgcGxhbmUgaXMgcHJvdmlkZWQsIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcKLSAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV93aWR0aCAmIH4xOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfaGVpZ2h0ICYgfjE7Ci0gICAgICAgICAgICAgICAgLyogSW5wdXQgUkdCIHBsYW5lIGlzIHByb3ZpZGVkLCBsZXQncyBjb252ZXJ0IGl0IHRvIFlVVjQyMCwgYW5kIHVwZGF0ZSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgIHN0cnVjdHVyZSAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eCk7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIFJHQiB0byBZVVY6IDB3JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE5vIGlucHV0IGltYWdlL3BsYW5lIHByb3ZpZGVkIGZvciBmcmFtaW5nIGVmZmVjdC4iKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ1I6IEFkZCB0ZXh0IGhhbmRsaW5nIHdpdGggZXh0ZXJuYWwgdGV4dCBpbnRlcmZhY2UgKi8KLSAgICAgICAgLyogSWYgZWZmZWN0IHR5cGUgaXMgdGV4dCwgd2UgY2FsbCBleHRlcm5hbCB0ZXh0IGZ1bmN0aW9uIHRvIGdldCBSR0IgNTY1IGJ1ZmZlciAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9UZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2FsbCB0aGUgZm9udCBlbmdpbmUgZnVuY3Rpb24gcG9pbnRlciB0byBnZXQgUkdCNTY1IGJ1ZmZlciAqLwotICAgICAgICAgICAgLyogV2UgdHJhbnNmb3JtIHRleHQgZWZmZWN0IGludG8gZnJhbWluZyBlZmZlY3QgZnJvbSBidWZmZXIgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKkZCOiBhZGQgVVRGIGNvbnZlcnRpb24gZm9yIHRleHQgYnVmZmVyKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQgKmZyYW1pbmdDdHg7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqZnJhbWluZ0N0eDsKLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ0NvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iRWZmZWN0UmVzaXplID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5iUmVzaXplOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVJlYWRQdHIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVdyaXRlUHRyID0geFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmVmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0udWlEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iX0lzRmlsZUdpZiA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmJfYW5pbWF0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHg7Ci0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotCi0gICAgICAgICAgICAgICAgLyogQnVnRml4IDEuMi4wOiBMZWFrIHdoZW4gZGVjb2RpbmcgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLQotICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcqLwotICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGFscGhhIGJsZW5kaW5nIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzKi8KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID0gMTAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID0gMTAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIGFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qRmlsbCB0aGUgYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0OwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAxMDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgLSBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCAoZm9yIHRleHQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKiBCdWdGaXggMS4yLjA6IExlYWsgd2hlbiBkZWNvZGluZyBlcnJvciAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0gICAgICAgICAgICAgICAgLyogRkI6IGNoYW5nZXMgZm9yIFZpZGVvIEFydGlzdDogbWVtY29weSBwVGV4dEJ1ZmZlciBzbyB0aGF0IGl0IGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgYWZ0ZXIgYSBjb21wbGV0ZSBhbmFseXNpcyovCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19TZW5kQ29tbWFuZDogcFRleHRCdWZmZXIgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKkNvbnZlcnQgdGV4dCBidWZmZXIgaW50byBjdXN0b21lciBmb3JtYXQgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXI7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSArIDEsCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkxvY2FsIHRleHQgYnVmZmVyIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAvLyBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxLAotICAgICAgICAgICAgICAgIC8vIE00VlMsICJMb2NhbCB0ZXh0IGJ1ZmZlciBlZmZlY3QiKTsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdCi0gICAgICAgICAgICAgICAgICAgIC8vLnhWU1MucFRleHRCdWZmZXIsIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIHRleHQgUkdCIGJ1ZmZlciovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUkdCIHN0cnVjdHVyZSBmb3IgdGhlIHRleHQgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpVGV4dEJ1ZmZlcldpZHRoCi0gICAgICAgICAgICAgICAgICAgID09IDAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVySGVpZ2h0ID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiB0ZXh0IHBsYW5lIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG5vdCBkZWZpbmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGlucHV0IFJHQiB0ZXh0IGJ1ZmZlciBhbmQgZm9yY2UgaXQgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbgotICAgICAgICAgICAgICAgICBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVyV2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aVRleHRCdWZmZXJIZWlnaHQgJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICAyICogZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICogZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJUZXh0IFJHQiBwbGFuZS0+cGFjX2RhdGEiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIC8qIENhbGwgdGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gKi8KLQotICAgICAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBUZXh0UmVuZGVyaW5nRmN0KAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBSZW5kZXJpbmdEYXRhLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGV4dCByZW5kZXJpbmcgZXh0ZXJuYWwgZnVuY3Rpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBSR0IgYnVmZmVyIGlzIHNldCAqLwotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uIGRpZCBub3Qgc2V0IFJHQiBidWZmZXIgY29ycmVjdGx5ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29udmVydCBSR0IgcGxhbmUgdG8gWVVWNDIwIGFuZCB1cGRhdGUgZnJhbWluZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIFJHQiB0byBZVVY6IDB3JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0jZWxzZQotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAvKiBDYWxsIHRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uICovCi0KLSAgICAgICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wUmVuZGVyaW5nRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGV4dCByZW5kZXJpbmcgZXh0ZXJuYWwgZnVuY3Rpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBSR0IgYnVmZmVyIGlzIHNldCAqLwotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gZGlkIG5vdCBzZXQgUkdCIGJ1ZmZlciBjb3JyZWN0bHkgISIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiBwbGFuZSB0byBZVVY0MjAgYW5kIHVwZGF0ZSBmcmFtaW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gY29udmVydGluZyBSR0IgdG8gWVVWOiAwdyV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgICAgICAgICAgICAgLyogQ2hhbmdlIGludGVybmFsbHkgZWZmZWN0IHR5cGUgZnJvbSAidGV4dCIgdG8gZnJhbWluZyAqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZzsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLmJSZXNpemUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTm8gdGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gc2V0ICEhIik7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGRhdGEgbmVlZGVkIGJ5IHRoZSBGaWZ0aWVzIGVmZmVjdCAqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCAqZmlmdGllc0N0eDsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGV4cGVjdGVkIGZyYW1lIHJhdGUgZm9yIHRoZSBmaWZ0aWVzIGVmZmVjdCAobXVzdCBiZSBhYm92ZSAwKSAqLwotICAgICAgICAgICAgaWYoIDAgPT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiVGhlIGZyYW1lIHJhdGUgZm9yIHRoZSBmaWZ0aWVzIGVmZmVjdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwICEiKTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaWZ0aWVzQ3R4ID0gKE00eFZTU19GaWZ0aWVzU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GaWZ0aWVzU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmaWZ0aWVzIGVmZmVjdCIpOwotCi0gICAgICAgICAgICBpZiggZmlmdGllc0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlmdGllc0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+ZmlmdGllc0VmZmVjdER1cmF0aW9uID0gMTAwMCAvIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+c2hpZnRSYW5kb21WYWx1ZSA9IDA7Ci0gICAgICAgICAgICBmaWZ0aWVzQ3R4LT5zdHJpcGVSYW5kb21WYWx1ZSA9IDA7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgdGhlIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIGZpZnRpZXNDdHg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBkYXRhIG5lZWRlZCBieSB0aGUgQ29sb3IgZWZmZWN0ICovCi0gICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNgotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmsKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4KLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmUKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QgKkNvbG9yQ3R4OwotCi0gICAgICAgICAgICBDb2xvckN0eCA9Ci0gICAgICAgICAgICAgICAgKE00eFZTU19Db2xvclN0cnVjdCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0NvbG9yU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBjb2xvciBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIENvbG9yQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb2xvckN0eC0+Y29sb3JFZmZlY3RUeXBlID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGU7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2Ci0gICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbG9yQ3R4LT5yZ2IxNkNvbG9yRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlSZ2IxNklucHV0Q29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29sb3JDdHgtPnJnYjE2Q29sb3JEYXRhID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU2F2ZSB0aGUgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgQ29sb3JDdHg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIEJhY2tncm91bmQgbXVzaWMgcmVnaXN0ZXJpbmcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgJiYgaXNOZXdCR00gPT0gTTRPU0FfVFJVRSApCi0gICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotCi0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zOwotICAgICAgICBNNE9TQV9DaGFyICpvdXRfcGNtOwotICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYKLQotICAgICAgICAvKiBXZSBzYXZlIG91dHB1dCBmaWxlIHBvaW50ZXIsIGJlY2F1c2Ugd2Ugd2lsbCBuZWVkIHRvIHVzZSBpdCB3aGVuIHNhdmluZyBhdWRpbyBtaXhlZAotICAgICAgICAgZmlsZSAobGFzdCBzYXZlIHN0ZXApICovCi0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcG9yYXJ5RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZTsKLQotICAgICAgICAvKiBJZiBhIHByZXZpb3VzIEJHTSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIGRlbGV0ZSBpdCAqLwotICAgICAgICAvKiBIZXJlIGNhbiBiZSBpbXBsZW1lbnRlZCB0ZXN0IHRvIGtub3cgaWYgdGhlIHNhbWUgQkdNIGlzIHJlZ2lzdGVyZWQgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPgotICAgICAgICAgICAgICAgICAgICBwRmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgQkdNICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9Ci0gICAgICAgICAgICAoTTR4VlNTX0JHTVNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikieFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgaW5wdXQgc3RydWN0dXJlIHRvIG91ciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19CR01TZXR0aW5ncykpOwotICAgICAgICAvKiBBbGxvY2F0ZSBmaWxlIG5hbWUsIGFuZCBjb3B5IGZpbGUgbmFtZSBidWZmZXIgdG8gb3VyIHN0cnVjdHVyZSAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0KLSAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoc3RybGVuKHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKQotICAgICAgICAgICAgKyAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBCR00gZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICBzdHJsZW4ocFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpICsgMSk7Ci0KLSNpZmRlZiBQUkVWSUVXX0VOQUJMRUQKLSAgICAgICAgLyogRGVjb2RlIEJHTSB0cmFjayB0byBwY20gb3V0cHV0IGZpbGUgKi8KLQotICAgICAgICBwUGFyYW1zID0KLSAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiRWxlbWVudCBvZiBNQ1MgUGFyYW1zIChmb3IgQkdNKSIpOwotCi0gICAgICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IFByb2JsZW0gd2hlbiBhbGxvY2F0aW5nIG9uZSBlbGVtZW50IE1DUyBQYXJhbXMiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXJzIGluIGNhc2Ugb2YgcHJvYmxlbSAoUFIgMjI3MykgKi8KLSAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBwUGFyYW1zLT5CZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICBwUGFyYW1zLT5FbmRDdXRUaW1lID0gMDsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdAotICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHhWU1MgY29udGV4dCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtczsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19wcmV2ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8gZmluZCBhbmQgZGVsZXRlIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBQQ00gdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXAtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENoYWluIHByZXZpb3VzIGVsZW1lbnQgd2l0aCBuZXh0IGVsZW1lbnQgPSByZW1vdmUgQkdNIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0IGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfcHJldiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2LT5wTmV4dCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgY3VycmVudCBwb2ludGVyIGlzIHRoZSBmaXJzdCBvZiB0aGUgY2hhaW5lZCBsaXN0IGFuZCBuZXh0IHBvaW50ZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgdGhlIGNoYWluZWQgbGlzdCBpcyBOVUxMICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGl0IG1lYW5zIHRoYXQgdGhlcmUgd2FzIG9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogPT4gd2UgcHV0IHRoZSBjb250ZXh0IHZhcmlhYmxlIHRvIE5VTEwgdG8gcmVhZmZlY3QgdGhlIGZpcnN0IGNoYWluZWQgbGlzdAotICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wID09IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfdGVtcC0+cE5leHQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIGNoYW5nZSBmaXJzdCBjaGFpbmVkIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwUGFyYW1zX3RlbXAtPnBOZXh0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfcHJldiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBwUGFyYW1zX3ByZXY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBXZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW5lZCBsaXN0IHRvIGJlIGFibGUgdG8gYWRkIG5ldwotICAgICAgICAgICAgIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zX3ByZXY7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgb25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0ICovCi0gICAgICAgICAgICAgICAgLyogU28sIHdlIG5lZWQgdG8gc2F2ZSB0aGUgbmV3IHBhcmFtcyovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgIHBNQ1NfbGFzdC0+cE5leHQgPSBwUGFyYW1zOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19NQ1NfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgcFBhcmFtcy0+SW5wdXRGaWxlVHlwZSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlOwotICAgICAgICBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ007Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPSBNNFZJREVPRURJVElOR19rMTVfRlBTOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0KLSAgICAgICAgICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICAgICAgICAgIFRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpbiB0aGUgQUFDIGNhc2UgaXMgbm93IGRpcmVjdGx5IGdpdmVuIGJ5IHRoZSB1c2VyKi8KLSAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGF1ZGlvIGJpdHJhdGUgaXMgY29ycmVjdGx5IGRlZmluZWQqLwotICAgICAgICAgICAgLypNb25vCi0gICAgICAgICAgICBNQ1MgdmFsdWVzIGZvciBBQUMgTW9ubyBhcmUgbWluOiAxNmticHMgYW5kIG1heDogMTkyIGticHMqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKlN0ZXJlbwotICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMzJrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2szMl9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtcy0+YkF1ZGlvTW9ubyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0gTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOwotCi0gICAgICAgIC8qIFByZXBhcmUgb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIC8qIDIxIGlzIHRoZSBzaXplIG9mICJwcmV2aWV3XzE2MDAwXzIucGNtIiArIFwwICovCi0gICAgICAgIG91dF9wY20gPQotICAgICAgICAgICAgKE00T1NBX0NoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKQotICAgICAgICAgICAgKyAyMSwgTTRWUywgKE00T1NBX0NoYXIgKikiVGVtcCBjaGFyKiBmb3IgcGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggb3V0X3BjbSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29weSB0ZW1wb3JhcnkgcGF0aCB0byBmaW5hbCBwcmV2aWV3IHBhdGggc3RyaW5nICovCi0gICAgICAgIE00T1NBX2Nock5Db3B5KG91dF9wY20sIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLAotICAgICAgICAgICAgc3RybGVuKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKSArIDEpOwotCi0gICAgICAgIC8qIERlcGVuZGluZyBvZiB0aGUgb3V0cHV0IHNhbXBsZSBmcmVxdWVuY3kgYW5kIG5iIG9mIGNoYW5uZWxzLCB3ZSBjb25zdHJ1Y3QgcHJldmlldwotICAgICAgICBvdXRwdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RydWN0IG91dHB1dCB0ZW1wb3JhcnkgUENNIGZpbGVuYW1lICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0X3BjbSwgKGNvbnN0IGNoYXIgKikicHJldmlld18xNjAwMF8xLnBjbVwwIiwKLSAgICAgICAgICAgICAgICAgICAgMjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfcGNtLCAoY29uc3QgY2hhciAqKSJwcmV2aWV3XzE2MDAwXzIucGNtXDAiLAotICAgICAgICAgICAgICAgICAgICAyMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSBQQ00gZmlsZW5hbWUgKi8KLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfcGNtLCAoY29uc3QgY2hhciAqKSJwcmV2aWV3XzA4MDAwXzEucGNtXDAiLCAyMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggb3V0X3BjbSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgICAgIG91dF9wY20gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIGF1ZGlvIG91dHB1dCBmb3JtYXQgXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gb3V0X3BjbTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgcERlY29kZWRQYXRoID0gb3V0X3BjbTsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfcGNtLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgb3V0X3BjbSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLQotICAgICAgICAvKiBGcmVlIHRlbXBvcmFyeSBvdXRwdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgaWYoIG91dF9wY20gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUob3V0X3BjbSk7Ci0gICAgICAgICAgICBvdXRfcGNtID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyBCR00gUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LCh2b2lkICopIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsCi0gICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLQotICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+Ci0gICAgICAgICAgICAgICAgcEZpbGUsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIEJHTSBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgaW5wdXQgZmlsZSBwYXRoICovCi0KLSAgICAgICAgcFBhcmFtcy0+aXNCR00gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUGFyYW1zLT5pc0NyZWF0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICBiSXNUcmFuc2NvZGluZyA9IE00T1NBX1RSVUU7Ci0jZW5kaWYgLyogUFJFVklFV19FTkFCTEVEICovCi0KLSAgICB9Ci0gICAgZWxzZSBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIGlzTmV3QkdNID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIEJHTSBpcyB0aGUgc2FtZSBhcyBwcmV2aW91c2x5LCBubyBuZWVkIHRvIHJlZGVjb2RlIGF1ZGlvICovCi0gICAgICAgIC8qIE5lZWQgdG8gdXBkYXRlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0LCB0byBzaWduYWwgTTR4VlNTX3N0ZXAgZnVuY3Rpb24gdG8gc2tpcAotICAgICAgICBCR00gZGVjb2RpbmcgKi8KLQotICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc190ZW1wID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfcHJldiA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLSAgICAgICAgLyogV2Ugc2F2ZSBvdXRwdXQgZmlsZSBwb2ludGVyLCBiZWNhdXNlIHdlIHdpbGwgbmVlZCB0byB1c2UgaXQgd2hlbiBzYXZpbmcgYXVkaW8KLSAgICAgICAgIG1peGVkIGZpbGUgKGxhc3Qgc2F2ZSBzdGVwKSAqLwotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGU7Ci0KLSAgICAgICAgLyogUmUtd3JpdGUgQkdNIHNldHRpbmdzIGluIGNhc2UgdGhleSBoYXZlIGNoYW5nZWQgYmV0d2VlbiB0d28gc2VuZENvbW1hbmQgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZEN0cyA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZEN0czsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcCA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUVuZExvb3AgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlFbmRMb29wOwotCi0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGZpbmQgYW5kIGRlbGV0ZSBCR00gZWxlbWVudCAqLwotCi0gICAgICAgIHdoaWxlKCBwUGFyYW1zX3RlbXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+aXNDcmVhdGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qIFBSRVZJRVdfRU5BQkxFRCAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNHhWU1NfU2VuZENvbW1hbmQgaGFzIGJlZW4gcmVjYWxsZWQsIEJHTSBpcyB0aGUgc2FtZSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gQkdNIGluIHRoaXMgeFZTUyBjb21tYW5kIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotICAgICAgICAgICAgLyogTmVlZCB0byByZW1vdmUgTUNTIHByZXZpb3VzIHBhcmFtcyBjaGFpbmVkIGxpc3QgKi8KLQotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19wcmV2ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8gZmluZCBhbmQgZGVsZXRlIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDaGFpbiBwcmV2aW91cyBlbGVtZW50IHdpdGggbmV4dCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3ByZXYgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldi0+cE5leHQgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIGN1cnJlbnQgcG9pbnRlciBpcyB0aGUgZmlyc3Qgb2YgdGhlIGNoYWluZWQgbGlzdCBhbmQgbmV4dCBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY2hhaW5lZCBsaXN0IGlzIE5VTEwgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogaXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgb25seSBvbmUgZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiA9PiB3ZSBwdXQgdGhlIGNvbnRleHQgdmFyaWFibGUgdG8gTlVMTCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wID09IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfdGVtcC0+cE5leHQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMKLSAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFmdGVyIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIGNoYW5nZSBmaXJzdCBjaGFpbmVkIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwUGFyYW1zX3RlbXAtPnBOZXh0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSW4gYWxsIG90aGVyIGNhc2VzLCBub3RoaW5nIGVsc2UgdG8gZG8gZXhjZXB0IGZyZWVpbmcgdGhlIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgICAgbGlzdCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wOwotICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLSAgICAgICAgICAgIC8qIEhlcmUsIHdlIHVuYWxsb2NhdGUgYWxsIEJHTSBjb21wb25lbnRzIGFuZCBwdXQgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgeFZTUy5wQkdNdHJhY2sgdG8gTlVMTCAqLwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlZCB0byBiZSBhYmxlIHRvIG1peCB3aXRoIHZpZGVvIG9ubHkgZmlsZXMgLT4gaW4gY2FzZSBubyBtYXN0ZXIgY2xpcCBpcyBmb3VuZAotICAgIChpLmUgb25seSBKUEcgaW5wdXQgb3IgdmlkZW8gb25seSBpbnB1dCkgKi8KLSAgICAvKiBhbmQgaWYgdGhlcmUgaXMgYSBCR00sIHdlIGZvcmNlIHRoZSBhZGRlZCB2b2x1bWUgdG8gMTAwIChpLmUgcmVwbGFjZSBhdWRpbykgKi8KLQotICAgIGlmKCBtYXN0ZXJDbGlwID09IC0xCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgbWVhbnMgdGhhdCBubyBpbnB1dCAzR1AgZmlsZSBoYXMgYSB2aWRlbyB0cmFjay4KLSAgICAgICAgVGhlcmVmb3JlLCBpZiBhIG1peGluZyBpcyBhc2tlZCwgaXQgd2lsbCBmYWlsLiBUaHVzLCB3ZSBmb3JjZSByZXBsYWNlIGF1ZGlvLiAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID0gMTAwOwotICAgIH0KLQotICAgIC8qIFNhdmUgY2xpcCBudW1iZXIgdG8ga25vdyBpZiBhIE00eFZTU19zZW5kQ29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLQotICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVBbmFseXppbmc7Ci0KLSAgICAvKiBJbiBjYXNlIG9mIE1NUyB1c2UgY2FzZSwgd2UgY29tcHV0ZSBoZXJlIHRoZSBtYXggdmlkZW8gYml0cmF0ZSAqLwotICAgIC8qIEluIGNhc2Ugb2YgdG9vIGxvdyBiaXRyYXRlLCBhIHNwZWNpZmljIHdhcm5pbmcgaXMgcmV0dXJuZWQgKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUgIT0gMCAmJiB0b3RhbER1cmF0aW9uID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0gICAgICAgIE00T1NBX0RvdWJsZSByYXRpbzsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZQotICAgICAgICAgICAgICAgID09IDEwMCApIC8qIFdlIGFyZSBpbiAicmVwbGFjZSBhdWRpbyBtb2RlLCBuZWVkIHRvIGNoZWNrIHRoZSBmaWxldHlwZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBEZWNvZGVkUGF0aDsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBCR00gdHJhY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgLyplcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICB4VlNTLnBCR010cmFjay0+cEZpbGUsICZmaWxlUHJvcGVydGllcyk7Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCBhbiBlcnJvcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBJbXBvc3NpYmxlIHRvIHVzZSBNTVMgbW9kZSB3aXRoIEJHTSAhPSBBTVItTkIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZQotICAgICAgICAgICAgICAgICAgICAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SCi0gICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+RmlsZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX3NlbmRDb21tYW5kOiBCYWQgaW5wdXQgQkdNIGZpbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHRhcmdldGVkIGJpdHJhdGUsIHdpdGggOCUgbWFyZ2luIChtb292KSAqLwotICAgICAgICBpZiggdG90YWxEdXJhdGlvbiA+IDEwMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAqIDggKiAwLjg0KSAvICh0b3RhbER1cmF0aW9uIC8gMTAwMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJlbW92ZSBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPj0gMTIyMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgLT0gMTIyMDA7IC8qIE9ubHkgQU1SIGlzIHN1cHBvcnRlZCBpbiBNTVMgY2FzZSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgYW4gaW5kaWNhdG9yIG9mICJjb21wbGV4aXR5IiBkZXBlbmRpbmcgb24gbmIgb2Ygc2VxdWVuY2VzIGFuZCB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAvKiBUaGUgaGlnaGVzdCBpcyB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcywgdGhlIG1vcmUgdGhlcmUgYXJlIHNvbWUgSSBmcmFtZXMgKi8KLSAgICAgICAgLyogSW4gdGhhdCBjYXNlLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVkdWNlIHRoZSB0YXJnZXQgYml0cmF0ZSAqLwotICAgICAgICByYXRpbyA9Ci0gICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyCi0gICAgICAgICAgICAqIDEwMDAwMCkgLyAoTTRPU0FfRG91YmxlKSh0b3RhbER1cmF0aW9uKSk7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIlJhdGlvIGNsaXBfbmIvZHVyYXRpb24gPSAlZlxuVGFyZ2V0ZWQgYml0cmF0ZSA9ICVkXG5Ub3RhbCBkdXJhdGlvbjogJWQiLAotICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcgotICAgICAgICAgICAgKiAxMDAwMDApIC8gKE00T1NBX0RvdWJsZSkodG90YWxEdXJhdGlvbikpLAotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlLCB0b3RhbER1cmF0aW9uKTsKLQotICAgICAgICBpZiggcmF0aW8gPiA1MCAmJiByYXRpbyA8PSA3NSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBwb3RlbnRpYWwgcmlzayBvZiBoYXZpbmcgYSBoaWdoZXIgZmlsZSBzaXplCi0gICAgICAgICAgICB0aGFuIHNwZWNpZmllZCAqLwotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlIC09IChNNE9TQV9VSW50MzIpKHRhcmdldGVkQml0cmF0ZSAqIDAuMSk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgICAgICAgICAiTmV3IGJpdHJhdGUxICEhXG5SYXRpbyBjbGlwX25iL2R1cmF0aW9uID0gJWZcblRhcmdldGVkIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgcmF0aW8sIHRhcmdldGVkQml0cmF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcmF0aW8gPiA3NSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSAtPSAoTTRPU0FfVUludDMyKSh0YXJnZXRlZEJpdHJhdGUgKiAwLjE1KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKAotICAgICAgICAgICAgICAgICJOZXcgYml0cmF0ZTIgISFcblJhdGlvIGNsaXBfbmIvZHVyYXRpb24gPSAlZlxuVGFyZ2V0ZWQgYml0cmF0ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICByYXRpbywgdGFyZ2V0ZWRCaXRyYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qQ1IgMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZBTDoKLSAgICAgICAgRGVjcmVhc2UgdGhlIG91dHB1dCBmaWxlIHNpemUgdG8ga2VlcCBhIG1hcmdpbiBvZiA1JQotICAgICAgICBUaGUgd3JpdGVyIHdpbGwgc3RvcCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZSBzaXplIHdpbGwgYmUgcmVhY2hlZCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplIC09Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAqIDAuMDUpOwotCi0gICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDMyMDAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMzIwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCAzMjAwMCApICAgICAgICAgICAgICAvKjQ4MDAwKSovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDMyMDAwOyAvKjQ4MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDQ4MDAwICkgICAgICAgICAgICAgIC8qNjQwMDApKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gNDgwMDA7IC8qNjQwMDA7Ki8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgNjQwMDAgKSAgICAgICAgICAgICAgLyoxMjgwMDApKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gNjQwMDA7IC8qMTI4MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgMTI4MDAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMTI4MDAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDE5MjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDE5MjAwMDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBDYW5ub3QgaGFwcGVuICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IEVycm9yIGluIG91dHB1dCBmaWxlU2l6ZSAhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IChNNE9TQV9VSW50MzIpdGFyZ2V0ZWRCaXRyYXRlOwotICAgIH0KLQotICAgIGlmKCBiSXNUcmFuc2NvZGluZyApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9UUkFOU0NPRElOR19ORUNFU1NBUlk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TYXZlU3RhcnQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ2hhciogcEZpbGVQYXRoKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmUgdGhlIHNhdmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBjcmVhdGUgM0dQIGVkaXRlZCBmaW5hbCBmaWxlCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBGaWxlUGF0aCAgICAgICAgICAgIChJTikgSWYgdGhlIHVzZXIgd2FudHMgdG8gcHJvdmlkZSBhIGRpZmZlcmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlbmFtZSwgZWxzZSBjYW4gYmUgTlVMTCAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0YXJ0KCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkICpwRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwRWRpdFNhdmluZ1NldHRpbmdzID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX1VJbnQzMiBvZmZzZXQgPSAwOwotICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyA9IDA7Ci0gICAgLypvbmx5IGZvciBVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgIC8qKi8KLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlT3BlbmVkICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1NhdmVTdGFydCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFJDOiB0byB0ZW1wb3JhcnkgaGFuZGxlIGNoYW5naW5nIG9mIG91dHB1dCBmaWxlcGF0aCAqLwotICAgIC8qIFRPIEJFIENIQU5HRUQgQ0xFQU5MWSBXSVRIIEEgTUFMTE9DL01FTUNQWSAhISEhICovCi0gICAgaWYoIHBGaWxlUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qaXQgbWVhbnMgdGhhdCBwT3V0cHV0RmlsZSBoYXMgYmVlbiBhbGxvY2F0ZWQgaW4gTTR4VlNTX3NlbmRDb21tYW5kKCkqLwotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHBGaWxlUGF0aDsKLSAgICAgICAgLypBcyBhbGwgaW5wdXRzIG9mIHRoZSB4VlNTIGFyZSBpbiBVVEY4LCBjb252ZXJ0IHRoZSBvdXRwdXQgZmlsZSBwYXRoIGludG8gdGhlIGN1c3RvbWVyCi0gICAgICAgICBmb3JtYXQqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBGaWxlUGF0aCwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgZmlsZVBhdGhTaXplID0gbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmaWxlUGF0aFNpemUgKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1NhdmVTdGFydDogb3V0cHV0IGZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUsICh2b2lkICopcERlY29kZWRQYXRoLCBmaWxlUGF0aFNpemUgKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZVtmaWxlUGF0aFNpemVdID0gJ1wwJzsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0geFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBmaWxlUGF0aFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKioqLwotCi0gICAgLypGQjogQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KLSAgICAvKkl0IGlzIHRoZSBzYW1lIHByaW5jaXBsZSBhcyBpbiB0aGUgUHJldmlld1N0YXJ0KCkqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MgPQotICAgICAgICAoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyksCi0gICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIlNhdmluZywgY29weSBvZiBWU1Mgc3RydWN0dXJlIik7Ci0KLSAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IHNldHRpbmdzIGZyb20gaW5wdXQgc3RydWN0dXJlICovCi0gICAgbWVtY3B5KCh2b2lkICopICYocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUyksCi0gICAgICAgICh2b2lkICopICYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MpLAotICAgICAgICBzaXplb2YoTTR4VlNTX0VkaXRTZXR0aW5ncykpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwRWRpdFNhdmluZ1NldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLQotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcDsgLyogVlNTMi4wIG1hbmRhdG9yeSBwYXJhbWV0ZXIgKi8KLQotICAgIC8qIEFsbG9jYXRlIHNhdmluZ1NldHRpbmdzLnBDbGlwTGlzdC9wVHJhbnNpdGlvbnMgc3RydWN0dXJlICovCi0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0ID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKgotICAgICAgICAqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgKnBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwKLSAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUywgc2F2aW5nICwgY29weSBvZiBwQ2xpcExpc3QiKTsKLQotICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKgotICAgICAgICAgICAgKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICopCi0gICAgICAgICAgICAqKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpLAotICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUywgc2F2aW5nLCBjb3B5IG9mIHBUcmFuc2l0aW9uTGlzdCIpOwotCi0gICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyBjbGlwIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGkgPCBwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgIC0gMSApIC8qIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPQotICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpLAotICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgLy8gQWRkIE1QNCBmaWxlIHN1cHBvcnQKLQotICAgICAgICBpZiggKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDQpCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYpCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpCi0KLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29weSBkYXRhIGZyb20gZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciBzYXZpbmcgc3RydWN0dXJlICovCi0gICAgICAgICAgICBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLAotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFIC8qIHJlbW92ZSBlZmZlY3RzICovKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLSAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIGZyZWUoCi0gICAgICAgICAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUpOwotICAgICAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSAoTTRPU0FfVm9pZAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGIDE2IGNvbnZlcnNpb24qLwotICAgICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLQotICAgICAgICAgICAgaWYoIGkKLSAgICAgICAgICAgICAgICA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgICAgICAtIDEgKSAvKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IEVycm9yIHdoZW4gcGFyc2luZyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldOlwKLSAgICAgICAgICAgICAgICAgQmFkIGZpbGUgdHlwZSIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgdmlkZW8gZWZmZWN0cywgdXNlZCB0byBrbm93IGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgdG8gYWxsb2NhdGUqLwotICAgIC8qIEZCIDIwMDgvMTAvMTU6IHJlbW92ZWQgOiBub3QgY29tcGF0aWJsZSB3aXRoIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX05vbmUKLSAgICBmb3Ioaj0wO2o8eFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cztqKyspCi0gICAgewotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSAhPSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lKQotICAgIHsKLSAgICBuYkVmZmVjdHMrKzsKLSAgICB9Ci0gICAgfSovCi0gICAgbmJFZmZlY3RzID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsKLQotICAgIC8qIEFsbG9jYXRlIGVmZmVjdHMgc2F2aW5nIHN0cnVjdHVyZSB3aXRoIGNvcnJlY3QgbnVtYmVyIG9mIGVmZmVjdHMgKi8KLSAgICBpZiggbmJFZmZlY3RzICE9IDAgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5iRWZmZWN0cwotICAgICAgICAgICAgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICopIlNhdmluZyBzZXR0aW5ncywgZWZmZWN0cyB0YWJsZSBvZiBzdHJ1Y3R1cmUgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSnVzdCBjb3B5IGVmZmVjdCBzdHJ1Y3R1cmUgdG8gc2F2aW5nIHN0cnVjdHVyZSwgYXMgZWZmZWN0cyB0aW1lIGFyZSBub3cgKi8KLSAgICAgICAgLyogcmVsYXRpdmUgdG8gb3V0cHV0IGNsaXAgdGltZSovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMsCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzLAotICAgICAgICAgICAgbmJFZmZlY3RzICogc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5FZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9Ci0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+bmJFZmZlY3RzID0gbmJFZmZlY3RzOwotCi0gICAgaWYoIHBGaWxlUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gcEZpbGVQYXRoOwotICAgIH0KLQotICAgIC8qIFNhdmUgcG9pbnRlciBvZiBzYXZpbmcgdmlkZW8gZWRpdG9yIHRvIHVzZSBpbiBzdGVwIGZ1bmN0aW9uICovCi0gICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IHBFZGl0U2F2aW5nU2V0dGluZ3M7Ci0KLSAgICAvKiBDaGFuZ2Ugb3V0cHV0IGZpbGUgbmFtZSB0byB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGUgbmFtZSwgYmVjYXVzZSBmaW5hbCBmaWxlIHdpbGwgYmUKLSAgICAgZ2VuZXJhdGVkIGJ5IGF1ZGlvIG1peGVyICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0KLSAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BfdG1wW000WFZTU19NQVhfUEFUSF9MRU5dOwotCi0gICAgICAgIC8qKi8KLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPQotICAgICAgICAgICAgKE00eFZTU19CR01TZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKSJTYXZpbmcgc2V0dGluZ3MsIGVmZmVjdHMgdGFibGUgb2Ygc3RydWN0dXJlIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBKdXN0IGNvcHkgZWZmZWN0IHN0cnVjdHVyZSB0byBzYXZpbmcgc3RydWN0dXJlLCBhcyBlZmZlY3RzIHRpbWUgYXJlIG5vdyAqLwotICAgICAgICAvKiByZWxhdGl2ZSB0byBvdXRwdXQgY2xpcCB0aW1lKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2ssCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKLSAgICAgICAgICAgIHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpKTsKLQotICAgICAgICAvKiBBbGxvY2F0ZSBmaWxlIG5hbWUsIGFuZCBjb3B5IGZpbGUgbmFtZSBidWZmZXIgdG8gb3VyIHN0cnVjdHVyZSAqLwotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAoc3RybGVuKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpCi0gICAgICAgICAgICArIDEpLAotICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiU2F2aW5nIHN0cnVjdCB4VlNTIEJHTSBmaWxlIHBhdGgiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICBzdHJsZW4oeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSkKLSAgICAgICAgICAgICsgMSk7Ci0KLSAgICAgICAgLypDb3B5IEJHTSB0cmFjayBmaWxlIHBhdGgqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0KLSAgICAgICAgICAgIGZyZWUocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wIGZpbGVuYW1lIGluIGNhc2Ugb2YgQkdNIik7Ci0KLSAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKi8KLQotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfM2dwLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfM2dwX3RtcCwgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxKTsKLQotICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF8zZ3AsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLjNncFwwIiwgMTMpOwotICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0XzNncF90bXAsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLnRtcFwwIiwgMTMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3AsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19TYXZlU3RhcnQ6IFRlbXAgZmlsZW5hbWUgaW4gY2FzZSBvZiBCR00iKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IGxlbmd0aCArIDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF8zZ3BfdG1wOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3BfdG1wLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wb3JhcnkgZmlsZSIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlLAotICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotCi0gICAgICAgIC8qIFB1dCBuYiBvZiBzdGVwIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nIHRvIDIsIGJlY2F1c2UgYXVkaW8gbWl4aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qIFB1dCBuYiBvZiBzdGVwIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nIHRvIDEsIGJlY2F1c2Ugbm8gYXVkaW8gbWl4aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqKiovCi0KLSAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAvKiovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFJlaW5pdGlhbGl6ZSBjdXJyZW50IHN0ZXAgbnVtYmVyIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nICovCi0gICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCA9IDA7Ci0KLSAgICAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVTYXZpbmc7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TYXZlU3RvcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHVuYWxsb2NhdGUgc2F2ZSByZXNzb3VyY2VzIGFuZCBjaGFuZ2UgeFZTUwotICogICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0b3AoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlU2F2aW5nICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1NhdmVTdG9wIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRnJlZSBzYXZpbmcgc3RydWN0dXJlcyAqLwotICAgIE00eFZTU19pbnRlcm5hbEZyZWVTYXZpbmcoeFZTU19jb250ZXh0KTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlU2F2ZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgZGlmZmVyZW50cyB0YXNrcywgZGVwZW5kaW5nIG9mIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb246Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBhbmFseXNlcyBlZGl0aW5nIHN0cnVjdHVyZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgcHJldmlldyBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfUHJldmlld1N0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgZmluYWwgZWRpdGVkIGZpbGUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TYXZlU3RhcnQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAgICAgICAgICAgICAgICAgKElOL09VVCkgUG9pbnRlciBvbiBhbiBpbnRlZ2VyIGdpdmluZyBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgaW5kaWNhdGlvbiAoYmV0d2VlbiAwLTEwMCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvciwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIGFnYWluCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9QUkVWSUVXX1JFQURZOiAgICBQcmV2aWV3IGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkU6ICAgICAgICBGaW5hbCBlZGl0ZWQgZmlsZSBpcyBnZW5lcmF0ZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTogICAgQW5hbHlzZSBpcyBkb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU3RlcCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwVnNzQ3R4dCA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBBdWRpb01peGluZ0N0eHQgPQotICAgICAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDggdWlQcm9ncmVzcyA9IDA7Ci0KLSAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+bV9zdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVTYXZpbmc6Ci0gICAgICAgIC8vY2FzZSBNNHhWU1Nfa1N0YXRlR2VuZXJhdGluZ1ByZXZpZXc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyApIC8qIFZTUyAtPiBjcmVhdGluZyBlZmZlY3RzLCB0cmFuc2l0aW9ucyAuLi4gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBWU1NDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBWc3NDdHh0OwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0U3RlcChwVnNzQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKSAmJiAoZXJyICE9IE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU3RlcDogTTRWU1MzR1BQX2VkaXRTdGVwIHJldHVybmVkIDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQICkKLSAgICAgICAgICAgICAgICAgICAgewotI2lmbmRlZiBET19OT1RfUkVNT1ZFX1RFTVBfRklMRVMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHdlIGNhbiBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBzdGVwLCBjaGVjayB0aGUgdGVtcCBmaWxlIGlzIG5vdCB1c2Ugc29tZXdoZXJlIGVsc2UgYWZ0ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBjbXBSZXN1bHQgPSAtMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IHBWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBwVlNTQ29udGV4dC0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwVlNTQ29udGV4dC0+cENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0uZmlsZVBhdGhTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBWU1NDb250ZXh0LT5wQ2xpcExpc3RbaV0uZmlsZVBhdGhTaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcFJlc3VsdCA9IG1lbWNtcCgodm9pZCAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKHZvaWQgKilwVlNTQ29udGV4dC0+cENsaXBMaXN0W2ldLnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZTU0NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLmZpbGVQYXRoU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNtcFJlc3VsdCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQgbWVhbnMgd2UgZm91bmQgYSBjb3JyZXNwb25kaW5nIGZpbGUsIHdlIGRvIG5vdCBkZWxldGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY21wUmVzdWx0ICE9IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICp0b3RvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgKnBUbXBTdHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHJlc3VsdCBpbiBVVEY4IHRvIGNoZWNrIGlmIHdlIGNhbiBkZWxldGUgaXQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFZTU0NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlLCAoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRtcFN0ciA9IHBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdG90byAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzIHRlbXBvcmFyeSBmaWxlcyBjYW4gYmUgaW1nWFhYLjNncCBvciB2aWRYWFguM2dwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVG1wU3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMCk7IC8qIEJlY2F1c2UgdGVtcG9yYXJ5IGZpbGVzIGhhdmUgYSBsZW5ndGggYXQgbW9zdCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFRtcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopImltZyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0b3RvICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RvID0gKE00T1NBX0NoYXIgKilzdHJzdHIoKGNvbnN0IGNoYXIgKilwVG1wU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopInZpZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVycgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTROT19FUlJPUiApIC8qIEl0IG1lYW5zIHRoZSBmaWxlIGlzIGEgdGVtcG9yYXJ5IGZpbGUsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gZGVsZXRlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qIERPX05PVF9SRU1PVkVfVEVNUF9GSUxFUyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogV2hlbiBhIHN0ZXAgaXMgY29tcGxldGUsIGluY3JlbWVudCBjdXJyZW50U3RlcCBhbmQgcmVzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgdW5sZXNzIHByb2dyZXNzIHdvdWxkIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZSh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciAgYmxybnhwc3cjMjM0LS0tPiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyo8LS0tLSBGaXggZm9yICBibHJueHBzdyMyMzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuIEF1ZGlvIG1peGluZyBjb21wb25lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5lZGl0aW5nU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZyApIC8qIEF1ZGlvIG1peGluZzogbWl4L3JlcGxhY2UgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgd2l0aCBnaXZlbiBCR00gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAocEF1ZGlvTWl4aW5nQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkcpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ01haW46IE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAgcmV0dXJuZWQgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBXaGVuIGEgc3RlcCBpcyBjb21wbGV0ZSwgaW5jcmVtZW50IGN1cnJlbnRTdGVwIGFuZCByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIHN0YXRlIGluIHN0ZXAgZnVuY3Rpb24gISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlQW5hbHl6aW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZUFuYWx5c2VQdG8zR1BQICkgLyogUHRvM0dQUCwgYW5hbHlzaW5nIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBUbzNHUFBwYXJhbXNMaXN0OyAvKiBDdXJyZW50IFB0bzNHUFAgUGFyYW1ldGVyIGlzIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsgLyogQ3VycmVudCBQdG8zR1BQIFBhcmFtZXRlciBpcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBJdCBtZWFucyB0aGVyZSBpcyBubyBuZXh0IGltYWdlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBzdGVwIHRvIE1DUyBwaGFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHl6ZU1DUzsgLyogQ2hhbmdlIEFuYWx5emluZyBtaWNybyBzdGF0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1MgcGhhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBmaWxlIGhhcyB0byBiZSBjb252ZXJ0ZWQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgd2UganVzdCByZXR1cm4gTTROT19FUlJPUiwgYW5kIGdvIHRvIG5leHQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmlzQ3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuaW5nIFB0bzNHUFAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVDb252ZXJ0UHRvM0dQUCApIC8qIFB0bzNHUFAsIGNvbnZlcnRpbmcgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF9TdGVwKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHByb2dyZXNzIGJhciAqLwotICAgICAgICAgICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQtPm1fTmJJbWFnZSA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX0ltYWdlQ291bnRlciAqIDEwMCkgLyAoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgLTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggZXJyICE9IE00Tk9fRVJST1IpICYmIChlcnIKLSAgICAgICAgICAgICAgICAgICAgICAgICE9ICgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcpKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPIEJFIENIRUNLRUQgTk8gTEVBS1MgICEhISEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1N0ZXA6IE00UFRPM0dQUF9TdGVwIHJldHVybmVkIDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGVycgotICAgICAgICAgICAgICAgICAgICAgICAgPT0gKChNNE9TQV9VSW50MzIpTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7IC8qIFdlIGdvIGJhY2sgdG8gYW5hbHl6ZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbmV4dCBmaWxlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICEhISEhISEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBUbyBhdm9pZCByZWNvbnZlcnRpbmcgaXQgaWYgYW5vdGhlciBTZW5kQ29tbWFuZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qU1M6Ymxybnhwc3cjICAyMzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncCByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5emVNQ1MgKSAvKiBNQ1M6IGFuYWx5emluZyBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNQ1NwYXJhbXNMaXN0OyAvKiBDdXJyZW50IE1DUyBQYXJhbWV0ZXIgaXMgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zICE9IE00T1NBX05VTEwgXAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7IC8qIEN1cnJlbnQgTUNTIFBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoZXJlIGlzIG5vIG5leHQgaW1hZ2UgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsgLyogUmVpbml0IEFuYWx5emluZyBtaWNybyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rU3RhdGVPcGVuZWQ7IC8qIENoYW5nZSB4VlNTIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOyAvKiBFbmQgb2YgQW5hbHlzaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsgLyogUmVpbml0IEFuYWx5emluZyBtaWNybyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa1N0YXRlT3BlbmVkOyAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mIEFuYWx5c2lzICovCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGZpbGUgaGFzIHRvIGJlIHRyYW5zY29kZWQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgd2UganVzdCByZXR1cm4gTTROT19FUlJPUiwgYW5kIGdvIHRvIG5leHQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogT3BlbmluZyBNQ1MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiByb3RhdGlvbkRlZ3JlZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nKHhWU1NfY29udGV4dCwgJnJvdGF0aW9uRGVncmVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcgcmV0dXJuZWRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXggPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT52aWRlb2NsaXBudW1iZXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXRzIGFyZSBkb25lIGluIHRoZSBNQ1MsIHNvIHdlIG5lZWQgdG8gcmVwbGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJlZ2luQ3V0VGltZSBhbmQgZW5kQ3V0VGltZSB0byBrZWVwIHRoZSBlbnRpcmUgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT51aUVuZEN1dFRpbWUgPSAwOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcgcmV0dXJuZWQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOyBNQ1MgY29udGV4dDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldGFpbiByb3RhdGlvbiBpbmZvIG9mIHRyaW1tZWQgLyB0cmFuc2NvZGVkIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMgPSByb3RhdGlvbkRlZ3JlZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZVRyYW5zY29kZU1DUyApCi0gICAgICAgICAgICAgICAgICAgIC8qIE1DUzogdHJhbnNjb2RpbmcgZmlsZSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc3RlcCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAvKlNTOmJscm54cHN3IyAgMjM0ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRNQ1NfRVJSX05PTU9SRV9TUEFDRSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUTyBCRSBDSEVDS0VEIE5PIExFQUtTICAhISEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOiBNNE1DU19zdGVwIHJldHVybmVkIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIE1DUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBlcnIgPT0gTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzIHVubGVzcyBwcm9ncmVzcyB3b3VsZCBiZSB3cm9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTOyAvKiBXZSBnbyBiYWNrIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZSBwYXJhbWV0ZXJzIHRvIHNlZSBpZiB0aGVyZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG5leHQgZmlsZSB0byB0cmFuc2NvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICEhISEhISEhISovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5pc0NyZWF0ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIFRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb252ZXJ0aW5nIGl0IGlmIGFub3RoZXIgU2VuZENvbW1hbmQgaXMgY2FsbGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZyByZXR1cm5lZCAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgbWljcm8gc3RhdGUgaW4gYW5hbHl6aW5nIHN0YXRlIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotZW5kX3N0ZXA6Ci0gICAgLyogQ29tcHV0ZSBwcm9ncmVzc2lvbiAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsICE9IDAgKQotICAgIHsKLSAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoKCAoIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgKiAxMDApIFwKLSAgICAgICAgICAgIC8gKHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwpKQotICAgICAgICAgICAgKyAodWlQcm9ncmVzcyAvICh4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKSkpOwotCi0gICAgICAgIGlmKCAqcFByb2dyZXNzID4gMTAwICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfQ2xvc2VDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBjdXJyZW50IGVkaXRpbmcgcHJvZmlsZSwgdW5hbGxvY2F0ZQotICogICAgICAgICAgICAgICAgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgY2FuIGNhbGwgYSBuZXcgTTR4VlNTX1NlbmRDb21tYW5kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19DbG9zZUNvbW1hbmQoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgLyogRGVwZW5kaW5nIG9mIHRoZSBzdGF0ZSwgZGlmZmVyZW50cyB0aGluZ3MgaGF2ZSB0byBiZSBkb25lICovCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlT3BlbmVkOgotICAgICAgICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVTYXZpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXggZm9yIGJscm54cHN3IzIzNC0tLS0+Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0Nsb3NlQ29tbWFuZDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5lZGl0aW5nU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKHhWU1NfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19DbG9zZUNvbW1hbmQ6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiA8LS0tLUZpeCBmb3IgYmxybnhwc3cjMjM0Ki8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyogV2UgZnJlZSB0aGlzIHBvaW50ZXIgb25seSBpZiBhIEJHTSB0cmFjayBpcyBwcmVzZW50LCBiZWNhdXNlIGluIHRoYXQgY2FzZSwKLSAgICAgICAgICAgICAgICB0aGlzIHBvaW50ZXIgb3ducyB0byB1cyAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgICAgICAgICAgICAgLyppZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgICAgICAgICAvKmlmKE00T1NBX05VTEwgIT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlU2F2ZWQ6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVBbmFseXppbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBQdG8zR1BQIG1vZHVsZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiBGaXggZm9yIGJscm54cHN3IzIzNC0tLS0+Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04pICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogPC0tLS0tRml4IGZvciBibHJueHBzdyMyMzQ+Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1MgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBNQ1MgbW9kdWxlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2Fib3J0KHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00TUNTX2Fib3J0IHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogPC0tLUZpeCBmb3IgYmxybnhwc3cjMjM0Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX0Nsb3NlQ29tbWFuZCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLQotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVJbml0aWFsaXplZDsgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfQ2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYWxsIHhWU1MgcmVzc291cmNlcwotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTR4VlNTX0Nsb3NlQ29tbWFuZC4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0NsZWFuVXAoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0NsZWFuVXA6ZW50ZXJpbmciKTsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoXAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX0NsZWFuVXAgZnVuY3Rpb24hIFN0YXRlIGlzICVkIixcCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVVEYgY29udmVyc2lvbjogZnJlZSB0ZW1wb3JhcnkgYnVmZmVyKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfQ2xlYW5VcDpsZWF2aW5nICIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlIHZlcnNpb24gb2YgdGhlIFZpZGVvIFN0dWRpbyAyLjEKLSAqCi0gKiBAcGFyYW0gICAgcFZlcnNpb24gICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHZlcnNpb24gaW5mbyBzdHJ1Y3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0dldFZlcnNpb24oIE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbiApCi17Ci0gICAgLyogSnVzdCB1c2VkIGZvciBhIGdyZXAgaW4gY29kZSAqLwotICAgIC8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSAgICBzdGF0aWMgY29uc3QgTTRPU0FfQ2hhciBjVmVyc2lvblsyNl0gPSAiTlhQU1dfVmlkZW9TdHVkaW8yMV8xXzNfMCI7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwVmVyc2lvbiApCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBWZXJzaW9uLT5tX21ham9yID0gTTRfeFZTU19NQUpPUjsKLSAgICBwVmVyc2lvbi0+bV9taW5vciA9IE00X3hWU1NfTUlOT1I7Ci0gICAgcFZlcnNpb24tPm1fcmV2aXNpb24gPSBNNF94VlNTX1JFVklTSU9OOwotICAgIHBWZXJzaW9uLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfVmVyc2lvbkluZm8pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEFsbG93cyBmaWxsaW5nIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICoKLSAqIEBub3RlICAgIFdBUk5JTkc6IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbIF0gd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlICAgICAgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIHBGaWxlICAgICAgICAgICAgICAgKElOKSBDbGlwIGZpbGUgbmFtZQotICogQHBhcmFtICAgZmlsZVBhdGhTaXplICAgICAgICAoSU4pIFNpemUgb2YgdGhlIGNsaXAgcGF0aCAobmVlZGVkIGZvciB0aGUgVVRGMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGUsIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggbmJFZmZlY3RzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzIGNhbGxlZCB3aXRoIHBDbGlwU2V0dGluZ3M9MHglcCIsCi0gICAgICAgIHBDbGlwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyogQ3JlYXRlIGluaGVyaXRlZCBWU1MzR1BQIHN0dWZmICovCi0gICAgLyplcnIgPSBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyhwQ2xpcFNldHRpbmdzLCBwRmlsZSxuYkVmZmVjdHMpOyovCi0gICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIChuZWVkZWQgZm9yIFVURiAxNiBjb252ZXJzaW9uKSovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncywgcEZpbGUsIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgbmJFZmZlY3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyA6XAotICAgICAgICAgICAgICAgICAgICAgICBFUlJPUiBpbiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgY2xpcCBzZXR0aW5ncyB0byBkZWZhdWx0ICovCi0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy51aUJlZ2luQ3V0UGVyY2VudCA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy51aUVuZEN1dFBlcmNlbnQgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MudWlEdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WGEgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVRvcGxlZnRZYSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tVG9wbGVmdFhiID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WWIgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVhhID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21YYiA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggZGVzdD0weCVwIHNyYz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QsIHBDbGlwU2V0dGluZ3NPcmlnKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NEZXN0IGlzIE5VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc09yaWcpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzT3JpZyBpcyBOVUxMIik7Ci0KLSAgICAvKiBDYWxsIGluaGVyaXRlZCBWU1MzR1BQIGR1cGxpY2F0aW9uICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLCBiQ29weUVmZmVjdHMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzIDpcCi0gICAgICAgICAgICAgICAgICAgICAgIEVSUk9SIGluIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIENsaXBTZXR0aW5nIHN0cnVjdHVyZSAocEZpbGUsIEVmZmVjdHMsIC4uLikuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyApCi17Ci0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19GcmVlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzIGlzIE5VTEwiKTsKLQotICAgIC8qIEZyZWUgaW5oZXJpdGVkIFZTUzNHUFAgc3R1ZmYgKi8KLSAgICBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRNQ1NDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIG1jc0NvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgTUNTIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBhbmFseXppbmcgc3RhdGUgb3IKLSAqIGJleW9uZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBtY3NDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgbWNzIGNvbnRleHQgdG8gcmV0dXJuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfZ2V0TUNTQ29udGV4dCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICptY3NDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19nZXRNQ1NDb250ZXh0OiBwQ29udGV4dCBpcyBOVUxMIik7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5tX3N0YXRlID09IE00eFZTU19rU3RhdGVJbml0aWFsaXplZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2dldE1DU0NvbnRleHQ6IEJhZCBzdGF0ZSEgU3RhdGUgaXMgJWQiLFwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAqbWNzQ29udGV4dCA9IHhWU1NfY29udGV4dC0+cE1DU19DdHh0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRWU1MzR1BQQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFZTUzNHUFAgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIEdlbmVyYXRpbmcgcHJldmlldwotICogICAgICAgICAgICAgIG9yIGJleW9uZAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHZzczNncHBDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgdnNzM2dwcCBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0KCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICp2c3MzZ3BwQ29udGV4dCApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQ6IHBDb250ZXh0IGlzIE5VTEwiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPCBNNHhWU1Nfa1N0YXRlU2F2aW5nICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQ6IEJhZCBzdGF0ZSEgU3RhdGUgaXMgJWQiLFwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAqdnNzM2dwcENvbnRleHQgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZpZGVvRGVjb2RlckNhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqKmRlY29kZXJzKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBDYWxsIHRoZSBkZWNvZGVyIGFwaSBkaXJlY3RseQotICAgIC8vIHRvIGdldCBhbGwgdGhlIHZpZGVvIGRlY29kZXIgY2FwYWJsaXRpZXMuCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0VmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcyhkZWNvZGVycyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDk1OWVjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfaW50ZXJuYWwuYwotICogQGJyaWVmICAgIEludGVybmFsIGZ1bmN0aW9ucyBvZiBleHRlbmRlZCBWaWRlbyBTdHVkaW8gU2VydmljZSAoVmlkZW8gU3R1ZGlvIDIuMSkKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotI2luY2x1ZGUgIk00eFZTU19BUEkuaCIKLSNpbmNsdWRlICJNNHhWU1NfSW50ZXJuYWwuaCIKLQotLypmb3IgcmdiMTYgY29sb3IgZWZmZWN0Ki8KLSNpbmNsdWRlICJNNFZJRklfRGVmaW5lcy5oIgotI2luY2x1ZGUgIk00VklGSV9DbGlwLmgiCi0KLS8qKgotICogY29tcG9uZW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIiAgICAgICAgICAgIC8qKjwgdmlkZW8gZWZmZWN0cyAqLwotCi0vKiBJbnRlcm5hbCBoZWFkZXIgZmlsZSBvZiBWU1MgaXMgaW5jbHVkZWQgYmVjYXVzZSBvZiBNTVMgdXNlIGNhc2UgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotCi0vKkV4aWYgaGVhZGVyIGZpbGVzIHRvIGFkZCBpbWFnZSByZW5kZXJpbmcgc3VwcG9ydCAoY3JvcHBpbmcsIGJsYWNrIGJvcmRlcnMpKi8KLSNpbmNsdWRlICJNNEVYSUZDX0NvbW1vbkFQSS5oIgotLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotI2RlZmluZSBUUkFOU1BBUkVOVF9DT0xPUiAweDdFMAotCi0vKiBQcm90b3R5cGUgb2YgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAgZnVuY3Rpb24gKGF2b2lkIGdyZWVuIGVmZmVjdCBvZiB0cmFuc3BhcmVuY3kgY29sb3IpICovCi1NNFZJRklfVUludDggTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLQotLypzcGVjaWFsIE1DUyBmdW5jdGlvbiB1c2VkIG9ubHkgaW4gVmlkZW9BcnRpc3QgYW5kIFZpZGVvU3R1ZGlvIHRvIG9wZW4gdGhlIG1lZGlhIGluIHRoZSBub3JtYWwKLSBtb2RlLiBUaGF0IHdheSB0aGUgbWVkaWEgZHVyYXRpb24gaXMgYWNjdXJhdGUqLwotZXh0ZXJuIE00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBNQ1MgKDNHUCB0cmFuc2NvZGVyKSB3aXRoIHRoZSBnaXZlbgotICogICAgICAgICAgICAgICAgcGFyYW1ldGVycwotICogQG5vdGUgICAgICAgIFRoZSB0cmFuc2NvZGluZyBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBieSB0aGUgaW50ZXJuYWwgeFZTUyBjb250ZXh0LgotICogICAgICAgICAgICAgICAgVGhpcyBjb250ZXh0IGNvbnRhaW5zIGEgcG9pbnRlciBvbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQotICogICAgICAgICAgICAgICAgY2hhaW5lZCBsaXN0IG9mIE1DUyBwYXJhbWV0ZXJzLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcm90YXRpb25EZWdyZWUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE1DU19Db250ZXh0IG1jc19jb250ZXh0OwotICAgIE00TUNTX091dHB1dFBhcmFtcyBQYXJhbXM7Ci0gICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMgUmF0ZXM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgY2xpcFByb3BzOwotCi0gICAgZXJyID0gTTRNQ1NfaW5pdCgmbWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX2luaXQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX29wZW4obWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlSW4sCi0gICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5JbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlT3V0LAotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX29wZW46IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgY2xpcCBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgZXJyID0gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhtY3NfY29udGV4dCwgJmNsaXBQcm9wcyk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAqcm90YXRpb25EZWdyZWUgPSBjbGlwUHJvcHMudmlkZW9Sb3RhdGlvbkRlZ3JlZXM7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIE1DUyBwYXJhbWV0ZXJzIHdpdGggdGhlIHBhcmFtZXRlcnMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlCi0gICAgICAgTUNTIHBhcmFtZXRlcnMgY2hhaW5lZCBsaXN0ICovCi0gICAgUGFyYW1zLk91dHB1dEZpbGVUeXBlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0RmlsZVR5cGU7Ci0gICAgUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0ID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgUGFyYW1zLm91dHB1dFZpZGVvUHJvZmlsZT0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIFBhcmFtcy5vdXRwdXRWaWRlb0xldmVsID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbDsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVNpemUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVJhdGUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZTsKLSAgICBQYXJhbXMuT3V0cHV0QXVkaW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBQYXJhbXMuT3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIFBhcmFtcy5iQXVkaW9Nb25vID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+YkF1ZGlvTW9ubzsKLSAgICBQYXJhbXMucE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIC8qRkIgMjAwOC8xMC8yMDogYWRkIG1lZGlhIHJlbmRlcmluZyBwYXJhbWV0ZXIgdG8ga2VlcCBhc3BlY3QgcmF0aW8qLwotICAgIHN3aXRjaCh4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5NZWRpYVJlbmRlcmluZykKLSAgICB7Ci0gICAgY2FzZSBNNHhWU1Nfa1Jlc2l6aW5nOgotICAgICAgICBQYXJhbXMuTWVkaWFSZW5kZXJpbmcgPSBNNE1DU19rUmVzaXppbmc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTR4VlNTX2tDcm9wcGluZzoKLSAgICAgICAgUGFyYW1zLk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa0Nyb3BwaW5nOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00eFZTU19rQmxhY2tCb3JkZXJzOgotICAgICAgICBQYXJhbXMuTWVkaWFSZW5kZXJpbmcgPSBNNE1DU19rQmxhY2tCb3JkZXJzOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgLyoqLwotICAgIC8vIG5ldyBwYXJhbXMgYWZ0ZXIgaW50ZWdyYXRpbmcgTUNTIDIuMAotICAgIC8vIFNldCB0aGUgbnVtYmVyIG9mIGF1ZGlvIGVmZmVjdHM7IDAgZm9yIG5vdy4KLSAgICBQYXJhbXMubmJFZmZlY3RzID0gMDsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLnBFZmZlY3RzID0gTlVMTDsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLmJEaXNjYXJkRXhpZiA9IE00T1NBX0ZBTFNFOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyBlZmZlY3Q7IG51bGwgZm9yIG5vdy4KLSAgICBQYXJhbXMuYkFkanVzdE9yaWVudGF0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgLy8gbmV3IHBhcmFtcyBhZnRlciBpbnRlZ3JhdGluZyBNQ1MgMi4wCi0KLSAgICAvKioKLSAgICAgKiBTZXQgb3V0cHV0IHBhcmFtZXRlcnMgKi8KLSAgICBlcnIgPSBNNE1DU19zZXRPdXRwdXRQYXJhbXMobWNzX2NvbnRleHQsICZQYXJhbXMpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19zZXRPdXRwdXRQYXJhbXM6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgUmF0ZXMuT3V0cHV0VmlkZW9CaXRyYXRlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIFJhdGVzLk91dHB1dEF1ZGlvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBSYXRlcy5CZWdpbkN1dFRpbWUgPSAwOwotICAgIFJhdGVzLkVuZEN1dFRpbWUgPSAwOwotICAgIFJhdGVzLk91dHB1dEZpbGVTaXplID0gMDsKLQotICAgIC8qRkI6IHRyYW5zY29kaW5nIHBlciBwYXJ0cyovCi0gICAgUmF0ZXMuQmVnaW5DdXRUaW1lID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+QmVnaW5DdXRUaW1lOwotICAgIFJhdGVzLkVuZEN1dFRpbWUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5FbmRDdXRUaW1lOwotICAgIFJhdGVzLk91dHB1dFZpZGVvVGltZXNjYWxlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9UaW1lc2NhbGU7Ci0KLSAgICBlcnIgPSBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhtY3NfY29udGV4dCwgJlJhdGVzKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChtY3NfY29udGV4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQ6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBNQ1MgY29udGV4dCB0byBiZSBhYmxlIHRvIGNhbGwgTUNTIHN0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCA9IG1jc19jb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgTUNTICgzR1AgdHJhbnNjb2RlcikKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IE00TUNTX2Nsb3NlKHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nOiBFcnJvciBpbiBNNE1DU19jbG9zZTogMHgleCIsIGVycik7Ci0gICAgICAgIE00TUNTX2Fib3J0KHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRoaXMgTUNTIGluc3RhbmNlICovCi0gICAgZXJyID0gTTRNQ1NfY2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZzogRXJyb3IgaW4gTTRNQ1NfY2xlYW5VcDogMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLSAqIEBicmllZiAgICBJdCBDb3ZlcnRzIGFuZCByZXNpemVzIGEgQVJHQjg4ODggaW1hZ2UgdG8gWVVWNDIwCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGaWxlSW4gICAgICAgICAgICAoSU4pIFRoZSBJbWFnZSBpbnB1dCBmaWxlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyICAgIChJTikgUG9pbnRlciBvbiBmaWxlc3lzdGVtIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIHBJbWFnZVBsYW5lcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIFlVVjQyMCBvdXRwdXQgcGxhbmVzIGFsbG9jYXRlZCBieSB0aGUgdXNlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHQjg4ODggaW1hZ2UgIHdpbGwgYmUgY29udmVydGVkIGFuZCByZXNpemVkICB0byBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotICpAcGFyYW0gICAgd2lkdGggICAgICAgIChJTikgd2lkdGggb2YgdGhlIEFSR0I4ODg4Ci0gKkBwYXJhbSAgICBoZWlnaHQgICAgICAgICAgICAoSU4pIGhlaWdodCBvZiB0aGUgQVJHQjg4ODgKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IG1lbW9yeSBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkKLXsKLSAgICBNNE9TQV9Db250ZXh0IHBBUkdCSW47Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUxICxyZ2JQbGFuZTI7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9hcmdiPSh3aWR0aCAqIGhlaWdodCAqIDQpOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKTsgLy9TaXplIG9mIFJHQjg4OCBkYXRhLgotICAgIE00T1NBX1VJbnQzMiBpID0gMCxqPSAwOwotICAgIE00T1NBX0VSUiBlcnI9TTROT19FUlJPUjsKLQotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLAotICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBhcmdiIGRhdGEiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIEVudGVyaW5nIDoiKTsKLSAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDp3aWR0aCBhbmQgaGVpZ2h0ICVkICVkIiwKLSAgICAgICAgd2lkdGggLGhlaWdodCk7Ci0gICAgLyogR2V0IGZpbGUgc2l6ZSAobWFuZGF0b3J5IGZvciBjaHVuayBkZWNvZGluZykgKi8KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRmlsZUluLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDpcCi0gICAgICAgICAgICBDYW4ndCBvcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIENhbid0IGNsb3NlIEFSR0I4ODg4XAotICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JJbik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgQ2FuJ3QgY2xvc2UgQVJHQjg4ODggXAotICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICByZ2JQbGFuZTEucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjg4OCBkYXRhIik7Ci0gICAgaWYocmdiUGxhbmUxLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICAgICByZ2JQbGFuZTEudV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHJnYlBsYW5lMS51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lMS51X3N0cmlkZSA9IHdpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lMS51X3RvcGxlZnQgPSAwOwotCi0KLSAgICAvKiogUmVtb3ZlIHRoZSBhbHBoYSBjaGFubmVsICovCi0gICAgZm9yIChpPTAsIGogPSAwOyBpIDwgZnJhbWVTaXplX2FyZ2I7IGkrKykgewotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgcmdiUGxhbmUxLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotCi0gICAgLyogVG8gQ2hlY2sgaWYgcmVzaXppbmcgaXMgcmVxdWlyZWQgd2l0aCBjb2xvciBjb252ZXJzaW9uICovCi0gICAgaWYod2lkdGggIT0gcEltYWdlUGxhbmVzLT51X3dpZHRoIHx8IGhlaWdodCAhPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFJlc2l6aW5nIDoiKTsKLSAgICAgICAgZnJhbWVTaXplID0gICggcEltYWdlUGxhbmVzLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X2hlaWdodCAqIDMpOwotICAgICAgICByZ2JQbGFuZTIucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgICAgICBpZihyZ2JQbGFuZTIucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV9oZWlnaHQgPSAgcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgIHJnYlBsYW5lMi51X3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgcmdiUGxhbmUyLnVfc3RyaWRlID0gcEltYWdlUGxhbmVzLT51X3dpZHRoKjM7Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAvKiBSZXNpemluZyBSR0I4ODggdG8gUkdCODg4ICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsICZyZ2JQbGFuZTEsICZyZ2JQbGFuZTIpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJlc2l6ZSBSR0I4ODggdG8gUkdCODg4OiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKkNvbnZlcnRpbmcgUmVzaXplZCBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUyLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQjg4OCB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKLQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBOTyAgUmVzaXppbmcgOiIpOwotICAgICAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lMSwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKLSAgICB9Ci1jbGVhbnVwOgotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBsZWF2aW5nIDoiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGhlaWdodCk7Ci0gKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRmlsZUluICAgICAgICAgICAgKElOKSBUaGUgSW1hZ2UgaW5wdXQgZmlsZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ciAgICAoSU4pIFBvaW50ZXIgb24gZmlsZXN5c3RlbSBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMgICAgKElOL09VVCkgUG9pbnRlciBvbiBZVVY0MjAgb3V0cHV0IHBsYW5lcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCAgdG8gb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotICogQHBhcmFtICAgIHdpZHRoICAgICAgICAoSU4pIHdpZHRoIG9mIHRoZSBBUkdCODg4OAotICogQHBhcmFtICAgIGhlaWdodCAgICAgICAgICAgIChJTikgaGVpZ2h0IG9mIHRoZSBBUkdCODg4OAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogbWVtb3J5IGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSoqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqeXV2UGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgeXV2UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZih5dXZQbGFuZSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHl1dlBsYW5lWzBdLnVfd2lkdGggPSB3aWR0aDsKLSAgICB5dXZQbGFuZVswXS51X3N0cmlkZSA9IHdpZHRoOwotICAgIHl1dlBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgeXV2UGxhbmVbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoeXV2UGxhbmVbMF0udV9oZWlnaHQgXAotICAgICAgICAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0KLSAgICB5dXZQbGFuZVsxXS51X2hlaWdodCA9IHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID4+MTsKLSAgICB5dXZQbGFuZVsxXS51X3dpZHRoID0geXV2UGxhbmVbMF0udV93aWR0aCA+PiAxOwotICAgIHl1dlBsYW5lWzFdLnVfc3RyaWRlID0geXV2UGxhbmVbMV0udV93aWR0aDsKLSAgICB5dXZQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgIHl1dlBsYW5lWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKHl1dlBsYW5lWzBdLnBhY19kYXRhICsgeXV2UGxhbmVbMF0udV9oZWlnaHQgXAotICAgICAgICAqIHl1dlBsYW5lWzBdLnVfd2lkdGgpOwotCi0gICAgeXV2UGxhbmVbMl0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgeXV2UGxhbmVbMl0udV93aWR0aCA9IHl1dlBsYW5lWzBdLnVfd2lkdGggPj4gMTsKLSAgICB5dXZQbGFuZVsyXS51X3N0cmlkZSA9IHl1dlBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgeXV2UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICB5dXZQbGFuZVsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSh5dXZQbGFuZVsxXS5wYWNfZGF0YSArIHl1dlBsYW5lWzFdLnVfaGVpZ2h0IFwKLSAgICAgICAgKiB5dXZQbGFuZVsxXS51X3dpZHRoKTsKLSAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCggcEZpbGVJbixwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2UGxhbmUsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIHJldHVybiBlcnJvcjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgZnJlZSh5dXZQbGFuZSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgICAgICpwSW1hZ2VQbGFuZXMgPSB5dXZQbGFuZTsKLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMCA6TGVhdmluZyIpOwotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdCAoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFBpY3R1cmVEdXJhdGlvbik7Ci0gKiBAYnJpZWYgICAgSXQgZmVlZHMgdGhlIFBUTzNHUFAgd2l0aCBZVVY0MjAgcGljdHVyZXMuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIGdpdmVuIHRvIHRoZSBQVE8zR1BQIGluIHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcwotICogQHBhcmFtICAgIHBQaWN0dXJlRHVyYXRpb24oT1VUKSBEdXJhdGlvbiBvZiB0aGUgcmV0dXJuZWQgcGljdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU6IFRoZSByZXR1cm5lZCBpbWFnZSBpcyB0aGUgbGFzdCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQ4ICAgIGxhc3RfZnJhbWVfZmxhZyA9IDA7Ci0gICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqIHBDID0gKE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KikgKHBQaWN0dXJlQ3R4dCk7Ci0KLSAgICAvKlVzZWQgZm9yIHBhbiZ6b29tKi8KLSAgICBNNE9TQV9VSW50OCB0ZW1wUGFuem9vbVhhID0gMDsKLSAgICBNNE9TQV9VSW50OCB0ZW1wUGFuem9vbVhiID0gMDsKLSAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotICAgIC8qKi8KLQotICAgIC8qVXNlZCBmb3IgY3JvcHBpbmcgYW5kIGJsYWNrIGJvcmRlcnMqLwotICAgIE00T1NBX0NvbnRleHQgICAgcFBpY3R1cmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgcGljdHVyZVNpemUgPSAwIDsKLSAgICBNNE9TQV9VSW50OCogICAgcGljdHVyZUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgLy9NNEVYSUZDX0NvbnRleHQgcEV4aWZDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNEVYSUZDX0Jhc2ljVGFncyBwQmFzaWNUYWdzOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lczEgPSBwSW1hZ2VQbGFuZXNbMF07Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcEltYWdlUGxhbmVzMiA9IHBJbWFnZVBsYW5lc1sxXTsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXMzID0gcEltYWdlUGxhbmVzWzJdOwotICAgIC8qKi8KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBQaWN0dXJlQ3R4dCksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcFBpY3R1cmVDdHh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBJbWFnZVBsYW5lcyksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcEltYWdlUGxhbmVzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBQaWN0dXJlRHVyYXRpb24pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcFBpY3R1cmVEdXJhdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgOkVudGVyaW5nIik7Ci0gICAgLypQUiBQNE1FMDAwMDMxODEgSW4gY2FzZSB0aGUgaW1hZ2UgbnVtYmVyIGlzIDAsIHBhbiZ6b29tIGNhbiBub3QgYmUgdXNlZCovCi0gICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tICYmIHBDLT5tX05iSW1hZ2UgPT0gMCkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvKklmIG5vIGNyb3BwaW5nL2JsYWNrIGJvcmRlcnMgb3IgcGFuJnpvb20sIGp1c3QgZGVjb2RlIGFuZCByZXNpemUgdGhlIHBpY3R1cmUqLwotICAgIGlmKHBDLT5tX21lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgJiYgTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGFuZCByZXNpemUgaW5wdXQgQVJHQjg4ODggZmlsZSB0byBZVVY0MjAgKi8KLSAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgMTogd2lkdGggYW5kIGhlZ2h0ICVkICVkIiwKLSAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAocEMtPm1fRmlsZUluLAotICAgICAgICAgICAgIHBDLT5tX3BGaWxlUmVhZFB0ciwgcEltYWdlUGxhbmVzLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCwKLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGRlY29kaW5nIEpQRUc6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qSW4gY2FzZSBvZiBjcm9wcGluZywgYmxhY2sgYm9yZGVycyBvciBwYW4mem9vbSwgY2FsbCB0aGUgRVhJRiByZWFkZXIgYW5kIHRoZSBBSVIqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlcyByYXRpb3MgKi8KLSAgICAgICAgaWYocEMtPm1fcERlY29kZWRQbGFuZSA9PSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbnZlcnQgaW5wdXQgQVJHQjg4ODggZmlsZSB0byBZVVY0MjAgKi8KLSAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdCAyOiB3aWR0aCBhbmQgaGVnaHQgJWQgJWQiLAotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4OHRvWVVWNDIwKHBDLT5tX0ZpbGVJbiwgcEMtPm1fcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICYocEMtPm1fcERlY29kZWRQbGFuZSkscEMtPm1fcFB0bzNHUFBwYXJhbXMtPndpZHRoLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5oZWlnaHQpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gZGVjb2RpbmcgSlBFRzogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wRGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBZVVY0MjAgcGxhbmFyIGlzIHJldHVybmVkIGJ1dCBhbGxvY2F0aW9uIGlzIG1hZGUgb25seSBvbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29udGlnb3VzIHBsYW5lcyBpbiBtZW1vcnkpICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZS0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aDsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgUGFyYW1zLm1fYk91dHB1dFN0cmlwZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0KLSAgICAgICAgLypJbml0aWFsaXplIEV4aWYgcGFyYW1zIHN0cnVjdHVyZSovCi0gICAgICAgIHBCYXNpY1RhZ3Mub3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOwotCi0gICAgICAgIC8qKgotICAgICAgICBQYW4mem9vbSBwYXJhbXMqLwotICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU2F2ZSByYXRpbyB2YWx1ZXMsIHRoZXkgY2FuIGJlIHJldXNlZCBpZiB0aGUgbmV3IHJhdGlvcyBhcmUgMCovCi0gICAgICAgICAgICB0ZW1wUGFuem9vbVhhID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGE7Ci0gICAgICAgICAgICB0ZW1wUGFuem9vbVhiID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGI7Ci0gICAgICAgICAgICAvKkNoZWNrIHRoYXQgdGhlIHJhdGlvIGlzIG5vdCAwKi8KLSAgICAgICAgICAgIC8qQ2hlY2sgKGEpIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG1heFJhdGlvID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+PQotICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpcyBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsgdGVtcFBhbnpvb21YYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG92ZXJzaXplIGlzIG1heFJhdGlvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhdGlvID0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgKyB0ZW1wUGFuem9vbVhhIC0gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArIHRlbXBQYW56b29tWGEgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhICsgdGVtcFBhbnpvb21YYSAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypNb2RpZnkgdGhlIChhKSBwYXJhbWV0ZXJzOiovCi0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPj0gbWF4UmF0aW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXJzIGNhbiBiZSBtb3ZlZCB0byBrZWVwIHRoZSBzYW1lIGFyZWEgc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhIC09IG1heFJhdGlvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1vdmUgdGhlIChhKSB0b3BsZWZ0IHBhcmFtZXRlciB0byAwIGJ1dCB0aGUgcmF0aW8gd2lsbCBiZSBhbHNvIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGEpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB0byBtYXRjaCB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypUaGUgbmV3IHJhdGlvIGlzIHRoZSBvcmlnaW5hbCBvbmUqLwotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPSB0ZW1wUGFuem9vbVhhOwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChhKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID4gMTAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQ2hhbmdlIHRoZSByYXRpbyBpZiB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGEpIHBhcmFtZXRlcnMgaXMKLSAgICAgICAgICAgICAgICAgICAgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhID0gMTAwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qQ2hlY2sgKGIpIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG1heFJhdGlvID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiA+PQotICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiArIHRlbXBQYW56b29tWGIgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiICsgdGVtcFBhbnpvb21YYiAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGIpCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgKyB0ZW1wUGFuem9vbVhiID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3ZlcnNpemUgaXMgbWF4UmF0aW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmF0aW8gPSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiArIHRlbXBQYW56b29tWGIgLSAxMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qTW9kaWZ5IHRoZSAoYikgcGFyYW1ldGVyczoqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGIpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB0byBtYXRjaCB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPj0gbWF4UmF0aW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXJzIGNhbiBiZSBtb3ZlZCB0byBrZWVwIHRoZSBzYW1lIGFyZWEgc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliIC09IG1heFJhdGlvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1vdmUgdGhlIChiKSB0b3BsZWZ0IHBhcmFtZXRlciB0byAwIGJ1dCB0aGUgcmF0aW8gd2lsbCBiZSBhbHNvIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qVGhlIG5ldyByYXRpbyBpcyB0aGUgb3JpZ2luYWwgb25lKi8KLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiID0gdGVtcFBhbnpvb21YYjsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiICsgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPiAxMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypDaGFuZ2UgdGhlIHJhdGlvIGlmIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikgcGFyYW1ldGVycyBpcwotICAgICAgICAgICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgPSAxMDAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChiKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29tcHV0ZXMgQUlSIHBhcmFtZXRlcnMgKi8KLS8qICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKgotICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiIFwKLSAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX1VJbnQzMikocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliXAotICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0KLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoTTRPU0FfVUludDMyKShwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0KLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gIChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0gKi8KLSAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdXNpbmcgcEMtPm1fTmJJbWFnZSB3ZSBoYXZlIHRvIHVzZSAocEMtPm1fTmJJbWFnZS0xKSBhcyBwQy0+bV9JbWFnZUNvdW50ZXIKLSAgICAgICAgICAgIC8vIHdpbGwgYmUgeC0xIG1heCBmb3IgeCBuby4gb2YgZnJhbWVzCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSkgKgotICAgICAgICAgICAgICAgIHBDLT5tX0ltYWdlQ291bnRlcikgLyAoTTRPU0FfRG91YmxlKXBDLT5tX05iSW1hZ2UtMSkpIC8gMTAwMCkpOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoKChNNE9TQV9Eb3VibGUpcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArCi0gICAgICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWJcCi0gICAgICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfRG91YmxlKXBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKShwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgXAotICAgICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEpICoKLSAgICAgICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlLTEpKSAvIDEwMDApKTsKLQotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoICsgUGFyYW1zLm1faW5wdXRDb29yZC5tX3gpXAotICAgICAgICAgICAgICAgICA+IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIFwKLSAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dENvb3JkLm1feDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCArIFBhcmFtcy5tX2lucHV0Q29vcmQubV95KVwKLSAgICAgICAgICAgICAgICAgPiBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRDb29yZC5tX3k7Ci0gICAgICAgICAgICB9Ci0KLQotCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgfQotCi0KLQotICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogQmxhY2sgYm9yZGVycyovCi0KLSAgICAgICAgaWYocEMtPm1fbWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1swXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzWzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICBGaXJzdCB3aXRob3V0IHBhbiZ6b29tKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHBCYXNpY1RhZ3Mub3JpZW50YXRpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOgotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbUxlZnQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpIDw9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpKnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyB3aWR0aCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X2hlaWdodCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpIDwgcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIGhlaWdodCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIHRvcCBhbmQgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJvdHRvbSBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpPj4xKSpwSW1hZ2VQbGFuZXNbMF0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEltYWdlUGxhbmVzWzJdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgIFNlY29uZGx5IHdpdGggcGFuJnpvb20qLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaChwQmFzaWNUYWdzLm9yaWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjoKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgICAgICAvKk5PIFJPVEFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCkgPD0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA8IFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG91dHB1dCB2aWRlbyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gb3V0cHV0IGhlaWdodCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdpZHRoIGlzIHRoZSBzY3JlZW4gd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0gKHRlbXBPdXRwdXRTaXplSGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIGlucHV0IGhlaWdodCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BvcnRpb25hbCB0byB0aGUgbWF4aW11bSBvdXRwdXQgaGVpZ2h0KSovCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHBJbWFnZVBsYW5lcy0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkvdGVtcE91dHB1dFNpemVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHRlbXBJbnB1dFNpemVIZWlnaHRNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGltYWdlIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIGhlaWdodCB3aWxsIGJlIHRoZSBtYXhpbXVtIHBvc3NpYmxlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV95Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZUhlaWdodE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3lcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHBhbiB6b29tIGFyZWEgY2FuIGJlIGV4dGVuZGVkIHN5bW1ldHJpY2FsbHkgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCBhbmQgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSAtPSAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dENvb3JkLm1feSA8IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV95ICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBhYm92ZSB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBiZWxvdyB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBib3R0b20qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGVtcElucHV0U2l6ZUhlaWdodE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgdGhlIG1heGltdW0gcG9zc2libGUgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgYWxsIHRoZSBpbnB1dCBpbWFnZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcE91dHB1dFNpemVIZWlnaHQqcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCB3aWR0aCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X2hlaWdodCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0V2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3V0cHV0IGhlaWdodCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplV2lkdGggPSAodGVtcE91dHB1dFNpemVXaWR0aD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBpbnB1dCB3aWR0aCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9ydGlvbmFsIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV93aWR0aCpQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC90ZW1wT3V0cHV0U2l6ZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gKHRlbXBJbnB1dFNpemVXaWR0aE1heD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGludG8gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZVdpZHRoTWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIHdpZHRoIHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV94Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCBhbmQgbGVmdCBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggLT0gKCh0ZW1wSW5wdXRTaXplV2lkdGhNYXhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0Q29vcmQubV94IDwgcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBhYm92ZSB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgbGVmdCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIGJlbG93IHRoZSBpbnB1dCBwYW4gem9vbSBhcmVhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSByaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSB0ZW1wSW5wdXRTaXplV2lkdGhNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZVdpZHRoKnBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgICAgICAvKlJPVEFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkgPCBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID4gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCBoZWlnaHQgaWYgdGhlIGlucHV0IGltYWdlIGFzcGVjdCByYXRpbyBpcyBrZXB0IGFuZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcE91dHB1dFNpemVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dFNpemVIZWlnaHQgPSAodGVtcE91dHB1dFNpemVIZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgaGVpZ2h0IGFjY29yZGluZyB0byB0aGUgbWF4aW11bSBvdXRwdXQgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQqUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdGVtcE91dHB1dFNpemVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHRlbXBJbnB1dFNpemVIZWlnaHRNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaW1hZ2Ugd2lkdGggKHJvdGF0aW9uIGluY2x1ZGVkKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgY29udGFpbmVkIGluIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIHdpZHRoIHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZUhlaWdodE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBwYW4gem9vbSBhcmVhIGNhbiBiZSBleHRlbmRlZCBzeW1tZXRyaWNhbGx5IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94IC09ICgodGVtcElucHV0U2l6ZUhlaWdodE1heCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV94ICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIG9uIHRoZSBsZWZ0IG9mIHRoZSBpbnB1dCBwYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSBhcmVhIHRvIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIGxlZnQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgcmlnaHQgb2YgdGhlIGlucHV0IHBhbiB6b29tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhIHRvIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIHJpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCB3aWR0aCBvZiB0aGUgQUlSIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHRlbXBJbnB1dFNpemVIZWlnaHRNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZUhlaWdodCpwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKT4+MSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMV0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG91dHB1dCB2aWRlbyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gb3V0cHV0IHdpZHRoIGlmIHRoZSBpbnB1dCBpbWFnZSBhc3BlY3QgcmF0aW8gaXMga2VwdCBhbmQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdpZHRoIGlzIHRoZSBzY3JlZW4gaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dFdpZHRoID0gMCwgdGVtcEZpbmFsT3V0cHV0V2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3V0cHV0IGhlaWdodCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0PSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0gKHRlbXBPdXRwdXRTaXplV2lkdGg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IHdpZHRoKSovCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV93aWR0aCpQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL3RlbXBPdXRwdXRTaXplV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPSAodGVtcElucHV0U2l6ZVdpZHRoTWF4Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW50byB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQgKHJvdGF0aW9uIGluY2x1ZGVkKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplV2lkdGhNYXggPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhlaWdodCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiBoZWlnaHQgd2lsbCBiZSB0aGUgbWF4aW11bSBwb3NzaWJsZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCh0ZW1wSW5wdXRTaXplV2lkdGhNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV95Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95IC09ICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2Ugb24gdGhlIHRvcCBvZiB0aGUgaW5wdXQgcGFuIHpvb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgYm90dG9tIG9mIHRoZSBpbnB1dCBwYW4gem9vbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBib3R0b20qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGVtcElucHV0U2l6ZVdpZHRoTWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBoZWlnaHQgb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhlaWdodCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IGhlaWdodCBvZiB0aGUgQUlSIGlzIGFsbCB0aGUgaW5wdXQgaW1hZ2UgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBPdXRwdXRTaXplV2lkdGgqcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypXaWR0aCBhbmQgaGVpZ2h0IGhhdmUgdG8gYmUgZXZlbiovCi0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgLypDaGVjayB0aGF0IHZhbHVlcyBhcmUgY29oZXJlbnQqLwotICAgICAgICAgICAgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID09IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgIFBpY3R1cmUgcmVuZGVyaW5nOiBSZXNpemluZyBhbmQgQ3JvcHBpbmcqLwotICAgICAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyAhPSBNNHhWU1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKHBCYXNpY1RhZ3Mub3JpZW50YXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa0Nyb3BwaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDxQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBIZWlnaHQgPSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgLypoZWlnaHQgd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgXAotICAgICAgICAgICAgICAgICAgICAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgKz0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKCh0ZW1wSGVpZ2h0IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcFdpZHRoPSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAvKndpZHRoIHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMilcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggKz0gKE00T1NBX0ludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKE00T1NBX0ludDMyKSh0ZW1wV2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBpZihNNE9TQV9OVUxMID09IHBDLT5tX2Fpcl9jb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFJUl9jcmVhdGUoJnBDLT5tX2Fpcl9jb250ZXh0LCBNNEFJUl9rWVVWNDIwUCk7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgcEMtPm1fcERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmUGFyYW1zKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBjb25maWd1cmluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lKTsKLSAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChwQy0+bV9haXJfY29udGV4dCwgcEMtPm1fcERlY29kZWRQbGFuZSwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEltYWdlUGxhbmVzWzBdID0gcEltYWdlUGxhbmVzMTsKLSAgICAgICAgcEltYWdlUGxhbmVzWzFdID0gcEltYWdlUGxhbmVzMjsKLSAgICAgICAgcEltYWdlUGxhbmVzWzJdID0gcEltYWdlUGxhbmVzMzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgaW1hZ2UgY291bnRlciAqLwotICAgIHBDLT5tX0ltYWdlQ291bnRlcisrOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgZW5kIG9mIHNlcXVlbmNlICovCi0gICAgbGFzdF9mcmFtZV9mbGFnICAgID0gKHBDLT5tX0ltYWdlQ291bnRlciA+PSBwQy0+bV9OYkltYWdlKTsKLQotICAgIC8qKgotICAgICAqIEtlZXAgdGhlIHBpY3R1cmUgZHVyYXRpb24gKi8KLSAgICAqcFBpY3R1cmVEdXJhdGlvbiA9IHBDLT5tX3RpbWVEdXJhdGlvbjsKLQotICAgIGlmICgxID09IGxhc3RfZnJhbWVfZmxhZykKLSAgICB7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fYWlyX2NvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gY2xlYW5pbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcERlY29kZWRQbGFuZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IExlYXZpbmcgIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgUHRvM0dQUCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBUaGUgIlBpY3R1cmVzIHRvIDNHUFAiIHBhcmFtZXRlcnMgYXJlIGdpdmVuIGJ5IHRoZSBpbnRlcm5hbCB4VlNTCi0gKiAgICAgICAgICAgIGNvbnRleHQuIFRoaXMgY29udGV4dCBjb250YWlucyBhIHBvaW50ZXIgb24gdGhlIGN1cnJlbnQgZWxlbWVudAotICogICAgICAgICAgICBvZiB0aGUgY2hhaW5lZCBsaXN0IG9mIFB0bzNHUFAgcGFyYW1ldGVycy4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTogVGhlIHJldHVybmVkIGltYWdlIGlzIHRoZSBsYXN0IG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIERlZmluaXRpb25zIHRvIGdlbmVyYXRlIGR1bW15IEFNUiBmaWxlIHVzZWQgdG8gYWRkIEFNUiBzaWxlbmNlIGluIGZpbGVzIGdlbmVyYXRlZAotICAgICBieSBQdG8zR1BQICovCi0gICAgI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0gICAgLyogVGhpcyBjb25zdGFudCBpcyBkZWZpbmVkIGluIE00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oICovCi0gICAgZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4XAotICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OFtNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdOwotCi0gICAgLyogQU1SIHNpbGVudCBmcmFtZSB1c2VkIHRvIGNvbXB1dGUgZHVtbXkgQU1SIHNpbGVuY2UgZmlsZSAqLwotICAgICNkZWZpbmUgTTRWU1MzR1BQX0FNUl9IRUFERVJfU0laRSA2Ci0gICAgY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FNUl9IRUFERVJbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci0gICAgeyAweDIzLCAweDIxLCAweDQxLCAweDRkLCAweDUyLCAweDBhIH07Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRQVE8zR1BQX0NvbnRleHQgcE00UFRPM0dQUF9DdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNFBUTzNHUFBfUGFyYW1zIFBhcmFtczsKLSAgICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqICAgIHBDYWxsQmFja0N0eHQ7Ci0gICAgTTRPU0FfQm9vbCBjbXBSZXN1bHQ9TTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQ29udGV4dCBwRHVtbXlBTVJGaWxlOwotICAgIE00T1NBX0NoYXIgb3V0X2FtcltNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00T1NBX0NoYXIqIHBEZWNvZGVkUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNNFBUTzNHUFAgaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfSW5pdCggJnBNNFBUTzNHUFBfQ3R4dCwgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsCi0gICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgJWxkXG4iLGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcENhbGxCYWNrQ3R4dCA9IChNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCksCi0gICAgICAgICBNNFZTLChNNE9TQV9DaGFyICopICJQdG8zZ3BwIGNhbGxiYWNrIHN0cnVjdCIpOwotICAgIGlmKHBDYWxsQmFja0N0eHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgIFBhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgIFBhcmFtcy52aWRlb1Byb2ZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgUGFyYW1zLnZpZGVvTGV2ZWwgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgImR1bW15IiBhbXIgZmlsZSBjb250YWluaW5nIHNpbGVuY2UgaW4gdGVtcG9yYXJ5IGZvbGRlciAqLwotICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwotCi0gICAgLyoqCi0gICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gb3V0X2FtcjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgb3V0X2FtciwKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3A6XAotICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0KLSAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPm9wZW5Xcml0ZSgmcER1bW15QU1SRmlsZSwgcERlY29kZWRQYXRoLCBNNE9TQV9rRmlsZVdyaXRlKTsKLQotICAgIC8qQ29tbWVudGVkIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiB0aGUgVVRGIGNvbnZlcnNpb24gc2VlIGFib3ZlKi8KLS8qICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0ci0+b3BlbldyaXRlKCZwRHVtbXlBTVJGaWxlLCBvdXRfYW1yLCBNNE9TQV9rRmlsZVdyaXRlKTsKLSAqLwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IENhbid0IG9wZW4gb3V0cHV0IGR1bW15IGFtciBmaWxlICVzLFwKLSAgICAgICAgICAgICBlcnJvcjogMHgleFxuIixvdXRfYW1yLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9ICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPndyaXRlRGF0YShwRHVtbXlBTVJGaWxlLAotICAgICAgICAoTTRPU0FfSW50OCopTTRWU1MzR1BQX0FNUl9IRUFERVIsIE00VlNTM0dQUF9BTVJfSEVBREVSX1NJWkUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IENhbid0IHdyaXRlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcyxcCi0gICAgICAgICAgICAgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT53cml0ZURhdGEocER1bW15QU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9JbnQ4KilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4LCBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IFwKLSAgICAgICAgICAgIENhbid0IHdyaXRlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT5jbG9zZVdyaXRlKHBEdW1teUFNUkZpbGUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IFwKLSAgICAgICAgICAgIENhbid0IGNsb3NlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIHBhcmFtZXRlcnMgZm9yIFB0bzNHUFAgd2l0aCB0aGUgcGFyYW1ldGVycyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiB0aGUKLSAgICAgKiBQdG8zR1BQIHBhcmFtZXRlcnMgY2hhaW5lZCBsaXN0IGFuZCB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID09IDApIHsKLSAgICAgICAgUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSAgICA9IE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgICBQYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljVG8zR1A6IHZpZGVvIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgIFBhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgUGFyYW1zLk91dHB1dEZpbGVNYXhTaXplICAgID0gTTRQVE8zR1BQX2tVTkxJTUlURUQ7Ci0gICAgUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tGY3QgICAgPSBNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OwotICAgIFBhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCAgICA9IHBDYWxsQmFja0N0eHQ7Ci0gICAgLypGQjogY2hhbmdlIHRvIHVzZSB0aGUgY29udmVydGVkIHBhdGggKFVURiBjb252ZXJzaW9uKSBzZWUgdGhlIGNvbnZlcnNpb24gYWJvdmUqLwotICAgIC8qRml4IDotIEFkZGluZyBBdWRpbyBUcmFjayBpbiBJbWFnZSBhcyBpbnB1dCA6QXVkaW9UYXJja0ZpbGUgU2V0dGluZyB0byBOVUxMICovCi0gICAgUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlICAgID0gTTRPU0FfTlVMTDsvLyhNNE9TQV9Wb2lkKilwRGVjb2RlZFBhdGg7Ly9vdXRfYW1yOwotICAgIFBhcmFtcy5BdWRpb1BhZGRpbmdNb2RlICAgICAgICA9IE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Mb29wOwotICAgIFBhcmFtcy5BdWRpb0ZpbGVGb3JtYXQgICAgICAgID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjsKLSAgICBQYXJhbXMucE91dHB1dDNncHBGaWxlICAgICAgICA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5wRmlsZU91dDsKLSAgICBQYXJhbXMucFRlbXBvcmFyeUZpbGUgICAgICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPnBGaWxlVGVtcDsKLSAgICAvKitQUiBObzogIGJscm54cHN3IzIyMyovCi0gICAgLypJbmNyZWFzaW5nIGZyZXF1ZW5jeSBvZiBGcmFtZSwgY2FsY3VsYXRpbmcgTm9zIG9mIEZyYW1lID0gZHVyYXRpb24gL0ZQUyAqLwotICAgIC8qT3RoZXIgY2hhbmdlcyBtYWRlIGlzIEAgTTR4VlNTX0FQSS5jIEAgbGluZSAzODQxIGluIE00eFZTU19TZW5kQ29tbWFuZCovCi0gICAgLypJZiBjYXNlIGNoZWNrIGZvciBQYW5ab29tIHJlbW92ZWQgKi8KLSAgICBQYXJhbXMuTmJWaWRlb0ZyYW1lcyAgICAgICAgICAgID0gKE00T1NBX1VJbnQzMikKLSAgICAgICAgKHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5kdXJhdGlvbiBcCi0gICAgICAgICAgICAvIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5mcmFtZXJhdGUpOyAvKiAqLwotICAgIHBDYWxsQmFja0N0eHQtPm1fdGltZUR1cmF0aW9uICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmZyYW1lcmF0ZTsKLSAgICAvKi1QUiBObzogIGJscm54cHN3IzIyMyovCi0gICAgcENhbGxCYWNrQ3R4dC0+bV9JbWFnZUNvdW50ZXIgICAgPSAwOwotICAgIHBDYWxsQmFja0N0eHQtPm1fRmlsZUluICAgICAgICAgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+cEZpbGVJbjsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgICAgICAgID0gUGFyYW1zLk5iVmlkZW9GcmFtZXM7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9wRmlsZVJlYWRQdHIgICAgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX3BEZWNvZGVkUGxhbmUgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDYWxsQmFja0N0eHQtPm1fcFB0bzNHUFBwYXJhbXMgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtczsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX2Fpcl9jb250ZXh0ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX21lZGlhUmVuZGVyaW5nID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPk1lZGlhUmVuZGVyaW5nOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzICovCi0gICAgZXJyID0gTTRQVE8zR1BQX09wZW4ocE00UFRPM0dQUF9DdHh0LCAmUGFyYW1zKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4gcmV0dXJuZWQ6IDB4JXhcbiIsZXJyKTsKLSAgICAgICAgaWYocENhbGxCYWNrQ3R4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDYWxsQmFja0N0eHQpOwotICAgICAgICAgICAgcENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgTTRQVE8zR1BQX0NsZWFuVXAocE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGNvbnRleHQgdG8gYmUgYWJsZSB0byBjYWxsIFB0bzNHUFAgc3RlcCBmdW5jdGlvbiBpbiBNNHhWU1Nfc3RlcCBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0ID0gcE00UFRPM0dQUF9DdHh0OwotICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IHBDYWxsQmFja0N0eHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBQdG8zR1BQCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9DaGFyIG91dF9hbXJbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBQVE8zR1BQIGNhbGxiYWNrIGNvbnRleHQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5hbGl6ZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfQ2xvc2UoeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xvc2UgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICBNNFBUTzNHUFBfQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0aGlzIE00UFRPM0dQUCBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00UFRPM0dQUF9DbGVhblVwKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXAgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBkdW1teS5hbXIgZmlsZSAqLwotICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwotCi0gICAgLyoqCi0gICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gb3V0X2FtcjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgb3V0X2FtciwKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncDpcCi0gICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgfQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBEZWNvZGVkUGF0aCk7Ci0KLSAgICAvKkNvbW1lbnRlZCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIFVURiBjb252ZXJzaW9uKi8KLS8qICAgIHJlbW92ZShvdXRfYW1yKTsKLSAqLwotCi0gICAgeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjU2NSBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICAgIEl0IGFsbG9jYXRlcyBvdXRwdXQgWVVWIHBsYW5lcwotICogQHBhcmFtICAgIGZyYW1pbmdDdHggICAgKElOKSBUaGUgZnJhbWluZyBzdHJ1Y3QgY29udGFpbmluZyBpbnB1dCBSR0I1NjUgcGxhbmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aFwKLSAgICAgICAgICAgICpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciAqKVwKLSAgICAgICAgICAgICAgICAiQWxsb2MgZm9yIHRoZSBDb252ZXJ0aW9uIG91dHB1dCBZVVYiKTs7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhIFwKLSAgICAgICAgKyBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0OwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSBcCi0gICAgICAgICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCIDU2NSB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZwotICAgICAgZWZmZWN0ICovCi0gICAgZXJyID0gTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAoTTRPU0FfTlVMTCwgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiwgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOlwKLSAgICAgICAgICAgICBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIHdpdGggUkdCIGJ1ZmZlci4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTZXRQbGFuZVRyYW5zcGFyZW50KE00T1NBX1VJbnQ4KiBwbGFuZUluLCBNNE9TQV9VSW50MzIgc2l6ZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgaTsKLSAgICBNNE9TQV9VSW50OCogcGxhbmUgPSBwbGFuZUluOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9IChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0gICAgZm9yKGk9MDsgaTwoc2l6ZT4+MSk7IGkrKykKLSAgICB7Ci0gICAgICAgICpwbGFuZSsrID0gdHJhbnNwYXJlbnQxOwotICAgICAgICAqcGxhbmUrKyA9IHRyYW5zcGFyZW50MjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSQkc4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgQVJHQjg4ODggaW5wdXQgZmlsZSAgdG8gWVVWNDIwIHdoZW51c2VkIGZvciBmcmFtbWluZyBlZmZlY3QKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBBUkdCODg4OCBmaWxlIHBhdGggaXMgY29udGFpbmVkIGluIHRoZSBwRWZmZWN0IHN0cnVjdHVyZQotICogICAgICAgICAgICBJZiB0aGUgQVJHQjg4ODggbXVzdCBiZSByZXNpemVkIHRvIGZpdCBvdXRwdXQgdmlkZW8gc2l6ZSwgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICB3aWxsIGRvIGl0LgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRWZmZWN0ICAgICAgICAoSU4pIFRoZSBlZmZlY3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9ucyBvbgotICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSB0byBkZWNvZGUsIHJlc2l6aW5nIC4uLgotICogQHBhcmFtICAgIGZyYW1pbmdDdHggICAgKElOL09VVCkgU3RydWN0dXJlIGluIHdoaWNoIHRoZSBvdXRwdXQgUkdCIHdpbGwgYmUgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqIEByZXR1cm4gICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IEZpbGUgbm90IGZvdW5kLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfQ29udGV4dCBwQVJHQkluOwotICAgIE00T1NBX1VJbnQzMiBmaWxlX3NpemU7Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBoZWlnaHQsIHdpZHRoX291dCwgaGVpZ2h0X291dDsKLSAgICBNNE9TQV9Wb2lkKiBwRmlsZSA9IHBFZmZlY3QtPnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDEgPSAoTTRPU0FfVUludDgpKChUUkFOU1BBUkVOVF9DT0xPUiAmIDB4RkYwMCk+PjgpOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MiA9IChNNE9TQV9VSW50OClUUkFOU1BBUkVOVF9DT0xPUjsKLSAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00T1NBX0NoYXIqIHBEZWNvZGVkUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLGogPSAwOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHJnYlBsYW5lOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemVfYXJnYj0oZnJhbWluZ0N0eC0+d2lkdGggKiBmcmFtaW5nQ3R4LT5oZWlnaHQgKiA0KTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wQWxwaGFQZXJjZW50ID0gMDsKLSAgICBNNFZJRklfVUludDgqIFRlbXBQYWNEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MTYgKnB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHogPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IEVudGVyaW5nICIpOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Qgd2lkdGggYW5kIGhlaWdodCAlZCAlZCAiLAotICAgICAgICBmcmFtaW5nQ3R4LT53aWR0aCxmcmFtaW5nQ3R4LT5oZWlnaHQpOwotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLCBNNFZTLCAoTTRPU0FfQ2hhciopXAotICAgICAgICAiSW1hZ2UgYXJnYiBkYXRhIik7Ci0gICAgaWYocFRtcERhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IHRoZSBmaWxlIHBhdGggaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0Ki8KLSAgICBwRGVjb2RlZFBhdGggPSBwRmlsZTsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgcEZpbGUsCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsRGVjb2RlUE5HOlwKLSAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IixlcnIpOwotICAgICAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotCi0gICAgIC8qIE9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSBhbmQgc3RvcmUgaXQgaW50byBtZW1vcnkgKi8KLSAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+b3BlblJlYWQoJnBBUkdCSW4sIHBEZWNvZGVkUGF0aCwgTTRPU0Ffa0ZpbGVSZWFkKTsKLQotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IG9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGUsIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIGVyciA9ICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IGNsb3NlIGlucHV0IHBuZyBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZSwgZXJyKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIHJnYlBsYW5lLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+aGVpZ2h0OwotICAgIHJnYlBsYW5lLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT53aWR0aDsKLSAgICByZ2JQbGFuZS51X3N0cmlkZSA9IHJnYlBsYW5lLnVfd2lkdGgqMzsKLSAgICByZ2JQbGFuZS51X3RvcGxlZnQgPSAwOwotCi0gICAgZnJhbWVTaXplID0gKHJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCAqIDMpOyAvL1NpemUgb2YgUkdCODg4IGRhdGEKLSAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoKGZyYW1lU2l6ZSkrICgyICogZnJhbWluZ0N0eC0+d2lkdGgpKSwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICBSZW1vdmUgdGhlIGFscGhhIGNoYW5uZWwgICIpOwotCi0gICAgLyogcHJlbXVsdGlwbGllZCBhbHBoYSAlIG9uIFJHQiAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpICs9IDQpIHsKLSAgICAgICAgLyogdGhpcyBpcyBhbHBoYSB2YWx1ZSAqLwotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wQWxwaGFQZXJjZW50ID0gcFRtcERhdGFbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSICovCi0gICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaSsxXTsKLSAgICAgICAgaisrOwotCi0gICAgICAgIC8qIEcgKi8KLSAgICAgICAgaWYgKHRlbXBBbHBoYVBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2krMl07Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0gZWxzZSB7LyogSW4gY2FzZSBvZiBhbHBoYSB2YWx1ZSAwLCBtYWtlIEdSRUVOIHRvIDI1NSAqLwotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSAyNTU7IC8vcFRtcERhdGFbaSsyXTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEIgKi8KLSAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSBwVG1wRGF0YVtpKzNdOwotICAgICAgICBqKys7Ci0gICAgfQotCi0gICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogY29udmVydCBSR0I4ODggdG8gUkdCNTY1ICovCi0KLSAgICAvKiBhbGxvY2F0ZSB0ZW1wIFJHQiA1NjUgYnVmZmVyICovCi0gICAgVGVtcFBhY0RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplICsKLSAgICAgICAgICAgICAgICAgICAgICAgKDQgKiAoZnJhbWluZ0N0eC0+d2lkdGggKyBmcmFtaW5nQ3R4LT5oZWlnaHQgKyAxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCNTY1IGRhdGEiKTsKLSAgICBpZiAoVGVtcFBhY0RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCBSR0I1NjUgZGF0YSIpOwotICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHB0ciA9IChNNE9TQV9VSW50MTYgKilUZW1wUGFjRGF0YTsKLSAgICB6ID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBqIDsgaSArPSAzKQotICAgIHsKLSAgICAgICAgcHRyW3orK10gPSBQQUNLX1JHQjU2NSgwLCAgIHJnYlBsYW5lLnBhY19kYXRhW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbaSsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2krMl0pOwotICAgIH0KLQotICAgIC8qIGZyZWUgdGhlIFJCRzg4OCBhbmQgYXNzaWduIFJHQjU2NSAqLwotICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgIHJnYlBsYW5lLnBhY19kYXRhID0gVGVtcFBhY0RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBvdXRwdXQgc2l6ZXMgYXJlIG9kZCAqLwotICAgIGlmKHJnYlBsYW5lLnVfaGVpZ2h0ICUgMiAhPSAwKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4KiBvdXRwdXRfcGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLSAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICBvdXRwdXQgaGVpZ2h0IGlzIG9kZCAgIik7Ci0gICAgICAgIG91dHB1dF9wYWNfZGF0YSArPXJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCoyOwotCi0gICAgICAgIGZvcihpPTA7aTxyZ2JQbGFuZS51X3dpZHRoO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgKm91dHB1dF9wYWNfZGF0YSsrID0gdHJhbnNwYXJlbnQxOwotICAgICAgICAgICAgKm91dHB1dF9wYWNfZGF0YSsrID0gdHJhbnNwYXJlbnQyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIGp1c3QgYWRkIGEgd2hpdGUgbGluZSB0byB0aGUgUE5HIHRoYXQgd2lsbCBiZSB0cmFuc3BhcmVudCAqLwotICAgICAgICByZ2JQbGFuZS51X2hlaWdodCsrOwotICAgIH0KLSAgICBpZihyZ2JQbGFuZS51X3dpZHRoICUgMiAhPSAwKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIGFkZCBhIG5ldyBjb2x1bW4gb2Ygd2hpdGUgKD10cmFuc3BhcmVudCksIGJ1dCB3ZSBuZWVkIHRvIHBhcnNlIGFsbCBSR0IgbGluZXMgLi4uICovCi0gICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICBNNFZJRklfVUludDgqIG5ld1JHQnBhY19kYXRhOwotICAgICAgICBNNFZJRklfVUludDgqIG91dHB1dF9wYWNfZGF0YSwgKmlucHV0X3BhY19kYXRhOwotCi0gICAgICAgIHJnYlBsYW5lLnVfd2lkdGgrKzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IFwKLSAgICAgICAgICAgICBvdXRwdXQgd2lkdGggaXMgb2RkICAiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgUkdCIG91dHB1dCBidWZmZXIgaW4gd2hpY2ggYWxsIGRlY29kZWQgZGF0YQotICAgICAgICAgICsgd2hpdGUgbGluZSB3aWxsIGJlIGNvcGllZCAqLwotICAgICAgICBuZXdSR0JwYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhyZ2JQbGFuZS51X2hlaWdodCpyZ2JQbGFuZS51X3dpZHRoKjJcCi0gICAgICAgICAgICAqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsIChNNE9TQV9DaGFyICopIk5ldyBGcmFtaW5nIEdJRiBPdXRwdXQgcGFjX2RhdGEgUkdCIik7Ci0KLSAgICAgICAgaWYobmV3UkdCcGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gXAotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0cHV0X3BhY19kYXRhPSBuZXdSR0JwYWNfZGF0YTsKLSAgICAgICAgaW5wdXRfcGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLQotICAgICAgICBmb3IoaT0wO2k8cmdiUGxhbmUudV9oZWlnaHQ7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilvdXRwdXRfcGFjX2RhdGEsICh2b2lkICopaW5wdXRfcGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgIChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotCi0gICAgICAgICAgICBvdXRwdXRfcGFjX2RhdGEgKz0gKChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotICAgICAgICAgICAgLyogUHV0IHRoZSBwaXhlbCB0byB0cmFuc3BhcmVuY3kgY29sb3IgKi8KLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MTsKLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MjsKLQotICAgICAgICAgICAgaW5wdXRfcGFjX2RhdGEgKz0gKChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IG5ld1JHQnBhY19kYXRhOwotICAgIH0KLQotICAgIC8qIHJlc2V0IHN0cmlkZSAqLwotICAgIHJnYlBsYW5lLnVfc3RyaWRlID0gcmdiUGxhbmUudV93aWR0aCoyOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBjaGFpbmVkIGxpc3QgcGFyYW1ldGVycyAqLwotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIC4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgLyoqCi0gICAgICogR2V0IG91dHB1dCB3aWR0aC9oZWlnaHQgKi8KLSAgICAgc3dpdGNoKE91dHB1dFZpZGVvUmVzb2x1dGlvbikKLSAgICAvL3N3aXRjaCh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUpCi0gICAgewotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICB3aWR0aF9vdXQgPSAxMjg7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA5NjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDE2MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDEyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTc2OwotICAgICAgICBoZWlnaHRfb3V0ID0gMTQ0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICB3aWR0aF9vdXQgPSAzMjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSAyNDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMzUyOwotICAgICAgICBoZWlnaHRfb3V0ID0gMjg4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDY0MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgd2lkdGhfb3V0ID0gODAwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNDgwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICB3aWR0aF9vdXQgPSA3MjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA0ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDY0MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDM2MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgICAgICB3aWR0aF9vdXQgPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDEyODA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA3MjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgICAgIHdpZHRoX291dCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDcyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgd2lkdGhfb3V0ID0gOTYwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNzIwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgIHdpZHRoX291dCA9IDE5MjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodDsKLSAgICAgICAgYnJlYWs7Ci0gICAgLyoqCi0gICAgICogSWYgb3V0cHV0IHZpZGVvIHNpemUgaXMgbm90IGdpdmVuLCB3ZSB0YWtlIFFDSUYgc2l6ZSwKLSAgICAgKiBzaG91bGQgbm90IGhhcHBlbiwgYmVjYXVzZSBhbHJlYWR5IGRvbmUgaW4gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgZGVmYXVsdDoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTc2OwotICAgICAgICBoZWlnaHRfb3V0ID0gMTQ0OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgcGxhbmVzIHN0cnVjdHVyZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyICopIkZyYW1pbmcgT3V0cHV0IHBsYW5lIFJHQiIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXNpemUgUkdCIGlmIG5lZWRlZCAqLwotICAgIGlmKChwRWZmZWN0LT54VlNTLmJSZXNpemUpICYmCi0gICAgICAgICAocmdiUGxhbmUudV93aWR0aCAhPSB3aWR0aF9vdXQgfHwgcmdiUGxhbmUudV9oZWlnaHQgIT0gaGVpZ2h0X291dCkpCi0gICAgewotICAgICAgICB3aWR0aCA9IHdpZHRoX291dDsKLSAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0X291dDsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogXAotICAgICAgICAgICAgIE5ldyBXaWR0aCBhbmQgaGVpZ2h0ICVkICVkICAiLHdpZHRoLGhlaWdodCk7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPSBoZWlnaHRfb3V0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gd2lkdGhfb3V0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgqMjsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV90b3BsZWZ0ID0gMDsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KmZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICBGcmFtaW5nUmdiLT51X3dpZHRoKjIqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsCi0gICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJGcmFtaW5nIE91dHB1dCBwYWNfZGF0YSBSR0IiKTsKLQotICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBcCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6ICBSZXNpemluZyBOZWVkZWQgIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICAgcmdiUGxhbmUudV9oZWlnaHQgJiByZ2JQbGFuZS51X3dpZHRoICVkICVkIixyZ2JQbGFuZS51X2hlaWdodCxyZ2JQbGFuZS51X3dpZHRoKTsKLQotICAgICAgICAvL2VyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsICZyZ2JQbGFuZSxmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgZXJyID0gTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUoTTRPU0FfTlVMTCwgJnJnYlBsYW5lLGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpOwotCi0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCA6XAotICAgICAgICAgICAgICAgIHdoZW4gcmVzaXppbmcgUkdCIHBsYW5lOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6XAotICAgICAgICAgICAgICBSZXNpemluZyBOb3QgTmVlZGVkICIpOwotCi0gICAgICAgIHdpZHRoID0gcmdiUGxhbmUudV93aWR0aDsKLSAgICAgICAgaGVpZ2h0ID0gcmdiUGxhbmUudV9oZWlnaHQ7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCoyOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3RvcGxlZnQgPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IHJnYlBsYW5lLnBhY19kYXRhOwotICAgIH0KLQotCi0gICAgaWYocEVmZmVjdC0+eFZTUy5iUmVzaXplKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvcmNlIHRvcGxlZnQgdG8gMCBmb3IgcHVyZSBmcmFtaW5nIGVmZmVjdCAqLwotICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPSAwOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCAgUkdCIG91dHB1dCB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZwotICAgICBlZmZlY3QgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIgKikiRnJhbWluZyBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIEFsbG9jIGZvciBZLCBVIGFuZCBWIHBsYW5lcwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCA9ICgod2lkdGgrMSk+PjEpPDwxOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSAoKGhlaWdodCsxKT4+MSk8PDE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSAoKHdpZHRoKzEpPj4xKTw8MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jCi0gICAgICAgICgoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoKmZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSBvdXRwdXQgWSIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKCgoaGVpZ2h0KzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9zdHJpZGUgPSAoKCh3aWR0aCsxKT4+MSk8PDEpPj4xOwotCi0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJBbGxvYyBmb3IgdGhlIG91dHB1dCBVIik7Ci0gICAgaWYgKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9ICgoKHdpZHRoKzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X2hlaWdodCA9ICgoKGhlaWdodCsxKT4+MSk8PDEpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLQotCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSAgb3V0cHV0IFYiKTsKLSAgICBpZiAoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6XAotICAgICAgICBjb252ZXJ0IFJHQiB0byBZVVYgIik7Ci0KLSAgICAvL2VyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgZXJyID0gTTRWSUZJX1JHQjU2NXRvWVVWNDIwKE00T1NBX05VTEwsIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IsICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLQotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJTUFMgcG5nOiBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogIExlYXZpbmcgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIFZTUyBmb3IgZWRpdGluZwotICogQG5vdGUgICAgSXQgYWxzbyBzZXQgc3BlY2lhbCB4VlNTIGVmZmVjdCBhcyBleHRlcm5hbCBlZmZlY3RzIGZvciB0aGUgVlNTCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogQWxsb2NhdGlvbiBlcnJvciAobm8gbW9yZSBtZW1vcnkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgcFZzc0N0eHQ7Ci0gICAgTTRPU0FfVUludDMyIGksajsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgVlNTIDNHUFAgZWRpdGlvbiBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9lZGl0SW5pdCggJnBWc3NDdHh0LCB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlOiBNNFZTUzNHUFBfZWRpdEluaXQgcmV0dXJuZWQgMHgleFxuIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQqIHBWU1NDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCopcFZzc0N0eHQ7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplIDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlIDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZSA7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLmJBdWRpb01vbm8gPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubzsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgIC8qIEluIGNhc2Ugb2YgTU1TIHVzZSBjYXNlLCB3ZSBmaWxsIGRpcmVjdGx5IGludG8gdGhlIFZTUyBjb250ZXh0IHRoZSB0YXJnZXRlZCBiaXRyYXRlICovCi0gICAgaWYoeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KiBwVlNTQ29udGV4dCA9IChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCopcFZzc0N0eHQ7Ci0KLSAgICAgICAgcFZTU0NvbnRleHQtPmJJc01NUyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBWU1NDb250ZXh0LT51aU1NU1ZpZGVvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlOwotICAgICAgICBwVlNTQ29udGV4dC0+TU1TdmlkZW9GcmFtZXJhdGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgfQotCi0gICAgLypXYXJuaW5nOiBzaW5jZSB0aGUgYWRkaW5nIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgcFNldHRpbmdzIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIG5leHQKLSAgICBwYXJ0IGluICBwQ3VycmVudEVkaXRTZXR0aW5ncyAodGhlcmUgaXMgYSBzcGVjaWZpYyBjdXJyZW50IGVkaXRpbmcgc3RydWN0dXJlIGZvciB0aGUgc2F2aW5nLAotICAgICBhcyBmb3IgdGhlIHByZXZpZXcpKi8KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9ucywgZm9yIHNhdmluZyBtb2RlICh0byBiZSBtb3ZlZCB0bwotICAgICAgTTR4VlNTX3NhdmVTdGFydCgpID8pKi8KLSAgICBmb3IgKGk9MDsgaTx4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaj0wOyBqPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPm5iRWZmZWN0czsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZSA9PQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZTsKLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldAotICAgICAgICAgICAgICAgICBkdXJpbmcgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rID09Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazsgLyoqPCB3ZSBkb24ndAotICAgICAgICAgICAgICAgIC8vIHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiA9PQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSA9PQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYTsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZnJhbWluZyBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZSA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOwotICAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGZyYW1pbmcgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbUluID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb207Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21JbjsgLyoqPCB3ZSBkb24ndCB1c2UgYW55Ci0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dDsgLyoqPCB3ZSBkb24ndCB1c2UgYW55Ci0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgY29sb3IgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OwotICAgICAgICAgICAgICAgIC8qKjwgd2UgZG9uJ3QgdXNlIGFueSBmdW5jdGlvbiBjb250ZXh0ICovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiB0aGUgVlNTIDNHUFAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdE9wZW4ocFZzc0N0eHQsIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGU6XAotICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0T3BlbiByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIFZTUyBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2xvc2UgLyBmcmVlIFZTUyBsYXRlciAqLwotICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IHBWc3NDdHh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgVlNTCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwVnNzQ3R4dCA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2xvc2UgdGhlIFZTUyAzR1BQICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0Q2xvc2UocFZzc0N0eHQpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGU6XAotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsb3NlIHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNldCB0aGUgVlNTIGNvbnRleHQgdG8gTlVMTCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSB0aGlzIFZTUzNHUFAgZWRpdGlvbiBpbnN0YW5jZSAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBWU1MgY29udGV4dCB0byBOVUxMICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZTogXAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIFZTUyBmb3IgYXVkaW8gbWl4aW5nCi0gKiBAbm90ZSAgICBJdCB0YWtlcyBpdHMgcGFyYW1ldGVycyBmcm9tIHRoZSBCR00gc2V0dGluZ3MgaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioqCi0gKiBGQjogdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIHNhdmluZyBpcyBub3cgdGhlCi0gKiAgcEN1cnJlbnRFZGl0U2V0dGluZ3MgYW5kIG5vdCB0aGUgcFNldHRpbmdzCi0gKiBUaGlzIGNoYW5nZSBoYXMgYmVlbiBhZGRlZCBmb3IgdGhlIFVURiBzdXBwb3J0Ci0gKiBBbGwgdGhlICJ4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgInhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MiCi0gKioqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzOwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcEF1ZGlvTWl4aW5nQ3R4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgYXVkaW8gbWl4aW5nIHNldHRpbmdzIHN0cnVjdHVyZSBhbmQgZmlsbCBpdCB3aXRoIEJHTSBwYXJhbWV0ZXJzICovCi0gICAgcEF1ZGlvTWl4U2V0dGluZ3MgPSAoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIgKikicEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICBpZihwQXVkaW9NaXhTZXR0aW5ncyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZSA9PQotICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApCi0gICAgewotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKChNNE9TQV9Db250ZXh0KXhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgICAmZmlsZVByb3BlcnRpZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlOlwKLSAgICAgICAgICAgICAgICAgaW1wb3NzaWJsZSB0byByZXRyaWV2ZSBhdWRpbyBCR00gcHJvcGVydGllcyAtPlwKLSAgICAgICAgICAgICAgICAgICAgIHJlZW5jb2RpbmcgYXVkaW8gYmFja2dyb3VuZCBtdXNpYyIsIGVycik7Ci0gICAgICAgICAgICBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0KzE7Ci0gICAgICAgICAgICAgICAgICAvKiBUbyBmb3JjZSBCR00gZW5jb2RpbmcgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBBdWRpb01peFNldHRpbmdzLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9GQUxTRTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+QWRkZWRBdWRpb0ZpbGVUeXBlID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5wQWRkZWRBdWRpb1RyYWNrRmlsZSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWU7Ci0KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0QVNGID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dEF1ZGlvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlOdW1DaGFubmVscyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlOdW1DaGFubmVsczsKLQotICAgIHBBdWRpb01peFNldHRpbmdzLT5iX0R1Y2tpbmdOZWVkZWVkID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPmJfRHVja2luZ05lZWRlZWQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPmZCVFZvbExldmVsID0KLSAgICAgKE00T1NBX0Zsb2F0ICl4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUvMTAwOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5JbkR1Y2tpbmdfdGhyZXNob2xkID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+bG93Vm9sdW1lLzEwMDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+ZlBUVm9sTGV2ZWwgPQotICAgICAoTTRPU0FfRmxvYXQpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPlBUVm9sTGV2ZWwvMTAwOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5iTG9vcCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+Ykxvb3A7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vKQotICAgIHsKLSAgICAgICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscyA9IDI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbCBhdWRpbyBtaXggc2V0dGluZ3Mgd2l0aCBCR00gcGFyYW1ldGVycyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzLT51aUJlZ2luTG9vcCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlFbmRMb29wID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpRW5kTG9vcDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRDdHM7Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgZmlsZSBvZiB0aGUgYXVkaW8gbWl4ZXIgd2lsbCBiZSBmaW5hbCBmaWxlIChhdWRpbyBtaXhpbmcgaXMgdGhlIGxhc3Qgc3RlcCkgKi8KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cE91dHB1dENsaXBGaWxlID0geFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBUZW1wb3JhcnlGaWxlOwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgZmlsZSBvZiB0aGUgYXVkaW8gbWl4ZXIgaXMgYSB0ZW1wb3JhcnkgZmlsZSBjb250YWluaW5nIGFsbCBhdWRpby92aWRlbyBlZGl0aW9ucyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzLT5wT3JpZ2luYWxDbGlwRmlsZSA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhdWRpbyBtaXhpbmcgc2V0dGluZ3MgcG9pbnRlciB0byBiZSBhYmxlIHRvIGZyZWUgaXQgaW4KLSAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBwQXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoJnBBdWRpb01peGluZ0N0eHQsIHBBdWRpb01peFNldHRpbmdzLAotICAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cik7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2FsbCBhdWRpbyBtaXhpbmcgc3RlcCBmdW5jdGlvbiBpbgotICAgICAgTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgPSBwQXVkaW9NaXhpbmdDdHh0OwotCi0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0IHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgLy9NNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKHBBdWRpb01peGluZ0N0eHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBWU1MgZm9yIGF1ZGlvIG1peGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICAqIEZyZWUgdGhpcyBWU1MzR1BQIGF1ZGlvIG1peGluZyBpbnN0YW5jZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4Q29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlOlwKLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBWU1MgYXVkaW8gbWl4aW5nIHNldHRpbmdzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBwcmV2aWV3IGVkaXRpb24gc3RydWN0dXJlIHVzZWQgdG8gZ2VuZXJhdGUKLSAqICAgICAgICAgICAgcHJldmlldy4zZ3AgZmlsZSBnaXZlbiB0byB0aGUgVlBTCi0gKiBAbm90ZSAgICBJdCBhbHNvIGZyZWUgdGhlIHByZXZpZXcgc3RydWN0dXJlIGdpdmVuIHRvIHRoZSBWUFMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIGZvcihpPTA7IGk8eFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSkpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgaWYoaSAhPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0KSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBvdXRwdXQgcHJldmlldyBmaWxlIHBhdGggKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRlbXBvcmFyeSBwcmV2aWV3IGZpbGUgcGF0aCAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSAibG9jYWwiIEJHTSBzZXR0aW5ncyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY3VycmVudCBlZGl0IHNldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgcHJldmlldyBlZmZlY3RzIGdpdmVuIHRvIGFwcGxpY2F0aW9uICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSB4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPkVmZmVjdHMpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBzYXZpbmcgZWRpdGlvbiBzdHJ1Y3R1cmUgdXNlZCB0byBnZW5lcmF0ZQotICogICAgICAgICAgICBvdXRwdXQuM2dwIGZpbGUgZ2l2ZW4gdG8gdGhlIFZQUwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBmb3IoaT0wOyBpPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgICAgICBpZihpICE9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlci0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoXAotICAgICAgICAgICAgICAgICAgICAoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBsaXN0ICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cykpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5uYkVmZmVjdHMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgb3V0cHV0IHNhdmluZyBmaWxlIHBhdGggKi8KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSB0ZW1wb3Jhcnkgc2F2aW5nIGZpbGUgcGF0aCAqLwotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlICJsb2NhbCIgQkdNIHNldHRpbmdzICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSBjdXJyZW50IGVkaXQgc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZnJlZVNldHRpbmdzKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIGFuIE00VlNTM0dQUF9FZGl0U2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAoSU4pIFBvaW50ZXIgb24gTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyBzdHJ1Y3R1cmUgdG8gZnJlZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVTZXR0aW5ncyhNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpCi17Ci0gICAgTTRPU0FfVUludDggaSxqOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVhY2ggY2xpcCAuLi4gKi8KLSAgICBmb3IoaT0wOyBpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGZyZWUgY2xpcCBzZXR0aW5ncyAqLwotICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyhwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSk7Ci0KLSAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldKSk7Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBpZihpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWM6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gY2FzZSBvZiBBbHBoYSBNYWdpYyB0cmFuc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGV4dHJhIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBmcmVlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKCgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmUtPnBhY19kYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZS0+cGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgoKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9aSsxO2o8cFNldHRpbmdzLT51aUNsaXBOdW1iZXItMTtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDbXBSZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgZXh0cmEgaW50ZXJuYWwgYWxwaGEgbWFnaWMgc3RydWN0dXJlIGFuZCBwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdG8gTlVMTCB0byBhdm9pZCByZWZyZWVpbmcgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3Rbal0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2pdLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY2xpcCBsaXN0ICovCi0gICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUkM6IEZyZWUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYocFNldHRpbmdzLT5FZmZlY3RzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmb3IoaT0wOyBpPHBTZXR0aW5ncy0+bmJFZmZlY3RzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRm9yIGVhY2ggY2xpcCwgZnJlZSBmcmFtaW5nIHN0cnVjdHVyZSBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZwotICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfVGV4dCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nQ29udGV4dCogZnJhbWluZ0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4X3NhdmU7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmczMTAyU3RydWN0KiBmcmFtaW5nQ3R4X2ZpcnN0ID0gZnJhbWluZ0N0eDsKLSNlbmRpZgotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4ICE9IE00T1NBX05VTEwpIC8qIEJ1Z2ZpeCAxLjIuMDogY3Jhc2gsIHRyeWluZyB0byBmcmVlIG5vbiBleGlzdGFudAotICAgICAgICAgICAgICAgICBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nWXV2WzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nWXV2ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1dik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLypJbiBjYXNlIHRoZXJlIGFyZSBzdGlsbCBhbGxvY2F0ZWQqLwotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5wU1BTQ29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIE00U1BTX2Rlc3Ryb3koZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKSAvKiBCdWdmaXggMS4yLjA6IGNyYXNoLCB0cnlpbmcgdG8gZnJlZSBub24KLSAgICAgICAgICAgICAgICAgICAgZXhpc3RhbnQgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eF9zYXZlID0gZnJhbWluZ0N0eC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4ID0gZnJhbWluZ0N0eF9zYXZlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogYnVnIGZpeCBQNE1FMDAwMDMwMDIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlKGZyYW1pbmdDdHhfZmlyc3QgIT0gZnJhbWluZ0N0eCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIEZpZnRpZXMgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBGaWZ0aWVzQ3R4ID0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQ7Ci0KLSAgICAgICAgICAgICAgICBpZihGaWZ0aWVzQ3R4ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKEZpZnRpZXNDdHgpOwotICAgICAgICAgICAgICAgICAgICBGaWZ0aWVzQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmsgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSA9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEZyZWUgQ29sb3IgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDdHggPSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dDsKLQotICAgICAgICAgICAgICAgIGlmKENvbG9yQ3R4ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKENvbG9yQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogRnJlZSBzaW1wbGUgZmllbGRzICovCi0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucFRleHRCdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBUZXh0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHMpOwotICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0vLyAgICBNNE9TQV9VSW50OCBpLGo7Ci0KLSAgICAvKiBGcmVlICJsb2NhbCIgQkdNIHNldHRpbmdzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zKiBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3Q7Ci0gICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogcFBhcmFtc19zYXV2OwotCi0gICAgICAgIHdoaWxlKHBQYXJhbXMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZVRlbXAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVUZW1wKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0jZW5kaWYvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zKiBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMqIHBQYXJhbXNfc2F1djsKLQotICAgICAgICB3aGlsZShwUGFyYW1zICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotI2VuZGlmLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSZWluaXQgYWxsIGNvbnRleHQgdmFyaWFibGVzICovCi0gICAgeFZTU19jb250ZXh0LT5wcmV2aW91c0NsaXBOdW1iZXIgPSAwOwotICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPSBNNHhWU1Nfa01pY3JvU3RhdGVFZGl0aW5nOwotICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPSBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCA9IDA7Ci0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IDA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcEZpbGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmUgcHJvcGVydGllcyBvZiBhbiBpbnB1dCAzR1AgZmlsZSB1c2luZyBNQ1MKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRmlsZSAgICAgICAgICAgIChJTikgM0dQIGZpbGUgdG8gYW5hbHlzZQotICogQHBhcmFtICAgIHBGaWxlUHJvcGVydGllcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIGEgc3RydWN0dXJlIHRoYXQgd2lsbCBjb250YWluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgM0dQIGZpbGUgcHJvcGVydGllcwotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE1DU19Db250ZXh0IG1jc19jb250ZXh0OwotCi0gICAgZXJyID0gTTRNQ1NfaW5pdCgmbWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX2luaXQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qb3BlbiB0aGUgTUNTIGluIHRoZSAibm9ybWFsIG9wZW5pbmciIG1vZGUgdG8gcmV0cmlldmUgdGhlIGV4YWN0IGR1cmF0aW9uKi8KLSAgICBlcnIgPSBNNE1DU19vcGVuX25vcm1hbE1vZGUobWNzX2NvbnRleHQsIHBGaWxlLCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCwKLSAgICAgICAgTTRPU0FfTlVMTCwgTTRPU0FfTlVMTCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX29wZW46IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhtY3NfY29udGV4dCwgcEZpbGVQcm9wZXJ0aWVzKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX2Fib3J0KG1jc19jb250ZXh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllczogRXJyb3IgaW4gTTRNQ1NfYWJvcnQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBUYXJnZXRlZFRpbWVTY2FsZSkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZSB0YXJnZXRlZCB0aW1lIHNjYWxlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSAgICBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBUYXJnZXRlZFRpbWVTY2FsZSAgICAoT1VUKSAgICBUYXJnZXRlZCB0aW1lIHNjYWxlCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwVGFyZ2V0ZWRUaW1lU2NhbGUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdG90YWxEdXJhdGlvbiA9IDA7Ci0gICAgTTRPU0FfVUludDggaSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXBUaW1lU2NhbGUgPSAwLCB0ZW1wRHVyYXRpb24gPSAwOwotCi0gICAgZm9yKGk9MDtpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyO2krKykKLSAgICB7Ci0gICAgICAgIC8qc2VhcmNoIHRpbWVzY2FsZSBvbmx5IGluIG1wZWc0IGNhc2UqLwotICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAKLSAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0Ci0gICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000VikKLSAgICAgICAgewotICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0KLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0KLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKikgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0luaXQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKkVuZCBvZiB0aGUgY29udmVyc2lvbjogdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwgJmZpbGVQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgLypnZXQgaW5wdXQgZmlsZSBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgIC8qZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+cEZpbGUsICZmaWxlUHJvcGVydGllcyk7Ki8KLSAgICAgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZTpcCi0gICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzIHJldHVybmVkOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRlbXBEdXJhdGlvbiA8IChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFRpbWVTY2FsZSA9IGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRHVyYXRpb24gPSAocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRlbXBEdXJhdGlvbiA8IChmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBUaW1lU2NhbGUgPSBmaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcER1cmF0aW9uID0gKGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkKLSAgICAgICAgewotICAgICAgICAgICAgLyp0aGUgdGltZXNjYWxlIGlzIDMwIGZvciBQVE8zR1AqLwotICAgICAgICAgICAgKnBUYXJnZXRlZFRpbWVTY2FsZSA9IDMwOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHRlbXBUaW1lU2NhbGUgPj0gMzApLypEZWZpbmUgYSBtaW5pbXVtIHRpbWUgc2NhbGUsIG90aGVyd2lzZSBpZiB0aGUgdGltZXNjYWxlIGlzIG5vdAotICAgIGVub3VnaCwgdGhlcmUgd2lsbCBiZSBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSBzaGVsbCBlbmNvZGVyKi8KLSAgICB7Ci0gICAgICAgICpwVGFyZ2V0ZWRUaW1lU2NhbGUgPSB0ZW1wVGltZVNjYWxlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFRhcmdldGVkVGltZVNjYWxlID0gMzA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotewotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGo7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDb250ZXh0ID0gKE00eFZTU19Db2xvclN0cnVjdCopcEZ1bmN0aW9uQ29udGV4dDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDaHJvbWluYW5jZSAqLwotICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xIHx8IHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDExNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTM5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2IHIgPSAwLGcgPSAwLGIgPSAwLHkgPSAwLHUgPSAwLHYgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDAwMWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDA3ZTApPj41OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsIChNNE9TQV9VSW50OCl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50OgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgZ2V0IHRoZSByLCBnLCBiKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwMDFmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHhmODAwKT4+MTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmZvciBjb2xvciBncmFkYXRpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoTTRPU0FfVUludDE2KSggYiAtICgoYippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKE00T1NBX1VJbnQxNikoZyAtICgoZyppKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKE00T1NBX1VJbnQxNikociAtICgocippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBMdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0W2pdID0gMjU1IC0gcF9idWZfc3JjW2pdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9idWZfc3JjICs9IFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0gUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJblszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgseTsKLQotICAgIE00VklGSV9VSW50OCAqcF9pbl9ZID0gUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBfaW5fVSA9IFBsYW5lSW5bMV0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1YgPSBQbGFuZUluWzJdLnBhY19kYXRhOwotCi0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBjdXJyZW50RnJhbWluZyA9IE00T1NBX05VTEw7Ci0gICAgTTRWSUZJX1VJbnQ4ICpGcmFtaW5nUkdCID0gTTRPU0FfTlVMTDsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotCi0gICAgTTRWSUZJX1VJbnQzMiB0b3BsZWZ0WzJdOwotCi0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQxID0gKE00T1NBX1VJbnQ4KSgoVFJBTlNQQVJFTlRfQ09MT1IgJiAweEZGMDApPj44KTsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDIgPSAoTTRPU0FfVUludDgpVFJBTlNQQVJFTlRfQ09MT1I7Ci0KLSNpZm5kZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopdXNlckRhdGE7Ci0gICAgY3VycmVudEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKilGcmFtaW5nLT5wQ3VycmVudDsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLSAgICAvKkZCKi8KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFGcmFtaW5nQ3R4OwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0gICAgLyplbmQgRkIqLwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBpbnB1dCAvIG91dHB1dCBwbGFuZSBwb2ludGVycyAqLwotICAgIHBfaW5fWSArPSBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwX2luX1UgKz0gUGxhbmVJblsxXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9WICs9IFBsYW5lSW5bMl0udV90b3BsZWZ0OwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBEZXBlbmRpbmcgb24gdGltZSwgaW5pdGlhbGl6ZSBGcmFtaW5nIGZyYW1lIHRvIHVzZSAqLwotICAgIGlmKEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPT0gLTEpCi0gICAgewotICAgICAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgY2xpcCB0aW1lIGhhcyByZWFjaCB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lIG9mIHRoZSBmcmFtaW5nIHBpY3R1cmUKLSAgICAgKiB3ZSBuZWVkIHRvIHN0ZXAgdG8gbmV4dCBmcmFtaW5nIHBpY3R1cmUgKi8KLQotICAgIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICBGcmFtaW5nUkdCID0gY3VycmVudEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotICAgIHRvcGxlZnRbMF0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF94OwotICAgIHRvcGxlZnRbMV0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF95OwotCi0gICAgZm9yKCB4PTAgO3ggPCBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgZm9yKCB5PTAgO3kgPCBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVG8gaGFuZGxlIGZyYW1pbmcgd2l0aCBpbnB1dCBzaXplICE9IG91dHB1dCBzaXplCi0gICAgICAgICAgICAgKiBGcmFtaW5nIGlzIGFwcGx5ZWQgaWYgY29vcmRpbmF0ZXMgbWF0Y2hlcyBiZXR3ZWVuIGZyYW1pbmcvdG9wbGVmdCBhbmQgaW5wdXQgcGxhbmUgKi8KLSAgICAgICAgICAgIGlmKCB5IDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAgJiYKLSAgICAgICAgICAgICAgICB5ID49IHRvcGxlZnRbMF0gJiYKLSAgICAgICAgICAgICAgICB4IDwgKHRvcGxlZnRbMV0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X2hlaWdodCkgJiYKLSAgICAgICAgICAgICAgICB4ID49IHRvcGxlZnRbMV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9GbG9hdCBhbHBoYUJsZW5kaW5nID0gMTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyogIGFscGhhQmxlbmRpbmdTdHJ1Y3QgPVwKLSAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKilcCi0gICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0KLSAgICAgICAgICAgICAgICBpZihhbHBoYUJsZW5kaW5nU3RydWN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgXAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgLyAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgLz0gMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocFByb2dyZXNzLT51aVByb2dyZXNzID49IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9mYWRlSW5UaW1lKjEwKSAmJiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPCAxMDAwXAotICAgICAgICAgICAgICAgICAgICAgLSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IChNNE9TQV9GbG9hdClcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKE00T1NBX0Zsb2F0KWFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlLzEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gMTAwMCAtIChNNE9TQV9VSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCAvIDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9ICgoTTRPU0FfRmxvYXQpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kKSkqKDEwMDAgLSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiovCi0KLSAgICAgICAgICAgICAgICBpZigoKihGcmFtaW5nUkdCKT09dHJhbnNwYXJlbnQxKSAmJiAoKihGcmFtaW5nUkdCKzEpPT10cmFuc3BhcmVudDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KCoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKyh5LXRvcGxlZnRbMF0pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoeC10b3BsZWZ0WzFdKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSkpKmFscGhhQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlKSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSkrPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9VKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsxXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlKSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSkrPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggUGxhbmVJblswXS51X3dpZHRoIDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAmJgotICAgICAgICAgICAgICAgICAgICB5ID09IFBsYW5lSW5bMF0udV93aWR0aC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JHQiA9IEZyYW1pbmdSR0IgKyAyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICogKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBsYW5lSW5bMF0udV93aWR0aCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZ1JHQiArIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBKdXN0IGNvcHkgaW5wdXQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIG1ha2UgYSB2aWRlbyBsb29rIGFzIGlmIGl0IHdhcyB0YWtlbiBpbiB0aGUgZmlmdGllcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwVXNlckRhdGEgICAgICAgKElOKSBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyggTTRPU0FfVm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgsIHksIHhTaGlmdDsKLSAgICBNNFZJRklfVUludDggKnBJblkgPSBwUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBPdXRZLCAqcEluWWJlZ2luOwotICAgIE00VklGSV9VSW50OCAqcEluQ3IsKiBwT3V0Q3I7Ci0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLQotICAgIC8qIEludGVybmFsIGNvbnRleHQqLwotICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBwX0ZpZnRpZXNEYXRhID0gKE00eFZTU19GaWZ0aWVzU3RydWN0ICopcFVzZXJEYXRhOwotCi0gICAgLyogQ2hlY2sgdGhlIGlucHV0cyAoZGVidWcgb25seSkgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBfRmlmdGllc0RhdGEgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInhWU1M6IHBfRmlmdGllc0RhdGEgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBQbGFuZU91dCA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAieFZTUzogcF9QbGFuZU91dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFByb2dyZXNzID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInhWU1M6IHBfUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLQotICAgIC8qIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwSW5ZICs9IHBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwT3V0WSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwSW5ZYmVnaW4gID0gcEluWTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSAqLwotICAgIGlmKHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPCAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZEluaXQoKTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIgKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV93aWR0aCk8PCAyKTsKLSAgICAgICAgcF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qIENob29zZSByYW5kb20gdmFsdWVzIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZHVyYXRpb24gb2YgYSBwYXJ0aWFsIGVmZmVjdCAqLwotICAgIGVsc2UgaWYoIChwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSAtIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUpXAotICAgICAgICAgPiBwX0ZpZnRpZXNEYXRhLT5maWZ0aWVzRWZmZWN0RHVyYXRpb24pCi0gICAgewotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X2hlaWdodCkgPj4gNCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyICopJihwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X3dpZHRoKTw8IDIpOwotICAgICAgICBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyogUHV0IGluIFNlcGlhIHRoZSBjaHJvbWluYW5jZSAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMTsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwSW5DciAgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhICArIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0OwotICAgICAgICBwT3V0Q3IgPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSArIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgPT0gcGxhbmVfbnVtYmVyKQotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTE3LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFUgdmFsdWUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDEzOSxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBWIHZhbHVlICovCi0KLSAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcE91dENyICs9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB0aGUgbmV3IHBpeGVscyB2YWx1ZXMgKi8KLSAgICBmb3IoIHggPSAwIDsgeCA8IHBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwX291dFl0bXAsICpwX2luWXRtcDsKLQotICAgICAgICAvKiBDb21wdXRlIHRoZSB4U2hpZnQgKHJhbmRvbSB2YWx1ZSkgKi8KLSAgICAgICAgaWYgKDAgPT0gKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgJSA1ICkpCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgKSAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIChwUGxhbmVJblswXS51X2hlaWdodCAtIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpICkgXAotICAgICAgICAgICAgICAgICUgKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gMSk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgKi8KLSAgICAgICAgcF9vdXRZdG1wID0gcE91dFkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHlTaGlmdCBvZiAxIHBpeGVsICovCi0gICAgICAgIHBfaW5ZdG1wICA9IHBJblliZWdpbiArICh4U2hpZnQgKiBwUGxhbmVJblswXS51X3N0cmlkZSk7ICAvKiBBcHBseSB0aGUgeFNoaWZ0ICovCi0KLSAgICAgICAgZm9yKCB5ID0gMCA7IHkgPCBwUGxhbmVJblswXS51X3dpZHRoIDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTZXQgWSB2YWx1ZSAqLwotICAgICAgICAgICAgaWYgKHhTaGlmdCA+IChwUGxhbmVJblswXS51X2hlaWdodCAtIDQpKQotICAgICAgICAgICAgICAgICpwX291dFl0bXAgPSA0MDsgICAgICAgIC8qIEFkZCBzb21lIGhvcml6b250YWwgYmxhY2sgbGluZXMgYmV0d2VlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gcGFydHMgb2YgdGhlIGltYWdlICovCi0gICAgICAgICAgICBlbHNlIGlmICggeSA9PSBwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gOTA7ICAgICAgICAvKiBBZGQgYSByYW5kb20gdmVydGljYWwgbGluZSBmb3IgdGhlIGJ1bGsgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gKnBfaW5ZdG1wOwotCi0KLSAgICAgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICBwX291dFl0bXArKzsKLSAgICAgICAgICAgIHBfaW5ZdG1wKys7Ci0KLSAgICAgICAgICAgIC8qIFJlc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBmb3IgdGhlIGxhc3QgcGl4ZWwqLwotICAgICAgICAgICAgaWYgKHkgPT0gKHBQbGFuZUluWzBdLnVfd2lkdGggLSAyKSkKLSAgICAgICAgICAgICAgICBwX291dFl0bXAgPSBwT3V0WTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgcE91dFkgKz0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbSggKQotICogQGJyaWVmICAgIFpvb20gaW4vb3V0IHZpZGVvIGVmZmVjdCBmdW5jdGlvbnMuCi0gKiBAbm90ZSAgICBUaGUgZXh0ZXJuYWwgdmlkZW8gZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSBpcyBzZXQgdG8KLSAqIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX1pvb21JbiBvciBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0LgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgICBwSW5wdXRQbGFuZXMgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgICAgICAoSU4vT1VUKSBPdXRwdXQgKGZpbHRlcmVkKSBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gdHJhbnNpdGlvbiBwcm9ncmVzcy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSkKLXsKLSAgICBNNE9TQV9VSW50MzIgYm94V2lkdGg7Ci0gICAgTTRPU0FfVUludDMyIGJveEhlaWdodDsKLSAgICBNNE9TQV9VSW50MzIgYm94UG9zWDsKLSAgICBNNE9TQV9VSW50MzIgYm94UG9zWTsKLSAgICBNNE9TQV9VSW50MzIgcmF0aW8gPSAwOwotICAgIC8qICAqIDEuMTg5MjA3IGJldHdlZW4gcmF0aW8gKi8KLSAgICAvKiB6b29tIGJldHdlZW4geDEgYW5kIHgxNiAqLwotICAgIE00T1NBX1VJbnQzMiByYXRpb3RhYlsxN10gPXsxMDI0LDEyMTgsMTQ0OCwxNzIyLDIwNDgsMjQzNSwyODk2LDM0NDQsNDA5Niw0ODcxLDU3OTMsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODg5LDgxOTIsOTc0MiwxMTU4NSwxMzc3NywxNjM4NH07Ci0gICAgTTRPU0FfVUludDMyIGlrOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgYm94UGxhbmVbM107Ci0KLSAgICBpZigoTTRPU0FfVm9pZCAqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21PdXQgPT0gcEZ1bmN0aW9uQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vcmF0aW8gPSAxNiAtICgxNSAqIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvMTAwMDsKLSAgICAgICAgcmF0aW8gPSAxNiAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAvIDY2IDsKLSAgICB9Ci0gICAgZWxzZSBpZigoTTRPU0FfVm9pZCAqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21JbiA9PSBwRnVuY3Rpb25Db250ZXh0KQotICAgIHsKLSAgICAgICAgLy9yYXRpbyA9IDEgKyAoMTUgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIHJhdGlvID0gMSArIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAvIDY2IDsKLSAgICB9Ci0KLSAgICBmb3IoaWs9MDtpazwzO2lrKyspewotCi0gICAgICAgIGJveFBsYW5lW2lrXS51X3N0cmlkZSA9IHBJbnB1dFBsYW5lc1tpa10udV9zdHJpZGU7Ci0gICAgICAgIGJveFBsYW5lW2lrXS5wYWNfZGF0YSA9IHBJbnB1dFBsYW5lc1tpa10ucGFjX2RhdGE7Ci0KLSAgICAgICAgYm94SGVpZ2h0ID0gKCBwSW5wdXRQbGFuZXNbaWtdLnVfaGVpZ2h0IDw8IDEwICkgLyByYXRpb3RhYltyYXRpb107Ci0gICAgICAgIGJveFdpZHRoID0gKCBwSW5wdXRQbGFuZXNbaWtdLnVfd2lkdGggPDwgMTAgKSAvIHJhdGlvdGFiW3JhdGlvXTsKLSAgICAgICAgYm94UGxhbmVbaWtdLnVfaGVpZ2h0ID0gKGJveEhlaWdodCkmKH4xKTsKLSAgICAgICAgYm94UGxhbmVbaWtdLnVfd2lkdGggPSAoYm94V2lkdGgpJih+MSk7Ci0KLSAgICAgICAgYm94UG9zWSA9IChwSW5wdXRQbGFuZXNbaWtdLnVfaGVpZ2h0ID4+IDEpIC0gKGJveFBsYW5lW2lrXS51X2hlaWdodCA+PiAxKTsKLSAgICAgICAgYm94UG9zWCA9IChwSW5wdXRQbGFuZXNbaWtdLnVfd2lkdGggPj4gMSkgLSAoYm94UGxhbmVbaWtdLnVfd2lkdGggPj4gMSk7Ci0gICAgICAgIGJveFBsYW5lW2lrXS51X3RvcGxlZnQgPSBib3hQb3NZICogYm94UGxhbmVbaWtdLnVfc3RyaWRlICsgYm94UG9zWDsKLSAgICB9Ci0KLSAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCAoTTRWSUZJX0ltYWdlUGxhbmUqKSZib3hQbGFuZSwgcE91dHB1dFBsYW5lcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gKi8KLSAgICByZXR1cm4oTTROT19FUlJPUik7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19BbHBoYU1hZ2ljKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgY29sb3IgZWZmZWN0IG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgdXNlckRhdGEgICAgICAgIChJTikgQ29udGFpbnMgYSBwb2ludGVyIG9uIGEgc2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgUGxhbmVJbjEgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDEKLSAqIEBwYXJhbSAgICBQbGFuZUluMiAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyIGZyb20gdmlkZW8gMgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlUcmFuc2l0aW9uS2luZChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpYyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKiBhbHBoYUNvbnRleHQ7Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhUHJvZ3Jlc3NMZXZlbDsKLQotICAgIE00VklGSV9JbWFnZVBsYW5lKiBwbGFuZXN3YXA7Ci0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLSAgICBNNFZJRklfVUludDggKmFscGhhTWFzazsKLSAgICAvKiAiT2xkIGltYWdlIiAqLwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfWTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1U7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9WOwotICAgIC8qICJOZXcgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4yX1Y7Ci0KLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgYWxwaGFDb250ZXh0ID0gKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKXVzZXJEYXRhOwotCi0gICAgYWxwaGFQcm9ncmVzc0xldmVsID0gKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAqIDEyOCkvMTAwMDsKLQotICAgIGlmKCBhbHBoYUNvbnRleHQtPmlzcmV2ZXJzZSAhPSBNNE9TQV9GQUxTRSkKLSAgICB7Ci0gICAgICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IDEyOCAtIGFscGhhUHJvZ3Jlc3NMZXZlbDsKLSAgICAgICAgcGxhbmVzd2FwID0gUGxhbmVJbjE7Ci0gICAgICAgIFBsYW5lSW4xID0gUGxhbmVJbjI7Ci0gICAgICAgIFBsYW5lSW4yID0gcGxhbmVzd2FwOwotICAgIH0KLQotICAgIHBfb3V0MCA9IFBsYW5lT3V0WzBdLnBhY19kYXRhOwotICAgIHBfb3V0MSA9IFBsYW5lT3V0WzFdLnBhY19kYXRhOwotICAgIHBfb3V0MiA9IFBsYW5lT3V0WzJdLnBhY19kYXRhOwotCi0gICAgYWxwaGFNYXNrID0gYWxwaGFDb250ZXh0LT5wUGxhbmUtPnBhY19kYXRhOwotCi0gICAgLyogIk9sZCBpbWFnZSIgKi8KLSAgICBwX2luMV9ZID0gUGxhbmVJbjFbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjFfVSA9IFBsYW5lSW4xWzFdLnBhY19kYXRhOwotICAgIHBfaW4xX1YgPSBQbGFuZUluMVsyXS5wYWNfZGF0YTsKLSAgICAvKiAiTmV3IGltYWdlIiAqLwotICAgIHBfaW4yX1kgPSBQbGFuZUluMlswXS5wYWNfZGF0YTsKLSAgICBwX2luMl9VID0gUGxhbmVJbjJbMV0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfViA9IFBsYW5lSW4yWzJdLnBhY19kYXRhOwotCi0gICAgIC8qKgotICAgICAqIEZvciBlYWNoIGNvbHVtbiAuLi4gKi8KLSAgICBmb3IoIHk9MDsgeTxQbGFuZU91dC0+dV9oZWlnaHQ7IHkrKyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGFuZCBlYWNoIHJvdyBvZiB0aGUgYWxwaGEgbWFzayAqLwotICAgICAgICBmb3IoIHg9MDsgeDxQbGFuZU91dC0+dV93aWR0aDsgeCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgcGl4ZWwgb2YgdGhlIGFscGhhIG1hc2sgaXMgPiB0byB0aGUgY3VycmVudCB0aW1lCi0gICAgICAgICAgICAgKiAoIGN1cnJlbnQgdGltZSBpcyBub3JtYWxpemVkIG9uIFswLTI1NV0gKSAqLwotICAgICAgICAgICAgaWYoIGFscGhhUHJvZ3Jlc3NMZXZlbCA8IGFscGhhTWFza1t4K3kqUGxhbmVPdXQtPnVfd2lkdGhdICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBrZWVwICJvbGQgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbjFfWSt4K3kqUGxhbmVJbjFbMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMV9VKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMV9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIHRha2UgIm5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHVzZXJEYXRhICAgICAgICAoSU4pIENvbnRhaW5zIGEgcG9pbnRlciBvbiBhIHNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIFBsYW5lSW4xICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIgZnJvbSB2aWRlbyAxCi0gKiBAcGFyYW0gICAgUGxhbmVJbjIgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpVHJhbnNpdGlvbktpbmQoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyogYWxwaGFDb250ZXh0OwotICAgIE00VklGSV9JbnQzMiBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhQmxlbmRMZXZlbE1pbjsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFCbGVuZExldmVsTWF4OwotICAgIE00VklGSV9JbnQzMiBhbHBoYUJsZW5kUmFuZ2U7Ci0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVzd2FwOwotICAgIE00VklGSV9VSW50MzIgeCx5OwotICAgIE00VklGSV9JbnQzMiBhbHBoYU1hc2tWYWx1ZTsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotICAgIE00VklGSV9VSW50OCAqYWxwaGFNYXNrOwotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1Y7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBNNFZJRklfVUludDggKnBfaW4yX1k7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9VOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVjsKLQotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGFscGhhQ29udGV4dCA9IChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKil1c2VyRGF0YTsKLQotICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKiAxMjgpLzEwMDA7Ci0KLSAgICBpZiggYWxwaGFDb250ZXh0LT5pc3JldmVyc2UgIT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICBhbHBoYVByb2dyZXNzTGV2ZWwgPSAxMjggLSBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgICAgIHBsYW5lc3dhcCA9IFBsYW5lSW4xOwotICAgICAgICBQbGFuZUluMSA9IFBsYW5lSW4yOwotICAgICAgICBQbGFuZUluMiA9IHBsYW5lc3dhcDsKLSAgICB9Ci0KLSAgICBhbHBoYUJsZW5kTGV2ZWxNaW4gPSBhbHBoYVByb2dyZXNzTGV2ZWwtYWxwaGFDb250ZXh0LT5ibGVuZGluZ3RocmVzaG9sZDsKLQotICAgIGFscGhhQmxlbmRMZXZlbE1heCA9IGFscGhhUHJvZ3Jlc3NMZXZlbCthbHBoYUNvbnRleHQtPmJsZW5kaW5ndGhyZXNob2xkOwotCi0gICAgYWxwaGFCbGVuZFJhbmdlID0gKGFscGhhQ29udGV4dC0+YmxlbmRpbmd0aHJlc2hvbGQpKjI7Ci0KLSAgICBwX291dDAgPSBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwX291dDEgPSBQbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICBwX291dDIgPSBQbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGFscGhhTWFzayA9IGFscGhhQ29udGV4dC0+cFBsYW5lLT5wYWNfZGF0YTsKLQotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgcF9pbjFfWSA9IFBsYW5lSW4xWzBdLnBhY19kYXRhOwotICAgIHBfaW4xX1UgPSBQbGFuZUluMVsxXS5wYWNfZGF0YTsKLSAgICBwX2luMV9WID0gUGxhbmVJbjFbMl0ucGFjX2RhdGE7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBwX2luMl9ZID0gUGxhbmVJbjJbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfVSA9IFBsYW5lSW4yWzFdLnBhY19kYXRhOwotICAgIHBfaW4yX1YgPSBQbGFuZUluMlsyXS5wYWNfZGF0YTsKLQotICAgIC8qIGFwcGx5IEFscGhhIE1hZ2ljIG9uIGVhY2ggcGl4ZWwgKi8KLSAgICAgICBmb3IoIHk9MDsgeTxQbGFuZU91dC0+dV9oZWlnaHQ7IHkrKyApCi0gICAgewotICAgICAgICBmb3IoIHg9MDsgeDxQbGFuZU91dC0+dV93aWR0aDsgeCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgYWxwaGFNYXNrVmFsdWUgPSBhbHBoYU1hc2tbeCt5KlBsYW5lT3V0LT51X3dpZHRoXTsKLSAgICAgICAgICAgIGlmKCBhbHBoYUJsZW5kTGV2ZWxNYXggPCBhbHBoYU1hc2tWYWx1ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogV2Uga2VlcCAib2xkIGltYWdlIiBpbiBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAqKCBwX291dDAreCt5KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0qKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVSsoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVisoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzJdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIChhbHBoYUJsZW5kTGV2ZWxNaW4gPCBhbHBoYU1hc2tWYWx1ZSkmJgotICAgICAgICAgICAgICAgICAgICAoYWxwaGFNYXNrVmFsdWUgPD0gYWxwaGFCbGVuZExldmVsTWF4ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIGJsZW5kICJvbGQgYW5kIG5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KE00VklGSV9VSW50OCkKLSAgICAgICAgICAgICAgICAgICAgKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbikqKCAqKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCAqKHBfaW4yX1kreCt5KlBsYW5lSW4yWzBdLnVfc3RyaWRlKSkgKS9hbHBoYUJsZW5kUmFuZ2UgKTsKLQotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0oTTRWSUZJX1VJbnQ4KVwKLSAgICAgICAgICAgICAgICAgICAgKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbikqKCAqKHBfaW4xX1UrKHg+PjEpKyh5Pj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMVsxXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyhhbHBoYUJsZW5kTGV2ZWxNYXgtYWxwaGFNYXNrVmFsdWUpKiggKihwX2luMl9VKyh4Pj4xKSsoeT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMlsxXS51X3N0cmlkZSkpICkvYWxwaGFCbGVuZFJhbmdlICk7Ci0KLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgpKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbilcCi0gICAgICAgICAgICAgICAgICAgICAgICAqKCAqKHBfaW4xX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMVsyXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKSooICoocF9pbjJfVisoeD4+MSkrKHk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBsYW5lSW4yWzJdLnVfc3RyaWRlKSkgKS9hbHBoYUJsZW5kUmFuZ2UgKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIHRha2UgIm5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotI2RlZmluZSBNNFhYWF9TYW1wbGVBZGRyZXNzKHBsYW5lLCB4LCB5KSAgKCAocGxhbmUpLnBhY19kYXRhICsgKHBsYW5lKS51X3RvcGxlZnQgKyAoeSlcCi0gICAgICogKHBsYW5lKS51X3N0cmlkZSArICh4KSApCi0KLXN0YXRpYyB2b2lkIE00WFhYX0NvcHlQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogZGVzdCwgTTRWSUZJX0ltYWdlUGxhbmUqIHNvdXJjZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgaGVpZ2h0LCB3aWR0aCwgc291cmNlU3RyaWRlLCBkZXN0U3RyaWRlLCB5OwotICAgIE00T1NBX01lbUFkZHI4ICAgIHNvdXJjZVdhbGssIGRlc3RXYWxrOwotCi0gICAgLyogY2FjaGUgdGhlIHZhcnMgdXNlZCBpbiB0aGUgbG9vcCBzbyBhcyB0byBhdm9pZCB0aGVtIGJlaW5nIHJlcGVhdGVkbHkgZmV0Y2hlZCBhbmQKLSAgICAgcmVjb21wdXRlZCBmcm9tIG1lbW9yeS4gKi8KLSAgICBoZWlnaHQgPSBkZXN0LT51X2hlaWdodDsKLSAgICB3aWR0aCA9IGRlc3QtPnVfd2lkdGg7Ci0KLSAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoKnNvdXJjZSwgMCwgMCk7Ci0gICAgc291cmNlU3RyaWRlID0gc291cmNlLT51X3N0cmlkZTsKLQotICAgIGRlc3RXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoKmRlc3QsIDAsIDApOwotICAgIGRlc3RTdHJpZGUgPSBkZXN0LT51X3N0cmlkZTsKLQotICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopZGVzdFdhbGssICh2b2lkICopc291cmNlV2Fsaywgd2lkdGgpOwotICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKE00VklGSV9JbWFnZVBsYW5lKiB0b3BQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBib3R0b21QbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgICBzaGlmdFVWKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyogRG8gdGhyZWUgbG9vcHMsIG9uZSBmb3IgZWFjaCBwbGFuZSB0eXBlLCBpbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgdG9vIG1hbnkgYnVmZmVycwotICAgICJob3QiIGF0IHRoZSBzYW1lIHRpbWUgKGJldHRlciBmb3IgY2FjaGUpLiAqLwotICAgIGZvciAoaT0wOyBpPDM7IGkrKykKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICB0b3BQYXJ0SGVpZ2h0LCBib3R0b21QYXJ0SGVpZ2h0LCB3aWR0aCwgc291cmNlU3RyaWRlLCBkZXN0U3RyaWRlLCB5OwotICAgICAgICBNNE9TQV9NZW1BZGRyOCAgICBzb3VyY2VXYWxrLCBkZXN0V2FsazsKLQotICAgICAgICAvKiBjYWNoZSB0aGUgdmFycyB1c2VkIGluIHRoZSBsb29wIHNvIGFzIHRvIGF2b2lkIHRoZW0gYmVpbmcgcmVwZWF0ZWRseSBmZXRjaGVkIGFuZAotICAgICAgICAgcmVjb21wdXRlZCBmcm9tIG1lbW9yeS4gKi8KLSAgICAgICAgaWYgKDAgPT0gaSkgLyogWSBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBib3R0b21QYXJ0SGVpZ2h0ID0gMipzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogVSBhbmQgViBwbGFuZXMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgYm90dG9tUGFydEhlaWdodCA9IHNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgdG9wUGFydEhlaWdodCA9IFBsYW5lT3V0W2ldLnVfaGVpZ2h0IC0gYm90dG9tUGFydEhlaWdodDsKLSAgICAgICAgd2lkdGggPSBQbGFuZU91dFtpXS51X3dpZHRoOwotCi0gICAgICAgIHNvdXJjZVdhbGsgPSAoTTRPU0FfTWVtQWRkcjgpTTRYWFhfU2FtcGxlQWRkcmVzcyh0b3BQbGFuZVtpXSwgMCwgYm90dG9tUGFydEhlaWdodCk7Ci0gICAgICAgIHNvdXJjZVN0cmlkZSA9IHRvcFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIGRlc3RXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIDApOwotICAgICAgICBkZXN0U3RyaWRlID0gUGxhbmVPdXRbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgLyogRmlyc3QgdGhlIHBhcnQgZnJvbSB0aGUgdG9wIHNvdXJjZSBjbGlwIGZyYW1lLiAqLwotICAgICAgICBmb3IgKHk9MDsgeTx0b3BQYXJ0SGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrLCAodm9pZCAqKXNvdXJjZVdhbGssIHdpZHRoKTsKLSAgICAgICAgICAgIGRlc3RXYWxrICs9IGRlc3RTdHJpZGU7Ci0gICAgICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGFuZCBub3cgY2hhbmdlIHRoZSB2YXJzIHRvIGNvcHkgdGhlIHBhcnQgZnJvbSB0aGUgYm90dG9tIHNvdXJjZSBjbGlwIGZyYW1lLiAqLwotICAgICAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoYm90dG9tUGxhbmVbaV0sIDAsIDApOwotICAgICAgICBzb3VyY2VTdHJpZGUgPSBib3R0b21QbGFuZVtpXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBkZXN0V2FsayBpcyBhbHJlYWR5IGF0IE00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIHRvcFBhcnRIZWlnaHQpICovCi0KLSAgICAgICAgZm9yICh5PTA7IHk8Ym90dG9tUGFydEhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2FsaywgKHZvaWQgKilzb3VyY2VXYWxrLCB3aWR0aCk7Ci0gICAgICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICAgICAgc291cmNlV2FsayArPSBzb3VyY2VTdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTR4VlNTX0hvcml6b250YWxTbGlkZVRyYW5zaXRpb24oTTRWSUZJX0ltYWdlUGxhbmUqIGxlZnRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHJpZ2h0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgIHNoaWZ0VVYpCi17Ci0gICAgTTRPU0FfVUludDMyIGksIHk7Ci0gICAgLyogSWYgd2Ugc2hpZnRlZCBieSBleGFjdGx5IDAsIG9yIGJ5IHRoZSB3aWR0aCBvZiB0aGUgdGFyZ2V0IGltYWdlLCB0aGVuIHdlIHdvdWxkIGdldCB0aGUgbGVmdAotICAgIGZyYW1lIG9yIHRoZSByaWdodCBmcmFtZSwgcmVzcGVjdGl2ZWx5LiBUaGVzZSBjYXNlcyBhcmVuJ3QgaGFuZGxlZCB0b28gd2VsbCBieSB0aGUgZ2VuZXJhbAotICAgIGhhbmRsaW5nLCBzaW5jZSB0aGV5IHJlc3VsdCBpbiAwLXNpemUgbWVtY29waWVzLCBzbyBtaWdodCBhcyB3ZWxsIHBhcnRpY3VsYXJpemUgdGhlbS4gKi8KLQotICAgIGlmICgwID09IHNoaWZ0VVYpICAgIC8qIG91dHB1dCBsZWZ0IGZyYW1lICovCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpPDM7IGkrKykgLyogZm9yIGVhY2ggWVVWIHBsYW5lICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00WFhYX0NvcHlQbGFuZSgmKFBsYW5lT3V0W2ldKSwgJihsZWZ0UGxhbmVbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChQbGFuZU91dFsxXS51X3dpZHRoID09IHNoaWZ0VVYpIC8qIG91dHB1dCByaWdodCBmcmFtZSAqLwotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaTwzOyBpKyspIC8qIGZvciBlYWNoIFlVViBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNFhYWF9Db3B5UGxhbmUoJihQbGFuZU91dFtpXSksICYocmlnaHRQbGFuZVtpXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0KLSAgICAvKiBEbyB0aHJlZSBsb29wcywgb25lIGZvciBlYWNoIHBsYW5lIHR5cGUsIGluIG9yZGVyIHRvIGF2b2lkIGhhdmluZyB0b28gbWFueSBidWZmZXJzCi0gICAgImhvdCIgYXQgdGhlIHNhbWUgdGltZSAoYmV0dGVyIGZvciBjYWNoZSkuICovCi0gICAgZm9yIChpPTA7IGk8MzsgaSsrKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyICAgIGhlaWdodCwgbGVmdFBhcnRXaWR0aCwgcmlnaHRQYXJ0V2lkdGg7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICBsZWZ0U3RyaWRlLCAgICByaWdodFN0cmlkZSwgICAgZGVzdFN0cmlkZTsKLSAgICAgICAgTTRPU0FfTWVtQWRkcjggICAgbGVmdFdhbGssICAgIHJpZ2h0V2FsaywgICAgZGVzdFdhbGtMZWZ0LCBkZXN0V2Fsa1JpZ2h0OwotCi0gICAgICAgIC8qIGNhY2hlIHRoZSB2YXJzIHVzZWQgaW4gdGhlIGxvb3Agc28gYXMgdG8gYXZvaWQgdGhlbSBiZWluZyByZXBlYXRlZGx5IGZldGNoZWQKLSAgICAgICAgYW5kIHJlY29tcHV0ZWQgZnJvbSBtZW1vcnkuICovCi0gICAgICAgIGhlaWdodCA9IFBsYW5lT3V0W2ldLnVfaGVpZ2h0OwotCi0gICAgICAgIGlmICgwID09IGkpIC8qIFkgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcmlnaHRQYXJ0V2lkdGggPSAyKnNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBVIGFuZCBWIHBsYW5lcyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICByaWdodFBhcnRXaWR0aCA9IHNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgbGVmdFBhcnRXaWR0aCA9IFBsYW5lT3V0W2ldLnVfd2lkdGggLSByaWdodFBhcnRXaWR0aDsKLQotICAgICAgICBsZWZ0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKGxlZnRQbGFuZVtpXSwgcmlnaHRQYXJ0V2lkdGgsIDApOwotICAgICAgICBsZWZ0U3RyaWRlID0gbGVmdFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIHJpZ2h0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKHJpZ2h0UGxhbmVbaV0sIDAsIDApOwotICAgICAgICByaWdodFN0cmlkZSA9IHJpZ2h0UGxhbmVbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgZGVzdFdhbGtMZWZ0ID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIDApOwotICAgICAgICBkZXN0V2Fsa1JpZ2h0ID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIGxlZnRQYXJ0V2lkdGgsIDApOwotICAgICAgICBkZXN0U3RyaWRlID0gUGxhbmVPdXRbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrTGVmdCwgKHZvaWQgKilsZWZ0V2FsaywgbGVmdFBhcnRXaWR0aCk7Ci0gICAgICAgICAgICBsZWZ0V2FsayArPSBsZWZ0U3RyaWRlOwotCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2Fsa1JpZ2h0LCAodm9pZCAqKXJpZ2h0V2FsaywgcmlnaHRQYXJ0V2lkdGgpOwotICAgICAgICAgICAgcmlnaHRXYWxrICs9IHJpZ2h0U3RyaWRlOwotCi0gICAgICAgICAgICBkZXN0V2Fsa0xlZnQgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgICAgIGRlc3RXYWxrUmlnaHQgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotewotICAgIE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyogc2V0dGluZ3MgPQotICAgICAgICAgKE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyopdXNlckRhdGE7Ci0gICAgTTRPU0FfVUludDMyICAgIHNoaWZ0VVY7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiaW5zaWRlIE00eFZTU19TbGlkZVRyYW5zaXRpb24iKTsKLSAgICBpZiAoKE00eFZTU19TbGlkZVRyYW5zaXRpb25fUmlnaHRPdXRMZWZ0SW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikKLSAgICAgICAgfHwgKE00eFZTU19TbGlkZVRyYW5zaXRpb25fTGVmdE91dFJpZ2h0SW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikgKQotICAgIHsKLSAgICAgICAgLyogaG9yaXpvbnRhbCBzbGlkZSAqLwotICAgICAgICBzaGlmdFVWID0gKChQbGFuZU91dFsxXSkudV93aWR0aCAqIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvMTAwMDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19TbGlkZVRyYW5zaXRpb24gdXBwZXI6IHNoaWZ0VVYgPSAlZCxwcm9ncmVzcyA9ICVkIiwKLSAgICAgICAgICAgIHNoaWZ0VVYscFByb2dyZXNzLT51aVByb2dyZXNzICk7Ci0gICAgICAgIGlmIChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1JpZ2h0T3V0TGVmdEluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFB1dCB0aGUgcHJldmlvdXMgY2xpcCBmcmFtZSByaWdodCwgdGhlIG5leHQgY2xpcCBmcmFtZSBsZWZ0LCBhbmQgcmV2ZXJzZSBzaGlmdFVWCi0gICAgICAgICAgICAoc2luY2UgaXQncyBhIHNoaWZ0IGZyb20gdGhlIGxlZnQgZnJhbWUpIHNvIHRoYXQgd2Ugc3RhcnQgb3V0IG9uIHRoZSByaWdodAotICAgICAgICAgICAgKGkuZS4gbm90IGxlZnQpIGZyYW1lLCBpdAotICAgICAgICAgICAgYmVpbmcgZnJvbSB0aGUgcHJldmlvdXMgY2xpcC4gKi8KLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfSG9yaXpvbnRhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMiwgUGxhbmVJbjEsIFBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAoUGxhbmVPdXRbMV0pLnVfd2lkdGggLSBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIExlZnQgb3V0LCByaWdodCBpbiovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfSG9yaXpvbnRhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMSwgUGxhbmVJbjIsIFBsYW5lT3V0LCBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiB2ZXJ0aWNhbCBzbGlkZSAqLwotICAgICAgICBzaGlmdFVWID0gKChQbGFuZU91dFsxXSkudV9oZWlnaHQgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfU2xpZGVUcmFuc2l0aW9uIGJvdHRvbTogc2hpZnRVViA9ICVkLHByb2dyZXNzID0gJWQiLHNoaWZ0VVYsCi0gICAgICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKTsKLSAgICAgICAgaWYgKE00eFZTU19TbGlkZVRyYW5zaXRpb25fVG9wT3V0Qm90dG9tSW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgLyogUHV0IHRoZSBwcmV2aW91cyBjbGlwIGZyYW1lIHRvcCwgdGhlIG5leHQgY2xpcCBmcmFtZSBib3R0b20uICovCi0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKFBsYW5lSW4xLCBQbGFuZUluMiwgUGxhbmVPdXQsIHNoaWZ0VVYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogQm90dG9tIG91dCwgdG9wIGluICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfVmVydGljYWxTbGlkZVRyYW5zaXRpb24oUGxhbmVJbjIsIFBsYW5lSW4xLCBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAoUGxhbmVPdXRbMV0pLnVfaGVpZ2h0IC0gc2hpZnRVVik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBOb3RlOiBpdCBtaWdodCBiZSB3b3J0aHdoaWxlIHRvIGRvIHNvbWUgcGFyYW1ldGVyIGNoZWNraW5nLCBzZWUgaWYgZGltZW5zaW9ucyBtYXRjaCwgZXRjLiwKLSAgICBhdCBsZWFzdCBpbiBkZWJ1ZyBtb2RlLiAqLwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgZmFkZSB0byBibGFjayBhbmQgdGhlbiBhIGZhZGUgZnJvbSBibGFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb24oTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotewotICAgIE00T1NBX0ludDMyIHRtcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLQotICAgIGlmKChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpIDwgNTAwKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpICovCi0gICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoKDEuMCAtICgoTTRPU0FfRmxvYXQpKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyoyKS8xMDAwKSkgKiAxMDI0ICk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFwcGx5IHRoZSBkYXJrZW5pbmcgZWZmZWN0ICovCi0gICAgICAgIGVyciA9IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoIChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVJbjEsCi0gICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilQbGFuZU91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb246IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJuc1wKLSAgICAgICAgICAgICAgICAgZXJyb3IgMHgleCwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpLiAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKCAoKChNNE9TQV9GbG9hdCkoKChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MtNTAwKSoyKSkvMTAwMCkpICogMTAyNCApOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICBlcnIgPSBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVJbjIsCi0gICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilQbGFuZU91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogY29udmVydGVkU2l6ZSkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGZyb20gdGhlIGN1c3RvbWVyIGZvcm1hdCB0byBVVEY4Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAoSU4pICAgIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICAoSU4pICAgIEJ1ZmZlciB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgKE9VVCkgICAgQ29udmVydGVkIGJ1ZmZlcgotICogQHBhcmFtICAgIGNvbnZlcnRlZFNpemUgICAgKE9VVCkgICAgU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIHBCdWZmZXJPdXQgPSBwQnVmZmVySW47Ci0gICAgaWYoeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemU7Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMAotICAgICAgICAgICAgLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgZXJyID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4Kil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopJkNvbnZlcnRlZFNpemUpOwotICAgICAgICBpZihlcnIgPT0gTTR4VlNTV0FSX0JVRkZFUl9PVVRfVE9PX1NNQUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogcENvbnZUb1VURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0KLSAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLQotICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhDb252ZXJ0ZWRTaXplKnNpemVvZihNNE9TQV9VSW50OCksIE00VkEsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBVVEYgY29udmVyc2lvbiBidWZmZXIiKTsKLSAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLypkZWNvZGVkIHBhdGgqLwotICAgICAgICBwQnVmZmVyT3V0ID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICgqY29udmVydGVkU2l6ZSkgPSBDb252ZXJ0ZWRTaXplOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydCBmcm9tIFVURjggdG8gdGhlIGN1c3RvbWVyIGZvcm1hdAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICAoSU4pICAgIEJ1ZmZlciB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgKE9VVCkgICAgQ29udmVydGVkIGJ1ZmZlcgotICogQHBhcmFtICAgIGNvbnZlcnRlZFNpemUgICAgKE9VVCkgICAgU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIHBCdWZmZXJPdXQgPSBwQnVmZmVySW47Ci0gICAgaWYoeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZTsKLQotICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwwLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdFwKLSAgICAgICAgICAgICgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLChNNE9TQV9VSW50OCopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAoTTRPU0FfVUludDMyKikmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgIGlmKGVyciA9PSBNNHhWU1NXQVJfQlVGRkVSX09VVF9UT09fU01BTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0KLSAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLQotICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKENvbnZlcnRlZFNpemUqc2l6ZW9mKE00T1NBX1VJbnQ4KSwgTTRWQSwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGODogVVRGIGNvbnZlcnNpb24gYnVmZmVyIik7Ci0gICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4OiBwQ29udkZyb21VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKmRlY29kZWQgcGF0aCovCi0gICAgICAgIHBCdWZmZXJPdXQgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgKCpjb252ZXJ0ZWRTaXplKSA9IENvbnZlcnRlZFNpemU7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9WaWRlb0VkaXRvclJlc2FtcGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM1MzdmMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclJlc2FtcGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBWaWRlb0VkaXRvclJlc2FtcGxlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKLQotICAgIHB1YmxpYzoKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpOwotCi0gICAgZW51bSB7IC8vU2FtcGxpbmcgZnJlcQotICAgICBrRnJlcTgwMDBIeiA9IDgwMDAsCi0gICAgIGtGcmVxMTEwMjVIeiA9IDExMDI1LAotICAgICBrRnJlcTEyMDAwSHogPSAxMjAwMCwKLSAgICAga0ZyZXExNjAwMEh6ID0gMTYwMDAsCi0gICAgIGtGcmVxMjIwNTBIeiA9IDIyMDUwLAotICAgICBrRnJlcTI0MDAwSHogPSAyNDAwMCwKLSAgICAga0ZyZXEzMjAwMEh6ID0gMzIwMDAsCi0gICAgIGtGcmVxNDQxMDAgPSA0NDEwMCwKLSAgICAga0ZyZXE0ODAwMCA9IDQ4MDAwLAotICAgIH07Ci0KLSAgICBBdWRpb1Jlc2FtcGxlciAqbVJlc2FtcGxlcjsKLSAgICBpbnQxNl90KiBtSW5wdXQ7Ci0gICAgaW50IG5iQ2hhbm5lbHM7Ci0gICAgaW50IG5iU2FtcGxlczsKLSAgICBNNE9TQV9JbnQzMiBvdXRTYW1wbGluZ1JhdGU7Ci0gICAgTTRPU0FfSW50MzIgaW5TYW1wbGluZ1JhdGU7Ci0KLSAgICBpbnQxNl90ICptVG1wSW5CdWZmZXI7Ci19OwotCi0jZGVmaW5lIE1BWF9TQU1QTEVEVVJBVElPTl9GT1JfQ09OVkVSVElPTiA0MCAvL21zCi0KLXN0YXR1c190IFZpZGVvRWRpdG9yUmVzYW1wbGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwgaW50NjRfdCBwdHMpIHsKLQotICAgIHVpbnQzMl90IGRhdGFTaXplID0gcEJ1ZmZlci0+ZnJhbWVDb3VudCAqIHRoaXMtPm5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgbVRtcEluQnVmZmVyID0gKGludDE2X3QqKW1hbGxvYyhkYXRhU2l6ZSk7Ci0gICAgbWVtY3B5KG1UbXBJbkJ1ZmZlciwgdGhpcy0+bUlucHV0LCBkYXRhU2l6ZSk7Ci0gICAgcEJ1ZmZlci0+cmF3ID0gKHZvaWQqKW1UbXBJbkJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclJlc2FtcGxlcjo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpIHsKLQotICAgIGlmKHBCdWZmZXItPnJhdyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUocEJ1ZmZlci0+cmF3KTsKLSAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgbVRtcEluQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0gICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci19Ci0KLWV4dGVybiAiQyIgewotCi1NNE9TQV9Db250ZXh0ICBMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKE00T1NBX0ludDMyIGJpdERlcHRoLCBNNE9TQV9JbnQzMiBpbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBzYW1wbGVSYXRlLCBNNE9TQV9JbnQzMiBxdWFsaXR5KSB7Ci0KLSAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9IG5ldyBWaWRlb0VkaXRvclJlc2FtcGxlcigpOwotICAgIGNvbnRleHQtPm1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKAotICAgICAgICBiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwotICAgIGlmIChjb250ZXh0LT5tUmVzYW1wbGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGNvbnRleHQtPm1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoYW5kcm9pZDo6VmlkZW9FZGl0b3JSZXNhbXBsZXI6OmtGcmVxMzIwMDBIeik7Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+c2V0Vm9sdW1lKDB4MTAwMCwgMHgxMDAwKTsKLSAgICBjb250ZXh0LT5uYkNoYW5uZWxzID0gaW5DaGFubmVsQ291bnQ7Ci0gICAgY29udGV4dC0+b3V0U2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICBjb250ZXh0LT5tSW5wdXQgPSBOVUxMOwotICAgIGNvbnRleHQtPm1UbXBJbkJ1ZmZlciA9IE5VTEw7Ci0KLSAgICByZXR1cm4gKChNNE9TQV9Db250ZXh0ICljb250ZXh0KTsKLX0KLQotCi12b2lkIExWQXVkaW9zZXRTYW1wbGVSYXRlKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCwgTTRPU0FfSW50MzIgaW5TYW1wbGVSYXRlKSB7Ci0KLSAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9Ci0gICAgICAoVmlkZW9FZGl0b3JSZXNhbXBsZXIgKilyZXNhbXBsZXJDb250ZXh0OwotICAgIGNvbnRleHQtPm1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoaW5TYW1wbGVSYXRlKTsKLSAgICAvKgotICAgICAqIG5iU2FtcGxlcyBpcyBjYWxjdWxhdGVkIGZvciA0MG1zIHdvcnRoIG9mIGRhdGE7aGVuY2Ugc2FtcGxlIHJhdGUKLSAgICAgKiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmJTYW1wbGVzCi0gICAgICovCi0gICAgY29udGV4dC0+aW5TYW1wbGluZ1JhdGUgPSBpblNhbXBsZVJhdGU7Ci0gICAgLy8gQWxsb2NhdGUgYnVmZmVyIGZvciBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIHNhbXBsZXMuCi0gICAgY29udGV4dC0+bUlucHV0ID0gKGludDE2X3QqKW1hbGxvYyggKGluU2FtcGxlUmF0ZSAqIE1BWF9TQU1QTEVEVVJBVElPTl9GT1JfQ09OVkVSVElPTiAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPm5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpIC8gMTAwMCk7Ci19Ci0KLXZvaWQgTFZBdWRpb3NldFZvbHVtZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsIE00T1NBX0ludDE2IGxlZnQsIE00T1NBX0ludDE2IHJpZ2h0KSB7Ci0KLSAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9Ci0gICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5zZXRWb2x1bWUobGVmdCxyaWdodCk7Ci19Ci0KLXZvaWQgTFZEZXN0cm95KE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCkgewotCi0gICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIgKmNvbnRleHQgPQotICAgICAgIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQ7Ci0KLSAgICBpZiAoY29udGV4dC0+bVRtcEluQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShjb250ZXh0LT5tVG1wSW5CdWZmZXIpOwotICAgICAgICBjb250ZXh0LT5tVG1wSW5CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChjb250ZXh0LT5tSW5wdXQgIT0gTlVMTCkgewotICAgICAgICBmcmVlKGNvbnRleHQtPm1JbnB1dCk7Ci0gICAgICAgIGNvbnRleHQtPm1JbnB1dCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGNvbnRleHQtPm1SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgY29udGV4dC0+bVJlc2FtcGxlcjsKLSAgICAgICAgY29udGV4dC0+bVJlc2FtcGxlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGNvbnRleHQgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgY29udGV4dDsKLSAgICAgICAgY29udGV4dCA9IE5VTEw7Ci0gICAgfQotfQotCi12b2lkIExWQXVkaW9yZXNhbXBsZV9Mb3dRdWFsaXR5KE00T1NBX0ludDE2KiBvdXQsIE00T1NBX0ludDE2KiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBvdXRGcmFtZUNvdW50LCBNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0KLSAgICAgIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQ7Ci0gICAgaW50MzJfdCAqcFRtcEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBjb250ZXh0LT5uYlNhbXBsZXMgPSAoY29udGV4dC0+aW5TYW1wbGluZ1JhdGUgKiBvdXRGcmFtZUNvdW50KSAvIGNvbnRleHQtPm91dFNhbXBsaW5nUmF0ZTsKLSAgICBtZW1jcHkoY29udGV4dC0+bUlucHV0LGlucHV0LChjb250ZXh0LT5uYlNhbXBsZXMgKiBjb250ZXh0LT5uYkNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSk7Ci0KLSAgICAvKgotICAgICBTUkMgbW9kdWxlIGFsd2F5cyBnaXZlcyBzdGVyZW8gb3V0cHV0LCBoZW5jZSAyIGZvciBzdGVyZW8gYXVkaW8KLSAgICAqLwotICAgIHBUbXBCdWZmZXIgPSAoaW50MzJfdCopbWFsbG9jKG91dEZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICBtZW1zZXQocFRtcEJ1ZmZlciwgMHgwMCwgb3V0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MzJfdCkpOwotCi0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QgKilwVG1wQnVmZmVyLAotICAgICAgIChzaXplX3Qpb3V0RnJhbWVDb3VudCwgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dCk7Ci0gICAgLy8gQ29udmVydCBiYWNrIHRvIDE2IGJpdHMKLSAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCopb3V0LCBwVG1wQnVmZmVyLCBvdXRGcmFtZUNvdW50KTsKLSAgICBmcmVlKHBUbXBCdWZmZXIpOwotICAgIHBUbXBCdWZmZXIgPSBOVUxMOwotfQotCi19Ci0KLX0gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvcjNncFJlYWRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvcjNncFJlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YTlhMDEyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgM0dQIFJlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgVklERU9FRElUT1JfM0dQUkVBREVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JfM0dQUkVBREVSX0gKLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSNlbmRpZiAvKiBWSURFT0VESVRPUl8zR1BSRUFERVJfSCAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkM2I4MDEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBBdWRpbyBEZWNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9BVURJT0RFQ09ERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9BVURJT0RFQ09ERVJfSAotCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BTVJXQihNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotI2VuZGlmIC8qIFZJREVPRURJVE9SX0FVRElPREVDT0RFUl9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0ZjZiMDQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBBdWRpbyBFbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9BVURJT0VOQ09ERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9BVURJT0VOQ09ERVJfSAotCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKTsKLQotI2VuZGlmIC8qIFZJREVPRURJVE9SX0FVRElPRU5DT0RFUl9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQnVmZmVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhZmY2YTcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckJ1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JCdWZmZXIuYwotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEJ1ZmZlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgICBWSURFT0VESVRPUl9CVUZGRVJfSAotI2RlZmluZSAgIFZJREVPRURJVE9SX0JVRkZFUl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLSNpbmNsdWRlICJNNF9VdGlscy5oIgotCi0jaW5jbHVkZSAiTFZfTWFjcm9zLmgiCi0KLS8qLS0tIENvcmUgaWQgZm9yIFZJREVPRURJVE9SIEJ1ZmZlciBhbGxvY2F0aW9ucyAgLS0tKi8KLSNkZWZpbmUgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMIDB4MDEyRgotCi0vKiAtLS0tLSBlcnJvcnMgIC0tLS0tKi8KLSNkZWZpbmUgTTRFUlJfTk9fQlVGRkVSX0FWQUlMQUJMRSBcCi0gICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLDB4MDAwMDAxKQotI2RlZmluZSBNNEVSUl9OT19CVUZGRVJfTUFUQ0ggXAotICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwweDAwMDAwMikKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfa0VtcHR5ID0gMCwKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfa0ZpbGxlZCwKLX0gVklERU9FRElUT1JfQlVGRkVSX1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSAgICBMVk9NWF9CVUZGRVJfQnVmZmVyCi0gKiBAYnJpZWYgICAgICAgT25lIE9NWCBCdWZmZXIgYW5kIGRhdGEgcmVsYXRlZCB0byBpdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiBwRGF0YTsgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgZGF0YSovCi0gICAgTTRPU0FfVUludDMyIHNpemU7Ci0gICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIHN0YXRlOyAvKio8IEJ1ZmZlciBzdGF0ZSAqLwotICAgIE00T1NBX1VJbnQzMiBpZHg7ICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgYnVmZmVyIGluc2lkZSB0aGUgcG9vbCAqLwotICAgIE00X01lZGlhVGltZSAgICBidWZmQ1RTOyAgICAgICAgLyoqPCBUaW1lIHN0YW1wIG9mIHRoZSBidWZmZXIgKi8KLX0gVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdHJ1Y3R1cmUgICAgTFZPTVhfQlVGRkVSX1Bvb2wKLSAqIEBicmllZiAgICAgICBTdHJ1Y3R1cmUgdG8gbWFuYWdlIGJ1ZmZlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlciogcE5YUEJ1ZmZlcjsKLSAgICBNNE9TQV9VSW50MzIgTkI7Ci0gICAgTTRPU0FfQ2hhciogcG9vbE5hbWU7Ci19IFZJREVPRURJVE9SX0JVRkZFUl9Qb29sOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZiAvL19fY3BsdXNwbHVzCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiogcHBvb2wsCi0gKiAgICAgICAgIE00T1NBX1VJbnQzMiBuYkJ1ZmZlcnMpCi0gKiBAYnJpZWYgICBBbGxvY2F0ZSBhIHBvb2wgb2YgbmJCdWZmZXJzIGJ1ZmZlcnMKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sIHRvIGNyZWF0ZQotICogQHBhcmFtICAgbmJCdWZmZXJzICA6IElOIFRoZSBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgcG9vbAotICogQHBhcmFtICAgcG9vbE5hbWUgICA6IElOIGEgbmFtZSBnaXZlbiB0byB0aGUgcG9vbAotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiogcHBvb2wsCi0gICAgICAgIE00T1NBX1VJbnQzMiBuYkJ1ZmZlcnMsIE00T1NBX0NoYXIqIHBvb2xOYW1lKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChMVk9NWF9CVUZGRVJfUG9vbCogcHBvb2wpCi0gKiBAYnJpZWYgICBEZWFsbG9jYXRlIGEgYnVmZmVyIHBvb2wKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sIHRvIGZyZWUKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCwKLSAqICAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpCi0gKiBAYnJpZWYgICBSZXR1cm5zIGEgYnVmZmVyIGluIGEgZ2l2ZW4gc3RhdGUKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sCi0gKiBAcGFyYW0gICBkZXNpcmVkU3RhdGUgOiBJTiBUaGUgYnVmZmVyIHN0YXRlCi0gKiBAcGFyYW0gICBwTlhQQnVmZmVyIDogSU4gVGhlIHNlbGVjdGVkIGJ1ZmZlcgotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIGRlc2lyZWRTdGF0ZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpOwotCi0KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfaW5pdFBvb2xCdWZmZXJzKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCwKLSAgICAgICAgTTRPU0FfVUludDMyIGxTaXplKTsKLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRPbGRlc3RCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wgKnBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZSBkZXNpcmVkU3RhdGUsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLy9fX2NwbHVzcGx1cwotI2VuZGlmIC8qVklERU9FRElUT1JfQlVGRkVSX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTWFpbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGMzYjUxNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19WSURFT19FRElUT1JfQVBJX0hfXwotI2RlZmluZSBfX1ZJREVPX0VESVRPUl9BUElfSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNU0dfVFlQRV9QUk9HUkVTU19JTkRJQ0FUSU9OLCAgICAgLy8gUGxheWJhY2sgcHJvZ3Jlc3MgaW5kaWNhdGlvbiBldmVudAotICAgIE1TR19UWVBFX1BMQVlFUl9FUlJPUiwgICAgICAgICAgICAvLyBQbGF5YmFjayBlcnJvcgotICAgIE1TR19UWVBFX1BSRVZJRVdfRU5ELCAgICAgICAgICAgICAvLyBQcmV2aWV3IG9mIGNsaXBzIGlzIGNvbXBsZXRlCi0gICAgTVNHX1RZUEVfT1ZFUkxBWV9VUERBVEUsICAgICAgICAgIC8vIHVwZGF0ZSBvdmVybGF5IGR1cmluZyBwcmV2aWV3Ci0gICAgTVNHX1RZUEVfT1ZFUkxBWV9DTEVBUiwgICAgICAgICAgIC8vIGNsZWFyIHRoZSBvdmVybGF5Ci19IHByb2dyZXNzX2NhbGxiYWNrX21zZ190eXBlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IG92ZXJsYXlTZXR0aW5nc0luZGV4OwotICAgIGludCBjbGlwSW5kZXg7Ci19IFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgKnBGaWxlOyAgICAgICAgICAgICAgICAgICAvKiogUENNIGZpbGUgcGF0aCAqLwotICAgIE00T1NBX0Jvb2wgICAgIGJSZW1vdmVPcmlnaW5hbDsgICAgICAgICAgLyoqIElmIHRydWUsIHRoZSBvcmlnaW5hbCBhdWRpbyB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aU5iQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqIE51bWJlciBvZiBjaGFubmVscyAoMT1tb25vLCAyPXN0ZXJlbykgb2YgQkdNIGNsaXAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpU2FtcGxpbmdGcmVxdWVuY3k7ICAgICAvKiogU2FtcGxpbmcgYXVkaW8gZnJlcXVlbmN5ICg4MDAwIGZvciBhbXIsIDE2MDAwIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGZvciBhYWMpIG9mIEJHTSBjbGlwKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aUV4dGVuZGVkU2FtcGxpbmdGcmVxdWVuY3k7IC8qKiBFeHRlbmRlZCBmcmVxdWVuY3kgZm9yIEFBQyssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQUFDKyBzdHJlYW1zIG9mIEJHTSBjbGlwKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aUFkZEN0czsgICAgICAgICAgICAgICAgLyoqIFRpbWUsIGluIG1pbGxpc2Vjb25kcywgYXQgd2hpY2ggdGhlIGFkZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFjayBpcyBpbnNlcnRlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpQWRkVm9sdW1lOyAgICAgICAgICAgICAvKiogVm9sdW1lLCBpbiBwZXJjZW50YWdlLCBvZiB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICBiZWdpbkN1dE1zOwotICAgIE00T1NBX1VJbnQzMiAgIGVuZEN1dE1zOwotICAgIE00T1NBX0ludDMyICAgIGZpbGVUeXBlOwotICAgIE00T1NBX0Jvb2wgICAgIGJMb29wOyAgICAgICAgICAgICAgICAgICAvKiogTG9vcGluZyBvbi9vZmYgKiovCi0gICAgLyogQXVkaW8gZHVja2luZyAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpSW5EdWNraW5nX3RocmVzaG9sZDsgICAvKiogVGhyZXNob2xkIHZhbHVlIGF0IHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kIG11c2ljIHNoYWxsIGR1Y2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aUluRHVja2luZ19sb3dWb2x1bWU7ICAgLyoqIGxvd2VyIHRoZSBiYWNrZ3JvdW5kIHRyYWNrIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZhY3RvciBvZiBjdXJyZW50IGxldmVsICovCi0gICAgTTRPU0FfQm9vbCAgICAgYkluRHVja2luZ19lbmFibGU7ICAgICAgIC8qKiBlbmFibGUgZHVja2luZyAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpQlRDaGFubmVsQ291bnQ7ICAgICAgICAvKiogY2hhbm5lbCBjb3VudCBmb3IgQlQgKi8KLSAgICBNNE9TQV9Wb2lkICAgICAqcFBDTUZpbGVQYXRoOwotfSBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5nczsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkICAgICAgKnBCdWZmZXI7ICAgICAgICAgICAgLyogWVVWNDIwIGJ1ZmZlciBvZiBmcmFtZSB0byBiZSByZW5kZXJlZCovCi0gICAgTTRPU0FfVUludDMyICAgIHRpbWVNczsgICAgICAgICAgICAvKiB0aW1lIHN0YW1wIG9mIHRoZSBmcmFtZSB0byBiZSByZW5kZXJlZCovCi0gICAgTTRPU0FfVUludDMyICAgIHVpU3VyZmFjZVdpZHRoOyAgICAvKiBTdXJmYWNlIGRpc3BsYXkgd2lkdGgqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aVN1cmZhY2VIZWlnaHQ7ICAgIC8qIFN1cmZhY2UgZGlzcGxheSBoZWlnaHQqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aUZyYW1lV2lkdGg7ICAgICAgICAvKiBGcmFtZSB3aWR0aCovCi0gICAgTTRPU0FfVUludDMyICAgIHVpRnJhbWVIZWlnaHQ7ICAgICAgICAvKiBGcmFtZSBoZWlnaHQqLwotICAgIE00T1NBX0Jvb2wgICAgICBiQXBwbHlFZmZlY3Q7ICAgICAgICAvKiBBcHBseSB2aWRlbyBlZmZlY3RzIGJlZm9yZSByZW5kZXIqLwotICAgIE00T1NBX1VJbnQzMiAgICBjbGlwQmVnaW5DdXRUaW1lOyAgLyogQ2xpcCBiZWdpbiBjdXQgdGltZSByZWxhdGl2ZSB0byBzdG9yeWJvYXJkICovCi0gICAgTTRPU0FfVUludDMyICAgIGNsaXBFbmRDdXRUaW1lOyAgICAvKiBDbGlwIGVuZCBjdXQgdGltZSByZWxhdGl2ZSB0byBzdG9yeWJvYXJkICovCi0gICAgTTRPU0FfVUludDMyICAgIHZpZGVvUm90YXRpb25EZWdyZWU7IC8qIFZpZGVvIHJvdGF0aW9uIGRlZ3JlZSAqLwotCi19IFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0cjsKLSNlbmRpZiAvKl9fVklERU9fRURJVE9SX0FQSV9IX18qLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1wM1JlYWRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1wM1JlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YjNiZTQwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgTVAzIFJlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgVklERU9FRElUT1JfTVAzUkVBREVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JfTVAzUkVBREVSX0gKLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSNlbmRpZiAvKiBWSURFT0VESVRPUl9NUDNSRUFERVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclV0aWxzLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTIxYjIxZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVXRpbHMuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgVXRpbGl0aWVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBBTkRST0lEX1VUSUxTX0hfCi0jZGVmaW5lIEFORFJPSURfVVRJTFNfSF8KLQotLyoqKioqKioqKioqKioqKioqKioKLSAqICAgICBIRUFERVJTICAgICAqCi0gKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVklERU9FRElUT1JfQ0hFQ0sodGVzdCwgZXJyQ29kZSkKLSAqIEBub3RlIFRoaXMgbWFjcm8gZGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZ29lcyB0byBmdW5jdGlvbiBjbGVhblVwIGxhYmVsCi0gKiAgICAgICBpZiB0aGUgdGVzdCBmYWlscy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgVklERU9FRElUT1JfQ0hFQ0sodGVzdCwgZXJyQ29kZSkgXAoteyBcCi0gICAgaWYoICEodGVzdCkgKSB7IFwKLSAgICAgICAgQUxPR1YoIiEhISAlcyAoTCVkKSBjaGVjayBmYWlsZWQgOiAiICN0ZXN0ICIsIHlpZWxkcyBlcnJvciAweCUuOHgiLCBcCi0gICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIGVyckNvZGUpOyBcCi0gICAgICAgIGVyciA9IChlcnJDb2RlKTsgXAotICAgICAgICBnb3RvIGNsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU0FGRV9GUkVFKHApCi0gKiBAbm90ZSBUaGlzIG1hY3JvIGNhbGxzIGZyZWUgYW5kIG1ha2VzIHN1cmUgdGhlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIFNBRkVfRlJFRShwKSBcCi17IFwKLSAgICBpZihNNE9TQV9OVUxMICE9IChwKSkgeyBcCi0gICAgICAgIGZyZWUoKHApKSA7IFwKLSAgICAgICAgKHApID0gTTRPU0FfTlVMTCA7IFwKLSAgICB9IFwKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU0FGRV9NQUxMT0MocCwgdHlwZSwgY291bnQsIGNvbW1lbnQpCi0gKiBAbm90ZSBUaGlzIG1hY3JvIGFsbG9jYXRlcyBhIGJ1ZmZlciwgY2hlY2tzIGZvciBzdWNjZXNzIGFuZCBmaWxscyB0aGUgYnVmZmVyCi0gKiAgICAgICB3aXRoIDAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIFNBRkVfTUFMTE9DKHAsIHR5cGUsIGNvdW50LCBjb21tZW50KSBcCi17IFwKLSAgICAocCkgPSAodHlwZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZih0eXBlKSooY291bnQpLCAweEZGLChNNE9TQV9DaGFyKiljb21tZW50KTtcCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSAocCksIE00RVJSX0FMTE9DKTsgXAotICAgIG1lbXNldCgodm9pZCAqKShwKSwgMCxzaXplb2YodHlwZSkqKGNvdW50KSk7IFwKLX0KLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqCi0gICAgICogICAgVVRJTElUSUVTICAgICAqCi0gICAgICoqKioqKioqKioqKioqKioqKioqLwotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBESVNQTEFZIE1FVEFEQVRBIENPTlRFTlQgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBkaXNwbGF5TWV0YURhdGEoY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEpOwotCi0vLyBCdWlsZCB0aGUgQVZDIGNvZGVjIHNwY2lmaWMgaW5mbyBmcm9tIHRoZSBTdGFnZUZyaWdodCBlbmNvZGVycyBvdXRwdXQKLXN0YXR1c190IGJ1aWxkQVZDQ29kZWNTcGVjaWZpY0RhdGEodWludDhfdCAqKm91dHB1dERhdGEsIHNpemVfdCAqb3V0cHV0U2l6ZSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIE1ldGFEYXRhICpwYXJhbSk7Ci0KLX0vL25hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8vQU5EUk9JRF9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZWVhM2E2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgdmlkZW8gZGVjb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgVklERU9FRElUT1JfVklERU9ERUNPREVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JfVklERU9ERUNPREVSX0gKLQotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICBNNE9TQV9Db250ZXh0ICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICBNNE9TQV9Db250ZXh0ICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZV9NUEVHNCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRWaWRlb0RlY29kZXJzQW5kQ2FwYWJpbGl0aWVzKAotICAgIE00REVDT0RFUl9WaWRlb0RlY29kZXJzKiogZGVjb2RlcnMpOwotCi0jZW5kaWYgLy8gVklERU9FRElUT1JfVklERU9ERUNPREVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWwuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjc2MjY0My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0ludGVybmFsLmgKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBkZWNvZGVyIGludGVybmFsIGhlYWRlciBmaWxlKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotI2luY2x1ZGUgIk00REFfVHlwZXMuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckJ1ZmZlci5oIgotI2luY2x1ZGUgIk00VkRfVG9vbHMuaCIKLSNpbmNsdWRlICJJNDIwQ29sb3JDb252ZXJ0ZXIuaCIKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL3JlY3QuaD4KLSNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLQotI2RlZmluZSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfTUFKT1IgICAgIDAKLSNkZWZpbmUgVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX01JTk9SICAgICAwCi0jZGVmaW5lIFZJREVPRURJVE9SX1ZJREVDX1NIRUxMX1ZFUl9SRVZJU0lPTiAgMQotCi0vKiBFUlJPUlMgKi8KLSNkZWZpbmUgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIDB4RkYsIDB4MDAwMSkKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10eXBlZGVmIGVudW0gewotICAgIFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjLAotICAgIFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWMsCi0gICAgVklERU9FRElUT1Jfa0gyNjRWaWRlb0RlYwotfSBWSURFT0VESVRPUl9Db2RlY1R5cGU7Ci0KLQotLyp0eXBlZGVmIHN0cnVjdHsKLSAgICBNNE9TQV9VSW50MzIgc3RyZWFtX2J5dGU7Ci0gICAgTTRPU0FfVUludDMyIHN0cmVhbV9pbmRleDsKLSAgICBNNE9TQV9NZW1BZGRyOCBpbjsKLQotfSBWSURFT0VESVRPUl9WSURFT19CaXRzdHJlYW1fY3R4dDsqLwotCi10eXBlZGVmIE00VlNfQml0c3RyZWFtX2N0eHQgVklERU9FRElUT1JfVklERU9fQml0c3RyZWFtX2N0eHQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIC8qKiBTdGFnZWZyaWd0aCBwYXJhbXMgKi8KLSAgICBPTVhDbGllbnQgICAgICAgICAgICAgICBtQ2xpZW50OyAvKio8IE9NWCBDbGllbnQgc2Vzc2lvbiBpbnN0YW5jZS4gKi8KLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICBtVmlkZW9EZWNvZGVyOyAvKio8IFN0YWdlZnJpZ2h0IGRlY29kZXIgaW5zdGFuY2UgKi8KLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICBtUmVhZGVyU291cmNlOyAvKio8IFJlYWRlciBhY2Nlc3MgPiAqLwotCi0gICAgLyogUkVBREVSICovCi0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICptX3BSZWFkZXJHbG9iYWw7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAgKm1fcFJlYWRlcjsKLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICAqbV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLQotICAgIC8qIFNUUkVBTSBQQVJBTVMgKi8KLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqICBtX3BWaWRlb1N0cmVhbWhhbmRsZXI7Ci0KLSAgICAvKiBVc2VyIGZpbHRlciBwYXJhbXMuICovCi0gICAgTTRWSUZJX1BsYW5Db252ZXJ0ZXJGdW5jdGlvblR5cGUgKm1fcEZpbHRlcjsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAqbV9wRmlsdGVyVXNlckRhdGE7Ci0KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICBtX2xhc3REZWNvZGVkQ1RTOwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIG1fbGFzdFJlbmRlckN0czsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtUmVhY2hlZEVPUzsKLSAgICBWSURFT0VESVRPUl9Db2RlY1R5cGUgICBtRGVjb2RlclR5cGU7Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSAgICAgbV9WaWRlb1NpemU7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIG1fRGNpOyAvKio8IERlY29kZXIgQ29uZmlnIGluZm8gKi8KLSAgICBWSURFT0VESVRPUl9CVUZGRVJfUG9vbCAqbV9wRGVjQnVmZmVyUG9vbDsgLyoqPCBEZWNvZGVkIGJ1ZmZlciBwb29sICovCi0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgICAgZGVjT3VwdXRDb2xvckZvcm1hdDsKLQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1OYklucHV0RnJhbWVzOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1GaXJzdElucHV0Q3RzOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1MYXN0SW5wdXRDdHM7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbU5iUmVuZGVyZWRGcmFtZXM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUZpcnN0UmVuZGVyZWRDdHM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUxhc3RSZW5kZXJlZEN0czsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtTmJPdXRwdXRGcmFtZXM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUZpcnN0T3V0cHV0Q3RzOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1MYXN0T3V0cHV0Q3RzOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgIG1HaXZlbldpZHRoLCBtR2l2ZW5IZWlnaHQ7IC8vVXNlZCBpbiBjYXNlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JTkZPX0ZPUk1BVF9DSEFOR0VECi0gICAgQVJlY3QgICAgICAgICAgICAgICAgICAgbUNyb3BSZWN0OyAgLy8gVGhlc2UgYXJlIG9idGFpbmVkIGZyb20ga0tleUNyb3BSZWN0LgotICAgIEk0MjBDb2xvckNvbnZlcnRlciogICAgIG1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0KLSAgICAvLyBUaW1lIGludGVydmFsIGJldHdlZW4gdHdvIGNvbnNlcXV0aXZlL25laWdoYm9yaW5nIHZpZGVvIGZyYW1lcy4KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICBtRnJhbWVJbnRlcnZhbE1zOwotCi19IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQ7Ci0KLX0gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDUxNTRmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgdmlkZW8gZW5jb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgVklERU9FRElUT1JfVklERU9FTkNPREVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JfVklERU9FTkNPREVSX0gKLQotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSk7Ci0KLSNlbmRpZiAvL1ZJREVPRURJVE9SX1ZJREVPRU5DT0RFUl9ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzMGI4NWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIE1lZGlhQnVmZmVyUHVsbGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclV0aWxzLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JCdWZmZXIuYyBcCi0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGNvcmVjZyBncmFwaGljcykgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL2x2cHAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2VkaXRvciBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICBcCi0gICAgbGliYmluZGVyICAgICAgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214ICAgICAgICBcCi0gICAgbGliZ3VpICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3Jfb3NhbCAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3JwbGF5ZXIgICAgICBcCi0KLUxPQ0FMX0NGTEFHUyArPSBcCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24KLQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl9zdGFnZWZyaWdodHNoZWxscwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NZWRpYUJ1ZmZlclB1bGxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzgyNjguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NZWRpYUJ1ZmZlclB1bGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXJQdWxsZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSAiTWVkaWFCdWZmZXJQdWxsZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0KLU1lZGlhQnVmZmVyUHVsbGVyOjpNZWRpYUJ1ZmZlclB1bGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSkKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSwKLSAgICAgIG1Bc2tUb1N0YXJ0KGZhbHNlKSwKLSAgICAgIG1Bc2tUb1N0b3AoZmFsc2UpLAotICAgICAgbUFjcXVpcmVTdG9wcGVkKGZhbHNlKSwKLSAgICAgIG1SZWxlYXNlU3RvcHBlZChmYWxzZSksCi0gICAgICBtU291cmNlRXJyb3IoT0spIHsKLQotICAgIGFuZHJvaWRDcmVhdGVUaHJlYWQoYWNxdWlyZVRocmVhZFN0YXJ0LCB0aGlzKTsKLSAgICBhbmRyb2lkQ3JlYXRlVGhyZWFkKHJlbGVhc2VUaHJlYWRTdGFydCwgdGhpcyk7Ci19Ci0KLU1lZGlhQnVmZmVyUHVsbGVyOjp+TWVkaWFCdWZmZXJQdWxsZXIoKSB7Ci0gICAgc3RvcCgpOwotfQotCi1ib29sIE1lZGlhQnVmZmVyUHVsbGVyOjpoYXNNZWRpYVNvdXJjZVJldHVybmVkRXJyb3IoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gKChtU291cmNlRXJyb3IgIT0gT0spID8gdHJ1ZSA6IGZhbHNlKTsKLX0KLXZvaWQgTWVkaWFCdWZmZXJQdWxsZXI6OnN0YXJ0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgbUFza1RvU3RhcnQgPSB0cnVlOwotICAgIG1BY3F1aXJlQ29uZC5zaWduYWwoKTsKLSAgICBtUmVsZWFzZUNvbmQuc2lnbmFsKCk7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXJQdWxsZXI6OnN0b3AoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBtQXNrVG9TdG9wID0gdHJ1ZTsKLSAgICBtQWNxdWlyZUNvbmQuc2lnbmFsKCk7Ci0gICAgbVJlbGVhc2VDb25kLnNpZ25hbCgpOwotICAgIHdoaWxlICghbUFjcXVpcmVTdG9wcGVkIHx8ICFtUmVsZWFzZVN0b3BwZWQpIHsKLSAgICAgICAgbVVzZXJDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIC8vIFJlbGVhc2UgcmVtYWluaW5nIGJ1ZmZlcnMKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1CdWZmZXJzLml0ZW1BdChpKS0+cmVsZWFzZSgpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlbGVhc2VCdWZmZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1SZWxlYXNlQnVmZmVycy5pdGVtQXQoaSktPnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICBtQnVmZmVycy5jbGVhcigpOwotICAgIG1SZWxlYXNlQnVmZmVycy5jbGVhcigpOwotfQotCi1NZWRpYUJ1ZmZlciogTWVkaWFCdWZmZXJQdWxsZXI6OmdldEJ1ZmZlck5vbkJsb2NraW5nKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgaWYgKG1CdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTWVkaWFCdWZmZXIqIGIgPSBtQnVmZmVycy5pdGVtQXQoMCk7Ci0gICAgICAgIG1CdWZmZXJzLnJlbW92ZUF0KDApOwotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci19Ci0KLU1lZGlhQnVmZmVyKiBNZWRpYUJ1ZmZlclB1bGxlcjo6Z2V0QnVmZmVyQmxvY2tpbmcoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICB3aGlsZSAobUJ1ZmZlcnMuZW1wdHkoKSAmJiAhbUFjcXVpcmVTdG9wcGVkKSB7Ci0gICAgICAgIG1Vc2VyQ29uZC53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBNZWRpYUJ1ZmZlciogYiA9IG1CdWZmZXJzLml0ZW1BdCgwKTsKLSAgICAgICAgbUJ1ZmZlcnMucmVtb3ZlQXQoMCk7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6cHV0QnVmZmVyKE1lZGlhQnVmZmVyKiBidWZmZXIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIG1SZWxlYXNlQnVmZmVycy5wdXNoKGJ1ZmZlcik7Ci0gICAgbVJlbGVhc2VDb25kLnNpZ25hbCgpOwotfQotCi1pbnQgTWVkaWFCdWZmZXJQdWxsZXI6OmFjcXVpcmVUaHJlYWRTdGFydCh2b2lkKiBhcmcpIHsKLSAgICBNZWRpYUJ1ZmZlclB1bGxlciogc2VsZiA9IChNZWRpYUJ1ZmZlclB1bGxlciopYXJnOwotICAgIHNlbGYtPmFjcXVpcmVUaHJlYWRGdW5jKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBNZWRpYUJ1ZmZlclB1bGxlcjo6cmVsZWFzZVRocmVhZFN0YXJ0KHZvaWQqIGFyZykgewotICAgIE1lZGlhQnVmZmVyUHVsbGVyKiBzZWxmID0gKE1lZGlhQnVmZmVyUHVsbGVyKilhcmc7Ci0gICAgc2VsZi0+cmVsZWFzZVRocmVhZEZ1bmMoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6YWNxdWlyZVRocmVhZEZ1bmMoKSB7Ci0gICAgbUxvY2subG9jaygpOwotCi0gICAgLy8gV2FpdCBmb3IgdGhlIHN0YXJ0IHNpZ25hbAotICAgIHdoaWxlICghbUFza1RvU3RhcnQgJiYgIW1Bc2tUb1N0b3ApIHsKLSAgICAgICAgbUFjcXVpcmVDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIC8vIExvb3AgdW50aWwgd2UgYXJlIGFza2VkIHRvIHN0b3AsIG9yIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0byByZWFkCi0gICAgd2hpbGUgKCFtQXNrVG9TdG9wKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBwQnVmZmVyOwotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVNvdXJjZS0+cmVhZCgmcEJ1ZmZlciwgTlVMTCk7Ci0gICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgbVNvdXJjZUVycm9yID0gcmVzdWx0OwotICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtQnVmZmVycy5wdXNoKHBCdWZmZXIpOwotICAgICAgICBtVXNlckNvbmQuc2lnbmFsKCk7Ci0gICAgfQotCi0gICAgbUFjcXVpcmVTdG9wcGVkID0gdHJ1ZTsKLSAgICBtVXNlckNvbmQuc2lnbmFsKCk7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXJQdWxsZXI6OnJlbGVhc2VUaHJlYWRGdW5jKCkgewotICAgIG1Mb2NrLmxvY2soKTsKLQotICAgIC8vIFdhaXQgZm9yIHRoZSBzdGFydCBzaWduYWwKLSAgICB3aGlsZSAoIW1Bc2tUb1N0YXJ0ICYmICFtQXNrVG9TdG9wKSB7Ci0gICAgICAgIG1SZWxlYXNlQ29uZC53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICAvLyBMb29wIHVudGlsIHdlIGFyZSBhc2tlZCB0byBzdG9wCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKG1SZWxlYXNlQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobUFza1RvU3RvcCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVsZWFzZUNvbmQud2FpdChtTG9jayk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFCdWZmZXIqIHBCdWZmZXIgPSBtUmVsZWFzZUJ1ZmZlcnMuaXRlbUF0KDApOwotICAgICAgICBtUmVsZWFzZUJ1ZmZlcnMucmVtb3ZlQXQoMCk7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBwQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICB9Ci0KLSAgICBtUmVsZWFzZVN0b3BwZWQgPSB0cnVlOwotICAgIG1Vc2VyQ29uZC5zaWduYWwoKTsKLSAgICBtTG9jay51bmxvY2soKTsKLX0KLQotfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzJhNTMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NZWRpYUJ1ZmZlclB1bGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX01FRElBX0JVRkZFUl9QVUxMRVJfSAotI2RlZmluZSBfTUVESUFfQlVGRkVSX1BVTExFUl9ICi0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgTWVkaWFTb3VyY2U7Ci1zdHJ1Y3QgTWVkaWFCdWZmZXI7Ci0KLS8qCi0gKiBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBjYW4gcHVsbCBhIGxpc3Qgb2YgbWVkaWEgYnVmZmVycwotICogZnJvbSBhIE1lZGlhU291cmNlIHJlcGVhdGVkbHkuIFRoZSB1c2VyIGNhbiB0aGVuIGdldCB0aGUKLSAqIGJ1ZmZlcnMgZnJvbSB0aGF0IGxpc3QuCi0gKi8KLXN0cnVjdCBNZWRpYUJ1ZmZlclB1bGxlciB7Ci1wdWJsaWM6Ci0gICAgTWVkaWFCdWZmZXJQdWxsZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpOwotICAgIH5NZWRpYUJ1ZmZlclB1bGxlcigpOwotCi0gICAgLy8gU3RhcnQgdG8gYnVpbGQgdXAgdGhlIGxpc3Qgb2YgdGhlIGJ1ZmZlcnMuCi0gICAgdm9pZCBzdGFydCgpOwotCi0gICAgLy8gUmVsZWFzZSB0aGUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGJ1ZmZlcnMsIGFuZCBzdG9wCi0gICAgLy8gcHVsbGluZyBidWZmZXJzIGZyb20gdGhlIE1lZGlhU291cmNlLgotICAgIHZvaWQgc3RvcCgpOwotCi0gICAgLy8gR2V0IGEgYnVmZmVyIGZyb20gdGhlIGxpc3QuIElmIHRoZXJlIGlzIG5vIGJ1ZmZlciBhdmFpbGFibGUKLSAgICAvLyBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIE5VTEwgaXMgcmV0dXJuZWQuCi0gICAgTWVkaWFCdWZmZXIqIGdldEJ1ZmZlckJsb2NraW5nKCk7Ci0KLSAgICAvLyBHZXQgYSBidWZmZXIgZnJvbSB0aGUgbGlzdC4gSWYgdGhlcmUgaXMgbm8gYnVmZmVyIGF2YWlsYWJsZQotICAgIC8vIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgaXQgYmxvY2tzIHdhaXRpbmcgZm9yCi0gICAgLy8gYSBidWZmZXIgdG8gYmVjb21lIGF2YWlsYWJsZSBvciB1bnRpbCBzdG9wKCkgaXMgY2FsbGVkLgotICAgIE1lZGlhQnVmZmVyKiBnZXRCdWZmZXJOb25CbG9ja2luZygpOwotCi0gICAgLy8gQWRkIGEgYnVmZmVyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYXZhaWxhYmxlIG1lZGlhIGJ1ZmZlcnMKLSAgICB2b2lkIHB1dEJ1ZmZlcihNZWRpYUJ1ZmZlciogYnVmZmVyKTsKLQotICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHNvdXJjZSByZXR1cm5lZCBhbiBlcnJvciBvciBub3QuCi0gICAgYm9vbCBoYXNNZWRpYVNvdXJjZVJldHVybmVkRXJyb3IoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgaW50IGFjcXVpcmVUaHJlYWRTdGFydCh2b2lkKiBhcmcpOwotICAgIHZvaWQgYWNxdWlyZVRocmVhZEZ1bmMoKTsKLQotICAgIHN0YXRpYyBpbnQgcmVsZWFzZVRocmVhZFN0YXJ0KHZvaWQqIGFyZyk7Ci0gICAgdm9pZCByZWxlYXNlVGhyZWFkRnVuYygpOwotCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgVmVjdG9yPE1lZGlhQnVmZmVyKj4gbUJ1ZmZlcnM7Ci0gICAgVmVjdG9yPE1lZGlhQnVmZmVyKj4gbVJlbGVhc2VCdWZmZXJzOwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBDb25kaXRpb24gbVVzZXJDb25kOyAgICAgLy8gZm9yIHRoZSB1c2VyIG9mIHRoaXMgY2xhc3MKLSAgICBDb25kaXRpb24gbUFjcXVpcmVDb25kOyAgLy8gZm9yIHRoZSBhY3F1aXJlIHRocmVhZAotICAgIENvbmRpdGlvbiBtUmVsZWFzZUNvbmQ7ICAvLyBmb3IgdGhlIHJlbGVhc2UgdGhyZWFkCi0KLSAgICBib29sIG1Bc2tUb1N0YXJ0OyAgICAgIC8vIEFza3MgdGhlIHRocmVhZHMgdG8gc3RhcnQKLSAgICBib29sIG1Bc2tUb1N0b3A7ICAgICAgIC8vIEFza3MgdGhlIHRocmVhZHMgdG8gc3RvcAotICAgIGJvb2wgbUFjcXVpcmVTdG9wcGVkOyAgLy8gVGhlIGFjcXVpcmUgdGhyZWFkIGhhcyBzdG9wcGVkCi0gICAgYm9vbCBtUmVsZWFzZVN0b3BwZWQ7ICAvLyBUaGUgcmVsZWFzZSB0aHJlYWQgaGFzIHN0b3BwZWQKLSAgICBzdGF0dXNfdCBtU291cmNlRXJyb3I7IC8vIEVycm9yIHJldHVybmVkIGJ5IE1lZGlhU291cmNlIHJlYWQKLQotICAgIC8vIERvbid0IGNhbGwgbWUhCi0gICAgTWVkaWFCdWZmZXJQdWxsZXIoY29uc3QgTWVkaWFCdWZmZXJQdWxsZXImKTsKLSAgICBNZWRpYUJ1ZmZlclB1bGxlciYgb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyUHVsbGVyJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIF9NRURJQV9CVUZGRVJfUFVMTEVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTk9USUNFIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3IzZ3BSZWFkZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5Y2Y5ZWMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgM0dQIFJlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfM0dQUkVBREVSIgotCi0vKioKLSAqIEhFQURFUlMKLSAqCi0gKi8KLSNkZWZpbmUgVklERU9FRElUT1JfQklUU1RSRUFNX1BBUlNFUgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvcjNncFJlYWRlci5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0jaW5jbHVkZSAiTTRSRUFERVJfM2dwQ29tLmgiCi0jaW5jbHVkZSAiTTRfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0jaWZkZWYgVklERU9FRElUT1JfQklUU1RSRUFNX1BBUlNFUgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRfVXRpbHMuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAiRVNEUy5oIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotLyoqCi0gKiBTT1VSQ0UgQ0xBU1MKLSAqLwotbmFtZXNwYWNlIGFuZHJvaWQgewotLyoqCi0gKiBFTkdJTkUgSU5URVJGQUNFCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBBcnJheSBvZiBBTVIgTkIvV0IgYml0cmF0ZXMKLSAqIEBub3RlICAgIEFycmF5IHRvIG1hdGNoIHRoZSBtb2RlIGFuZCB0aGUgYml0IHJhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1jb25zdCBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQW1yQml0UmF0ZSBbMiAvKiA4a0h6IC8gMTZrSHogICAgICovXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzkgLyogdGhlIGJpdHJhdGUgbW9kZSAqL10gPQotewotICAgIHs0NzUwLCA1MTUwLCA1OTAwLCAgNjcwMCwgIDc0MDAsICA3OTUwLCAgMTAyMDAsIDEyMjAwLCAwfSwKLSAgICB7NjYwMCwgODg1MCwgMTI2NTAsIDE0MjUwLCAxNTg1MCwgMTgyNTAsIDE5ODUwLCAyMzA1MCwgMjM4NTB9Ci19OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dAotICogQGJyaWVmOlRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFN0YWdlRnJpZ2h0IDNHUCBzaGVsbCBSZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNwPERhdGFTb3VyY2U+ICAgICAgICAgICAgICBtRGF0YVNvdXJjZTsKLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gICAgICAgICAgbUV4dHJhY3RvcjsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgbUF1ZGlvU291cmNlOwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgICAgICBtVmlkZW9Tb3VyY2U7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgIG1WaWRlb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1BdWRpb0F1OwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBtVmlkZW9BdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbU1heER1cmF0aW9uOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICBtRmlsZVNpemU7Ci0gICAgTTRfU3RyZWFtVHlwZSAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtU3RyZWFtSWQ7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1UcmFja3M7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1DdXJyVHJhY2s7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1BdWRpb1NlZWtpbmc7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIG1BdWRpb1NlZWtUaW1lOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBtVmlkZW9TZWVraW5nOwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBtVmlkZW9TZWVrVGltZTsKLQotfSBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0OwotCi0jaWZkZWYgVklERU9FRElUT1JfQklUU1RSRUFNX1BBUlNFUgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dAotICogQGJyaWVmICAgICAgIEludGVybmFsIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQzMiogICBtUGJpdFN0cmVhbTsgICAvKio8IGJpdHN0cmVhbSBwb2ludGVyICgzMmJpdHMgYWxpZ25lZCkgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgbVNpemU7ICAgICAgICAgLyoqPCBiaXRzdHJlYW0gc2l6ZSBpbiBieXRlcyAqLwotICAgIE00T1NBX0ludDMyICAgICBtSW5kZXg7ICAgICAgICAvKio8IGJ5dGUgaW5kZXggKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgbUJpdEluZGV4OyAgICAgLyoqPCBiaXQgaW5kZXggKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgbVN0cnVjdFNpemU7ICAgLyoqPCBzaXplIG9mIHN0cnVjdHVyZSAqLwotfSBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBBbGxvY2F0ZXMgdGhlIGNvbnRleHQgYW5kIGluaXRpYWxpemVzIGludGVybmFsIGRhdGEuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAoT1VUKSAgUG9pbnRlciB0byB0aGUgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQgdG8gY3JlYXRlLgotICogQHBhcmFtICAgYml0U3RyZWFtICAgQSBwb2ludGVyIHRvIHRoZSBiaXRzdHJlYW0KLSAqIEBwYXJhbSAgIHNpemUgICAgICAgIFRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VySW5pdCh2b2lkKiogcENvbnRleHQsCi0gICAgICAgIHZvaWQqIHBCaXRTdHJlYW0sIE00T1NBX0ludDMyIHNpemUpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KiBwU3RyZWFtQ29udGV4dDsKLQotICAgICpwQ29udGV4dD1NNE9TQV9OVUxMOwotICAgIHBTdHJlYW1Db250ZXh0ID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgc2l6ZW9mKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQpLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopIjNHUCBCaXRTdHJlYW1QYXJzZXIgQ29udGV4dCIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtPShNNE9TQV9VSW50MzIqKXBCaXRTdHJlYW07Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1TaXplPXNpemU7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1JbmRleD0wOwotICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXg9MDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bVN0cnVjdFNpemUgPQotICAgICAgICBzaXplb2YoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCk7Ci0KLSAgICAqcENvbnRleHQ9cFN0cmVhbUNvbnRleHQ7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDbGVhbiB1cCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAoSU4vT1VUKSAgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyB2b2lkIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAodm9pZCogcENvbnRleHQpIHsKLSAgICBmcmVlKChNNE9TQV9JbnQzMiopcENvbnRleHQpOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJlYWQgdGhlIG5leHQgPGxlbmd0aD4gYml0cyBpbiB0aGUgYml0c3RyZWFtLgotICogQG5vdGUgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAoSU4vT1VUKSBCaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIGxlbmd0aCAgICAgIChJTikgVGhlIG51bWJlciBvZiBiaXRzIHRvIGV4dHJhY3QgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiBAcmV0dXJuICB0aGUgcmVhZCBiaXRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgTTRPU0FfVUludDMyIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHZvaWQqIHBDb250ZXh0LAotICAgICAgICBNNE9TQV9JbnQzMiBsZW5ndGgpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KiBwU3RyZWFtQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX1VJbnQzMiB1X21hc2s7Ci0gICAgTTRPU0FfVUludDMyIHJldHZhbDsKLSAgICBNNE9TQV9JbnQzMiBpX292ZjsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTD09cFN0cmVhbUNvbnRleHQpLCAwLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHM6aW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHJldHZhbD0oTTRPU0FfVUludDMyKUdFVF9NRU1PUlkzMihwU3RyZWFtQ29udGV4dC0+XAotICAgICAgICBtUGJpdFN0cmVhbVsgcFN0cmVhbUNvbnRleHQtPm1JbmRleCBdKTsKLSAgICBpX292ZiA9IHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXggKyBsZW5ndGggLSAzMjsKLSAgICB1X21hc2sgPSAobGVuZ3RoID49IDMyKSA/IDB4ZmZmZmZmZmY6ICgxIDw8IGxlbmd0aCkgLSAxOwotCi0gICAgLyogZG8gd2UgaGF2ZSBlbm91Z2ggYml0cyBhdmFpbGJsZSBpbiB0aGUgY3VycmVudCB3b3JkKDMyYml0cykqLwotICAgIGlmIChpX292ZiA8PSAwKSB7Ci0gICAgICAgIHJldHZhbD0ocmV0dmFsID4+ICgtIGlfb3ZmKSkgJiB1X21hc2s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVfbmV4dHdvcmQgPSAoTTRPU0FfVUludDMyKUdFVF9NRU1PUlkzMigKLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tUGJpdFN0cmVhbVsgcFN0cmVhbUNvbnRleHQtPm1JbmRleCArIDEgXSk7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1X21zYl9tYXNrLCB1X21zYl92YWx1ZSwgdV9sc2JfbWFzaywgdV9sc2JfdmFsdWU7Ci0KLSAgICAgICAgdV9tc2JfbWFzayA9ICgoMSA8PCAoMzIgLSBwU3RyZWFtQ29udGV4dC0+bUJpdEluZGV4KSkgLSAxKSA8PCBpX292ZjsKLSAgICAgICAgdV9tc2JfdmFsdWUgPSByZXR2YWwgPDwgaV9vdmY7Ci0gICAgICAgIHVfbHNiX21hc2sgPSAoMSA8PCBpX292ZikgLSAxOwotICAgICAgICB1X2xzYl92YWx1ZSA9IHVfbmV4dHdvcmQgPj4gKDMyIC0gaV9vdmYpOwotICAgICAgICByZXR2YWw9ICh1X21zYl92YWx1ZSAmIHVfbXNiX21hc2sgKSB8ICh1X2xzYl92YWx1ZSAmIHVfbHNiX21hc2spOwotICAgIH0KLSAgICAvKiByZXR1cm4gdGhlIGJpdHMuLi4qLwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEluY3JlbWVudCB0aGUgYml0c3RyZWFtIHBvaW50ZXIgb2YgPGxlbmd0aD4gYml0cy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChJTi9PVVQpIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHBhcmFtICAgbGVuZ3RoICAgICAgKElOKSBUaGUgbnVtYmVyIG9mIGJpdCB0byBzaGlmdCB0aGUgYml0c3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHZvaWQqIHBDb250ZXh0LAotICAgICAgICBNNE9TQV9JbnQzMiBsZW5ndGgpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KiBwU3RyZWFtQ29udGV4dD0oCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0ludDMyIHZhbDsKLQotICAgIGlmIChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdmFsPXBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXggKyBsZW5ndGg7Ci0gICAgLyogdXBkYXRlIHRoZSBiaXRzLi4uKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bUJpdEluZGV4ICs9IGxlbmd0aDsKLQotICAgIGlmICh2YWwgLSAzMiA+PSAwKSB7Ci0gICAgICAgIC8qIHVwZGF0ZSB0aGUgYml0cy4uLiovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXggLT0gMzI7Ci0gICAgICAgIC8qIHVwZGF0ZSB0aGUgd29yZHMqLwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bUluZGV4Kys7Ci0gICAgfQotfQotCi1zdGF0aWMgTTRPU0FfVUludDMyIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckdldEJpdHMoCi0gICAgICAgIHZvaWQqIHBDb250ZXh0LE00T1NBX0ludDMyIGJpdFBvcywgTTRPU0FfSW50MzIgYml0TGVuZ3RoKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9JbnQzMiBiaXRMb2NhdGlvbiwgYml0SW5kZXg7Ci0gICAgTTRPU0FfVUludDMyIHJldHZhbD0wOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wU3RyZWFtQ29udGV4dCksIDAsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJHZXRCaXRzOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogY29tcHV0ZXMgdGhlIHdvcmQgbG9jYXRpb24qLwotICAgIGJpdExvY2F0aW9uPWJpdFBvcy8zMjsKLSAgICBiaXRJbmRleD0oYml0UG9zKSAlIDMyOwotCi0gICAgaWYgKGJpdExvY2F0aW9uIDwgcFN0cmVhbUNvbnRleHQtPm1TaXplKSB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1X21hc2s7Ci0gICAgICAgIE00T1NBX0ludDMyIGlfb3ZmID0gYml0SW5kZXggKyBiaXRMZW5ndGggLSAzMjsKLSAgICAgICAgcmV0dmFsPShNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKAotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtWyBiaXRMb2NhdGlvbiBdKTsKLQotICAgICAgICB1X21hc2sgPSAoYml0TGVuZ3RoID49IDMyKSA/IDB4ZmZmZmZmZmY6ICgxIDw8IGJpdExlbmd0aCkgLSAxOwotCi0gICAgICAgIGlmIChpX292ZiA8PSAwKSB7Ci0gICAgICAgICAgICByZXR2YWw9KHJldHZhbCA+PiAoLSBpX292ZikpICYgdV9tYXNrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTTRPU0FfVUludDMyIHVfbmV4dHdvcmQgPSAoTTRPU0FfVUludDMyKUdFVF9NRU1PUlkzMigKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW1bIGJpdExvY2F0aW9uICsgMSBdKTsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1X21zYl9tYXNrLCB1X21zYl92YWx1ZSwgdV9sc2JfbWFzaywgdV9sc2JfdmFsdWU7Ci0KLSAgICAgICAgICAgIHVfbXNiX21hc2sgPSAoKDEgPDwgKDMyIC0gYml0SW5kZXgpKSAtIDEpIDw8IGlfb3ZmOwotICAgICAgICAgICAgdV9tc2JfdmFsdWUgPSByZXR2YWwgPDwgaV9vdmY7Ci0gICAgICAgICAgICB1X2xzYl9tYXNrID0gKDEgPDwgaV9vdmYpIC0gMTsKLSAgICAgICAgICAgIHVfbHNiX3ZhbHVlID0gdV9uZXh0d29yZCA+PiAoMzIgLSBpX292Zik7Ci0gICAgICAgICAgICByZXR2YWw9ICh1X21zYl92YWx1ZSAmIHVfbXNiX21hc2sgKSB8ICh1X2xzYl92YWx1ZSAmIHVfbHNiX21hc2spOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclJlc3RhcnQodm9pZCogcENvbnRleHQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KiBwU3RyZWFtQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KilwQ29udGV4dDsKLQotICAgIGlmIChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLyogcmVzZXRzIHRoZSBiaXRzdHJlYW0gcG9pbnRlcnMqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tSW5kZXg9MDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bUJpdEluZGV4PTA7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgIEdldCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBwb2ludGVkIGJ5IHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEBub3RlICAgSXQgc2hvdWxkIGJlIHVzZWQgY2FyZWZ1bGx5IGFzIHRoZSBwb2ludGVyIGlzIGluIHRoZSBiaXRzdHJlYW0gaXRzZWxmCi0gKiAgICAgICAgIGFuZCBubyBjb3B5IGlzIG1hZGUuCi0gKiBAcGFyYW0gIHBDb250ZXh0ICAgIChJTi9PVVQpICBCaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgYml0c3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9VSW50OCogIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0dldEN1cnJlbnRiaXRTdHJlYW1Qb2ludGVyKAotICAgICAgICB2b2lkKiBwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTD09cFN0cmVhbUNvbnRleHQpLCAwLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHJldHVybiAoTTRPU0FfVUludDgqKSgoTTRPU0FfVUludDgqKXBTdHJlYW1Db250ZXh0LT5tUGJpdFN0cmVhbSArIFwKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1JbmRleCAqIHNpemVvZihNNE9TQV9VSW50MzIpICsgXAotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bUJpdEluZGV4LzgpIDsKLX0KLQotc3RhdGljIE00T1NBX0ludDMyIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckdldFNpemUodm9pZCogcENvbnRleHQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KiBwU3RyZWFtQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEw9PXBTdHJlYW1Db250ZXh0KSwgMCwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICByZXR1cm4gcFN0cmVhbUNvbnRleHQtPm1TaXplOwotfQotCi0KLXN0YXRpYyB2b2lkIFZpZGVvRWRpdG9yM2dwUmVhZGVyX01QRUc0Qml0U3RyZWFtUGFyc2VySW5pdCh2b2lkKiogcENvbnRleHQsCi0gICAgICAgIHZvaWQqIHBCaXRTdHJlYW0sIE00T1NBX0ludDMyIHNpemUpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJJbml0KHBDb250ZXh0LCBwQml0U3RyZWFtLCBzaXplKTsKLX0KLXN0YXRpYyBNNE9TQV9JbnQzMiBWaWRlb0VkaXRvcjNncFJlYWRlcl9HZXRNcGVnTGVuZ3RoRnJvbUludGVnZXIodm9pZCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiB2YWwpIHsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoPTA7Ci0gICAgTTRPU0FfVUludDMyIG51bUJ5dGVzPTA7Ci0gICAgTTRPU0FfVUludDMyIGI9MDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTD09cENvbnRleHQpLCAwLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIC8qIHRoZSBsZW5ndGggaXMgZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzLiBUaGUgaGlnaGVzdCBiaXQgaXMgdXNlZAotICAgIHRvIGluZGljYXRlIHRoYXQgdGhlIGxlbmd0aCBjb250aW51ZXMgb24gdGhlIG5leHQgYnl0ZS4KLQotICAgIFRoZSBsZW5ndGggY2FuIGJlOiAweDgwIDB4ODAgMHg4MCAweDIyCi0gICAgb2YganVzdCAgICAgICAgICAgIDB4MjIgKGhpZ2hlc3QgYml0IG5vdCBzZXQpCi0KLSAgICAqLwotCi0gICAgZG8gewotICAgICAgICBiPSh2YWwgJiAoKDB4ZmYpPDwgKDggKiBudW1CeXRlcykpKT4+ICg4ICogbnVtQnl0ZXMpOwotICAgICAgICBsZW5ndGg9KGxlbmd0aCA8PCA3KSB8IChiICYgMHg3Zik7Ci0gICAgICAgIG51bUJ5dGVzKys7Ci0gICAgfSB3aGlsZSAoKGIgJiAweDgwKSAmJiBudW1CeXRlcyA8IDQpOwotCi0gICAgcmV0dXJuIGxlbmd0aDsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICBEZWNvZGUgYW4gTVBFRzQgU3lzdGVtcyBkZXNjcmlwdG9yIHNpemUgZnJvbSBhbiBlbmNvZGVkIFNETCBzaXplIGRhdGEKLSAqIEBub3RlICAgVGhlIHZhbHVlIGlzIHJlYWQgZnJvbSB0aGUgY3VycmVudCBiaXRzdHJlYW0gbG9jYXRpb24uCi0gKiBAcGFyYW0gIHBDb250ZXh0ICAgIChJTi9PVVQpICBCaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqIEByZXR1cm4gU2l6ZSBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX0ludDMyIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0dldE1wZWdMZW5ndGhGcm9tU3RyZWFtKHZvaWQqIHBDb250ZXh0KXsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoPTA7Ci0gICAgTTRPU0FfVUludDMyIG51bUJ5dGVzPTA7Ci0gICAgTTRPU0FfVUludDMyIGI9MDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTD09cENvbnRleHQpLCAwLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIC8qIHRoZSBsZW5ndGggaXMgZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzLiBUaGUgaGlnaGVzdCBiaXQgaXMgdXNlZAotICAgIHRvIGluZGljYXRlIHRoYXQgdGhlIGxlbmd0aCBjb250aW51ZXMgb24gdGhlIG5leHQgYnl0ZS4KLQotICAgIFRoZSBsZW5ndGggY2FuIGJlOiAweDgwIDB4ODAgMHg4MCAweDIyCi0gICAgb2YganVzdCAgICAgICAgICAgIDB4MjIgKGhpZ2hlc3QgYml0IG5vdCBzZXQpCi0gICAgKi8KLQotICAgIGRvIHsKLSAgICAgICAgYj1WaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cyhwQ29udGV4dCwgOCk7Ci0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQ29udGV4dCwgOCk7Ci0gICAgICAgIGxlbmd0aD0obGVuZ3RoIDw8IDcpIHwgKGIgJiAweDdmKTsKLSAgICAgICAgbnVtQnl0ZXMrKzsKLSAgICB9IHdoaWxlICgoYiAmIDB4ODApICYmIG51bUJ5dGVzIDwgNCk7Ci0KLSAgICByZXR1cm4gbGVuZ3RoOwotfQotI2VuZGlmIC8qIFZJREVPRURJVE9SX0JJVFNUUkVBTV9QQVJTRVIgKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIDNncCByZWFkZXIKLSAqIEBub3RlICAgIGFsbG9jYXRlcyB0aGUgY29udGV4dAotICoKLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgICAgICAoT1VUKSAgIHBvaW50ZXIgb24gYSByZWFkZXIgY29udGV4dAotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcENvbnRleHQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IE5VTEw7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCAsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlIGJlZ2luIik7Ci0KLSAgICAvKiBDb250ZXh0IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbiAqLwotICAgIFNBRkVfTUFMTE9DKHBDLCBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0LCAxLCAiVmlkZW9FZGl0b3IzZ3BSZWFkZXIiKTsKLQotICAgIG1lbXNldChwQywgc2l6ZW9mKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQpLCAwKTsKLQotICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1BdWRpb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tVmlkZW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICBwQy0+bUF1ZGlvU2Vla2luZyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tQXVkaW9TZWVrVGltZSA9IDA7Ci0KLSAgICBwQy0+bVZpZGVvU2Vla2luZyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tVmlkZW9TZWVrVGltZSA9IDA7Ci0KLSAgICBwQy0+bU1heER1cmF0aW9uID0gMDsKLQotICAgICpwQ29udGV4dD1wQzsKLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZSBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgZGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIDNncCByZWFkZXIKLSogQG5vdGUgYWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIHBDb250ZXh0IHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9kZXN0cm95IGJlZ2luIik7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgU0FGRV9GUkVFKHBDLT5tQXVkaW9BdS5kYXRhQWRkcmVzcyk7Ci0gICAgcEMtPm1BdWRpb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBTQUZFX0ZSRUUocEMtPm1WaWRlb0F1LmRhdGFBZGRyZXNzKTsKLSAgICBwQy0+bVZpZGVvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIFNBRkVfRlJFRShwQyk7Ci0gICAgcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Rlc3Ryb3kgbm8gZXJyb3IiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Rlc3Ryb3kgZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBvcGVuIHRoZSByZWFkZXIgYW5kIGluaXRpYWxpemVzIGl0cyBjcmVhdGVkIGluc3RhbmNlCi0qIEBub3RlICAgICB0aGlzIGZ1bmN0aW9uIG9wZW4gdGhlIG1lZGlhIGZpbGUKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBGaWxlRGVzY3JpcHRvcjogICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVkaWEgdG8gb3BlbgotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotKiBAcmV0dXJuICAgTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSBpcyBEUk0gcHJvdGVjdGVkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9vcGVuKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcikgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gc3RhcnQgIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW46IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBGaWxlRGVzY3JpcHRvciksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW46IGludmFsaWQgcG9pbnRlciBwRmlsZURlc2NyaXB0b3IiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9vcGVuIERhdGFzb3VyY2Ugc3RhcnQgJXMiLAotICAgICAgICAoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICAvL3BDLT5tRGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoKGNoYXIqKXBGaWxlRGVzY3JpcHRvcik7Ci0gICAgcEMtPm1EYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UgKChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotCi0gICAgaWYgKHBDLT5tRGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9vcGVuIERhdGFzb3VyY2UgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQy0+bUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUocEMtPm1EYXRhU291cmNlLAotICAgICAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpOwotCi0gICAgaWYgKHBDLT5tRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gZXh0cmFjdG9yIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaW50MzJfdCBpc0RSTVByb3RlY3RlZCA9IDA7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBwQy0+bUV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKLSAgICBtZXRhLT5maW5kSW50MzIoa0tleUlzRFJNLCAmaXNEUk1Qcm90ZWN0ZWQpOwotICAgIGlmIChpc0RSTVByb3RlY3RlZCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBlcnJvciAtIERSTSBQcm90ZWN0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBjbG9zZSB0aGUgcmVhZGVyCi0qIEBub3RlICAgICBjbG9zZSB0aGUgM0dQIGZpbGUKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSogQHJldHVybiAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCAqcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhICpwQXVkaW9TYnJVc2VyRGF0YTsKLSAgICBNNF9BY2Nlc3NVbml0ICpwQVU7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2UgYmVnaW4iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgaWYgKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZSBBdWRpbyIpOwotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCAhPSBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wVXNlckRhdGEpKSB7Ci0gICAgICAgICAgICBwQXVkaW9TYnJVc2VyRGF0YSA9IChNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKikoXAotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSk7Ci0KLSAgICAgICAgICAgIHBBVSA9IChNNF9BY2Nlc3NVbml0KilwQXVkaW9TYnJVc2VyRGF0YS0+bV9wRmlyc3RBVTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBBVSkgewotICAgICAgICAgICAgICAgIGZyZWUocEFVKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEF1ZGlvU2JyVXNlckRhdGEtPm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQXVkaW9TYnJVc2VyRGF0YS0+XAotICAgICAgICAgICAgICAgICAgICBtX3BBYWNEZWNvZGVyVXNlckNvbmZpZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHBBdWRpb1NiclVzZXJEYXRhKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9FU0RTSW5mb1NpemUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIC8qIEZpbmFsbHkgZGVzdHJveSB0aGUgc3RyZWFtIGhhbmRsZXIgKi8KLSAgICAgICAgZnJlZShwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBwQy0+bUF1ZGlvU291cmNlLT5zdG9wKCk7Ci0gICAgICAgIHBDLT5tQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLSAgICB9Ci0gICAgaWYgKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZSBWaWRlbyAiKTsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgZnJlZShwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9FU0RTSW5mb1NpemUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmluYWxseSBkZXN0cm95IHRoZSBzdHJlYW0gaGFuZGxlciAqLwotICAgICAgICBmcmVlKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIHBDLT5tVmlkZW9Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgIH0KLSAgICBwQy0+bUV4dHJhY3Rvci5jbGVhcigpOwotICAgIHBDLT5tRGF0YVNvdXJjZS5jbGVhcigpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBnZXQgYW4gb3B0aW9uIGZyb20gdGhlIDNncCByZWFkZXIKLSogQG5vdGUgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6Ci0qCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIGdldAotKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgIChPVVQpICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdXNlcikgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotKgotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSogQHJldHVybiAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgIE00RVJSX1ZJREVPX05PVF9IMjYzICAgIE5vIHZpZGVvIHN0cmVhbSBIMjYzIGluIGZpbGUuCi0qIEByZXR1cm4gICBNNEVSUl9OT19WSURFT19TVFJFQU1fUkVUUklFVkVEX1lFVAotKiAgICAgICAgICAgRnVuY3Rpb24gM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGJlZ2luICVkIiwgb3B0aW9uSWQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uOiBpbnZhbGlkIHBvaW50ZXIgb24gdmFsdWUiKTsKLQotICAgIHN3aXRjaCAob3B0aW9uSWQpIHsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9EdXJhdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBkdXJhdGlvbiAlZCIscEMtPm1NYXhEdXJhdGlvbik7Ci0gICAgICAgICAgICAqKE00T1NBX1RpbWUqKXBWYWx1ZSA9IHBDLT5tTWF4RHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbjoKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbjogTTRSRUFERVJfa09wdGlvbklEX1ZlcnNpb24iKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9Db3B5cmlnaHQ6Ci0gICAgICAgIC8qIG5vdCB1c2VkICovCi0gICAgICAgIEFMT0dWKCI+Pj4+Pj4+ICAgTTRSRUFERVJfa09wdGlvbklEX0NvcHlyaWdodCIpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0NyZWF0aW9uVGltZToKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBNNFJFQURFUl9rT3B0aW9uSURfQ3JlYXRpb25UaW1lIik7Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBCaXRyYXRlID0gKE00T1NBX1VJbnQzMiopcFZhbHVlOwotCi0gICAgICAgICAgICBpZiAocEMtPm1NYXhEdXJhdGlvbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJUbXAgPSAoTTRPU0FfVUludDMyKXBDLT5tTWF4RHVyYXRpb247Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gKE00T1NBX1VJbnQzMikocEMtPm1GaWxlU2l6ZSAqIDgwMDAuMCAvIHBDLT5tTWF4RHVyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBiaXRyYXRlICVsZCIsICpwQml0cmF0ZSk7Ci0gICAgICAgIH0KLSAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSXzNHUF9rT3B0aW9uSURfSDI2M1Byb3BlcnRpZXM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIG5vIHZpZGVvU3RyZWFtIHJldHJpZXZlZCIpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfTk9fVklERU9fU1RSRUFNX1JFVFJJRVZFRF9ZRVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZigoTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzICE9IHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgbV9zdHJlYW1UeXBlKSB8fCAocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplIDwgNykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIERTSSBTaXplICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfVklERU9fTk9UX0gyNjM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIE1BR0lDQUwgaW4gdGhlIGRlY29kZXIgY29uZmkgSDI2MzogdGhlIDd0aCBieXRlIGlzIHRoZSBwcm9maWxlCi0gICAgICAgICAgICAgKiBudW1iZXIsIDZ0aCBieXRlIGlzIHRoZSBsZXZlbCBudW1iZXIgKi8KLSAgICAgICAgICAgICgoTTRSRUFERVJfM0dQX0gyNjNQcm9wZXJ0aWVzICopcFZhbHVlKS0+dWlQcm9maWxlID0KLSAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mb1s2XTsKLSAgICAgICAgICAgICgoTTRSRUFERVJfM0dQX0gyNjNQcm9wZXJ0aWVzICopcFZhbHVlKS0+dWlMZXZlbCA9Ci0gICAgICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm9bNV07Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSXzNHUF9rT3B0aW9uSURfXAotICAgICAgICAgICAgSDI2M1Byb3BlcnRpZXMgZW5kIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1B1cnBsZUxhYnNEcm06Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlck9wdGlvbiBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1B1cnBsZUxhYnNEcm0iKTsKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9HZXROdW1iZXJPZkF1ZGlvQXU6Ci0gICAgICAgIC8qIG5vdCB1c2VkICovCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlT3B0aW9uIE00UkVBREVSX2tPcHRpb25JRF9HZXROdW1iZXJPZkF1ZGlvQXUiKTsKLSAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mVmlkZW9BdToKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiA6R2V0TnVtYmVyT2ZWaWRlb0F1Iik7Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9HZXRNZXRhZGF0YToKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBNNFJFQURFUl9rT3B0aW9uSURfR2V0TWV0YWRhdGEiKTsKLSAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3g6Ci0gICAgICAgIC8qIHVzZWQgb25seSBmb3IgU0VNQyAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSX2tPcHRpb25JRF8zZ3BGdHlwQm94Iik7Ci0gICAgICAgIGVyciA9IE00RVJSX0JBRF9PUFRJT05fSUQ7IC8vY2hlY2sgdGhpcwotICAgICAgICBicmVhazsKLQotI2lmZGVmIE9QVElPTklEX0dFVF9ORVhUX1ZJREVPX0NUUwotICAgIGNhc2UgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9nZXROZXh0VmlkZW9DVFM6Ci0gICAgICAgIC8qIG5vdCB1c2VkICovCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb246IGdldE5leHRWaWRlb0NUUyIpOwotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00RVJSX0JBRF9PUFRJT05fSUQiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBlbmQ6IG9wdGlvbklEOiB4JXgiLCBvcHRpb25JZCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBzZXQgYW4gb3B0aW9uIG9uIHRoZSAzZ3AgcmVhZGVyCi0qIEBub3RlIE5vIG9wdGlvbiBjYW4gYmUgc2V0IHlldC4KLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0qIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgKElOKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB1c2VyKSB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKiBAcmV0dXJuICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfc2V0T3B0aW9uIGJlZ2luICVkIixvcHRpb25JZCk7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpIHsKLSAgICAgICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHI6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8TTRPU0FfT3B0aW9uSUQ+KE00UkVBREVSXzNHUF9rT3B0aW9uSURfQXVkaW9Pbmx5KToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9PcHRpb25JRD4oTTRSRUFERVJfM0dQX2tPcHRpb25JRF9WaWRlb09ubHkpOgotICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PE00T1NBX09wdGlvbklEPihNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8TTRPU0FfT3B0aW9uSUQ+KE00UkVBREVSX2tPcHRpb25JRF9NYXhNZXRhZGF0YVNpemUpOgotICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfc2V0T3B0aW9uOiByZXR1cm5zIE00RVJSX0JBRF9PUFRJT05fSUQiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb24gZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBoYW5kbGVyIHRvIHdoaWNoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjY2VzcyB1bml0IHdpbGwgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQ6ICAgIChJTi9PVVQpIHBvaW50ZXIgdG8gdGhlIGFjY2VzcyB1bml0IChhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgY2FsbGVyKSB0byBpbml0aWFsaXplCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1YyBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3QgYmVnaW4iKTsKLQotICAgIC8qIEluaXRpYWxpemUgcEFjY2Vzc1VuaXQgc3RydWN0dXJlICovCi0gICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9DVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0RUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyAgPSBNNE9TQV9OVUxMOwotICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJlYW1JRCAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJ1Y3RTaXplICAgPSBzaXplb2YoTTRfQWNjZXNzVW5pdCk7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0IGVuZCIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBqdW1wIGludG8gdGhlIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIHRpbWUKLSogQG5vdGUKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgKElOKSAgIHRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgIChJL08pSU4gIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUIHRoZSB0aW1lIHRvIHdoaWNoIHRoZSBzdHJlYW0gcmVhbGx5IGp1bXBlZAotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRPU0FfSW50MzIqIHBUaW1lKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQ7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFRpbWUgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcCBiZWdpbiIpOwotCi0gICAgaWYgKCpwVGltZSA9PSAocFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24pKSB7Ci0gICAgICAgICpwVGltZSAtPSAxOwotICAgIH0KLSAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcCB0aW1lIHVzICVsZCAiLCB0aW1lNjQpOwotCi0gICAgaWYgKChwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlciAhPSBNNE9TQV9OVUxMKSAmJgotICAgICAgICAgICAgKHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkID09IHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tQXVkaW9BdTsKLSAgICAgICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgICAgIHRpbWU2NCA9IHRpbWU2NCAqIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWNybyBzZWMgKi8KLSAgICAgICAgcEMtPm1BdWRpb1NlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQy0+bUF1ZGlvU2Vla1RpbWUgPSB0aW1lNjQ7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIEFVRElPIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0gICAgfSBlbHNlIGlmICgocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgIChwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCA9PSBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bVZpZGVvQXU7Ci0gICAgICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgICAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLQotICAgICAgICB0aW1lNjQgPSB0aW1lNjQgKiAxMDAwOyAvKiBDb252ZXJ0IHRoZSB0aW1lIGludG8gbWljcm8gc2VjICovCi0gICAgICAgIHBDLT5tVmlkZW9TZWVraW5nID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcEMtPm1WaWRlb1NlZWtUaW1lID0gdGltZTY0OwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcCBWSURFTyB0aW1lIHVzICVsZCAiLCB0aW1lNjQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIHRpbWU2NCA9IHRpbWU2NCAvIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWxsaSBzZWMgKi8KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcCB0aW1lIG1zIGJlZm9yZSBzZWVrc2V0ICVsZCAiLCB0aW1lNjQpOwotCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKXRpbWU2NDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIGVuZCIpOwotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIHJlc2V0IHRoZSBzdHJlYW0sIHRoYXQgaXMgc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkKLSogQG5vdGUKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gcmVzZXQKLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE00T1NBX1RpbWUgdGltZTY0ID0gMDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldCBiZWdpbiIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBwQXUgPSAmcEMtPm1BdWRpb0F1OwotICAgIH0gZWxzZSBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bVZpZGVvQXU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgIEdldHMgYW4gYWNjZXNzIHVuaXQgKEFVKSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlciBzb3VyY2UuCi0qIEBub3RlICAgQW4gQVUgaXMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGFtb3VudCBvZiBkYXRhIHRvIGJlIGRlY29kZWQgYnkgZGVjb2RlcgotKgotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgKElOKSBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSogQHBhcmFtICAgIHBBY2Nlc3NVbml0ICAgICAoSU8pIFBvaW50ZXIgdG8gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YQotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKiBAcmV0dXJucyAgTTRFUlJfQUxMT0MgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICBNNFdBUl9OT19NT1JFX0FVICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQz0oVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgaW50NjRfdCB0ZW1wVGltZTY0ID0gMDsKLSAgICBNZWRpYUJ1ZmZlciAqbU1lZGlhQnVmZmVyID0gTlVMTDsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICBNNE9TQV9Cb29sIGZsYWcgPSBNNE9TQV9GQUxTRTsKLSAgICBzdGF0dXNfdCBlcnJvcjsKLSAgICBpbnQzMl90IGkzMlRtcCA9IDA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwQz09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXU6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGJlZ2luIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgYXVkaW8gc3RyZWFtIik7Ci0gICAgICAgIHBBdSA9ICZwQy0+bUF1ZGlvQXU7Ci0gICAgICAgIGlmIChwQy0+bUF1ZGlvU2Vla2luZyA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGF1ZGlvIHNlZWsgdGltZTogJWxkIiwKLSAgICAgICAgICAgICAgICBwQy0+bUF1ZGlvU2Vla1RpbWUpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8ocEMtPm1BdWRpb1NlZWtUaW1lKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9Tb3VyY2UtPnJlYWQoJm1NZWRpYUJ1ZmZlciwgJm9wdGlvbnMpOwotCi0gICAgICAgICAgICBtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsCi0gICAgICAgICAgICAgICAgKGludDY0X3QqKSZ0ZW1wVGltZTY0KTsKLSAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBmbGFnID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgYXVkaW8gbm8gc2VlazoiKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9Tb3VyY2UtPnJlYWQoJm1NZWRpYUJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSB2aWRlbyBzdGVyYW0gIik7Ci0gICAgICAgIHBBdSA9ICZwQy0+bVZpZGVvQXU7Ci0gICAgICAgIGlmKHBDLT5tVmlkZW9TZWVraW5nID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIGZsYWcgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBzZWVrOiAlbGQiLHBDLT5tVmlkZW9TZWVrVGltZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhwQy0+bVZpZGVvU2Vla1RpbWUsCi0gICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBmcmVlIHRoZSBNZWRpYUJ1ZmZlciIpOwotICAgICAgICAgICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSBwQy0+bVZpZGVvU291cmNlLT5yZWFkKCZtTWVkaWFCdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiVkUzZ3BSZWFkZXJfZ2V0TmV4dEF1IE1lZGlhQnVmZmVyICV4ICwgZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgICAgICBtTWVkaWFCdWZmZXIsIGVycm9yKTsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhQnVmZmVyICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZpMzJUbXApICYmIGkzMlRtcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTWU5DIEZSQU1FIEZPVU5ELS0lZCIsIGkzMlRtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gQVVfUF9GcmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0gICAgICAgICAgICB9IHdoaWxlKHRlbXBUaW1lNjQgPCBwQy0+bVZpZGVvU2Vla1RpbWUpOwotCi0gICAgICAgICAgICBBTE9HVigiVkUzZ3BSZWFkZXJfZ2V0TmV4dEF1OiB2aWRlbyAgdGltZSB3aXRoIHNlZWsgID0gJWxsZDoiLAotICAgICAgICAgICAgICAgIHRlbXBUaW1lNjQpOwotICAgICAgICAgICAgcEMtPm1WaWRlb1NlZWtpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgdmlkZW8gbm8gc2VlazoiKTsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9Tb3VyY2UtPnJlYWQoJm1NZWRpYUJ1ZmZlciwgJm9wdGlvbnMpOwotCi0gICAgICAgICAgICBpZihtTWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAmaTMyVG1wKSAmJiBpMzJUbXApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlNZTkMgRlJBTUUgRk9VTkQtLSVkIiwgaTMyVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IEFVX1BfRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAgICAgKGludDY0X3QqKSZ0ZW1wVGltZTY0KTsKLSAgICAgICAgICAgICAgICBBTE9HVigiVkUzZ3BSZWFkZXJfZ2V0TmV4dEF1OiB2aWRlbyBubyBzZWVrIHRpbWUgPSAlbGxkOiIsCi0gICAgICAgICAgICAgICAgICAgIHRlbXBUaW1lNjQpOwotICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXU6dmlkZW8gbm8gc2VlayB0aW1lIGJ1ZmZlciBpcyBOVUxMIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IE00RVJSX1BBUkFNRVRFUiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBpZiggKHBBdS0+ZGF0YUFkZHJlc3MgPT0gTlVMTCkgfHwgIChwQXUtPnNpemUgPCBcCi0gICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKSkgewotICAgICAgICAgICAgaWYocEF1LT5kYXRhQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZSgoTTRPU0FfSW50MzIqKXBBdS0+ZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkJ1ZmZlciBsZW5naHQgPSAlZCAsJWQiLChtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpICtcCi0gICAgICAgICAgICAgICAgMykgJiB+MHgzLChtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKSk7Ci0KLSAgICAgICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSAoTTRPU0FfSW50MzIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAobU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDMpICYgfjB4MyxNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikicEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MiICk7Ci0gICAgICAgICAgICBpZihwQXUtPmRhdGFBZGRyZXNzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IG1hbGxvYyBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5zaXplID0gbU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQXUtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKikoKGNvbnN0IGNoYXIgKiltTWVkaWFCdWZmZXItPmRhdGEoKSArIG1NZWRpYUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICAgICAgaWYoIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpICAmJgotICAgICAgICAgICAgKHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgPT0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YykgKSB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSA9IG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgICAgICBNNE9TQV9VSW50OCAqbGJ1ZmZlcjsKLQotICAgICAgICAgICAgbGJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKSBwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgQUxPR1YoInBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzIHNpemUgPSAleCIsc2l6ZSk7Ci0KLSAgICAgICAgICAgIGxidWZmZXJbMF0gPSAoc2l6ZSA+PiAyNCkgJiAweEZGOwotICAgICAgICAgICAgbGJ1ZmZlclsxXSA9IChzaXplID4+IDE2KSAmIDB4RkY7Ci0gICAgICAgICAgICBsYnVmZmVyWzJdID0gKHNpemUgPj4gOCkgJiAweEZGOwotICAgICAgICAgICAgbGJ1ZmZlclszXSA9IChzaXplKSAmIDB4RkY7Ci0gICAgICAgIH0KLQotICAgICAgICBwQXUtPkNUUyA9IHRlbXBUaW1lNjQ7Ci0KLSAgICAgICAgcEF1LT5DVFMgPSBwQXUtPkNUUyAvIDEwMDA7IC8vY29udmVydGluZyB0aGUgbWljcm9zZWMgdG8gbWlsbGlzZWMKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBDVFMgPSAlbGQiLHBBdS0+Q1RTKTsKLQotICAgICAgICBwQXUtPkRUUyAgPSBwQXUtPkNUUzsKLSAgICAgICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBNNFNZU19rRnJhZ0F0dHJPazsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWFCdWZmZXItPnJlbGVhc2UoKTsKLQotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9JbnQ4KikgcEF1LT5kYXRhQWRkcmVzczsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSA9IHBBdS0+c2l6ZTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSA9IHBBdS0+c2l6ZTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fQ1RTID0gcEF1LT5DVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0RUUyA9IHBBdS0+RFRTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPSBwQXUtPmF0dHJpYnV0ZTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXU6IE00V0FSX05PX01PUkVfQVUgKEVPUykgcmVhY2hlZCIpOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gMDsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9Ci0gICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotCi0gICAgcEF1LT5uYkZyYWcgPSAwOwotICAgIG1NZWRpYUJ1ZmZlciA9IE5VTEw7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBlbmQgIik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgU3BsaXQgdGhlIEFWQyBEU0kgaW4gaXRzIGRpZmZlcmVudCBjb21wb25lbnRzIGFuZCB3cml0ZSBpdCBpbgotICogICAgICAgICAgT05FIG1lbW9yeSBidWZmZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogICAgICAgICAoSU4vT1VUKSBUaGUgTVBFRzQtQVZDIHN0cmVhbQotICogQHBhcmFtICAgcERlY29kZXJDb25maWdMb2NhbDogICAgKElOKSBUaGUgRFNJIGJ1ZmZlcgotICogQHBhcmFtICAgZGVjb2RlckNvbmZpZ1NpemVMb2NhbDogKElOKSBUaGUgRFNJIGJ1ZmZlciBzaXplCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgRVJSX0ZJTEVfU1lOVEFYX0VSUk9SICAgcERlY29kZXJDb25maWdMb2NhbCBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQW5hbHlzZUF2Y0RzaSgKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00T1NBX0ludDMyKiBwRGVjb2RlckNvbmZpZ0xvY2FsLAotICAgICAgICBNNE9TQV9JbnQzMiBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsKSB7Ci0gICAgc3RydWN0IF9hdmNTcGVjaWZpY0luZm8gKnBBdmNTcGVjSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHVpU3BlY0luZm9TaXplOwotICAgIE00T1NBX0NvbnRleHQgcEJpdFBhcnNlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX01lbUFkZHI4IHBQb3M7Ci0KLSAgICAvKioKLSAgICAgKiBGaXJzdCBwYXJzaW5nIHRvIGdldCB0aGUgdG90YWwgYWxsb2NhdGlvbiBzaXplICh3ZSBtdXN0IG5vdCBkbwotICAgICAqIG11bHRpcGxlIG1hbGxvYywgYnV0IG9ubHkgb25lIGluc3RlYWQpICovCi0gICAgewotICAgICAgICBNNE9TQV9JbnQzMiB2YWw7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBpLGo7Ci0gICAgICAgIE00T1NBX1VJbnQ4IG5hbFVuaXRMZW5ndGg7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsKLSAgICAgICAgTTRPU0FfVUludDMyIHVpVG90YWxTaXplT2ZTUFMgPSAwOwotICAgICAgICBNNE9TQV9VSW50OCAgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsKLSAgICAgICAgTTRPU0FfVUludDMyIHVpVG90YWxTaXplT2ZQUFMgPSAwOwotICAgICAgICBNNE9TQV9VSW50MzIgdWlTaXplOwotICAgICAgICBzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbyBhdmNTcElmOwotCi0gICAgICAgIGF2Y1NwSWYubV9uYWxVbml0TGVuZ3RoID0gMDsKLQotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRGVjb2RlckNvbmZpZ0xvY2FsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSM0dQX0RFQ09ERVJfQ09ORklHX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfTVBFRzRCaXRTdHJlYW1QYXJzZXJJbml0KCZwQml0UGFyc2VyQ29udGV4dCwKLSAgICAgICAgICAgIHBEZWNvZGVyQ29uZmlnTG9jYWwsIGRlY29kZXJDb25maWdTaXplTG9jYWwpOwotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBCaXRQYXJzZXJDb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCBiaXRzIC0tIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCBiaXRzIC0tIGF2YyBwcm9maWxlIGluZGljYXRpb24qLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCBiaXRzIC0tIHByb2ZpbGUgY29tcGF0aWJpbGl0eSAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCBiaXRzIC0tIGF2YyBsZXZlbCBpbmRpY2F0aW9uKi8KLSAgICAgICAgdmFsPVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgLyogNiBiaXRzIHJlc2VydmVkIDExMTExMWIgMiBiaXRzIGxlbmd0aCBTaXplIG1pbnVzIG9uZSovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtX25hbFVuaXRMZW5ndGggKi8KLQotICAgICAgICBuYWxVbml0TGVuZ3RoID0gKE00T1NBX1VJbnQ4KSgodmFsICYgMHgwMykgKyAxKTsvKjBiMTExMTExMDAqLwotICAgICAgICBpZiAobmFsVW5pdExlbmd0aCA+IDQpIHsKLSAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTUFMgdGFibGUgKi8KLSAgICAgICAgICAgIHZhbD1WaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cyhwQml0UGFyc2VyQ29udGV4dCwKLSAgICAgICAgICAgIDgpOy8qIDMgYml0cy1yZXNlcnZlZCAxMTFiLTUgYml0cyBudW1iZXIgb2Ygc2VxdWVuY2UgcGFyYW1ldGVyIHNldCovCi0gICAgICAgICAgICBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0cyA9IHZhbCAmIDB4MUY7Ci0gICAgICAgICAgICAvKjFGIGluc3RlYWQgb2YgRTAqLyAvKjBiMTExMDAwMDAqLyAvKk51bWJlciBvZiBzZXEgcGFyYW1ldGVyIHNldHMqLwotICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHM7IGkrKykgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGlzIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICB1aVNpemUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgMTYpOwotICAgICAgICAgICAgICAgIHVpVG90YWxTaXplT2ZTUFMgKz0gdWlTaXplOwotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKlJlYWQgdGhlIGVsZW1lbnQoZG9udCBrZWVwIGl0LCB3ZSBvbmx5IHdhbnQgc2l6ZSByaWdodCBub3cpICovCi0gICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8dWlTaXplOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTUFMgdGFibGUgKi8KLSAgICAgICAgICAgIG51bU9mUGljdHVyZVBhcmFtZXRlclNldHM9KE00T1NBX1VJbnQ4KVwKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cyhwQml0UGFyc2VyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgOCk7Ci0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhpcyBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgdWlTaXplID0gKE00T1NBX1VJbnQzMikKLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICAgICAgdWlUb3RhbFNpemVPZlBQUyArPSB1aVNpemU7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgMTYpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqUmVhZCB0aGUgZWxlbWVudChkb250IGtlZXAgaXQsd2Ugb25seSB3YW50IHNpemUgcmlnaHQgbm93KSovCi0gICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8dWlTaXplOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBmdWxsIGJ1ZmZlciAqLwotICAgICAgICAgICAgdWlTcGVjSW5mb1NpemUgPSBzaXplb2Yoc3RydWN0IF9hdmNTcGVjaWZpY0luZm8pICsKLSAgICAgICAgICAgICAgICAgICAgIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzICogc2l6ZW9mKHN0cnVjdCBfcGFyYW1ldGVyU2V0KQotICAgICAgICAgICAgICAgICAgICAgKyAvKio8IHNpemUgb2YgdGhlIHRhYmxlIG9mIFNQUyBlbGVtZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0cyAgKiBzaXplb2Yoc3RydWN0IF9wYXJhbWV0ZXJTZXQpCi0gICAgICAgICAgICAgICAgICAgICArIC8qKjwgc2l6ZSBvZiB0aGUgdGFibGUgb2YgUFBTIGVsZW1lbnRzICovCi0gICAgICAgICAgICAgICAgICAgICB1aVRvdGFsU2l6ZU9mU1BTICsKLSAgICAgICAgICAgICAgICAgICAgIHVpVG90YWxTaXplT2ZQUFM7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mbyA9KHN0cnVjdCBfYXZjU3BlY2lmaWNJbmZvKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2ModWlTcGVjSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIk1QRUctNCBBVkMgRGVjb2RlclNwZWNpZmljIik7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXZjU3BlY0luZm8pIHsKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDbGVhblVwKHBCaXRQYXJzZXJDb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogU2V0IHRoZSBwb2ludGVycyB0byB0aGUgY29ycmVjdCBwYXJ0IG9mIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9uYWxVbml0TGVuZ3RoID0gbmFsVW5pdExlbmd0aDsKLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9udW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0cyA9Ci0gICAgICAgICAgICAgICAgbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHM7Ci0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0cyAgPQotICAgICAgICAgICAgICAgIG51bU9mUGljdHVyZVBhcmFtZXRlclNldHM7Ci0KLSAgICAgICAgICAgIC8qIFdlIHBsYWNlIHRoZSBTUFMgcGFyYW0gc2V0cyB0YWJsZSBhZnRlciBtX3BQaWN0dXJlUGFyYW1ldGVyU2V0ICovCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFNlcXVlbmNlUGFyYW1ldGVyU2V0PSAoc3RydWN0IF9wYXJhbWV0ZXJTZXQqKSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKCZwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQpICsKLSAgICAgICAgICAgICAgICBzaXplb2YocEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0KSk7Ci0gICAgICAgICAgICAvKldlIHBsYWNlIHRoZSBQUFMgcGFyYW0gc2V0cyB0YWJsZSBhZnRlciB0aGUgU1BTIHBhcmFtIHNldHMgdGFibGUqLwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0ID0gKHN0cnVjdCBfcGFyYW1ldGVyU2V0KikoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KShwQXZjU3BlY0luZm8tPm1fcFNlcXVlbmNlUGFyYW1ldGVyU2V0KSArCi0gICAgICAgICAgICAgICAgKG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzICogc2l6ZW9mKHN0cnVjdCBfcGFyYW1ldGVyU2V0KSkpOwotICAgICAgICAgICAgLyoqPCBUaGUgZGF0YSB3aWxsIGJlIHBsYWNlZCBhZnRlciB0aGUgUFBTIHBhcmFtIHNldHMgdGFibGUgKi8KLSAgICAgICAgICAgIHBQb3MgPSAoTTRPU0FfTWVtQWRkcjgpcEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0ICsKLSAgICAgICAgICAgICAgICAobnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0cyAqIHNpemVvZihzdHJ1Y3QgX3BhcmFtZXRlclNldCkpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIHJlc2V0IHRoZSBiaXQgcGFyc2VyICovCi0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDbGVhblVwKHBCaXRQYXJzZXJDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlY29uZCBwYXJzaW5nIHRvIGNvcHkgdGhlIGRhdGEgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQXZjU3BlY0luZm8pIHsKLSAgICAgICAgTTRPU0FfSW50MzIgaSxqOwotCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX01QRUc0Qml0U3RyZWFtUGFyc2VySW5pdCgmcEJpdFBhcnNlckNvbnRleHQsCi0gICAgICAgICAgICBwRGVjb2RlckNvbmZpZ0xvY2FsLCBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsKTsKLQotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQml0UGFyc2VyQ29udGV4dCkgewotICAgICAgICAgICAgZnJlZShwQXZjU3BlY0luZm8pOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIC8qIDggYml0cyAtLSBjb25maWd1cmF0aW9uIHZlcnNpb24gKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIC8qIDggYml0cyAtLSBhdmMgcHJvZmlsZSBpbmRpY2F0aW9uKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIC8qIDggYml0cyAtLSBwcm9maWxlIGNvbXBhdGliaWxpdHkgKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIC8qIDggYml0cyAtLSBhdmMgbGV2ZWwgaW5kaWNhdGlvbiovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAvKiBtX25hbFVuaXRMZW5ndGggKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgLyogMyBiaXRzIC0tIHJlc2VydmVkIDExMWIgLS0gNSBiaXRzIG51bWJlciBvZiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ki8KLQotICAgICAgICBmb3IgKGk9MDsgaSA8IHBBdmNTcGVjSW5mby0+bV9udW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsgaSsrKSB7Ci0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFNlcXVlbmNlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsMTYpOwotCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFNlcXVlbmNlUGFyYW1ldGVyU2V0W2ldLm1fcFBhcmFtZXRlclNldFVuaXQgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopcFBvczsgIC8qKjwgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBwUG9zICs9IHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9sZW5ndGg7Ci0gICAgICAgICAgICAgICAgLyoqPCBpbmNyZW1lbnQgdGhlIHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgIGZvciAoaj0wOyBqPHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9sZW5ndGg7aisrKXsKLSAgICAgICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFNlcXVlbmNlUGFyYW1ldGVyU2V0W2ldLm1fcFBhcmFtZXRlclNldFVuaXRbal09Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIC8qIG51bWJlciBvZiBww65jdHVyZSBwYXJhbWV0ZXIgc2V0Ki8KLQotICAgICAgICBmb3IgKGk9MDsgaSA8IHBBdmNTcGVjSW5mby0+bV9udW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzOyBpKyspIHsKLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgMTYpOwotICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LDE2KTsKLQotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fcFBhcmFtZXRlclNldFVuaXQgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopcFBvczsgICAvKio8IGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgcFBvcyArPSBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9sZW5ndGg7Ci0gICAgICAgICAgICAgICAgLyoqPCBpbmNyZW1lbnQgdGhlIHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgIGZvciAoaj0wOyBqPHBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fcFBhcmFtZXRlclNldFVuaXRbal0gPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDbGVhblVwKHBCaXRQYXJzZXJDb250ZXh0KTsKLSAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSB1aVNwZWNJbmZvU2l6ZTsKLSAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSAoTTRPU0FfVUludDgqKXBBdmNTcGVjSW5mbzsKLSAgICB9Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplICA9ICBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyAgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgZGVjb2RlckNvbmZpZ1NpemVMb2NhbCwgTTRSRUFERVJfM0dQLAotICAgICAgICAoTTRPU0FfQ2hhciopIk1QRUctNCBBVkMgRGVjb2RlclNwZWNpZmljIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBtZW1jcHkoKHZvaWQgKiApIHBTdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgKHZvaWQgKiApcERlY29kZXJDb25maWdMb2NhbCwKLSAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLWNsZWFudXA6Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcChwQml0UGFyc2VyQ29udGV4dCk7Ci0gICAgcmV0dXJuIE00RVJSX1JFQURFUjNHUF9ERUNPREVSX0NPTkZJR19FUlJPUjsKLX0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIEdldCB0aGUgbmV4dCBzdHJlYW0gZm91bmQgaW4gdGhlIDNncCBmaWxlCi0qIEBub3RlCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogT1VUKSAgIHBvaW50ZXIgdG8gYSB1c2VyIGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsIGJlIGZpbGxlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgbWVkaWEgZmFtaWx5IG9mIHRoZSBmb3VuZCBzdHJlYW0KLSogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOihPVVQpIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciB0aGF0IHdpbGwgYmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZmlsbGVkIHdpdGggdGhlIGZvdW5kIHN0cmVhbSBkZXNjcmlwdGlvbgotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSogQHJldHVybiAgIE00V0FSX05PX01PUkVfU1RSRUFNICAgIG5vIG1vcmUgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgbWVkaWEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgKnBNZWRpYUZhbWlseSwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEM9KFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcEF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqIHBWaWRlb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRPU0FfSW50OCAqRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50MzIgZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPTAsIG1heEFVU2l6ZSA9IDA7Ci0KLSAgICBNNF9TdHJlYW1UeXBlIHN0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVVbmtub3duOwotICAgIE00T1NBX1VJbnQ4IHRlbXAsIGksIHRyYWNrQ291bnQ7Ci0gICAgTTRPU0FfQm9vbCBoYXZlQXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGhhdmVWaWRlbyA9IE00T1NBX0ZBTFNFOwotICAgIHNwPE1ldGFEYXRhPiBtZXRhICA9IE5VTEw7Ci0gICAgaW50NjRfdCBEdXJhdGlvbiA9IDA7Ci0gICAgTTRPU0FfVUludDgqIERlY29kZXJTcGVjaWZpYyA9IE00T1NBX05VTEwgOwotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBjb25zdCB2b2lkICpjb2RlY19zcGVjaWZpY19kYXRhOwotICAgIHNpemVfdCBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7Ci0gICAgTTRPU0FfSW50MzIgIHB0ZW1wVGltZTsKLSAgICBNNE9TQV9JbnQzMiAgYXZnRlBTPTA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgYmVnaW4iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBNZWRpYUZhbWlseSAgID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJnZXROZXh0U3RyZWFtSGFuZGxlcjogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhRmFtaWx5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0KLSAgICB0cmFja0NvdW50ID0gcEMtPm1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgdGVtcCA9IHBDLT5tQ3VyclRyYWNrOwotCi0gICAgaWYodGVtcCA+PSB0cmFja0NvdW50KSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBlcnJvciA9ICVkIiwKLSAgICAgICAgICAgIE00V0FSX05PX01PUkVfU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuIChNNFdBUl9OT19NT1JFX1NUUkVBTSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgbWV0YSA9IHBDLT5tRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKHRlbXApOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICAgICAgaWYgKCFoYXZlVmlkZW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewotICAgICAgICAgICAgcEMtPm1WaWRlb1NvdXJjZSA9IHBDLT5tRXh0cmFjdG9yLT5nZXRUcmFjayh0ZW1wKTsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICAgICAgICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbzsKLSAgICAgICAgICAgIGhhdmVWaWRlbyA9IHRydWU7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgZ2V0VHJhY2sgY2FsbGVkIik7Ci0gICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKSkgewotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSkgewotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJHZXROZXh0U3RyZWFtSGFuZGxlciBzdHJlYW1UeXBlTk9ORSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyOiBzdHJlYW0gdHlwZTogJWQgIiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgaWYoc3RyZWFtVHlwZSAhPSBNNERBX1N0cmVhbVR5cGVVbmtub3duKSB7Ci0gICAgICAgICAgICAgICAgcEMtPm1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICBwQy0+bVN0cmVhbUlkID0gcEMtPm1DdXJyVHJhY2s7Ci0KLSAgICAgICAgICAgICAgICBwVmlkZW9TdHJlYW1IYW5kbGVyID0gKE00X1ZpZGVvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jCi0gICAgICAgICAgICAgICAgICAgIChzaXplb2YoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKSwgTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00X1ZpZGVvU3RyZWFtSGFuZGxlciIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBWaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3N0cnVjdFNpemU9c2l6ZW9mKE00X1ZpZGVvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJihwVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3ZpZGVvV2lkdGgpKTsKLSAgICAgICAgICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgKGludDMyX3QqKSYocFZpZGVvU3RyZWFtSGFuZGxlci0+bV92aWRlb0hlaWdodCkpOwotCi0gICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlcikgID0gKE00X1N0cmVhbUhhbmRsZXIqKShwVmlkZW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAoaW50NjRfdCopJihEdXJhdGlvbikpOwotICAgICAgICAgICAgICAgICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kdXJhdGlvbikgPSAoaW50MzJfdCkoKER1cmF0aW9uKS8xMDAwKTsgLy8gY29udmVyc2lvbiB0byBtUwotICAgICAgICAgICAgICAgIHBDLT5tTWF4RHVyYXRpb24gPSAoKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChwQy0+bU1heER1cmF0aW9uID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIHRvbyBzaG9ydDogJWxsZCBVcyIsIER1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBWaWRlb1N0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgbV9kdXJhdGlvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKTsKLQotICAgICAgICAgICAgICAgIG9mZjY0X3QgZmlsZVNpemUgPSAwOwotICAgICAgICAgICAgICAgIHBDLT5tRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmZmlsZVNpemUpOwotICAgICAgICAgICAgICAgIHBDLT5tRmlsZVNpemUgID0gZmlsZVNpemU7Ci0KLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgbV9maWxlU2l6ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tRmlsZVNpemUpOwotCi0gICAgICAgICAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsIChpbnQzMl90KikmKG1heEFVU2l6ZSkpOwotICAgICAgICAgICAgICAgIGlmKG1heEFVU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heEFVU2l6ZSA9IDcwMDAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9tYXhBVVNpemUgPSBtYXhBVVNpemU7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIjw8PDw8PDw8PDwgICB2aWRlbzogbU1heEFVU2l6ZSBmcm9tIE1QNCBleHRyYWN0b3I6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fbWF4QVVTaXplKTsKLQotICAgICAgICAgICAgICAgICgoTTRfU3RyZWFtSGFuZGxlciopcFZpZGVvU3RyZWFtSGFuZGxlciktPm1fYXZlcmFnZUJpdFJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5tRmlsZVNpemUgKiA4MDAwKS9wQy0+bU1heER1cmF0aW9uOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBtX2F2ZXJhZ2VCaXRyYXRlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwVmlkZW9TdHJlYW1IYW5kbGVyKS0+bV9hdmVyYWdlQml0UmF0ZSk7Ci0KLQotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVSYXRlLAotICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJihhdmdGUFMpKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiPDw8PDw8PDw8PCAgIHZpZGVvOiBBdmVyYWdlIEZQUyBmcm9tIE1QNCBleHRyYWN0b3I6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgYXZnRlBTKTsKLQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZSA9KE00T1NBX0Zsb2F0KSBhdmdGUFM7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIjw8PDw8PDw8PDwgICB2aWRlbzogQXZlcmFnZSBGUFMgZnJvbSBNUDQgZXh0cmFjdG9yIGluIEZMT0FUOiAlZiIsCi0gICAgICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHZpZGVvIHJvdGF0aW9uIGRlZ3JlZQotICAgICAgICAgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWU7Ci0gICAgICAgICAgICAgICAgaWYoIW1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcm90YXRpb25EZWdyZWUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwVmlkZW9TdHJlYW1IYW5kbGVyLT52aWRlb1JvdGF0aW9uRGVncmVlcyA9IHJvdGF0aW9uRGVncmVlOwotCi0gICAgICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopKHBWaWRlb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgLyogR2V0IHRoZSBEU0kgaW5mbyAqLwotICAgICAgICAgICAgICAgIGlmKE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyA9PSBzdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsKE00T1NBX0NoYXIqKSJIMjYzIERTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKURlY29kZXJTcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilkYXRhLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZFX2dldE5leHRTdHJlYW1IYW5kbGVyOiBIMjYzIGRzaSBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgPT0gc3RyZWFtVHlwZSkgewotICAgICAgICAgICAgICAgICAgICBpZihtZXRhLT5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljSW5mbyA9IChNNE9TQV9JbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm9TaXplLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiSDI2NCBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BfZ2V0TmV4dFN0cmVhbSBpcyBOVUxMICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKURlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopZGF0YSwgZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRFNJIFNpemUgJWQiLCBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9BbmFseXNlQXZjRHNpKCpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKilEZWNvZGVyU3BlY2lmaWNJbmZvLCBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJkZWNzaXplICVkLCBoMjY0ZGVjc2l6ZSAlZDogJWQiLCAoKnBTdHJlYW1IYW5kbGVyKS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwgKCpwU3RyZWFtSGFuZGxlciktPlwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9OVUxMICE9IERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQgPT0gc3RyZWFtVHlwZSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXNkcy5Jbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplID0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IChNNE9TQV9VSW50OCopXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwgKE00T1NBX0NoYXIqKSJNNFYgRGVjb2RlclNwZWNpZmljIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKCpwU3RyZWFtSGFuZGxlciktPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BFU0RTSW5mbywgKHZvaWQgKilkYXRhLCBzaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygmY29kZWNfc3BlY2lmaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWRSBNUDQgZHNpc2l6ZTogJWQsICV4IiwgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwgKE00T1NBX0NoYXIqKSIgRGVjb2RlclNwZWNpZmljIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKURlY29kZXJTcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtIE5PIHZpZGVvIHN0cmVhbSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW0gTk8gdmlkZW8gc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAoIWhhdmVBdWRpbyAmJiAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbSBhdWRpbyBnZXRUcmFjayBjYWxsZWQiKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9Tb3VyY2UgPSBwQy0+bUV4dHJhY3Rvci0+Z2V0VHJhY2socEMtPm1DdXJyVHJhY2spOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS0+c3RhcnQoKTsKLSAgICAgICAgICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbzsKLQotICAgICAgICAgICAgaWYoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKSkgewotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKSkgewotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhIHN0cmVhbXR5cGUgVW5rbm93biAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHN0cmVhbVR5cGUgIT0gTTREQV9TdHJlYW1UeXBlVW5rbm93bikgewotICAgICAgICAgICAgICAgIHBDLT5tU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgICAgICAgICAgcEMtPm1TdHJlYW1JZCA9IHBDLT5tQ3VyclRyYWNrOwotCi0gICAgICAgICAgICAgICAgQUxPR1YoIlZFIHN0cmVhbXR5cGUgJWQgLGlkICVkIiwgIHN0cmVhbVR5cGUsIHBDLT5tQ3VyclRyYWNrKTsKLQotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXIgPSAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MKLSAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRfQXVkaW9TdHJlYW1IYW5kbGVyIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplICAgPSAwOwotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeT0gMDsKLSAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCAgPSAwOwotCi0gICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlcikgPSAoTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyID0KLSAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKShwQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9hdmVyYWdlQml0UmF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlcj0oTTRfU3RyZWFtSGFuZGxlciopcEF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgKGludDMyX3QqKSYobWF4QVVTaXplKSk7Ci0gICAgICAgICAgICAgICAgaWYobWF4QVVTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4QVVTaXplID0gNzAwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX21heEFVU2l6ZSA9IG1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBBTE9HVigiVkUgQXVkaW8gbU1heEFVU2l6ZSBmcm9tIE1QNCBleHRyYWN0b3I6ICVkIiwgbWF4QVVTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQgPT0gc3RyZWFtVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJXaWRlQmFuZCA9PSBzdHJlYW1UeXBlKSkgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmcmVxSW5kZXggPSAwOyAvKio8IEFNUiBOQiAqLwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBtb2RlU2V0OwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEJpdFBhcnNlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgaWYoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJXaWRlQmFuZCA9PSBzdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZXFJbmRleCA9IDE7IC8qKjwgQU1SIFdCICovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXNkcy5Jbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgICAgICAgICBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZjb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIkFNUiBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUNoYXIgQW1yRHNpW10gPQotICAgICAgICAgICAgICAgICAgICAgICAgeydQJywnSCcsJ0wnLCdQJywweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAxLH07Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gOTsKLSAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwgKE00T1NBX0NoYXIqKSJQSExQIERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJlcUluZGV4ID09MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQW1yRHNpWzhdID0gMHgwMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFtckRzaVs4XSA9IDB4MDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpPCA5OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpY1tpXSA9IEFtckRzaVtpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IERlY29kZXJTcGVjaWZpYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fYXZlcmFnZUJpdFJhdGUgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9BbXJCaXRSYXRlW2ZyZXFJbmRleF1bN107Ci0gICAgICAgICAgICB9IGVsc2UgaWYoKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IHN0cmVhbVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXNkcy5Jbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8gPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSwgTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJBQUMgRGVjb2RlclNwZWNpZmljIiApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8sCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVkVkc2kgJWQsJXgiLGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGEpOwotCi0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwgKE00T1NBX0NoYXIqKSJBQUMgRGVjb2RlclNwZWNpZmljIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopY29kZWNfc3BlY2lmaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW0gbVN0cmVhbVR5cGU6IG5vbmUgIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlZFIG5vYXVkaW8tdmlkZW8gc3RyZWFtOnBDLT5tQ3VyclRyYWNrID0gJWQgIixwQy0+bUN1cnJUcmFjayk7Ci0gICAgICAgICAgICBwQy0+bUN1cnJUcmFjaysrOyAvL0luY3JlbWVudCBjdXJyZW50IHRyYWNrIHRvIGdldCB0aGUgbmV4dCB0cmFjawotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJWRSBTdHJlYW1UeXBlOiAlZCwgc3RyZW1oYW5kbGVyICV4IixzdHJlYW1UeXBlLCAqcFN0cmVhbUhhbmRsZXIgKTsKLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fc3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3N0cmVhbUlkICAgPSBwQy0+bVN0cmVhbUlkOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wVXNlckRhdGEgID0gTTRPU0FfTlVMTDsKLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgICAgICAoaW50NjRfdCopJihEdXJhdGlvbikpOwotCi0gICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uID0gKGludDMyX3QpKER1cmF0aW9uIC8gMTAwMCk7Ci0KLSAgICAgICAgcEMtPm1NYXhEdXJhdGlvbiA9ICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kdXJhdGlvbik7Ci0gICAgICAgIEFMT0dWKCJWRSBzdHIgZHVyYXRpb24gZHVyYXRpb246ICVkICIsICgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKTsKLQotICAgICAgICAvKiBJbiBBQUMgY2FzZTogUHV0IHRoZSBmaXJzdCBBVSBpbiBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YQotICAgICAgICAgKnNpbmNlIGRlY29kZXIgaGFzIHRvIGtub3cgaWYgc3RyZWFtIGNvbnRhaW5zIFNCUiBkYXRhKEltcGxpY2l0IHNpZykgKi8KLSAgICAgICAgaWYoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gKCpwU3RyZWFtSGFuZGxlciktPm1fc3RyZWFtVHlwZSkgewotICAgICAgICAgICAgTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSogIHBBdWRpb1NiclVzZXJkYXRhOwotCi0gICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YSA9IChNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEpLE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEiKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdWRpb1NiclVzZXJkYXRhKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BVc2VyRGF0YSA9IHBBdWRpb1NiclVzZXJkYXRhOwotICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fYklzU2JyRW5hYmxlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wRmlyc3RBVSA9IChNNF9BY2Nlc3NVbml0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpLE00UkVBREVSXzNHUCwgKE00T1NBX0NoYXIqKSIxc3QgQUFDIEFVIik7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wRmlyc3RBVSkgewotICAgICAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhLT5tX3BBYWNEZWNvZGVyVXNlckNvbmZpZyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhLT5tX3BBYWNEZWNvZGVyVXNlckNvbmZpZyA9IChNNF9BYWNEZWNvZGVyQ29uZmlnKilcCi0gICAgICAgICAgICAgICAgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BYWNEZWNvZGVyQ29uZmlnKSxNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJtX3BBYWNEZWNvZGVyVXNlckNvbmZpZyIpOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBBdWRpb1N0cmVhbUhhbmRsZXIgPQotICAgICAgICAgICAgICAgIChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKSgqcFN0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSogcFVzZXJEYXRhID0gKE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqKVwKLSAgICAgICAgICAgICAgICAocEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9wVXNlckRhdGEpOwotCi0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3QocEMsICgqcFN0cmVhbUhhbmRsZXIpLAotICAgICAgICAgICAgICAgIChNNF9BY2Nlc3NVbml0KilwVXNlckRhdGEtPm1fcEZpcnN0QVUpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdShwQywgKCpwU3RyZWFtSGFuZGxlciksCi0gICAgICAgICAgICAgICAgKE00X0FjY2Vzc1VuaXQqKXBVc2VyRGF0YS0+bV9wRmlyc3RBVSk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAxLiAiTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIiIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIG1vcmUKLSAgICAgICAgICAgICAqIGFjY2VzcyB1bml0IGZyb20gdGhlIGN1cnJlbnQgdHJhY2suIEluIG90aGVyIHdvcmRzLCB0aGVyZQotICAgICAgICAgICAgICogaXMgb25seSBhIHNpbmdsZSBhY2Nlc3MgdW5pdCBmcm9tIHRoZSBjdXJyZW50IHRyYWNrLCBhbmQKLSAgICAgICAgICAgICAqIHRoZSBwYXJzaW5nIG9mIHRoaXMgdHJhY2sgaGFzIHJlYWNoZWQgRU9TLiBUaGUgcmVhc29uIHdoeQotICAgICAgICAgICAgICogdGhlIGZpcnN0IGFjY2VzcyB1bml0IG5lZWRzIHRvIGJlIHBhcnNlZCBoZXJlIGlzIGJlY2F1c2UgZm9yCi0gICAgICAgICAgICAgKiBzb21lIGF1ZGlvIGNvZGVjIChsaWtlIEFBQyksIHRoZSB2ZXJ5IGZpcnN0IGFjY2VzcyB1bml0Ci0gICAgICAgICAgICAgKiBtdXN0IGJlIGRlY29kZWQgYmVmb3JlIGl0cyBjb25maWd1cmF0aW9uL2VuY29kaW5nIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAqIChzdWNoIGFzICMgb2YgY2hhbm5lbHMgYW5kIHNhbXBsZSByYXRlKSBjYW4gYmUgY29ycmVjdGx5Ci0gICAgICAgICAgICAgKiBkZXRlcm1pbmVkLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIDIuICJ0cmFja0NvdW50ID4gcEMtPm1DdXJyVHJhY2siIGluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBvdGhlcgotICAgICAgICAgICAgICogdHJhY2tzIHRvIGJlIHBhcnNlZCwgaW4gYWRkaXRpb24gdG8gdGhlIGN1cnJlbnQgdHJhY2suCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogV2hlbiBib3RoIGNvbmRpdGlvbnMgMSAmIDIgaG9sZCwgb3RoZXIgdHJhY2tzIHNob3VsZCBiZQotICAgICAgICAgICAgICogcGFyc2VkLiBUaHVzLCB3ZSBzaG91bGQgbm90IGJhaWwgb3V0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgJiYgdHJhY2tDb3VudCA+IHBDLT5tQ3VyclRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0KHBDLCAoKnBTdHJlYW1IYW5kbGVyKSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHBDLT5tQ3VyclRyYWNrKys7IC8vSW5jcmVtZW50IHRoZSBjdXJyZW50IHRyYWNrIHRvIGdldCBuZXh0IHRyYWNrCi0gICAgQUxPR1YoInBDLT5tQ3VyclRyYWNrID0gJWQiLHBDLT5tQ3VyclRyYWNrKTsKLQotICAgIGlmICghaGF2ZUF1ZGlvICYmICFoYXZlVmlkZW8pIHsKLSAgICAgICAgKnBNZWRpYUZhbWlseT1NNFJFQURFUl9rTWVkaWFGYW1pbHlVbmtub3duOwotICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgfQotRXJyb3I6Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIGVuZCBlcnJvciA9ICVkIixlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00T1NBX0ludDMyKiBwVGltZSkKLXsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0ICpwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE1lZGlhQnVmZmVyICptTWVkaWFCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgIE00T1NBX1RpbWUgdGltZTY0OwotICAgIGludDY0X3QgdGVtcFRpbWU2NCA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyb3I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgYmVnaW4iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFRpbWUgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lOiBpbnZhbGlkIHRpbWUgcG9pbnRlciIpOwotICAgIGlmICgqcFRpbWUgPT0gKHBTdHJlYW1IYW5kbGVyLT5tX2R1cmF0aW9uKSkgewotICAgICAgICAqcFRpbWUgLT0gMTsKLSAgICB9Ci0KLSAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWUgKiAxMDAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIHNlZWsgdGltZTogJWxkIix0aW1lNjQpOwotICAgIG9wdGlvbnMuc2V0U2Vla1RvKHRpbWU2NCwgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwotICAgIGVycm9yID0gcEMtPm1WaWRlb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgaWYgKGVycm9yICE9IE9LKSB7Ci0gICAgICAgIC8vQ2FuIG5vdCBnZXQgdGhlIHByZXZpb3VzIFN5bmMuCi0gICAgICAgIC8vTXVzdCBiZSBlbmQgb2Ygc3RyZWFtLgotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9Ci0KLSAgICBtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIHJlYWQgdGltZSAlbGQsICV4IiwgdGVtcFRpbWU2NCwKLSAgICAgICAgbU1lZGlhQnVmZmVyKTsKLQotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMikodGVtcFRpbWU2NCAvIDEwMDApOwotCi0gICAgaWYobU1lZGlhQnVmZmVyICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgQUxPR1YoIiBtTWVkaWFCdWZmZXIgc2l6ZSA9ICVkIGxlbmd0aCAlZCIsIG1NZWRpYUJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtTWVkaWFCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0KLSAgICBpZihlcnJvciAhPSBPSykgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgZW5kIFwKLSAgICAgICAgICAgIE00V0FSX1JFQURFUl9JTkZPUk1BVElPTl9OT1RfUFJFU0VOVCIpOwotICAgICAgICByZXR1cm4gTTRXQVJfUkVBREVSX0lORk9STUFUSU9OX05PVF9QUkVTRU5UOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBlbmQ6IGVyciAleCIsIGVycik7Ci0gICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotfQotCi1leHRlcm4gIkMiIHsKLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwTWVkaWFUeXBlLCAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmRyR2xvYmFsSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJkckRhdGFJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlIGJlZ2luIik7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSAlZCAweCV4IDB4JXgiLCAqcE1lZGlhVHlwZSwKLSAgICAgICAgKnBSZHJHbG9iYWxJbnRlcmZhY2UsKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwUmRyR2xvYmFsSW50ZXJmYWNlLCBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UiKTsKLSAgICBTQUZFX01BTExPQygqcFJkckRhdGFJbnRlcmZhY2UsIE00UkVBREVSX0RhdGFJbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UiKTsKLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZTNHUFA7Ci0KLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGUgICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGU7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RGVzdHJveSAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RPcGVuICAgICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9vcGVuOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENsb3NlICAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dFN0cmVhbSA9Ci0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEZpbGxBdVN0cnVjdCA9Ci0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdGFydCAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0b3AgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RSZXNldCAgICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRQcmV2UmFwVGltZSA9Ci0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lOwotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0QXUgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTsKLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9yZWFkZXJDb250ZXh0ICAgICAgPSBNNE9TQV9OVUxMOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFNBRkVfRlJFRSgqcFJkckdsb2JhbEludGVyZmFjZSk7Ci0gICAgICAgIFNBRkVfRlJFRSgqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotfSAgLyogZXh0ZXJuICJDIiAqLwotCi19ICAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0YzdlYTEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBBdWRpbyBEZWNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9BVURJT0RFQ09ERVIiCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsVHlwZXMuaCIKLQotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKgotICogICBERUZJTklUSU9OUyAgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0vLyBWZXJzaW9uCi0jZGVmaW5lIFZJREVPRURJVE9SX0FVRElPX0RFQ09ERVJfVkVSU0lPTl9NQUpPUiAxCi0jZGVmaW5lIFZJREVPRURJVE9SX0FVRElPX0RFQ09ERVJfVkVSU0lPTl9NSU5PUiAwCi0jZGVmaW5lIFZJREVPRURJVE9SX0FVRElPX0RFQ09ERVJfVkVSU0lPTl9SRVYgICAwCi0KLS8vIEZvcmNlIHVzaW5nIHNvZnR3YXJlIGRlY29kZXIgYXMgZW5naW5lIGRvZXMgbm90IHN1cHBvcnQgcHJlZmV0Y2gKLSNkZWZpbmUgVklERU9FRElUT1JfRk9SQ0VDT0RFQyBrU29mdHdhcmVDb2RlY3NPbmx5Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXRpYyBzcDxWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgZm9ybWF0LCB2b2lkICpkZWNvZGVyU2hlbGxDb250ZXh0KTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgc3RvcmVCdWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgflZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgICAgIENSRUFURUQsCi0gICAgICAgICAgICBTVEFSVEVELAotICAgICAgICAgICAgRVJST1IKLSAgICAgICAgfTsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+JiBmb3JtYXQsCi0gICAgICAgICB2b2lkICpkZWNvZGVyU2hlbGxDb250ZXh0KTsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1Gb3JtYXQ7Ci0gICAgICAgIFZlY3RvcjxNZWRpYUJ1ZmZlcio+IG1CdWZmZXJzOwotICAgICAgICBNdXRleCBtTG9jazsgIC8vIHByb3RlY3RzIG1CdWZmZXJzCi0gICAgICAgIGJvb2wgbUlzRU9TOwotICAgICAgICBTdGF0ZSBtU3RhdGU7Ci0gICAgICAgIHZvaWQqIG1EZWNTaGVsbENvbnRleHQ7Ci0gICAgICAgIC8vIERvbid0IGNhbGwgbWUuCi0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKGNvbnN0IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlJik7Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlJiBvcGVyYXRvcj0oCi0gICAgICAgICAgICBjb25zdCBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZSAmKTsKLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZXh0IG9mIHRoZSBTdGFnZUZyaWdodCBhdWRpbyBkZWNvZGVyCi0gKiAgICAgICAgICAgc2hlbGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNEFEX1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVyVHlwZTsKLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgc3A8VmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U+ICBtRGVjb2RlclNvdXJjZTsKLSAgICBPTVhDbGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnQ7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgICAgICAgICBtRGVjb2RlcjsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYk91dHB1dENoYW5uZWxzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iSW5wdXRGcmFtZXM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJPdXRwdXRGcmFtZXM7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAgKm1fcFJlYWRlcjsKLSAgICBNNF9BY2Nlc3NVbml0KiBtX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlOwotICAgIE00T1NBX0VSUiByZWFkZXJFcnJDb2RlOwotICAgIGludDMyX3QgdGltZVN0YW1wTXM7Ci0KLX0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dDsKLQotc3A8VmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U+IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpDcmVhdGUoCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgZm9ybWF0LCB2b2lkICpkZWNvZGVyU2hlbGxDb250ZXh0KSB7Ci0KLSAgICBzcDxWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZT4gYVNvdXJjZSA9Ci0gICAgICAgIG5ldyBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZShmb3JtYXQsIGRlY29kZXJTaGVsbENvbnRleHQpOwotCi0gICAgcmV0dXJuIGFTb3VyY2U7Ci19Ci0KLVZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBmb3JtYXQsIHZvaWQqIGRlY29kZXJTaGVsbENvbnRleHQpOgotICAgICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgIG1Jc0VPUyhmYWxzZSksCi0gICAgICAgIG1TdGF0ZShDUkVBVEVEKSwKLSAgICAgICAgbURlY1NoZWxsQ29udGV4dChkZWNvZGVyU2hlbGxDb250ZXh0KSB7Ci19Ci0KLVZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjp+VmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoKSB7Ci0KLSAgICBpZiggU1RBUlRFRCA9PSBtU3RhdGUgKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYoIENSRUFURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0YXJ0OiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gU1RBUlRFRDsKLQotY2xlYW5VcDoKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0YXJ0IEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9wKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3AgYmVnaW4iKTsKLQotICAgIGlmKCBTVEFSVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9wOiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKCFtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIGludCBuID0gbUJ1ZmZlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgbUJ1ZmZlcnMuaXRlbUF0KGkpLT5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1coIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9wIDogJWQgYnVmZmVyIHJlbWFpbmVkIiwgbik7Ci0gICAgICAgIG1CdWZmZXJzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gQ1JFQVRFRDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6Z2V0Rm9ybWF0Iik7Ci0gICAgcmV0dXJuIG1Gb3JtYXQ7Ci19Ci0KLXN0YXRpYyBNZWRpYUJ1ZmZlciogcmVhZEJ1ZmZlckZyb21SZWFkZXIoCi0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00X0FjY2Vzc1VuaXQqIHBBY2Nlc3NVbml0ID0gcERlY0NvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7Ci0KLSAgICAvLyBHZXQgbmV4dCBBVSBmcm9tIHJlYWRlci4KLSAgICBsZXJyID0gcERlY0NvbnRleHQtPm1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgcERlY0NvbnRleHQtPm1fcFJlYWRlci0+bV9yZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBEZWNDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgcEFjY2Vzc1VuaXQpOwotCi0gICAgaWYgKGxlcnIgPT0gTTRXQVJfTk9fTU9SRV9BVSkgewotICAgICAgICBBTE9HVigicmVhZEJ1ZmZlckZyb21SZWFkZXIgOiBFT1MiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcERlY0NvbnRleHQtPnRpbWVTdGFtcE1zID0gcEFjY2Vzc1VuaXQtPm1fQ1RTOwotCi0gICAgTWVkaWFCdWZmZXIqIG5ld0J1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcigoc2l6ZV90KXBBY2Nlc3NVbml0LT5tX3NpemUpOwotICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfSW50OCopbmV3QnVmZmVyLT5kYXRhKCkgKyBuZXdCdWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgKHZvaWQgKilwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcywgcEFjY2Vzc1VuaXQtPm1fc2l6ZSk7Ci0gICAgbmV3QnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIChwQWNjZXNzVW5pdC0+bV9DVFMgKiAxMDAwTEwpKTsKLSAgICByZXR1cm4gbmV3QnVmZmVyOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyByZWFkT3B0aW9uczsKLQotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNDb250ZXh0ID0KLSAgICAgKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQgKiltRGVjU2hlbGxDb250ZXh0OwotCi0gICAgaWYgKCBTVEFSVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpyZWFkIGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBHZXQgYSBidWZmZXIgZnJvbSB0aGUgcmVhZGVyIGlmIHdlIGRvbid0IGhhdmUgYW55Ci0gICAgaWYobUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gcmVhZEJ1ZmZlckZyb21SZWFkZXIocERlY0NvbnRleHQpOwotICAgICAgICBpZiAoIW5ld0J1ZmZlcikgewotICAgICAgICAgICAgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICBwRGVjQ29udGV4dC0+cmVhZGVyRXJyQ29kZSA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotICAgICAgICBtQnVmZmVycy5wdXNoKG5ld0J1ZmZlcik7Ci0gICAgfQotICAgICpidWZmZXIgPSBtQnVmZmVycy5pdGVtQXQoMCk7Ci0gICAgbUJ1ZmZlcnMucmVtb3ZlQXQoMCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNDb250ZXh0ID0KLSAgICAgKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQgKiltRGVjU2hlbGxDb250ZXh0OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciBiZWdpbiIpOwotCi0gICAgLy8gSWYgdGhlIHVzZXIgZGlkbid0IGdpdmUgdXMgYSBidWZmZXIsIGdldCBpdCBmcm9tIHRoZSByZWFkZXIuCi0gICAgaWYoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgTWVkaWFCdWZmZXIqIG5ld0J1ZmZlciA9IHJlYWRCdWZmZXJGcm9tUmVhZGVyKHBEZWNDb250ZXh0KTsKLSAgICAgICAgaWYgKCFuZXdCdWZmZXIpIHsKLSAgICAgICAgICAgIHBEZWNDb250ZXh0LT5yZWFkZXJFcnJDb2RlID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBidWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgbUJ1ZmZlcnMucHVzaChidWZmZXIpOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIgRU5EIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKgotICogICAgICBUT09MUyAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzKE00T1NBX0ludDgqIHBEYXRhLAotICAgICAgICBNNE9TQV9VSW50MzIgZGF0YVNpemUsIE00T1NBX1VJbnQ4IG5iQml0cywgTTRPU0FfSW50MzIqIHBSZXN1bHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiogcE9mZnNldCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIHN0YXJ0Qnl0ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHN0YXJ0Qml0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZW5kQnl0ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGVuZEJpdCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGN1cnJlbnRCeXRlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgcmVzdWx0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdWkzMlRtcCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHVpMzJNYXNrID0gMDsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBEYXRhLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcE9mZnNldCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygzMiA+PSBuYkJpdHMsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soKCpwT2Zmc2V0ICsgbmJCaXRzKSA8PSA4KmRhdGFTaXplLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMgYmVnaW4iKTsKLQotICAgIHN0YXJ0Qnl0ZSAgID0gKCpwT2Zmc2V0KSA+PiAzOwotICAgIGVuZEJ5dGUgICAgID0gKCpwT2Zmc2V0ICsgbmJCaXRzKSA+PiAzOwotICAgIHN0YXJ0Qml0ICAgID0gKCpwT2Zmc2V0KSAlIDg7Ci0gICAgZW5kQml0ICAgICAgPSAoKnBPZmZzZXQgKyBuYkJpdHMpICUgODsKLSAgICBjdXJyZW50Qnl0ZSA9IHN0YXJ0Qnl0ZTsKLQotICAgIC8vIEV4dHJhY3QgdGhlIHJlcXVlc3RlZCBudW5iZXIgb2YgYml0cyBmcm9tIG1lbW9yeQotICAgIHdoaWxlKCBjdXJyZW50Qnl0ZSA8PSBlbmRCeXRlKSB7Ci0gICAgICAgIHVpMzJNYXNrID0gMHgwMDAwMDBGRjsKLSAgICAgICAgaWYoIGN1cnJlbnRCeXRlID09IHN0YXJ0Qnl0ZSApIHsKLSAgICAgICAgICAgIHVpMzJNYXNrID4+PSBzdGFydEJpdDsKLSAgICAgICAgfQotICAgICAgICB1aTMyVG1wID0gdWkzMk1hc2sgJiAoKE00T1NBX1VJbnQzMilwRGF0YVtjdXJyZW50Qnl0ZV0pOwotICAgICAgICBpZiggY3VycmVudEJ5dGUgPT0gZW5kQnl0ZSApIHsKLSAgICAgICAgICAgIHVpMzJUbXAgPj49ICg4LWVuZEJpdCk7Ci0gICAgICAgICAgICByZXN1bHQgPDw9IGVuZEJpdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA8PD0gODsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgfD0gdWkzMlRtcDsKLSAgICAgICAgY3VycmVudEJ5dGUrKzsKLSAgICB9Ci0KLSAgICAqcFJlc3VsdCA9IHJlc3VsdDsKLSAgICAqcE9mZnNldCArPSBuYkJpdHM7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLSNkZWZpbmUgRlJFUV9UQUJMRV9TSVpFIDE2Ci1jb25zdCBNNE9TQV9VSW50MzIgQURfQUFDX0ZSRVFfVEFCTEVbRlJFUV9UQUJMRV9TSVpFXSA9Ci0gICAgezk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwKLSAgICAzMjAwMCwgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwLCAwLCAwLCAwfTsKLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSShNNE9TQV9JbnQ4KiBwRFNJLAotICAgICAgICBNNE9TQV9VSW50MzIgZHNpU2l6ZSwgQUFDX0RFQ19TVFJFQU1fUFJPUFMqIHBQcm9wZXJ0aWVzKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgb2Zmc2V0ID0gMDsKLSAgICBNNE9TQV9JbnQzMiByZXN1bHQgPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0kgYmVnaW4iKTsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBEU0ksIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUHJvcGVydGllcywgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIEdldCB0aGUgb2JqZWN0IHR5cGUKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzKHBEU0ksIGRzaVNpemUsIDUsICZyZXN1bHQsICZvZmZzZXQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgIHN3aXRjaCggcmVzdWx0ICkgewotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAvKiBBdWRpbyBPYmplY3QgVHlwZSBpcyAyIChBQUMgTG93IENvbXBsZXhpdHkpICovCi0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVBTUHJlc2VudCAgPSAwOwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFTQlJQcmVzZW50ID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAvKiBBdWRpbyBPYmplY3QgVHlwZSBpcyA1IChTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uKSAqLwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFQU1ByZXNlbnQgID0gMDsKLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlIGlzIDI5IChQYXJhbWV0cmljIFN0ZXJlbykgKi8KLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hUFNQcmVzZW50ICA9IDE7Ci0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVNCUlByZXNlbnQgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigicGFyc2VfQUFDX0RTSSBFUlJPUiA6IG9iamVjdCB0eXBlICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghImludmFsaWQgQUFDIG9iamVjdCB0eXBlIiwgTTRFUlJfQkFEX09QVElPTl9JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcFByb3BlcnRpZXMtPmFBdWRpb09iamVjdFR5cGUgPSAoTTRPU0FfSW50MzIpcmVzdWx0OwotCi0gICAgLy8gR2V0IHRoZSBmcmVxdWVuY3kgaW5kZXgKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzKHBEU0ksIGRzaVNpemUsIDQsICZyZXN1bHQsICZvZmZzZXQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKCgwIDw9IHJlc3VsdCkgJiYgKEZSRVFfVEFCTEVfU0laRSA+IHJlc3VsdCksCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcFByb3BlcnRpZXMtPmFTYW1wRnJlcSA9IEFEX0FBQ19GUkVRX1RBQkxFW3Jlc3VsdF07Ci0gICAgcFByb3BlcnRpZXMtPmFFeHRlbnNpb25TYW1wRnJlcSA9IDA7Ci0KLSAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMocERTSSwgZHNpU2l6ZSwgNCwgJnJlc3VsdCwgJm9mZnNldCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgcFByb3BlcnRpZXMtPmFOdW1DaGFuID0gKE00T1NBX1VJbnQzMilyZXN1bHQ7Ci0KLSAgICAvLyBTZXQgdGhlIG1heCBQQ00gc2FtcGxlcyBwZXIgY2hhbm5lbAotICAgIHBQcm9wZXJ0aWVzLT5hTWF4UENNU2FtcGxlc1BlckNoID0gKHBQcm9wZXJ0aWVzLT5hU0JSUHJlc2VudCkgPyAyMDQ4IDogMTAyNDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wYXJzZV9BQUNfRFNJIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wYXJzZV9BQUNfRFNJIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKgotICogRU5HSU5FIElOVEVSRkFDRSAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95KE00QURfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveSBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgLy8gU3RvcCB0aGUgZ3JhcGgKLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLmdldCgpICkgewotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLT5zdG9wKCk7Ci0gICAgfQotCi0gICAgLy8gRGVzdHJveSB0aGUgZ3JhcGgKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlLmNsZWFyKCk7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci5jbGVhcigpOwotICAgIHBEZWNvZGVyQ29udGV4dC0+bUNsaWVudC5kaXNjb25uZWN0KCk7Ci0KLSAgICBTQUZFX0ZSRUUocERlY29kZXJDb250ZXh0KTsKLSAgICBwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3kgOiBET05FIik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveSA6IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoTTRBRF9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0NvbnRleHQqIHBDb250ZXh0LCBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLAotICAgICAgICB2b2lkKiBwVXNlckRhdGEpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIEFBQ19ERUNfU1RSRUFNX1BST1BTIGFhY1Byb3BlcnRpZXM7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgc3A8TWV0YURhdGE+IGRlY29kZXJNZXRhRGF0YSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciogbWltZSA9IE5VTEw7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlIGJlZ2luOiBkZWNvZGVyVHlwZSAlZCIsIGRlY29kZXJUeXBlKTsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFN0cmVhbUhhbmRsZXIsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBDb250ZXh0IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbgotICAgIFNBRkVfTUFMTE9DKHBEZWNvZGVyQ29udGV4dCwgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCwgMSwKLSAgICAgICAgIkF1ZGlvRGVjb2RlciIpOwotICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJUeXBlID0gZGVjb2RlclR5cGU7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyID0gcFN0cmVhbUhhbmRsZXI7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzICA9IDA7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgPSAwOwotICAgIHBEZWNvZGVyQ29udGV4dC0+cmVhZGVyRXJyQ29kZSA9IE00Tk9fRVJST1I7Ci0gICAgcERlY29kZXJDb250ZXh0LT50aW1lU3RhbXBNcyA9IC0xOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSA6IG1heEFVU2l6ZSAlZCIsCi0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBtZXRhIGRhdGEgZm9yIHRoZSBkZWNvZGVyCi0gICAgZGVjb2Rlck1ldGFEYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHN3aXRjaCggcERlY29kZXJDb250ZXh0LT5tRGVjb2RlclR5cGUgKSB7Ci0gICAgICAgIGNhc2UgTTRBRF9rVHlwZUFNUk5COgotICAgICAgICAgICAgLy8gU3RhZ2VGcmlnaHQgcGFyYW1ldGVycwotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQjsKLSAgICAgICAgICAgIC8vIEVuZ2luZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoID0gMTYwOwotICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSA9IDI7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSA4MDAwOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQU1SV0I6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOwotCi0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoID0gMTYwOwotICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSA9IDI7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSAxNjAwMDsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rVHlwZUFBQzoKLSAgICAgICAgICAgIC8vIFJlamVjdCBBRFRTICYgQURJRiAob3IgYW55IGluY29ycmVjdCB0eXBlKQotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0KLSAgICAgICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUsTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgICAgICAgICAgLy8gU3RhZ2VGcmlnaHQgcGFyYW1ldGVycwotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLQotICAgICAgICAgICAgZGVjb2Rlck1ldGFEYXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLm1fcEVTRFNJbmZvLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX0VTRFNJbmZvU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8vIEVuZ2luZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAvLyBSZXRyaWV2ZSBzYW1wbGluZyBmcmVxdWVuY3kgYW5kIG51bWJlciBvZiBjaGFubmVscyBmcm9tIHRoZSBEU0kKLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0koCi0gICAgICAgICAgICAgICAgKE00T1NBX0ludDgqKXBTdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5cCi0gICAgICAgICAgICAgICAgICAgIG1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgJmFhY1Byb3BlcnRpZXMpOwotCi0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxMDI0OwotICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSA9IDI7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgIGFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPQotICAgICAgICAgICAgICAgIGFhY1Byb3BlcnRpZXMuYU51bUNoYW47Ci0KLSAgICAgICAgICAgIC8vIENvcHkgdGhlIHN0cmVhbSBwcm9wZXJ0aWVzIGludG8gdXNlcmRhdGEKLSAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBVc2VyRGF0YSApIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopJmFhY1Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihBQUNfREVDX1NUUkVBTV9QUk9QUykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlTVAzOgotICAgICAgICAgICAgLy8gU3RhZ2VGcmlnaHQgcGFyYW1ldGVycwotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJBdWRpb0RlY29kZXJfb3BlbiA6IGluY29ycmVjdCBpbnB1dCBmb3JtYXQiLAotICAgICAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWNvZGVyTWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKLSAgICBkZWNvZGVyTWV0YURhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLAotICAgICAgICAoaW50MzJfdClwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kpOwotICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMpOwotICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLAotICAgICAgICAoaW50NjRfdClwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbik7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIgc291cmNlCi0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlclNvdXJjZSA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpDcmVhdGUoCi0gICAgICAgIGRlY29kZXJNZXRhRGF0YSwgKHZvaWQgKilwRGVjb2RlckNvbnRleHQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcERlY29kZXJDb250ZXh0LT5tRGVjb2RlclNvdXJjZS5nZXQoKSwKLSAgICAgICAgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHJlc3VsdCA9IHBEZWNvZGVyQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIE9NWCBjb2RlYwotI2lmZGVmIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMKLSAgICBjb2RlY0ZsYWdzIHw9IE9NWENvZGVjOjpWSURFT0VESVRPUl9GT1JDRUNPREVDOwotI2VuZGlmIC8qIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMgKi8KLQotICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKHBEZWNvZGVyQ29udGV4dC0+XAotICAgICAgICBtQ2xpZW50LmludGVyZmFjZSgpLAotICAgICAgICBkZWNvZGVyTWV0YURhdGEsIGZhbHNlLCBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlLCBOVUxMLAotICAgICAgICAgICAgY29kZWNGbGFncyk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBHZXQgdGhlIG91dHB1dCBjaGFubmVscywgdGhlIGRlY29kZXIgbWlnaHQgb3ZlcndyaXRlIHRoZSBpbnB1dCBtZXRhZGF0YQotICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwKLSAgICAgICAgJnBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0Q2hhbm5lbHMpOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgOiBvdXRwdXQgY2hhbiAlZCIsCi0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0Q2hhbm5lbHMpOwotCi0gICAgLy8gU3RhcnQgdGhlIGRlY29kZXIKLSAgICByZXN1bHQgPSBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgKnBDb250ZXh0ID0gcERlY29kZXJDb250ZXh0OwotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgOiBET05FIik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveShwRGVjb2RlckNvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FBQyhNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoCi0gICAgICAgIE00QURfa1R5cGVBQUMsIHBDb250ZXh0LCBwU3RyZWFtSGFuZGxlcixwVXNlckRhdGEpOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQU1STkIoTTRBRF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlciwgdm9pZCogcFVzZXJEYXRhKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlKAotICAgICAgICBNNEFEX2tUeXBlQU1STkIsIHBDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwgcFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FNUldCKE00QURfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsIHZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSgKLSAgICAgICAgTTRBRF9rVHlwZUFNUldCLCBwQ29udGV4dCwgcFN0cmVhbUhhbmRsZXIsIHBVc2VyRGF0YSk7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9NUDMoTTRBRF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlciwgdm9pZCogcFVzZXJEYXRhKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlKAotICAgICAgICBNNEFEX2tUeXBlTVAzLCBwQ29udGV4dCwgcFN0cmVhbUhhbmRsZXIsIHBVc2VyRGF0YSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoCi0gICAgICAgIE00QURfQ29udGV4dCBwQ29udGV4dCwgTTRBRF9CdWZmZXIqIHBJbnB1dEJ1ZmZlcikgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTWVkaWFCdWZmZXIqIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLQotICAgIHBEZWNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBJbnB1dEJ1ZmZlciApIHsKLSAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKikoKE00T1NBX0ludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICAodm9pZCAqKXBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywgcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUpOwotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgcElucHV0QnVmZmVyLT5tX3RpbWVTdGFtcFVzKTsKLSAgICB9Ci0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlclNvdXJjZS0+c3RvcmVCdWZmZXIoYnVmZmVyKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyKE00QURfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlciwgTTRBRF9CdWZmZXIqIHBPdXB1dEJ1ZmZlcikgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgaW50MzJfdCBpMzJUbXAgPSAwOwotICAgIGludDY0X3QgaTY0VG1wID0gMDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBidWZmZXIsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT3VwdXRCdWZmZXIsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZXR1cm5lZCBkYXRhCi0gICAgaWYoIDAgPT0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSApIHsKLSAgICAgICAgLy8gRGVjb2RlciBoYXMgbm8gZGF0YSB5ZXQsIG5vdGhpbmcgdW51c3VhbAotICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgfQotCi0gICAgcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMrKzsKLQotICAgIGlmKCBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9PQotICAgICAgICAoTTRPU0FfVUludDMyKXBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0Q2hhbm5lbHMgKSB7Ci0gICAgICAgIC8vIEp1c3QgY29weSB0aGUgUENNcwotICAgICAgICBwT3VwdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSA9IChNNE9TQV9VSW50MzIpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcE91cHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKikoKChNNE9TQV9NZW1BZGRyOClidWZmZXItPmRhdGEoKSkrYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICB9IGVsc2UgaWYoIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzIDwKLSAgICAgICAgKE00T1NBX1VJbnQzMilwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dENoYW5uZWxzICkgewotICAgICAgICAvLyBUaGUgZGVjb2RlciBmb3JjZXMgc3RlcmVvIG91dHB1dCwgZG93bnNhbXBsZQotICAgICAgICBwT3VwdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSA9IChNNE9TQV9VSW50MzIpKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkvMik7Ci0gICAgICAgIE00T1NBX0ludDE2KiBwRGF0YUluICA9ICgoTTRPU0FfSW50MTYqKWJ1ZmZlci0+ZGF0YSgpKSArCi0gICAgICAgICAgICBidWZmZXItPnJhbmdlX29mZnNldCgpOwotICAgICAgICBNNE9TQV9JbnQxNiogcERhdGFPdXQgPSAoTTRPU0FfSW50MTYqKXBPdXB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzczsKLSAgICAgICAgTTRPU0FfSW50MTYqIHBEYXRhRW5kID0gcERhdGFJbiArIFwKLSAgICAgICAgICAgIChidWZmZXItPnJhbmdlX2xlbmd0aCgpL3NpemVvZihNNE9TQV9JbnQxNikpOwotICAgICAgICB3aGlsZSggcERhdGFJbiA8IHBEYXRhRW5kICkgewotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKnBEYXRhSW47Ci0gICAgICAgICAgICBwRGF0YUluKz0yOwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBkZWNvZGVyIGZvcmNlcyBtb25vIG91dHB1dCwgbm90IHN1cHBvcnRlZAotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgLy8gUmVsZWFzZSB0aGUgYnVmZmVyCi0gICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBPdXB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID0gMDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwKE00QURfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRBRF9CdWZmZXIqIHBJbnB1dEJ1ZmZlciwgTTRBRF9CdWZmZXIqIHBPdXRwdXRCdWZmZXIsCi0gICAgICAgIE00T1NBX0Jvb2wgYkp1bXApIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIE1lZGlhQnVmZmVyKiBvdXRwdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXAgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBEZWNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzKys7Ci0KLSAgICAvLyBQdXNoIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIGRlY29kZXIgc291cmNlCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKHBEZWNvZGVyQ29udGV4dCwKLSAgICAgICAgcElucHV0QnVmZmVyKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgIC8vIFJlYWQKLSAgICByZXN1bHQgPSBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLT5yZWFkKCZvdXRwdXRCdWZmZXIsIE5VTEwpOwotICAgIGlmIChJTkZPX0ZPUk1BVF9DSEFOR0VEID09IHJlc3VsdCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDogQXVkaW8gZGVjb2RlciBcCi0gICAgICAgICByZXR1cm5lZCBJTkZPX0ZPUk1BVF9DSEFOR0VEIik7Ci0gICAgICAgIENIRUNLKG91dHB1dEJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQ7Ci0KLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJmNoYW5uZWxDb3VudCkpOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDogc2FtcGxpbmdGcmVxID0gJWQiLCBzYW1wbGVSYXRlKTsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXA6IGNoYW5uZWxDbnQgPSAlZCIsIGNoYW5uZWxDb3VudCk7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAodWludDMyX3Qpc2FtcGxlUmF0ZTsKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPQotICAgICAgICAgKHVpbnQzMl90KWNoYW5uZWxDb3VudDsKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyA9IGNoYW5uZWxDb3VudDsKLQotICAgICAgICByZXR1cm4gTTRXQVJfSU5GT19GT1JNQVRfQ0hBTkdFOwotICAgIH0gZWxzZSBpZiAoRVJST1JfRU5EX09GX1NUUkVBTSA9PSByZXN1bHQpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXA6IEF1ZGlvIGRlY29kZXIgXAotICAgICAgICAgcmV0dXJuZWQgRVJST1JfRU5EX09GX1NUUkVBTSIpOwotICAgICAgICBwRGVjb2RlckNvbnRleHQtPnJlYWRlckVyckNvZGUgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9IGVsc2UgaWYgKE9LICE9IHJlc3VsdCkgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLy8gQ29udmVydCB0aGUgUENNIGJ1ZmZlcgotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIocERlY29kZXJDb250ZXh0LAotICAgICAgICBvdXRwdXRCdWZmZXIsIHBPdXRwdXRCdWZmZXIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbykgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldFZlcnNpb24gYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwVmVyc2lvbkluZm8sIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgICAgICA9IFZJREVPRURJVE9SX0FVRElPX0RFQ09ERVJfVkVSU0lPTl9NQUpPUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fbWlub3IgICAgICA9IFZJREVPRURJVE9SX0FVRElPX0RFQ09ERVJfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gICA9IFZJREVPRURJVE9SX0FVRElPX0RFQ09ERVJfVkVSU0lPTl9SRVY7Ci0gICAgcFZlcnNpb25JbmZvLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfVmVyc2lvbkluZm8pOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldFZlcnNpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldFZlcnNpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3NldE9wdGlvbihNNEFEX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gYmVnaW4gMHglWCIsIG9wdGlvbklEKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBEZWNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN3aXRjaCggb3B0aW9uSUQgKSB7Ci0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8TTRPU0FfVUludDMyPihNNEFEX2tPcHRpb25JRF9Vc2VyUGFyYW0pOgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyc2V0T3B0aW9uIFVzZXJQYXJhbSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZToKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlcnNldE9wdGlvbiAzZ3BSZWFkZXJJbnRlcmZhY2UiKTsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bV9wUmVhZGVyID0KLSAgICAgICAgICAgICAoTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tPcHRpb25JRF9BdWRpb0FVOgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyc2V0T3B0aW9uIEF1ZGlvQVUiKTsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZSA9Ci0gICAgICAgICAgICAgKE00X0FjY2Vzc1VuaXQgKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uICB1bnN1cHBvcnRlZCBvcHRpb25JZCAweCVYIiwKLSAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfQkFEX09QVElPTl9JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYoICgoTTRPU0FfVUludDMyKU00Tk9fRVJST1IgPT0gZXJyKSB8fCAoKE00T1NBX1VJbnQzMilNNEVSUl9OT1RfSU1QTEVNRU5URUQgPT0gZXJyKSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3NldE9wdGlvbiBlcnJvciAweCVYIiwgZXJyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRPcHRpb24oTTRBRF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uIGJlZ2luOiBvcHRpb25JRCAweCVYIiwgb3B0aW9uSUQpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3dpdGNoKCBvcHRpb25JRCApIHsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0dldEF1ZGlvQVVFcnJDb2RlOgotICAgICAgICAgICAgKih1aW50MzJfdCAqKW9wdGlvblZhbHVlID0gcERlY29kZXJDb250ZXh0LT5yZWFkZXJFcnJDb2RlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tPcHRpb25JRF9BdWRpb05iQ2hhbm5lbHM6Ci0gICAgICAgICAgICAqKHVpbnQzMl90ICopb3B0aW9uVmFsdWUgPQotICAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tPcHRpb25JRF9BdWRpb1NhbXBGcmVxdWVuY3k6Ci0gICAgICAgICAgICAqKHVpbnQzMl90ICopb3B0aW9uVmFsdWUgPQotICAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfQXVDVFM6Ci0gICAgICAgICAgICAqKHVpbnQzMl90ICopb3B0aW9uVmFsdWUgPSBwRGVjb2RlckNvbnRleHQtPnRpbWVTdGFtcE1zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRPcHRpb24gdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRPcHRpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZShNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfVHlwZSogcERlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBEZWNvZGVyVHlwZSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBEZWNvZGVySW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBiZWdpbiAlZCAweCV4IDB4JXgiLAotICAgICAgICBkZWNvZGVyVHlwZSwgcERlY29kZXJUeXBlLCBwRGVjb2RlckludGVyZmFjZSk7Ci0KLSAgICBTQUZFX01BTExPQygqcERlY29kZXJJbnRlcmZhY2UsIE00QURfSW50ZXJmYWNlLCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIiKTsKLQotICAgICpwRGVjb2RlclR5cGUgPSBkZWNvZGVyVHlwZTsKLQotICAgIHN3aXRjaCggZGVjb2RlclR5cGUgKSB7Ci0gICAgICAgIGNhc2UgTTRBRF9rVHlwZUFNUk5COgotICAgICAgICAgICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdENyZWF0ZUF1ZGlvRGVjID0KLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQU1STkI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQU1SV0I6Ci0gICAgICAgICAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgPQotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BTVJXQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00QURfa1R5cGVBQUM6Ci0gICAgICAgICAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgPQotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlTVAzOgotICAgICAgICAgICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdENyZWF0ZUF1ZGlvRGVjID0KLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVkVBRF9nZXRJbnRlcmZhY2UgRVJST1I6IHVuc3VwcG9ydGVkIHR5cGUgJWQiLCBkZWNvZGVyVHlwZSk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95QXVkaW9EZWMgICA9Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3k7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFJlc2V0QXVkaW9EZWMgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U3RhcnRBdWRpb0RlYyAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTdGVwQXVkaW9EZWMgICAgICA9Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXA7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldFZlcnNpb25BdWRpb0RlYyA9Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldFZlcnNpb247Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyA9Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbjsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcERlY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0gICAgQUxPR1YoIlRFU1Q6IEFBQyBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEFEX2tUeXBlQUFDLCBwRGVjb2RlclR5cGUsIHBEZWNvZGVySW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BTVJOQihNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSkgewotICAgIEFMT0dWKCJURVNUOiBBTVIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRBRF9rVHlwZUFNUk5CLCBwRGVjb2RlclR5cGUsIHBEZWNvZGVySW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BTVJXQihNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRBRF9rVHlwZUFNUldCLCBwRGVjb2RlclR5cGUsIHBEZWNvZGVySW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9NUDMoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00QURfa1R5cGVNUDMsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOTFmM2VlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgQXVkaW8gRW5jb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfQVVESU9FTkNPREVSIgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLQotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0KLS8qKiogREVGSU5JVElPTlMgKioqLwotLy8gRm9yY2UgdXNpbmcgc29mdHdhcmUgZW5jb2RlciBhcyBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBwcmVmZXRjaAotI2RlZmluZSBWSURFT0VESVRPUl9GT1JDRUNPREVDIGtTb2Z0d2FyZUNvZGVjc09ubHkKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotc3RydWN0IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXRpYyBzcDxWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgaW50MzJfdCBzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+VmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0cnVjdCBNZWRpYUJ1ZmZlckNoYWluIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyKiBidWZmZXI7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBuZXh0TGluazsKLSAgICAgICAgfTsKLSAgICAgICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgICAgICBDUkVBVEVELAotICAgICAgICAgICAgU1RBUlRFRCwKLSAgICAgICAgICAgIEVSUk9SCi0gICAgICAgIH07Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbUZpcnN0QnVmZmVyTGluazsKLSAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbUxhc3RCdWZmZXJMaW5rOwotICAgICAgICBpbnQzMl90IG1OYkJ1ZmZlcjsKLSAgICAgICAgU3RhdGUgbVN0YXRlOwotICAgICAgICBzcDxNZXRhRGF0YT4gbUVuY0Zvcm1hdDsKLQotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZShjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk7Ci0KLSAgICAgICAgLy8gRG9uJ3QgY2FsbCBtZS4KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UoY29uc3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UmKTsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UmIG9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlJik7Ci19OwotCi1zcDxWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZT4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpDcmVhdGUiKTsKLSAgICBzcDxWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZT4gYVNvdXJjZSA9Ci0gICAgICAgIG5ldyBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZShmb3JtYXQpOwotCi0gICAgcmV0dXJuIGFTb3VyY2U7Ci19Ci0KLVZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSgKLSAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk6Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsoTlVMTCksCi0gICAgICAgIG1MYXN0QnVmZmVyTGluayhOVUxMKSwKLSAgICAgICAgbU5iQnVmZmVyKDApLAotICAgICAgICBtU3RhdGUoQ1JFQVRFRCksCi0gICAgICAgIG1FbmNGb3JtYXQoZm9ybWF0KSB7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSIpOwotfQotCi0KLVZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjp+VmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UoKSB7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjp+VmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UiKTsKLQotICAgIGlmKCBTVEFSVEVEID09IG1TdGF0ZSApIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0YXJ0Iik7Ci0KLSAgICBpZiggQ1JFQVRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RhcnQgRVJST1IgOiBpbnZhbGlkIHN0YXRlICVkIiwKLSAgICAgICAgICAgIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IFNUQVJURUQ7Ci0KLWNsZWFuVXA6Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdGFydCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCgpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCIpOwotCi0gICAgaWYoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3AgRVJST1I6IGludmFsaWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgaW50MzJfdCBpID0gMDsKLSAgICBNZWRpYUJ1ZmZlckNoYWluKiB0bXBMaW5rID0gTlVMTDsKLSAgICB3aGlsZSggbUZpcnN0QnVmZmVyTGluayApIHsKLSAgICAgICAgaSsrOwotICAgICAgICB0bXBMaW5rID0gbUZpcnN0QnVmZmVyTGluazsKLSAgICAgICAgbUZpcnN0QnVmZmVyTGluayA9IG1GaXJzdEJ1ZmZlckxpbmstPm5leHRMaW5rOwotICAgICAgICBkZWxldGUgdG1wTGluazsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wIDogJWQgYnVmZmVyIHJlbWFpbmVkIiwgaSk7Ci0gICAgbUZpcnN0QnVmZmVyTGluayA9IE5VTEw7Ci0gICAgbUxhc3RCdWZmZXJMaW5rID0gTlVMTDsKLQotICAgIG1TdGF0ZSA9IENSRUFURUQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3AgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3A8TWV0YURhdGE+IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbUVuY0Zvcm1hdDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIHJlYWRPcHRpb25zOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIE1lZGlhQnVmZmVyQ2hhaW4qIHRtcExpbmsgPSBOVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpyZWFkIik7Ci0KLSAgICBpZiAoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnJlYWQgRVJST1IgOiBpbnZhbGlkIHN0YXRlICVkIiwKLSAgICAgICAgICAgIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIGlmKCBOVUxMID09IG1GaXJzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgICpidWZmZXIgPSBOVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnJlYWQgOiBFT1MiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotICAgICpidWZmZXIgPSBtRmlyc3RCdWZmZXJMaW5rLT5idWZmZXI7Ci0KLSAgICB0bXBMaW5rID0gbUZpcnN0QnVmZmVyTGluazsKLSAgICBtRmlyc3RCdWZmZXJMaW5rID0gbUZpcnN0QnVmZmVyTGluay0+bmV4dExpbms7Ci0gICAgaWYoIE5VTEwgPT0gbUZpcnN0QnVmZmVyTGluayApIHsKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rID0gTlVMTDsKLSAgICB9Ci0gICAgZGVsZXRlIHRtcExpbms7Ci0gICAgbU5iQnVmZmVyLS07Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnJlYWQgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotaW50MzJfdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciIpOwotCi0gICAgTWVkaWFCdWZmZXJDaGFpbiogbmV3TGluayA9IG5ldyBNZWRpYUJ1ZmZlckNoYWluOwotICAgIG5ld0xpbmstPmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICBuZXdMaW5rLT5uZXh0TGluayA9IE5VTEw7Ci0gICAgaWYoIE5VTEwgIT0gbUxhc3RCdWZmZXJMaW5rICkgewotICAgICAgICBtTGFzdEJ1ZmZlckxpbmstPm5leHRMaW5rID0gbmV3TGluazsKLSAgICB9IGVsc2UgewotICAgICAgICBtRmlyc3RCdWZmZXJMaW5rID0gbmV3TGluazsKLSAgICB9Ci0gICAgbUxhc3RCdWZmZXJMaW5rID0gbmV3TGluazsKLSAgICBtTmJCdWZmZXIrKzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIgRU5EIik7Ci0gICAgcmV0dXJuIG1OYkJ1ZmZlcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiBFTkdJTkUgSU5URVJGQUNFICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZXh0IG9mIHRoZSBTdGFnZUZyaWdodCBhdWRpbwotICogICAgICAgICAgIGVuY29kZXIgc2hlbGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgIG1Gb3JtYXQ7Ci0gICAgTTRFTkNPREVSX0F1ZGlvUGFyYW1zKiAgICAgICAgICAgIG1Db2RlY1BhcmFtczsKLSAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gICAgbURTSTsKLSAgICBzcDxWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZT4gbUVuY29kZXJTb3VyY2U7Ci0gICAgT01YQ2xpZW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnQ7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgICAgICAgIG1FbmNvZGVyOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJJbnB1dEZyYW1lczsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iT3V0cHV0RnJhbWVzOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RPdXRwdXRDdHM7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0T3V0cHV0Q3RzOwotfSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0OwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cChNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAgYmVnaW4iKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQtPm1EU0kucEluZm8pOwotICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBmb3JtYXQsCi0gICAgICAgIE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQgYmVnaW46IGZvcm1hdCAlZCIsIGZvcm1hdCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dCwgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyIik7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgKnBDb250ZXh0ID0gcEVuY29kZXJDb250ZXh0OwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9BQUMoTTRPU0FfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rQUFDLCBwQ29udGV4dCwgcFVzZXJEYXRhKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXRfQU1STkIoTTRPU0FfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rQU1STkIsIHBDb250ZXh0LCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9NUDMoTTRPU0FfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rTVAzLCBwQ29udGV4dCwgcFVzZXJEYXRhKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlKE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UgYmVnaW4iKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXItPnN0b3AoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLmNsZWFyKCk7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLmNsZWFyKCk7Ci0KLSAgICBBTE9HVigiQXVkaW9FbmNvZGVyX2Nsb3NlOklOICVkIGZyYW1lcyxPVVQgJWQgZnJhbWVzIGZyb20gJWxsZCB0byAlbGxkIiwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcywKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMsIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0T3V0cHV0Q3RzKTsKLQotICAgIGlmKCBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzICE9IHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZTpzb21lIGZyYW1lcyB3ZXJlIG5vdCBlbmNvZGVkICVkICVkIiwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMsIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlIGJlZ2luIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcyAqcFBhcmFtcywgTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvICpwRFNJLAotICAgICAgICBNNE9TQV9Db250ZXh0IHBHcmFiYmVyQ29udGV4dCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBzcDxNZXRhRGF0YT4gZW5jb2Rlck1ldGFkYXRhID0gTlVMTDsKLSAgICBjb25zdCBjaGFyKiBtaW1lID0gTlVMTDsKLSAgICBpbnQzMl90IGlOYkNoYW5uZWwgPSAwOwotICAgIHVpbnQzMl90IGNvZGVjRmxhZ3MgPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gYmVnaW4iKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUGFyYW1zLCAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBEU0ksICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBEU0ktPnBJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwRFNJLT5pbmZvU2l6ZSA9IDA7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzICA9IDA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgPSAwOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gLTE7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyAgPSAtMTsKLQotICAgIC8vIEFsbG9jYXRlICYgaW5pdGlhbGl6ZSB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycwotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIDogcGFyYW1zIEY9JWQgQ049JWQgQlI9JWQgRj0lZCIsCi0gICAgICAgIHBQYXJhbXMtPkZyZXF1ZW5jeSwgcFBhcmFtcy0+Q2hhbm5lbE51bSwgcFBhcmFtcy0+Qml0cmF0ZSwKLSAgICAgICAgcFBhcmFtcy0+Rm9ybWF0KTsKLSAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcywgTTRFTkNPREVSX0F1ZGlvUGFyYW1zLCAxLAotICAgICAgICAiVklERU9FRElUT1IgQ29kZWNQYXJhbXMiKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJlcXVlbmN5ICA9IHBQYXJhbXMtPkZyZXF1ZW5jeTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Q2hhbm5lbE51bSA9IHBQYXJhbXMtPkNoYW5uZWxOdW07Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUgICAgPSBwUGFyYW1zLT5CaXRyYXRlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgICAgID0gcFBhcmFtcy0+Rm9ybWF0OwotCi0gICAgLy8gQ2hlY2sgb3V0cHV0IGZvcm1hdCBjb25zaXN0ZW5jeQotICAgIFZJREVPRURJVE9SX0NIRUNLKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgPT0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLyoqCi0gICAgICogU3RhZ2VGcmlnaHQgZ3JhcGggYnVpbGRpbmcKLSAgICAgKi8KLSAgICAvLyBDcmVhdGUgdGhlIG1ldGEgZGF0YSBmb3IgdGhlIGVuY29kZXIKLSAgICBlbmNvZGVyTWV0YWRhdGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc3dpdGNoKCBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQUFDOgotICAgICAgICB7Ci0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FNUk5COgotICAgICAgICB7Ci0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJBdWRpb0VuY29kZXJfb3BlbiA6IGluY29ycmVjdCBpbnB1dCBmb3JtYXQiLAotICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmVxdWVuY3kpOwotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5CaXRyYXRlKTsKLQotICAgIHN3aXRjaCggcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkNoYW5uZWxOdW0gKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNb25vOgotICAgICAgICB7Ci0gICAgICAgICAgICBpTmJDaGFubmVsID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tTdGVyZW86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlOYkNoYW5uZWwgPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJBdWRpb0VuY29kZXJfb3BlbiA6IGluY29ycmVjdCBjaGFubmVsIG51bWJlciIsCi0gICAgICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBpTmJDaGFubmVsKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZW5jb2RlciBzb3VyY2UKLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgZW5jb2Rlck1ldGFkYXRhKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuZ2V0KCksCi0gICAgICAgIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIE9NWCBjbGllbnQKLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBPTVggY29kZWMKLSNpZmRlZiBWSURFT0VESVRPUl9GT1JDRUNPREVDCi0gICAgY29kZWNGbGFncyB8PSBPTVhDb2RlYzo6VklERU9FRElUT1JfRk9SQ0VDT0RFQzsKLSNlbmRpZiAvKiBWSURFT0VESVRPUl9GT1JDRUNPREVDICovCi0gICAgLy8gRklYTUU6Ci0gICAgLy8gV2UgYXJlIG1vdmluZyBhd2F5IHRvIHVzZSBzb2Z0d2FyZSBBQUNFbmNvZGVyIGFuZCBpbnN0ZWFkIHVzZSBPTVgtYmFzZWQKLSAgICAvLyBzb2Z0d2FyZSBBQUMgYXVkaW8gZW5jb2Rlci4gV2Ugd2FudCB0byB1c2UgQUFDRW5jb2RlciBmb3Igbm93LiBBZnRlciB3ZQotICAgIC8vIGZpeCB0aGUgaW50ZXJmYWNlIGlzc3VlIHdpdGggdGhlIE9NWC1iYXNlZCBBQUMgYXVkaW8gZW5jb2Rlciwgd2Ugc2hvdWxkCi0gICAgLy8gdGhlbiBzZXQgdGhlIGNvbXBvbmVudCBuYW1lIGJhY2sgdG8gTlVMTCB0byBhbGxvdyB0aGUgc3lzdGVtIHRvIHBpY2sgdXAKLSAgICAvLyB0aGUgcmlnaHQgQUFDIGF1ZGlvIGVuY29kZXIuCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuaW50ZXJmYWNlKCksIGVuY29kZXJNZXRhZGF0YSwgdHJ1ZSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UsICJBQUNFbmNvZGVyIiAvKiBjb21wb25lbnQgbmFtZSAqLywKLSAgICAgICAgICAgIGNvZGVjRmxhZ3MpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci5nZXQoKSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gU3RhcnQgdGhlIGdyYXBoCi0gICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+c3RhcnQoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIEdldCBBQUMgRFNJLCB0aGlzIGNvZGUgY2FuIG9ubHkgd29yayB3aXRoIHNvZnR3YXJlIGVuY29kZXIKLSAgICBpZiggTTRFTkNPREVSX2tBQUMgPT0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCApIHsKLSAgICAgICAgaW50MzJfdCAgICAgIGlzQ29kZWNDb25maWcgPSAwOwotICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyICAgICAgICA9IE5VTEw7Ci0KLSAgICAgICAgLy8gUmVhZCBvbmNlIHRvIGdldCB0aGUgRFNJCi0gICAgICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXItPnJlYWQoJmJ1ZmZlciwgTlVMTCk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsCi0gICAgICAgICAgICAmaXNDb2RlY0NvbmZpZykgJiYgaXNDb2RlY0NvbmZpZywgTTRFUlJfU1RBVEUpOwotCi0gICAgICAgIC8vIFNhdmUgdGhlIERTSQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1EU0kuaW5mb1NpemUgPSAoTTRPU0FfVUludDMyKWJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dC0+bURTSS5wSW5mbywgTTRPU0FfSW50OCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bURTSS5pbmZvU2l6ZSwgIkVuY29kZXIgaGVhZGVyIik7Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEVuY29kZXJDb250ZXh0LT5tRFNJLnBJbmZvLAotICAgICAgICAgICAgKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KShidWZmZXItPmRhdGEoKSkrYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1EU0kuaW5mb1NpemUpOwotCi0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAqcERTSSA9IHBFbmNvZGVyQ29udGV4dC0+bURTSTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gOiBET05FIik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciogcEluQnVmZmVyKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDgqIHBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyID0gTlVMTDsKLSAgICBpbnQzMl90IG5iQnVmZmVyID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgYmVnaW4iKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3dpdGNoKCBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Q2hhbm5lbE51bSApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01vbm86Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tTdGVyZW86Ci0gICAgICAgICAgICAvLyBMZXQgdGhlIE1lZGlhQnVmZmVyIG93biB0aGUgZGF0YSBzbyB3ZSBkb24ndCBoYXZlIHRvIGZyZWUgaXQKLSAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcigoc2l6ZV90KXBJbkJ1ZmZlci0+cFRhYmxlQnVmZmVyU2l6ZVswXSk7Ci0gICAgICAgICAgICBwRGF0YSA9IChNNE9TQV9JbnQ4KilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwRGF0YSwgKHZvaWQgKilwSW5CdWZmZXItPnBUYWJsZUJ1ZmZlclswXSwKLSAgICAgICAgICAgICAgICBwSW5CdWZmZXItPnBUYWJsZUJ1ZmZlclNpemVbMF0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVkVBRV9wcm9jZXNzSW5wdXRCdWZmZXIgdW5zdXBwb3J0ZWQgY2hhbm5lbCBjb25maWd1cmF0aW9uICVkIiwKLSAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Q2hhbm5lbE51bSk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgOiBzdG9yZSAlZCBieXRlcyIsCi0gICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIC8vIFB1c2ggdGhlIGJ1ZmZlciB0byB0aGUgc291cmNlCi0gICAgbmJCdWZmZXIgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihidWZmZXIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKCBOVUxMICE9IGJ1ZmZlciApIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlciwgTTRFTkNPREVSX0F1ZGlvQnVmZmVyKiBwT3V0QnVmZmVyKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBDdHMgPSAwOwotICAgIGludDMyX3QgaTMyVG1wID0gMDsKLSAgICBpbnQ2NF90IGk2NFRtcCA9IDA7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IGJ1ZmZlciwgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT3V0QnVmZmVyLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgLy8gUHJvY2VzcyB0aGUgcmV0dXJuZWQgQVUKLSAgICBpZiggMCA9PSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICkgewotICAgICAgICAvLyBFbmNvZGVyIGhhcyBubyBkYXRhIHlldCwgbm90aGluZyB1bnVzdWFsCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIDogYnVmZmVyIGlzIGVtcHR5Iik7Ci0gICAgICAgIHBPdXRCdWZmZXItPnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgfQotICAgIGlmKCBidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpMzJUbXApICYmIGkzMlRtcCApIHsKLSAgICAgICAgLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiB3aXRoIHNvZnR3YXJlIGVuY29kZXIsCi0gICAgICAgICAqIERTSSB3YXMgcmV0cmlldmVkIGJlZm9yZWhhbmQgKi8KLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX1NUQVRFKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBDaGVjayB0aGUgQ1RTCi0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJmk2NFRtcCksCi0gICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgIEN0cyA9IChNNE9TQV9JbnQzMikoaTY0VG1wLzEwMDApOwotCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKys7Ci0gICAgICAgIGlmKCAwID4gcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgKSB7Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyA9IGk2NFRtcDsKLSAgICAgICAgfQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0T3V0cHV0Q3RzID0gaTY0VG1wOwotCi0gICAgICAgIC8vIEZvcm1hdCB0aGUgQVUKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dEJ1ZmZlci0+cFRhYmxlQnVmZmVyWzBdLAotICAgICAgICAgICAgKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KShidWZmZXItPmRhdGEoKSkrYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgcE91dEJ1ZmZlci0+cFRhYmxlQnVmZmVyU2l6ZVswXSA9IChNNE9TQV9VSW50MzIpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgLy8gUmVsZWFzZSB0aGUgYnVmZmVyCi0gICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIqIHBJbkJ1ZmZlciwgTTRFTkNPREVSX0F1ZGlvQnVmZmVyKiBwT3V0QnVmZmVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9zdGVwIGJlZ2luIik7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwSW5CdWZmZXIsICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcE91dEJ1ZmZlciwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzKys7Ci0KLSAgICAvLyBQdXNoIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIGVuY29kZXIgc291cmNlCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCxwSW5CdWZmZXIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gUmVhZAotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXItPnJlYWQoJmJ1ZmZlciwgTlVMTCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBQcm92aWRlIHRoZSBlbmNvZGVkIEFVIHRvIHRoZSB3cml0ZXIKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwgYnVmZmVyLAotICAgICAgICBwT3V0QnVmZmVyKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9zdGVwIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9zdGVwIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24gYmVnaW4gb3B0aW9uSUQgMHglWCIsIG9wdGlvbklEKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3dpdGNoKCBvcHRpb25JRCApIHsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb246IHVuc3VwcG9ydGVkIG9wdGlvbklkIDB4JVgiLAotICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0T3B0aW9uIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBmb3JtYXQsIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBGb3JtYXQsICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEVuY29kZXJJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlIDB4JXggMHgleCIscEZvcm1hdCwKLSAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UpOwotICAgIFNBRkVfTUFMTE9DKCpwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlLCAxLAotICAgICAgICAiQXVkaW9FbmNvZGVyIik7Ci0KLSAgICAqcEZvcm1hdCA9IGZvcm1hdDsKLQotICAgIHN3aXRjaCggZm9ybWF0ICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQUFDOgotICAgICAgICB7Ci0gICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X0FBQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgewotICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9BTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUDM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0SW5pdCA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXRfTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZTogdW5zdXBwb3J0ZWQgZm9ybWF0ICVkIiwKLSAgICAgICAgICAgICAgICBmb3JtYXQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0Q2xlYW5VcCAgICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW47Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RDbG9zZSAgICAgICAgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFN0ZXAgICAgICAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXA7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RHZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb247Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnBFbmNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLWV4dGVybiAiQyIgewotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FBQygKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00RU5DT0RFUl9rQUFDLCBwRm9ybWF0LCBwRW5jb2RlckludGVyZmFjZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQU1STkIoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00RU5DT0RFUl9rQU1STkIsIHBGb3JtYXQsIHBFbmNvZGVySW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9NUDMoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QMyBubyBlcnJvciIpOwotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX2tNUDMsIHBGb3JtYXQsIHBFbmNvZGVySW50ZXJmYWNlKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckJ1ZmZlci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckJ1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTdiMjhlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JCdWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQnVmZmVyLmMKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBCdWZmZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jdW5kZWYgTTRPU0FfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgTTRPU0FfVFJBQ0VfTEVWRUwgMQotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQnVmZmVyLmgiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0KLSNkZWZpbmUgVklERU9FRElUT1JfQlVGRkVQT09MX01BWF9OQU1FX1NJWkUgNDAKLQotI2RlZmluZSBWSURFT0VESVRPUl9TQUZFX0ZSRUUocCkgXAoteyBcCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwKSBcCi0gICAgeyBcCi0gICAgICAgIGZyZWUocCk7IFwKLSAgICAgICAgcCA9IE00T1NBX05VTEw7IFwKLSAgICB9IFwKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbmJCdWZmZXJzKQotICogQGJyaWVmICAgQWxsb2NhdGUgYSBwb29sIG9mIG5iQnVmZmVycyBidWZmZXJzCi0gKgotICogQHBhcmFtICAgcHBvb2wgICAgICA6IElOIFRoZSBidWZmZXIgcG9vbCB0byBjcmVhdGUKLSAqIEBwYXJhbSAgIG5iQnVmZmVycyAgOiBJTiBUaGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlIHBvb2wKLSAqIEBwYXJhbSAgIHBvb2xOYW1lICAgOiBJTiBhIG5hbWUgZ2l2ZW4gdG8gdGhlIHBvb2wKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCoqIHBwb29sLAotICAgICAgICBNNE9TQV9VSW50MzIgbmJCdWZmZXJzLCBNNE9TQV9DaGFyKiBwb29sTmFtZSkKLXsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBvb2w7Ci0gICAgTTRPU0FfVUludDMyIGluZGV4OwotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgOiBwcG9vbCA9ICVwIG5iQnVmZmVycyA9ICUiIFBSSXUzMiwKLSAgICAgICAgcHBvb2wsIG5iQnVmZmVycyk7Ci0KLSAgICBwb29sID0gTTRPU0FfTlVMTDsKLSAgICBwb29sID0gKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBzaXplb2YoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wpLCBWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sOiBwb29sIikpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBvb2wpCi0gICAgewotICAgICAgICBsZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbF9DbGVhbnVwOwotICAgIH0KLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sIDogQWxsb2NhdGluZyBQb29sIGJ1ZmZlcnMiKTsKLSAgICBwb29sLT5wTlhQQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwb29sLT5wTlhQQnVmZmVyID0gKFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcikqbmJCdWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJCVUZGRVJfYWxsb2NhdGVQb29sOiBwTlhQQnVmZmVyIikpOwotICAgIGlmKE00T1NBX05VTEwgPT0gcG9vbC0+cE5YUEJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIGxlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA7Ci0gICAgfQotCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbmJCdWZmZXJzOyBpbmRleCsrKQotICAgIHsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sIDogQWxsb2NhdGluZyBQb29sIG5hbWUgYnVmZmVyIik7Ci0gICAgcG9vbC0+cG9vbE5hbWUgPSBNNE9TQV9OVUxMOwotICAgIHBvb2wtPnBvb2xOYW1lID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVQT09MX01BWF9OQU1FX1NJWkUsVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAoTTRPU0FfQ2hhciopKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sOiBwb29sbmFtZSIpKTsKLSAgICBpZihwb29sLT5wb29sTmFtZSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgbGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICBnb3RvIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2xfQ2xlYW51cDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFzc2lnbmluZyBQb29sIG5hbWUgYnVmZmVyIik7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKilwb29sLT5wb29sTmFtZSwgMCxWSURFT0VESVRPUl9CVUZGRVBPT0xfTUFYX05BTUVfU0laRSk7Ci0gICAgbWVtY3B5KCh2b2lkICopcG9vbC0+cG9vbE5hbWUsICh2b2lkICopcG9vbE5hbWUsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFLTEpOwotCi0gICAgcG9vbC0+TkIgPSBuYkJ1ZmZlcnM7Ci0KLVZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2xfQ2xlYW51cDoKLSAgICBpZihNNE5PX0VSUk9SICE9IGxlcnIpCi0gICAgewotICAgICAgICBWSURFT0VESVRPUl9TQUZFX0ZSRUUocG9vbC0+cE5YUEJ1ZmZlcik7Ci0gICAgICAgIFZJREVPRURJVE9SX1NBRkVfRlJFRShwb29sLT5wb29sTmFtZSk7Ci0gICAgICAgIFZJREVPRURJVE9SX1NBRkVfRlJFRShwb29sKTsKLSAgICB9Ci0gICAgKnBwb29sID0gcG9vbDsKLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCBFTkQiKTsKLQotICAgIHJldHVybiBsZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCkKLSAqIEBicmllZiAgIERlYWxsb2NhdGUgYSBidWZmZXIgcG9vbAotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gZnJlZQotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyICBqID0gMDsKLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2wgOiBwcG9vbCA9ICVwIiwgcHBvb2wpOwotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGZvciAoaiA9IDA7IGogPCBwcG9vbC0+TkI7IGorKykKLSAgICB7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpOwotICAgICAgICAgICAgcHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocHBvb2wgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIFNBRkVfRlJFRShwcG9vbC0+cE5YUEJ1ZmZlcik7Ci0gICAgICAgIFNBRkVfRlJFRShwcG9vbC0+cG9vbE5hbWUpOwotICAgICAgICBTQUZFX0ZSRUUocHBvb2wpOwotICAgIH0KLQotICAgIHJldHVybihlcnIpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gKiAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotICogQGJyaWVmICAgUmV0dXJucyBhIGJ1ZmZlciBpbiBhIGdpdmVuIHN0YXRlCi0gKgotICogQHBhcmFtICAgcHBvb2wgICAgICA6IElOIFRoZSBidWZmZXIgcG9vbAotICogQHBhcmFtICAgZGVzaXJlZFN0YXRlIDogSU4gVGhlIGJ1ZmZlciBzdGF0ZQotICogQHBhcmFtICAgcE5YUEJ1ZmZlciA6IElOIFRoZSBzZWxlY3RlZCBidWZmZXIKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZSBkZXNpcmVkU3RhdGUsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0Jvb2wgYkZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfVUludDMyIGksIGlidWY7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlciBmcm9tICVzIGluIHN0YXRlPSVkIiwKLSAgICAgICAgcHBvb2wtPnBvb2xOYW1lLCBkZXNpcmVkU3RhdGUpOwotCi0gICAgaWJ1ZiA9IDA7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IHBwb29sLT5OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYkZvdW5kID0gKHBwb29sLT5wTlhQQnVmZmVyW2ldLnN0YXRlID09IGRlc2lyZWRTdGF0ZSk7Ci0gICAgICAgIGlmIChiRm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlidWYgPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZighYkZvdW5kKQotICAgIHsKLSAgICAgICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIgTm8gYnVmZmVyIGF2YWlsYWJsZSBpbiBzdGF0ZSAlZCIsCi0gICAgICAgICAgICBkZXNpcmVkU3RhdGUpOwotICAgICAgICAqcE5YUEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFOwotICAgIH0KLQotICAgIC8qIGNhc2Ugd2hlcmUgYSBidWZmZXIgaGFzIGJlZW4gZm91bmQgKi8KLSAgICAqcE5YUEJ1ZmZlciA9ICYocHBvb2wtPnBOWFBCdWZmZXJbaWJ1Zl0pOwotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXI6IGlkeCA9ICUiIFBSSXUzMiwgaWJ1Zik7Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9pbml0UG9vbEJ1ZmZlcnMoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBvb2wsCi0gICAgTTRPU0FfVUludDMyIGxTaXplKQotewotICAgIE00T1NBX0VSUiAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgIGluZGV4LCBqOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIHBvb2wgKi8KLSAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IHBvb2wtPk5COyBpbmRleCsrKQotICAgIHsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5wRGF0YSA9IChNNE9TQV9Wb2lkKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBsU2l6ZSwgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiQlVGRkVSX2luaXRQb29sQnVmZmVyczogQnVmZmVyIGRhdGEiKSk7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgPT0gcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbmRleDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5zaXplID0gMDsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uc3RhdGUgPSBWSURFT0VESVRPUl9CVUZGRVJfa0VtcHR5OwotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5pZHggPSBpbmRleDsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uYnVmZkNUUyA9IC0xOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCAqcG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIGRlc2lyZWRTdGF0ZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpCi17Ci0gICAgTTRPU0FfRVJSICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiAgaW5kZXgsIGo7Ci0gICAgTTRfTWVkaWFUaW1lICBjYW5kaWRhdGVUaW1lU3RhbXAgPSAoTTRfTWVkaWFUaW1lKTB4N2ZmZmZmZjsKLSAgICBNNE9TQV9Cb29sICAgIGJGb3VuZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgKnBOWFBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIGZvcihpbmRleCA9IDA7IGluZGV4PCBwb29sLT5OQjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIGlmKHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnN0YXRlID09IGRlc2lyZWRTdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uYnVmZkNUUyA8PSBjYW5kaWRhdGVUaW1lU3RhbXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBjYW5kaWRhdGVUaW1lU3RhbXAgPSBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5idWZmQ1RTOwotICAgICAgICAgICAgICAgICAgICAqcE5YUEJ1ZmZlciA9ICYocG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKE00T1NBX0ZBTFNFID09IGJGb3VuZCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfZ2V0T2xkZXN0QnVmZmVyIFdBUk5JTkcgbm8gYnVmZmVyIGF2YWlsYWJsZSIpOwotICAgICAgICBlcnIgPSBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvck1wM1JlYWRlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmUwZDA1ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIE1QMyBSZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9NUDNSRUFERVIiCi0KLS8qKgotICogSEVBREVSUwotICoKLSAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTXAzUmVhZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqIFNPVVJDRSBDTEFTUwotICovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8qKgotICogRU5HSU5FIElOVEVSRkFDRQotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFNGIE1QMyByZWFkZXIgc2hlbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNwPERhdGFTb3VyY2U+ICAgICAgICAgICAgICBtRGF0YVNvdXJjZTsKLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gICAgICAgICAgbUV4dHJhY3RvcjsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgbU1lZGlhU291cmNlOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBtQXVkaW9BdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbU1heER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICBtU3RyZWFtTnVtYmVyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBtU2Vla2luZzsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yRmxhZ3M7Ci19IFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIE1QMyByZWFkZXIKLSAqIEBub3RlICAgICBhbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGUgYmVnaW4iKTsKLQotICAgIC8qIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uICovCi0gICAgU0FGRV9NQUxMT0MocFJlYWRlckNvbnRleHQsIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlciIpOwotCi0gICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb24gPSAwOwotICAgICpwQ29udGV4dCA9IHBSZWFkZXJDb250ZXh0OwotCi1jbGVhblVwOgotICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgIGRlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSBNUDMgcmVhZGVyCi0gKiBAbm90ZSAgICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKiBAcGFyYW0gICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBUaGUgaW5wdXQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmVhZGVyQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveSBiZWdpbiIpOwotCi0gICAgU0FGRV9GUkVFKHBSZWFkZXJDb250ZXh0KTsKLWNsZWFuVXA6Ci0gICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBvcGVuIHRoZSByZWFkZXIgYW5kIGluaXRpYWxpemVzIGl0cyBjcmVhdGVkIGluc3RhbmNlCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBNUDMgZmlsZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwRmlsZURlc2NyaXB0b3I6ICAgIChJTikgICAgUG9pbnRlciB0byBwcm9wcmlldGFyeSBkYXRhIGlkZW50aWZ5aW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSB0byBvcGVuCi0KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICAgdGhlIG1lZGlhIGlzIERSTSBwcm90ZWN0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcil7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gYmVnaW4iKTsKLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBzdGFydCAlcyIsCi0gICAgICAgIChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlICgoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBEYXRhc291cmNlIGVuZCIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIERhdGFzb3VyY2UgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIHN0YXJ0Iik7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKAotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UsTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIGVuZCIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yID09IE5VTEwpICAgIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlciA9IDA7Ci0KLSAgICBpbnQzMl90IGlzRFJNUHJvdGVjdGVkID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZpc0RSTVByb3RlY3RlZCk7Ci0gICAgaWYgKGlzRFJNUHJvdGVjdGVkKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGVycm9yIC0gRFJNIFByb3RlY3RlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGNsb3NlcyB0aGUgTVAzIHJlYWRlcgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY2xvc2UgYmVnaW4iKTsKLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZWFkZXJDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgZnJlZShwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLlwKLSAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5cCi0gICAgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+c3RvcCgpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UuY2xlYXIoKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci5jbGVhcigpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZS5jbGVhcigpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgKE9VVCkgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdXNlcikgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbiBiZWdpbjogb3B0aW9uSWQ9ICVkICIsKGludClvcHRpb25JZCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpIHsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9EdXJhdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIk1wM1JlYWRlciBkdXJhdGlvbj0lbGQiLHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb24pOwotICAgICAgICAgICAgKihNNE9TQV9UaW1lKilwVmFsdWUgPSBwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwQml0cmF0ZSA9IChNNE9TQV9VSW50MzIqKXBWYWx1ZTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEJpdHJhdGUgPSAwOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YxVGFnOgotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YyVGFnOgotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhOgotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uOiAgTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgYW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOKSAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdXNlcikgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBUaGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgb3B0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCBiZWdpbjogb3B0aW9uSWQ6ICV1IFZhbHVlOiAlcCAiLAotICAgICAgICAgIG9wdGlvbklkLCBwVmFsdWUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZWFkZXJDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpIHsKLSAgICAgICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHI6Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0IGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAganVtcCBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCB0aW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgKElOKSAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyKElOKSAgIHN0cmVhbSBkZXNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBUaW1lICAgICAgICAgKEkvTylJTjp0aGUgdGltZSB0byBqdW1wIHRvIChpbiBtcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRPU0FfSW50MzIqIHBUaW1lKSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNNE9TQV9UaW1lIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wIGJlZ2luIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBUaW1lID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wOiBpbnZhbGlkIHRpbWUgcG9pbnRlciIpOwotCi0gICAgaWYocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBSZWFkZXJDb250ZXh0LT5cCi0gICAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXIpewotICAgICAgICBwQXUgPSAmcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wOiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcCB0aW1lIG1zICVsZCAiLCB0aW1lNjQpOwotCi0gICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICB0aW1lNjQgPSB0aW1lNjQgKiAxMDAwOyAvKiBDb252ZXJ0IHRoZSB0aW1lIGludG8gbWljcm8gc2VjICovCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXAgdGltZSB1cyAlbGQgIiwgdGltZTY0KTsKLQotICAgIHBSZWFkZXJDb250ZXh0LT5tU2Vla2luZyA9IE00T1NBX1RSVUU7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1TZWVrVGltZSA9IHRpbWU2NDsKLQotICAgIHRpbWU2NCA9IHRpbWU2NCAvIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWxsaSBzZWMgKi8KLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgbWVkaWEgZmlsZQotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiAgIChPVVQpIHBvaW50ZXIgdG8gYSB1c2VyIGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lZGlhIGZhbWlseSBvZiB0aGUgZm91bmQgc3RyZWFtCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChPVVQpIHBvaW50ZXIgdG8gYSBzdHJlYW0gaGFuZGxlciB0aGF0IHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGFuZCBmaWxsZWQgd2l0aCBzdHJlYW0gZGVzY3JpcHRpb24KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICBubyBtb3JlIGF2YWlsYWJsZSBzdHJlYW0gaW4gdGhlIG1lZGlhCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgKnBNZWRpYUZhbWlseSwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyUGFyYW0pIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gc3RyZWFtRGVzYzsKLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXI7Ci0gICAgTTRPU0FfVUludDggdHlwZSwgdGVtcDsKLSAgICBNNE9TQV9Cb29sIGhhdmVBdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gTlVMTDsKLSAgICBpbnQ2NF90IER1cmF0aW9uOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gYmVnaW4iKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZWFkZXJDb250ZXh0ID09IDApLCAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW06IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ID09IDApLCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhRmFtaWx5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlclBhcmFtID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gc3RyZWFtIG51bWJlciA9ICVkIiwKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIpOwotICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlciA+PSAxKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIG1heCBudW1iZXIgb2Ygc3RyZWFtIHJlYWNoZWQiKTsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNOwotICAgIH0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlciA9IHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyICsgMTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBudW1iZXIgb2YgVHJhY2tzJWQiLAotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKSk7Ci0gICAgZm9yICh0ZW1wID0gMDsgdGVtcCA8IHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyB0ZW1wKyspIHsKLSAgICAgICAgbWV0YSA9IHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKHRlbXApOwotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICAgICAgaWYgKCFoYXZlQXVkaW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewotICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmdldFRyYWNrKHRlbXApOwotICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+c3RhcnQoKTsKLSAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGF2ZUF1ZGlvKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghaGF2ZUF1ZGlvKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIG5vIG1vcmUgc3RyZWFtICIpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNOwotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yRmxhZ3MgPSBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+ZmxhZ3MoKTsKLSAgICAqcE1lZGlhRmFtaWx5ID0gTTRSRUFERVJfa01lZGlhRmFtaWx5QXVkaW87Ci0KLSAgICBzdHJlYW1EZXNjLmR1cmF0aW9uID0gbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJkR1cmF0aW9uKTsKLSAgICBzdHJlYW1EZXNjLmR1cmF0aW9uID0gKE00T1NBX1RpbWUpRHVyYXRpb24vMTAwMDsKLQotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgKGludDMyX3QqKSZzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlKTsKLSAgICBtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsIChpbnQzMl90Kikmc3RyZWFtRGVzYy50aW1lU2NhbGUpOwotICAgIEFMT0dWKCJCaXRyYXRlID0gJWQsIFNhbXBsZVJhdGUgPSAlZCBkdXJhdGlvbiA9ICVsbGQiLAotICAgICAgICBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlLHN0cmVhbURlc2MudGltZVNjYWxlLER1cmF0aW9uLzEwMDApOwotCi0gICAgc3RyZWFtRGVzYy5zdHJlYW1UeXBlID0gTTRTWVNfa01QMzsKLSAgICBzdHJlYW1EZXNjLnByb2ZpbGVMZXZlbCA9IDB4RkYgOwotICAgIHN0cmVhbURlc2Muc3RyZWFtSUQgPSBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlcjsKLSAgICBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgIHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgIHN0cmVhbURlc2MubWF4Qml0cmF0ZSA9IHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGU7Ci0KLSAgICAvKiAgICBBbGxvY2F0ZSB0aGUgYXVkaW8gc3RyZWFtIGhhbmRsZXIgYW5kIHNldCBpdHMgcGFyYW1ldGVycyAgICAqLwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXIgPSAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLCBNNFJFQURFUl9NUDMsCi0gICAgICAgIChNNE9TQV9DaGFyKikiTTRfQXVkaW9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBpZiAocEF1ZGlvU3RyZWFtSGFuZGxlciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIG1hbGxvYyBmYWlsZWQiKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+c3RvcCgpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZS5jbGVhcigpOwotCi0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcFN0cmVhbUhhbmRsZXIgPShNNF9TdHJlYW1IYW5kbGVyKikocEF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgKnBTdHJlYW1IYW5kbGVyUGFyYW0gPSBwU3RyZWFtSGFuZGxlcjsKLSAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciA9IHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKTsKLQotICAgIGlmIChtZXRhID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gbWV0YSBpcyBOVUxMIik7Ci0gICAgfQotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IHN0cmVhbURlc2MudGltZVNjYWxlOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgKE00T1NBX1VJbnQ4Kikoc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9Ci0gICAgICAgIHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0KLSAgICBtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwKLSAgICAgICAgKGludDMyX3QqKSZwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMpOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoID0gMTE1MjsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLQotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSA9IE5VTEw7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQgPSBzdHJlYW1EZXNjLnN0cmVhbUlEOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2R1cmF0aW9uID0gc3RyZWFtRGVzYy5kdXJhdGlvbjsKLSAgICBwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uID0gc3RyZWFtRGVzYy5kdXJhdGlvbjsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlQml0UmF0ZSA9IHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGU7Ci0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemUgPSAwOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVBdWRpb01wMzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pICAgICBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciB0byB3aGljaAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWNjZXNzIHVuaXQgd2lsbCBiZSBhc3NvY2lhdGVkCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQ6ICAgIChJTi9PVVQpIHBvaW50ZXIgdG8gdGhlIGFjY2VzcyB1bml0IChhbGxvY2F0ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNhbGxlcikgdG8gaW5pdGlhbGl6ZQotICogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCAqcEF1OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3QgaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0IHN0YXJ0ICIpOwotICAgIGlmKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwUmVhZGVyQ29udGV4dC0+XAotICAgICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyKXsKLSAgICAgICAgcEF1ID0gJnBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0IFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSBwQXUgc3RydWN0dXJlICovCi0gICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEF1LT5zaXplICAgICAgICA9IDA7Ci0gICAgcEF1LT5DVFMgICAgICAgICA9IDA7Ci0gICAgcEF1LT5EVFMgICAgICAgICA9IDA7Ci0gICAgcEF1LT5hdHRyaWJ1dGUgICA9IDA7Ci0gICAgcEF1LT5uYkZyYWcgICAgICA9IDA7Ci0KLSAgICAvKiBJbml0aWFsaXplIHBBY2Nlc3NVbml0IHN0cnVjdHVyZSAqLwotICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fQ1RTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9EVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgID0gTTRPU0FfTlVMTDsKLSAgICBwQWNjZXNzVW5pdC0+bV9tYXhzaXplICAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemU7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RyZWFtSUQgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RydWN0U2l6ZSAgID0gc2l6ZW9mKE00X0FjY2Vzc1VuaXQpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdCBlbmQiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHJlc2V0IHRoZSBzdHJlYW0sIGkuZSBzZWVrIGl0IHRvIHRoZSBiZWdpbm5pbmcKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIGNvbnRleHQ6ICAgICAgICAgIChJTikgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQgPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0IHN0YXJ0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwUmVhZGVyQ29udGV4dC0+XAotICAgICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIHBBdSA9ICZwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0IFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLQotICAgIHBSZWFkZXJDb250ZXh0LT5tU2Vla2luZyA9IE00T1NBX1RSVUU7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1TZWVrVGltZSA9IHRpbWU2NDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0cyBhbiBhY2Nlc3MgdW5pdCAoQVUpIGZyb20gdGhlIHN0cmVhbSBoYW5kbGVyIHNvdXJjZS4KLSAqIEBub3RlICAgIEFVIGlzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhbW91bnQgb2YgZGF0YSB0byBiZSBkZWNvZGVkIGJ5IGRlY29kZXIKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAoSU4pIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXIgKElOKSBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgIHBBY2Nlc3NVbml0ICAgIChJL08pUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybnMgICBNNEVSUl9BTExPQyAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm5zICAgTTRXQVJfTk9fTU9SRV9BVSAgdGhlcmUgYXJlIG5vIG1vcmUgYWNjZXNzIHVuaXQgaW4gdGhlIHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTWVkaWFCdWZmZXIgKm1BdWRpb0J1ZmZlcjsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUgc3RhcnQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZWFkZXJDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBSZWFkZXJDb250ZXh0LT5cCi0gICAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgcEF1ID0gJnBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OiBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tU2Vla2luZykgewotICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhwUmVhZGVyQ29udGV4dC0+bVNlZWtUaW1lKTsKLSAgICB9Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLT5yZWFkKCZtQXVkaW9CdWZmZXIsICZvcHRpb25zKTsKLQotICAgIGlmIChtQXVkaW9CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBpZiAoKHBBdS0+ZGF0YUFkZHJlc3MgPT0gTlVMTCkgfHwKLSAgICAgICAgICAgIChwQXUtPnNpemUgPCBtQXVkaW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpKSkgewotICAgICAgICAgICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUoKE00T1NBX0ludDMyKilwQXUtPmRhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSAoTTRPU0FfSW50MzIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAobUF1ZGlvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDMpICYgfjB4MywKLSAgICAgICAgICAgICAgICBNNFJFQURFUl9NUDMsIChNNE9TQV9DaGFyKikicEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MiICk7Ci0KLSAgICAgICAgICAgIGlmIChwQXUtPmRhdGFBZGRyZXNzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1IG1hbGxvYyBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZS5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBBdS0+c2l6ZSA9IG1BdWRpb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIG1lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEF1LT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIChjb25zdCBjaGFyICopbUF1ZGlvQnVmZmVyLT5kYXRhKCkgKyBtQXVkaW9CdWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICAgICAgbUF1ZGlvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAoaW50NjRfdCopJnBBdS0+Q1RTKTsKLQotCi0gICAgICAgIHBBdS0+Q1RTID0gcEF1LT5DVFMgLyAxMDAwOyAvKmNvbnZlcnRpbmcgdGhlIG1pY3Jvc2VjIHRvIG1pbGxpc2VjICovCi0gICAgICAgIHBBdS0+RFRTICA9IHBBdS0+Q1RTOwotICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IE00U1lTX2tGcmFnQXR0ck9rOwotICAgICAgICBtQXVkaW9CdWZmZXItPnJlbGVhc2UoKTsKLQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1IEFVIENUUyA9ICVsZCIscEF1LT5DVFMpOwotCi0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzID0gKE00T1NBX0ludDgqKSBwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgPSBwQXUtPkNUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fRFRTID0gcEF1LT5EVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9IHBBdS0+YXR0cmlidXRlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUgRU9TIHJlYWNoZWQuIik7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemU9MDsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9Ci0gICAgcEF1LT5uYkZyYWcgPSAwOwotCi0gICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tU2Vla2luZyA9IE00T1NBX0ZBTFNFOwotICAgIG1BdWRpb0J1ZmZlciA9IE5VTEw7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBlbmQiKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWV4dGVybiAiQyIgewotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZTogYmVnaW4iKTsKLSAgICAvKiBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrICovCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwTWVkaWFUeXBlLCAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmRyR2xvYmFsSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJkckRhdGFJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBTQUZFX01BTExPQygqcFJkckdsb2JhbEludGVyZmFjZSwgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlLCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlIik7Ci0gICAgU0FGRV9NQUxMT0MoKnBSZHJEYXRhSW50ZXJmYWNlLCBNNFJFQURFUl9EYXRhSW50ZXJmYWNlLCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlIik7Ci0KLSAgICAqcE1lZGlhVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVNUDM7Ci0KLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGUgICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGU7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RGVzdHJveSAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RPcGVuICAgICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENsb3NlICAgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9zZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dFN0cmVhbSA9Ci0gICAgICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW07Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ID0KLSAgICAgICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0YXJ0ICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RKdW1wICAgICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldFByZXZSYXBUaW1lID0gTTRPU0FfTlVMTDsKLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0QXUgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdTsKLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9yZWFkZXJDb250ZXh0ICAgICAgPSBNNE9TQV9OVUxMOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFNBRkVfRlJFRSgqcFJkckdsb2JhbEludGVyZmFjZSk7Ci0gICAgICAgIFNBRkVfRlJFRSgqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2U6IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci19ICAvKiBleHRlcm4gIkMiICovCi19ICAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclV0aWxzLmNwcCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyNjRhMmUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclV0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JVdGlscy5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBVdGlsaXRpZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJTRl91dGlscyIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotCi0vKiBBbmRyb2lkIGluY2x1ZGVzKi8KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxtZW1vcnkuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogIERFQlVHIExFVkVMIFNFVFVQICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBMT0cxIEFMT0dFICAgIC8qRVJST1JTIExvZ2dpbmcqLwotI2RlZmluZSBMT0cyIEFMT0dJICAgIC8qV0FSTklORyBMb2dnaW5nKi8KLSNkZWZpbmUgTE9HMyAvL0FMT0dWICAvKkNPTU1FTlRTIExvZ2dpbmcqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXZvaWQgZGlzcGxheU1ldGFEYXRhKGNvbnN0IHNwPE1ldGFEYXRhPiBtZXRhKSB7Ci0KLSAgICBjb25zdCBjaGFyKiBjaGFyRGF0YTsKLSAgICBpbnQzMl90IGludDMyRGF0YTsKLSAgICBpbnQ2NF90IGludDY0RGF0YTsKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIGNvbnN0IHZvaWQqIGRhdGE7Ci0gICAgdm9pZCogcHRyOwotICAgIHNpemVfdCBzaXplOwotCi0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleU1JTUVUeXBlICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlXaWR0aCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlIZWlnaHQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5SUZyYW1lc0ludGVydmFsICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5U3RyaWRlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVN0cmlkZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVNsaWNlSGVpZ2h0LCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVNsaWNlSGVpZ2h0ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUNoYW5uZWxDb3VudCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5U2FtcGxlUmF0ZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Qml0UmF0ZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlFU0RTIHR5cGU9JWQgc2l6ZT0lenUiLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFWQ0MgZGF0YT0weCVYIHR5cGU9JWQgc2l6ZT0lenUiLAotICAgICAgICAgICAgKigodW5zaWduZWQgaW50KilkYXRhKSwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlWb3JiaXNJbmZvIHR5cGU9JWQgc2l6ZT0lenUiLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlWb3JiaXNCb29rcyB0eXBlPSVkIHNpemU9JXp1IiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVdhbnRzTkFMRnJhZ21lbnRzICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5SXNTeW5jRnJhbWUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUlzQ29kZWNDb25maWcgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUaW1lLCAmaW50NjREYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRpbWUgJWxsZCIsIGludDY0RGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUR1cmF0aW9uLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUR1cmF0aW9uICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q29sb3JGb3JtYXQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZFBvaW50ZXIoa0tleVBsYXRmb3JtUHJpdmF0ZSwgJnB0cikpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlQbGF0Zm9ybVByaXZhdGUgcG9pbnRlcj0lcCIsIHB0cik7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURlY29kZXJDb21wb25lbnQgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJ1ZmZlcklELCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUJ1ZmZlcklEICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleU1heElucHV0U2l6ZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZpbnQ2NERhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VGh1bWJuYWlsVGltZSAlbGxkIiwgaW50NjREYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBbGJ1bSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUFydGlzdCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFydGlzdCAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBbGJ1bUFydGlzdCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0aXN0ICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUNvbXBvc2VyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q29tcG9zZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5R2VucmUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlHZW5yZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlUaXRsZSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRpdGxlICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleVllYXIsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlZZWFyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFsYnVtQXJ0LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0IHR5cGU9JWQgc2l6ZT0lenUiLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBbGJ1bUFydE1JTUUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5QXV0aG9yLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5QXV0aG9yICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUNEVHJhY2tOdW1iZXIsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlDRFRyYWNrTnVtYmVyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURpc2NOdW1iZXIsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlEaXNjTnVtYmVyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURhdGUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlEYXRlICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleVdyaXRlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVdyaXRlciAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VGltZVNjYWxlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRpbWVTY2FsZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvUHJvZmlsZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlWaWRlb1Byb2ZpbGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlWaWRlb0xldmVsLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZpZGVvTGV2ZWwgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5NjRCaXRGaWxlT2Zmc2V0ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RmlsZVR5cGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5RmlsZVR5cGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsICZpbnQ2NERhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VHJhY2tUaW1lU3RhdHVzICVsbGQiLCBpbnQ2NERhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlSZWFsVGltZVJlY29yZGluZywgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlSZWFsVGltZVJlY29yZGluZyAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotfQotCi0vKioKLSAqIFRoaXMgY29kZSB3YXMgZXh0cmFjdGVkIGZyb20gU3RhZ2VGcmlnaHQgTVBFRzQgd3JpdGVyCi0gKiBJcyBpcyB1c2VkIHRvIHBhcnNlIGFuZCBmb3JtYXQgdGhlIEFWQyBjb2RlYyBzcGVjaWZpYyBpbmZvIHJlY2VpdmVkCi0gKiBmcm9tIFN0YWdlRnJpZ2h0IGVuY29kZXJzCi0gKi8KLXN0YXRpYyBjb25zdCB1aW50OF90IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0ID0gMHgwNzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtOYWxVbml0VHlwZVBpY1BhcmFtU2V0ID0gMHgwODsKLXN0cnVjdCBBVkNQYXJhbVNldCB7Ci0gICAgQVZDUGFyYW1TZXQodWludDE2X3QgbGVuZ3RoLCBjb25zdCB1aW50OF90ICpkYXRhKQotICAgICAgICA6IG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkge30KLQotICAgIHVpbnQxNl90IG1MZW5ndGg7Ci0gICAgY29uc3QgdWludDhfdCAqbURhdGE7Ci19Owotc3RydWN0IEFWQ0NvZGVjU3BlY2lmaWNDb250ZXh0IHsKLSAgICBMaXN0PEFWQ1BhcmFtU2V0PiBtU2VxUGFyYW1TZXRzOwotICAgIExpc3Q8QVZDUGFyYW1TZXQ+IG1QaWNQYXJhbVNldHM7Ci0gICAgdWludDhfdCBtUHJvZmlsZUlkYzsKLSAgICB1aW50OF90IG1Qcm9maWxlQ29tcGF0aWJsZTsKLSAgICB1aW50OF90IG1MZXZlbElkYzsKLX07Ci0KLWNvbnN0IHVpbnQ4X3QgKnBhcnNlUGFyYW1TZXQoQVZDQ29kZWNTcGVjaWZpY0NvbnRleHQqIHBDLAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuZ3RoLCBpbnQgdHlwZSwgc2l6ZV90ICpwYXJhbVNldExlbikgewotICAgIENIRUNLKHR5cGUgPT0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQgfHwKLSAgICAgICAgICB0eXBlID09IGtOYWxVbml0VHlwZVBpY1BhcmFtU2V0KTsKLQotICAgIHNpemVfdCBieXRlc0xlZnQgPSBsZW5ndGg7Ci0gICAgd2hpbGUgKGJ5dGVzTGVmdCA+IDQgICYmCi0gICAgICAgICAgICBtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCAmZGF0YVtsZW5ndGggLSBieXRlc0xlZnRdLCA0KSkgewotICAgICAgICAtLWJ5dGVzTGVmdDsKLSAgICB9Ci0gICAgaWYgKGJ5dGVzTGVmdCA8PSA0KSB7Ci0gICAgICAgIGJ5dGVzTGVmdCA9IDA7IC8vIExhc3QgcGFyYW1ldGVyIHNldAotICAgIH0KLSAgICBjb25zdCB1aW50OF90ICpuZXh0U3RhcnRDb2RlID0gJmRhdGFbbGVuZ3RoIC0gYnl0ZXNMZWZ0XTsKLSAgICAqcGFyYW1TZXRMZW4gPSBuZXh0U3RhcnRDb2RlIC0gZGF0YTsKLSAgICBpZiAoKnBhcmFtU2V0TGVuID09IDApIHsKLSAgICAgICAgQUxPR0UoIlBhcmFtIHNldCBpcyBtYWxmb3JtZWQsIHNpbmNlIGl0cyBsZW5ndGggaXMgMCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBBVkNQYXJhbVNldCBwYXJhbVNldCgqcGFyYW1TZXRMZW4sIGRhdGEpOwotICAgIGlmICh0eXBlID09IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0KSB7Ci0gICAgICAgIGlmICgqcGFyYW1TZXRMZW4gPCA0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2VxIHBhcmFtZXRlciBzZXQgbWFsZm9ybWVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAocEMtPm1TZXFQYXJhbVNldHMuZW1wdHkoKSkgewotICAgICAgICAgICAgcEMtPm1Qcm9maWxlSWRjID0gZGF0YVsxXTsKLSAgICAgICAgICAgIHBDLT5tUHJvZmlsZUNvbXBhdGlibGUgPSBkYXRhWzJdOwotICAgICAgICAgICAgcEMtPm1MZXZlbElkYyA9IGRhdGFbM107Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocEMtPm1Qcm9maWxlSWRjICE9IGRhdGFbMV0gfHwKLSAgICAgICAgICAgICAgICBwQy0+bVByb2ZpbGVDb21wYXRpYmxlICE9IGRhdGFbMl0gfHwKLSAgICAgICAgICAgICAgICBwQy0+bUxldmVsSWRjICE9IGRhdGFbM10pIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiSW5jb25zaXN0ZW50IHByb2ZpbGUvbGV2ZWwgZm91bmQgaW4gc2VxIHBhcmFtZXRlciBzZXRzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPm1TZXFQYXJhbVNldHMucHVzaF9iYWNrKHBhcmFtU2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBwQy0+bVBpY1BhcmFtU2V0cy5wdXNoX2JhY2socGFyYW1TZXQpOwotICAgIH0KLSAgICByZXR1cm4gbmV4dFN0YXJ0Q29kZTsKLX0KLQotc3RhdHVzX3QgYnVpbGRBVkNDb2RlY1NwZWNpZmljRGF0YSh1aW50OF90ICoqcE91dHB1dERhdGEsIHNpemVfdCAqcE91dHB1dFNpemUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBNZXRhRGF0YSAqcGFyYW0pCi17Ci0gICAgLy9BTE9HVigiYnVpbGRBVkNDb2RlY1NwZWNpZmljRGF0YSIpOwotCi0gICAgaWYgKCAocE91dHB1dERhdGEgPT0gTlVMTCkgfHwgKHBPdXRwdXRTaXplID09IE5VTEwpICkgewotICAgICAgICBBTE9HRSgib3V0cHV0IGlzIGludmFsaWQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoKnBPdXRwdXREYXRhICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkFscmVhZHkgaGF2ZSBjb2RlYyBzcGVjaWZpYyBkYXRhIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgIEFMT0dFKCJDb2RlYyBzcGVjaWZpYyBkYXRhIGxlbmd0aCB0b28gc2hvcnQ6ICV6dSIsIHNpemUpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIC8vIERhdGEgaXMgaW4gdGhlIGZvcm0gb2YgQVZDQ29kZWNTcGVjaWZpY0RhdGEKLSAgICBpZiAobWVtY21wKCJceDAwXHgwMFx4MDBceDAxIiwgZGF0YSwgNCkpIHsKLSAgICAgICAgLy8gMiBieXRlcyBmb3IgZWFjaCBvZiB0aGUgcGFyYW1ldGVyIHNldCBsZW5ndGggZmllbGQKLSAgICAgICAgLy8gcGx1cyB0aGUgNyBieXRlcyBmb3IgdGhlIGhlYWRlcgotICAgICAgICBpZiAoc2l6ZSA8IDQgKyA3KSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlenUiLCBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAqcE91dHB1dFNpemUgPSBzaXplOwotICAgICAgICAqcE91dHB1dERhdGEgPSAodWludDhfdCopbWFsbG9jKHNpemUpOwotICAgICAgICBtZW1jcHkoKnBPdXRwdXREYXRhLCBkYXRhLCBzaXplKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIEFWQ0NvZGVjU3BlY2lmaWNDb250ZXh0IGN0eDsKLSAgICB1aW50OF90ICpvdXRwdXREYXRhID0gTlVMTDsKLSAgICBzaXplX3Qgb3V0cHV0U2l6ZSA9IDA7Ci0KLSAgICAvLyBDaGVjayBpZiB0aGUgZGF0YSBpcyB2YWxpZAotICAgIHVpbnQ4X3QgdHlwZSA9IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0OwotICAgIGJvb2wgZ290U3BzID0gZmFsc2U7Ci0gICAgYm9vbCBnb3RQcHMgPSBmYWxzZTsKLSAgICBjb25zdCB1aW50OF90ICp0bXAgPSBkYXRhOwotICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRTdGFydENvZGUgPSBkYXRhOwotICAgIHNpemVfdCBieXRlc0xlZnQgPSBzaXplOwotICAgIHNpemVfdCBwYXJhbVNldExlbiA9IDA7Ci0gICAgb3V0cHV0U2l6ZSA9IDA7Ci0gICAgd2hpbGUgKGJ5dGVzTGVmdCA+IDQgJiYgIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIHRtcCwgNCkpIHsKLSAgICAgICAgdHlwZSA9ICgqKHRtcCArIDQpKSAmIDB4MUY7Ci0gICAgICAgIGlmICh0eXBlID09IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0KSB7Ci0gICAgICAgICAgICBpZiAoZ290UHBzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlNQUyBtdXN0IGNvbWUgYmVmb3JlIFBQUyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWdvdFNwcykgewotICAgICAgICAgICAgICAgIGdvdFNwcyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0U3RhcnRDb2RlID0gcGFyc2VQYXJhbVNldCgmY3R4LCB0bXAgKyA0LCBieXRlc0xlZnQgLSA0LCB0eXBlLAotICAgICAgICAgICAgICAgICZwYXJhbVNldExlbik7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTmFsVW5pdFR5cGVQaWNQYXJhbVNldCkgewotICAgICAgICAgICAgaWYgKCFnb3RTcHMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiU1BTIG11c3QgY29tZSBiZWZvcmUgUFBTIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZ290UHBzKSB7Ci0gICAgICAgICAgICAgICAgZ290UHBzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRTdGFydENvZGUgPSBwYXJzZVBhcmFtU2V0KCZjdHgsIHRtcCArIDQsIGJ5dGVzTGVmdCAtIDQsIHR5cGUsCi0gICAgICAgICAgICAgICAgJnBhcmFtU2V0TGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJPbmx5IFNQUyBhbmQgUFBTIE5hbCB1bml0cyBhcmUgZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV4dFN0YXJ0Q29kZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTW92ZSBvbiB0byBmaW5kIHRoZSBuZXh0IHBhcmFtZXRlciBzZXQKLSAgICAgICAgYnl0ZXNMZWZ0IC09IG5leHRTdGFydENvZGUgLSB0bXA7Ci0gICAgICAgIHRtcCA9IG5leHRTdGFydENvZGU7Ci0gICAgICAgIG91dHB1dFNpemUgKz0gKDIgKyBwYXJhbVNldExlbik7Ci0gICAgfQotCi0gICAgewotICAgICAgICAvLyBDaGVjayBvbiB0aGUgbnVtYmVyIG9mIHNlcSBwYXJhbWV0ZXIgc2V0cwotICAgICAgICBzaXplX3QgblNlcVBhcmFtU2V0cyA9IGN0eC5tU2VxUGFyYW1TZXRzLnNpemUoKTsKLSAgICAgICAgaWYgKG5TZXFQYXJhbVNldHMgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdW5kIG5vdCBmaW5kIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoblNlcVBhcmFtU2V0cyA+IDB4MUYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUb28gbWFueSBzZXEgcGFyYW1ldGVyIHNldHMgKCV6dSkgZm91bmQiLCBuU2VxUGFyYW1TZXRzKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIG9uIHRoZSBudW1iZXIgb2YgcGljIHBhcmFtZXRlciBzZXRzCi0gICAgICAgIHNpemVfdCBuUGljUGFyYW1TZXRzID0gY3R4Lm1QaWNQYXJhbVNldHMuc2l6ZSgpOwotICAgICAgICBpZiAoblBpY1BhcmFtU2V0cyA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bmQgbm90IGZpbmQgcGljdHVyZSBwYXJhbWV0ZXIgc2V0Iik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuUGljUGFyYW1TZXRzID4gMHhGRikgewotICAgICAgICAgICAgQUxPR0UoIlRvbyBtYW55IHBpYyBwYXJhbWV0ZXIgc2V0cyAoJXp1KSBmb3VuZCIsIG5QaWNQYXJhbVNldHMpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElTTyAxNDQ5Ni0xNTogQVZDIGZpbGUgZm9ybWF0Ci0gICAgb3V0cHV0U2l6ZSArPSA3OyAgLy8gNyBtb3JlIGJ5dGVzIGluIHRoZSBoZWFkZXIKLSAgICBvdXRwdXREYXRhID0gKHVpbnQ4X3QgKiltYWxsb2Mob3V0cHV0U2l6ZSk7Ci0gICAgdWludDhfdCAqaGVhZGVyID0gb3V0cHV0RGF0YTsKLSAgICBoZWFkZXJbMF0gPSAxOyAgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24KLSAgICBoZWFkZXJbMV0gPSBjdHgubVByb2ZpbGVJZGM7ICAgICAgICAgICAvLyBwcm9maWxlIGluZGljYXRpb24KLSAgICBoZWFkZXJbMl0gPSBjdHgubVByb2ZpbGVDb21wYXRpYmxlOyAgICAvLyBwcm9maWxlIGNvbXBhdGliaWxpdHkKLSAgICBoZWFkZXJbM10gPSBjdHgubUxldmVsSWRjOwotCi0gICAgLy8gNi1iaXQgJzExMTExMScgZm9sbG93ZWQgYnkgMi1iaXQgdG8gbGVuZ3RoU2l6ZU1pbnV1c09uZQotICAgIGludDMyX3QgdXNlMkJ5dGVOYWxMZW5ndGggPSAwOwotICAgIGlmIChwYXJhbSAmJgotICAgICAgICBwYXJhbS0+ZmluZEludDMyKGtLZXkyQnl0ZU5hbExlbmd0aCwgJnVzZTJCeXRlTmFsTGVuZ3RoKSAmJgotICAgICAgICB1c2UyQnl0ZU5hbExlbmd0aCkgewotICAgICAgICBoZWFkZXJbNF0gPSAweGZjIHwgMTsgIC8vIGxlbmd0aCBzaXplID09IDIgYnl0ZXMKLSAgICB9IGVsc2UgewotICAgICAgICBoZWFkZXJbNF0gPSAweGZjIHwgMzsgIC8vIGxlbmd0aCBzaXplID09IDQgYnl0ZXMKLSAgICB9Ci0KLSAgICAvLyAzLWJpdCAnMTExJyBmb2xsb3dlZCBieSA1LWJpdCBudW1TZXF1ZW5jZVBhcmFtZXRlclNldHMKLSAgICBpbnQgblNlcXVlbmNlUGFyYW1TZXRzID0gY3R4Lm1TZXFQYXJhbVNldHMuc2l6ZSgpOwotICAgIGhlYWRlcls1XSA9IDB4ZTAgfCBuU2VxdWVuY2VQYXJhbVNldHM7Ci0gICAgaGVhZGVyICs9IDY7Ci0gICAgZm9yIChMaXN0PEFWQ1BhcmFtU2V0Pjo6aXRlcmF0b3IgaXQgPSBjdHgubVNlcVBhcmFtU2V0cy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gY3R4Lm1TZXFQYXJhbVNldHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgLy8gMTYtYml0IHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgbGVuZ3RoCi0gICAgICAgIHVpbnQxNl90IHNlcVBhcmFtU2V0TGVuZ3RoID0gaXQtPm1MZW5ndGg7Ci0gICAgICAgIGhlYWRlclswXSA9IHNlcVBhcmFtU2V0TGVuZ3RoID4+IDg7Ci0gICAgICAgIGhlYWRlclsxXSA9IHNlcVBhcmFtU2V0TGVuZ3RoICYgMHhmZjsKLSAgICAgICAgLy9BTE9HRSgiIyMjIFNQUyAlZCAlZCAlZCIsIHNlcVBhcmFtU2V0TGVuZ3RoLCBoZWFkZXJbMF0sIGhlYWRlclsxXSk7Ci0KLSAgICAgICAgLy8gU1BTIE5BTCB1bml0IChzZXF1ZW5jZSBwYXJhbWV0ZXIgbGVuZ3RoIGJ5dGVzKQotICAgICAgICBtZW1jcHkoJmhlYWRlclsyXSwgaXQtPm1EYXRhLCBzZXFQYXJhbVNldExlbmd0aCk7Ci0gICAgICAgIGhlYWRlciArPSAoMiArIHNlcVBhcmFtU2V0TGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLyA4LWJpdCBuUGljdHVyZVBhcmFtZXRlclNldHMKLSAgICBpbnQgblBpY3R1cmVQYXJhbVNldHMgPSBjdHgubVBpY1BhcmFtU2V0cy5zaXplKCk7Ci0gICAgaGVhZGVyWzBdID0gblBpY3R1cmVQYXJhbVNldHM7Ci0gICAgaGVhZGVyICs9IDE7Ci0gICAgZm9yIChMaXN0PEFWQ1BhcmFtU2V0Pjo6aXRlcmF0b3IgaXQgPSBjdHgubVBpY1BhcmFtU2V0cy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gY3R4Lm1QaWNQYXJhbVNldHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgLy8gMTYtYml0IHBpY3R1cmUgcGFyYW1ldGVyIHNldCBsZW5ndGgKLSAgICAgICAgdWludDE2X3QgcGljUGFyYW1TZXRMZW5ndGggPSBpdC0+bUxlbmd0aDsKLSAgICAgICAgaGVhZGVyWzBdID0gcGljUGFyYW1TZXRMZW5ndGggPj4gODsKLSAgICAgICAgaGVhZGVyWzFdID0gcGljUGFyYW1TZXRMZW5ndGggJiAweGZmOwotLy9BTE9HRSgiIyMjIFBQUyAlZCAlZCAlZCIsIHBpY1BhcmFtU2V0TGVuZ3RoLCBoZWFkZXJbMF0sIGhlYWRlclsxXSk7Ci0KLSAgICAgICAgLy8gUFBTIE5hbCB1bml0IChwaWN0dXJlIHBhcmFtZXRlciBzZXQgbGVuZ3RoIGJ5dGVzKQotICAgICAgICBtZW1jcHkoJmhlYWRlclsyXSwgaXQtPm1EYXRhLCBwaWNQYXJhbVNldExlbmd0aCk7Ci0gICAgICAgIGhlYWRlciArPSAoMiArIHBpY1BhcmFtU2V0TGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAqcE91dHB1dFNpemUgPSBvdXRwdXRTaXplOwotICAgICpwT3V0cHV0RGF0YSA9IG91dHB1dERhdGE7Ci0gICAgcmV0dXJuIE9LOwotfQotfS8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTkxNzMxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTc4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIHZpZGVvIGRlY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9WSURFT0RFQ09ERVIiCi0vKioqKioqKioqKioqKioqKioqKgotICogICAgIEhFQURFUlMgICAgICoKLSAqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0jaW5jbHVkZSAiTTRWRF9Ub29scy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIERFRklOSVRJT05TICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTUFYX0RFQ19CVUZGRVJTIDEwCi0KLS8qKioqKioqKioqKioqKioqKioqKgotICogICBTT1VSQ0UgQ0xBU1MgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXN0YXRpYyBNNE9TQV9FUlIgY29weUJ1ZmZlclRvUXVldWUoCi0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCwKLSAgICBNZWRpYUJ1ZmZlciogcERlY29kZWRCdWZmZXIpOwotCi1jbGFzcyBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgcHVibGljOgotCi0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsCi0gICAgICAgICAgICBWSURFT0VESVRPUl9Db2RlY1R5cGUgY29kZWNUeXBlLAotICAgICAgICAgICAgdm9pZCAqZGVjb2RlclNoZWxsQ29udGV4dCk7Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLSAgICBwcm90ZWN0ZWQgOgotICAgICAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3A8TWV0YURhdGE+IG1Gb3JtYXQ7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBtQnVmZmVyOwotICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwKiBtR3JvdXA7Ci0gICAgICAgIE11dGV4IG1Mb2NrOwotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBtcERlY1NoZWxsQ29udGV4dDsKLSAgICAgICAgaW50MzJfdCBtTWF4QVVTaXplOwotICAgICAgICBib29sIG1TdGFydGVkOwotICAgICAgICBWSURFT0VESVRPUl9Db2RlY1R5cGUgbUNvZGVjVHlwZTsKLQotICAgICAgICAvLyBEb24ndCBjYWxsIG1lCi0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKGNvbnN0IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlICYpOwotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSAmb3BlcmF0b3I9KAotICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UgJik7Ci19OwotCi1WaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6VmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0LCBWSURFT0VESVRPUl9Db2RlY1R5cGUgY29kZWNUeXBlLAotICAgICAgICB2b2lkICpkZWNvZGVyU2hlbGxDb250ZXh0KSA6Ci0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUJ1ZmZlcihOVUxMKSwKLSAgICAgICAgbUdyb3VwKE5VTEwpLAotICAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICAgIG1Db2RlY1R5cGUoY29kZWNUeXBlKSB7Ci0gICAgbXBEZWNTaGVsbENvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCopIGRlY29kZXJTaGVsbENvbnRleHQ7Ci19Ci0KLVZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjp+VmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoKSB7Ci0gICAgaWYgKG1TdGFydGVkID09IHRydWUpIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6OnN0YXJ0KAotICAgICAgICBNZXRhRGF0YSAqcGFyYW1zKSB7Ci0KLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIGlmIChtRm9ybWF0LT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJm1NYXhBVVNpemUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQga0tleU1heElucHV0U2l6ZSIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgICAgICBpZiAobUdyb3VwID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGQVRBTDogbWVtb3J5IGxpbWl0YXRpb24gISAiKTsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLQotICAgICAgICBtR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1NYXhBVVNpemUpKTsKLQotICAgICAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgLy8gRklYTUU6Ci0gICAgICAgICAgICAvLyBXaHkgZG8gd2UgbmVlZCB0byBjaGVjayBvbiB0aGUgcmVmIGNvdW50PwotICAgICAgICAgICAgaW50IHJlZl9jb3VudCA9IG1CdWZmZXItPnJlZmNvdW50KCk7Ci0gICAgICAgICAgICBBTE9HVigiTWVkaWFCdWZmZXIgcmVmY291bnQgaXMgJWQiLHJlZl9jb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZl9jb3VudDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBkZWxldGUgbUdyb3VwOwotICAgICAgICBtR3JvdXAgPSBOVUxMOwotICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0KLSAgICByZXR1cm4gbUZvcm1hdDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6OnJlYWQoTWVkaWFCdWZmZXIqKiBidWZmZXJfb3V0LAotICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBpZiAob3B0aW9ucyAhPSBOVUxMKSB7Ci0gICAgICAgIGludDY0X3QgdGltZV91czsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotICAgICAgICBvcHRpb25zLT5nZXRTZWVrVG8oJnRpbWVfdXMsICZtb2RlKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIHJlYWQgb3B0aW9ucyIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgICAgIE00T1NBX0ludDMyIHJhcFRpbWUgPSB0aW1lX3VzIC8gMTAwMDsKLQotICAgICAgICAvKi0tLSBSZXRyaWV2ZSB0aGUgcHJldmlvdXMgUkFQIHRpbWUgLS0tKi8KLSAgICAgICAgZXJyID0gbXBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlckdsb2JhbC0+bV9wRmN0R2V0UHJldlJhcFRpbWUoCi0gICAgICAgICAgICAgICAgICBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopbXBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICZyYXBUaW1lKTsKLQotICAgICAgICBpZiAoZXJyID09IE00V0FSX1JFQURFUl9JTkZPUk1BVElPTl9OT1RfUFJFU0VOVCkgewotICAgICAgICAgICAgLyogTm8gUkFQIHRhYmxlLCBqdW1wIGJhY2t3YXJkIGFuZCBwcmVkZWNvZGUgKi8KLSAgICAgICAgICAgIHJhcFRpbWUgLT0gNDAwMDA7Ci0gICAgICAgICAgICBpZihyYXBUaW1lIDwgMCkgcmFwVGltZSA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0IHJhcCB0aW1lIGVycm9yID0gMHgleFxuIiwgKHVpbnQzMl90KWVycik7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXJHbG9iYWwtPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgbXBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlci0+bV9yZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKiltcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICZyYXBUaW1lKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgianVtcCBlcnIgPSAweCV4XG4iLCAodWludDMyX3QpZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqYnVmZmVyX291dCA9IE5VTEw7Ci0KLSAgICBNNE9TQV9FUlIgbGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwotICAgIGlmIChsZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBsZXJyOwotICAgIH0KLSAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsgIC8vIGNsZWFyIGFsbCB0aGUgbWV0YSBkYXRhCi0KLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgLy9nZXROZXh0IEFVIGZyb20gcmVhZGVyLgotICAgICAgICBNNF9BY2Nlc3NVbml0KiBwQWNjZXNzVW5pdCA9IG1wRGVjU2hlbGxDb250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlOwotICAgICAgICBsZXJyID0gbXBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgIG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXItPm1fcmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopbXBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICBwQWNjZXNzVW5pdCk7Ci0gICAgICAgIGlmIChsZXJyID09IE00V0FSX05PX0RBVEFfWUVUIHx8IGxlcnIgPT0gTTRXQVJfTk9fTU9SRV9BVSkgewotICAgICAgICAgICAgKmJ1ZmZlcl9vdXQgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLQotICAgICAgICAvL2NvcHkgdGhlIHJlYWRlciBBVSBidWZmZXIgdG8gbUJ1ZmZlcgotICAgICAgICBNNE9TQV9VSW50MzIgbFNpemUgID0gKHBBY2Nlc3NVbml0LT5tX3NpemUgPiAoTTRPU0FfVUludDMyKW1NYXhBVVNpemUpXAotICAgICAgICAgICAgPyAoTTRPU0FfVUludDMyKW1NYXhBVVNpemUgOiBwQWNjZXNzVW5pdC0+bV9zaXplOwotICAgICAgICBtZW1jcHkoKHZvaWQgKiltQnVmZmVyLT5kYXRhKCksKHZvaWQgKilwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIGxTaXplKTsKLQotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgbFNpemUpOwotICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzID0gKGludDY0X3QpIChwQWNjZXNzVW5pdC0+bV9DVFMgKiAxMDAwKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBmcmFtZVRpbWVVcyk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSB0aGUgQVUgc3RhcnQgY29kZSBmb3IgSDI2NAotICAgICAgICBpZiAoVklERU9FRElUT1Jfa0gyNjRWaWRlb0RlYyA9PSBtQ29kZWNUeXBlKSB7Ci0gICAgICAgICAgICB1aW50OF90ICpkYXRhID0odWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOwotICAgICAgICAgICAgZGF0YVswXT0wOwotICAgICAgICAgICAgZGF0YVsxXT0wOwotICAgICAgICAgICAgZGF0YVsyXT0wOwotICAgICAgICAgICAgZGF0YVszXT0xOwotICAgICAgICB9Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsCi0gICAgICAgICAgICAocEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlID09IDB4MDQpPyAxIDogMCk7Ci0gICAgICAgICpidWZmZXJfb3V0ID0gbUJ1ZmZlcjsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgTTRPU0FfVUludDMyIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICBWSURFT0VESVRPUl9WSURFT19CaXRzdHJlYW1fY3R4dCogcGFyc2luZ0N0eHQsIE00T1NBX1VJbnQzMiBuYl9iaXRzKSB7Ci0gICAgcmV0dXJuIChNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KChNNFZTX0JpdHN0cmVhbV9jdHh0KikgcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICBuYl9iaXRzKSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbFBhcnNlVmlkZW9EU0koTTRPU0FfVUludDgqIHBWb2wsCi0gICAgICAgIE00T1NBX0ludDMyIGFWb2xTaXplLCBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8qIHBEY2ksCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1NpemUqIHBWaWRlb1NpemUpIHsKLQotICAgIFZJREVPRURJVE9SX1ZJREVPX0JpdHN0cmVhbV9jdHh0IHBhcnNpbmdDdHh0OwotICAgIE00T1NBX1VJbnQzMiBjb2RlLCBqOwotICAgIE00T1NBX01lbUFkZHI4IHN0YXJ0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0gICAgTTRPU0FfVUludDMyIHRpbWVfaW5jcl9sZW5ndGg7Ci0gICAgTTRPU0FfVUludDggdm9sX3ZlcmlkPTAsIGJfaGllcmFyY2h5X3R5cGU7Ci0KLSAgICAvKiBQYXJzaW5nIHZhcmlhYmxlcyAqLwotICAgIE00T1NBX1VJbnQ4IHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2VuYWJsZSA9IDA7Ci0gICAgTTRPU0FfVUludDggcmVkdWNlZF9yZXNvbHV0aW9uX3ZvcF9lbmFibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNjYWxhYmlsaXR5ID0gMDsKLSAgICBNNE9TQV9VSW50OCBlbmhhbmNlbWVudF90eXBlID0gMDsKLSAgICBNNE9TQV9VSW50OCBjb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSA9IDA7Ci0gICAgTTRPU0FfVUludDggaW50ZXJsYWNlZCA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX3dhcnBpbmdfcG9pbnRzID0gMDsKLSAgICBNNE9TQV9VSW50OCBzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSAwOwotICAgIE00T1NBX1VJbnQ4IHF1YW50X3ByZWNpc2lvbiA9IDA7Ci0KLSAgICAvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KLSAgICBwVmlkZW9TaXplLT5tX3VpV2lkdGggICAgICA9IDA7Ci0gICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCAgICAgPSAwOwotCi0gICAgcERjaS0+dWlUaW1lU2NhbGUgICAgICAgICAgPSAwOwotICAgIHBEY2ktPnVpUHJvZmlsZSAgICAgICAgICAgID0gMDsKLSAgICBwRGNpLT51aVVzZU9mUmVzeW5jaE1hcmtlciA9IDA7Ci0gICAgcERjaS0+YkRhdGFQYXJ0aXRpb24gICAgICAgPSBNNE9TQV9GQUxTRTsKLSAgICBwRGNpLT5iVXNlT2ZSVkxDICAgICAgICAgICA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyogUmVzZXQgdGhlIGJpdHN0cmVhbSBjb250ZXh0ICovCi0gICAgcGFyc2luZ0N0eHQuc3RyZWFtX2J5dGUgPSAwOwotICAgIHBhcnNpbmdDdHh0LnN0cmVhbV9pbmRleCA9IDg7Ci0gICAgcGFyc2luZ0N0eHQuaW4gPSAoTTRPU0FfTWVtQWRkcjgpIHBWb2w7Ci0KLSAgICBzdGFydCA9IChNNE9TQV9NZW1BZGRyOCkgcFZvbDsKLQotICAgIC8qIFN0YXJ0IHBhcnNpbmcgKi8KLSAgICB3aGlsZSAocGFyc2luZ0N0eHQuaW4gLSBzdGFydCA8IGFWb2xTaXplKSB7Ci0gICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICBpZiAoY29kZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgIGlmIChjb2RlID09IDApIHsKLSAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LDgpOwotICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgY29kZSBmb3VuZCAqLwotICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4MjAuLjB4MkYgOiB2aWRlb19vYmplY3RfbGF5ZXJfc3RhcnRfY29kZSAtLS0tLSAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoY29kZSA+IDB4MUYpICYmIChjb2RlIDwgMHgzMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxNSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gc2F2ZSBpdCBmb3Igdm9wIHBhcnNpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IChNNE9TQV9VSW50OCljb2RlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAgIC8qIG9ubHkgcmVjdGFuZ3VsYXIgY2FzZSBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT51aVRpbWVTY2FsZSA9IGNvZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXB1dGVzIHRpbWUgaW5jcmVtZW50IGxlbmd0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaiAgICA9IGNvZGUgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCAzMikgJiYgKGogIT0gMCk7IGogPj49MSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfaW5jcl9sZW5ndGggPSAoaSA9PSAwKSA/IDEgOiBpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCB0aW1lX2luY3JfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlICE9IDEpIHsgLyogMSA9IEJpbmFyeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBXaWR0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9TaXplLT5tX3VpV2lkdGggPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7LyogSGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb1NpemUtPm1fdWlIZWlnaHQgPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGludGVybGFjZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZWQgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE9CTUMgZGlzYWJsZSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2b2xfdmVyaWQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMik7Lyogc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV9lbmFibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3ByaXRlX2VuYWJsZSA9PSAxKSB8fCAoc3ByaXRlX2VuYWJsZSA9PSAyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcHJpdGVfZW5hYmxlICE9IDIpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBzcHJpdGUgd2lkdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTMpOy8qIHNwcml0ZSBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTMpOy8qIHNwcml0ZSBsIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTMpOy8qIHNwcml0ZSB0b3AgY29vcmRpbmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNik7Lyogc3ByaXRlIHdhcnBpbmcgcG9pbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX3dhcnBpbmdfcG9pbnRzID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDIpOy8qIHNwcml0ZSB3YXJwaW5nIGFjY3VyYWN5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHNwcml0ZSBicmlnaHRuZXNzIGNoYW5nZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcHJpdGVfZW5hYmxlICE9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZvbF92ZXJpZCAhPSAxKSAmJiAodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlICE9IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBzYWRjdCBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOyAvKiBub3QgOCBiaXRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsvKiBxdWFudCBwcmVjaXNpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudF9wcmVjaXNpb24gPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNCk7LyogYml0cyBwZXIgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JleXNjYWxlIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBxdWFudCB0eXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBsb2FkIGludHJhIHF1YW50IG1hdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7LyogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgNjQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGxvYWQgbm9uIGludHJhIHF1YW50IG1hdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7LyogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgNjQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2xfdmVyaWQgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBxdWFydGVyIHNhbXBsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBjb21wbGV4aXR5IGVzdGltYXRpb24gZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcmVzeW5jIG1hcmtlciBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT51aVVzZU9mUmVzeW5jaE1hcmtlciA9IChjb2RlKSA/IDAgOiAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBkYXRhIHBhcnRpdGlvbm5lZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+YkRhdGFQYXJ0aXRpb24gPSAoY29kZSkgPyBNNE9TQV9UUlVFIDogTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiByZXZlcnNpYmxlIFZMQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPmJVc2VPZlJWTEMgPSAoY29kZSkgPyBNNE9TQV9UUlVFIDogTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2xfdmVyaWQgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBuZXdwcmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBzY2FsYWJpbGl0eSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFiaWxpdHkgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGhpZXJhcmNoeSB0eXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYl9oaWVyYXJjaHlfdHlwZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsvKiByZWYgbGF5ZXIgaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcmVmIHNhbXBsaW5nIGRpcmVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsvKiBob3Igc2FtcGxpbmcgZmFjdG9yIE4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7LyogaG9yIHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOy8qIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7LyogdmVydCBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBlbmhhbmNlbWVudCB0eXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5oYW5jZW1lbnRfdHlwZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWJfaGllcmFyY2h5X3R5cGUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogdXNlIHJlZiBzaGFwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHVzZSByZWYgdGV4dHVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHhCMCA6IHZpc3VhbF9vYmplY3Rfc2VxdWVuY2Vfc3RhcnRfY29kZSAtLS0tLSAqLwotCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoY29kZSA9PSAweEIwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsvKiBwcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT51aVByb2ZpbGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4QjUgOiB2aXN1YWxfb2JqZWN0X3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvZGUgPT0gMHhCNSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogaXMgb2JqZWN0IGxheWVyIGlkZW50aWZpZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNCk7IC8qIHZpc3VhbCBvYmplY3QgdmVyaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA3KTsgLyogUmVhbGlnbiBvbiBieXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIGVuZCAtLS0tLSAqLwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoY29kZSA+PiAyKSA9PSAweDIwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBIMjYzIC4uLi0+IHdyb25nKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1NlbWlwbGFuYXJZVlU0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgIE00VklGSV9VSW50OCAqaW55dXYsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApIHsKLSAgICBNNFZJRklfVUludDggcmV0dXJuX2NvZGUgPSBNNFZJRklfT0s7Ci0gICAgTTRWSUZJX1VJbnQ4ICpvdXR5dXYgPQotICAgICAgICAoKE00VklGSV9VSW50OCopJihQbGFuZU91dFswXS5wYWNfZGF0YVtQbGFuZU91dFswXS51X3RvcGxlZnRdKSk7Ci0gICAgaW50MzJfdCB3aWR0aCA9IFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgaW50MzJfdCBoZWlnaHQgPSBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIGludDMyX3Qgb3V0WXNpemUgPSB3aWR0aCAqIGhlaWdodDsKLSAgICB1aW50MzJfdCAqb3V0eSA9ICAodWludDMyX3QgKikgb3V0eXV2OwotICAgIHVpbnQxNl90ICpvdXRjYiA9Ci0gICAgICAgICh1aW50MTZfdCAqKSAmKFBsYW5lT3V0WzFdLnBhY19kYXRhW1BsYW5lT3V0WzFdLnVfdG9wbGVmdF0pOwotICAgIHVpbnQxNl90ICpvdXRjciA9Ci0gICAgICAgICh1aW50MTZfdCAqKSAmKFBsYW5lT3V0WzJdLnBhY19kYXRhW1BsYW5lT3V0WzJdLnVfdG9wbGVmdF0pOwotCi0gICAgLyogWSBjb3B5aW5nICovCi0gICAgbWVtY3B5KCh2b2lkICopb3V0eSwgKHZvaWQgKilpbnl1diwgb3V0WXNpemUpOwotCi0gICAgLyogVSAmIFYgY29weWluZyAqLwotICAgIHVpbnQzMl90ICppbnl1dl80ID0gKHVpbnQzMl90ICopIChpbnl1diArIG91dFlzaXplKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IGhlaWdodCA+PiAxOyBpID4gMDsgLS1pKSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBqID0gd2lkdGggPj4gMjsgaiA+IDA7IC0taikgewotICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9ICppbnl1dl80Kys7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wVSA9IHRlbXAgJiAweEZGOwotICAgICAgICAgICAgdGVtcFUgPSB0ZW1wVSB8ICgodGVtcCA+PiA4KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBWID0gKHRlbXAgPj4gOCkgJiAweEZGOwotICAgICAgICAgICAgdGVtcFYgPSB0ZW1wViB8ICgodGVtcCA+PiAxNikgJiAweEZGMDApOwotCi0gICAgICAgICAgICAvLyBGbGlwIFUgYW5kIFYKLSAgICAgICAgICAgICpvdXRjYisrID0gdGVtcFY7Ci0gICAgICAgICAgICAqb3V0Y3IrKyA9IHRlbXBVOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXR1cm5fY29kZTsKLX0KLXZvaWQgbG9nU3VwcG9ydERlY29kZXJzQW5kQ2FwYWJpbGl0aWVzKE00REVDT0RFUl9WaWRlb0RlY29kZXJzKiBkZWNvZGVycykgewotICAgIFZpZGVvRGVjb2RlciAqcERlY29kZXI7Ci0gICAgVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXMgKnBPbXhDb21wb25lbnRzID0gTlVMTDsKLSAgICBWaWRlb1Byb2ZpbGVMZXZlbCAqcFByb2ZpbGVMZXZlbCA9IE5VTEw7Ci0gICAgcERlY29kZXIgPSBkZWNvZGVycy0+ZGVjb2RlcjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaTwgZGVjb2RlcnMtPmRlY29kZXJOdW1iZXI7IGkrKykgewotICAgICAgICBBTE9HVigiU3VwcG9ydGVkIENvZGVjWyVkXSA6JWQiLCBpLCBwRGVjb2Rlci0+Y29kZWMpOwotICAgICAgICBwT214Q29tcG9uZW50cyA9IHBEZWNvZGVyLT5jb21wb25lbnQ7Ci0gICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCAgcERlY29kZXItPmNvbXBvbmVudE51bWJlcjsgaisrKSB7Ci0gICAgICAgICAgIHBQcm9maWxlTGV2ZWwgPSBwT214Q29tcG9uZW50cy0+cHJvZmlsZUxldmVsOwotICAgICAgICAgICBBTE9HVigiLS0+Y29tcG9uZW50ICVkIiwgaik7Ci0gICAgICAgICAgIGZvcihzaXplX3QgayA9IDA7IGsgPCBwT214Q29tcG9uZW50cy0+cHJvZmlsZU51bWJlcjsgaysrKSB7Ci0gICAgICAgICAgICAgICBBTE9HVigiLS0+cHJvZmlsZTolbGQgbWF4TGV2ZWw6JWxkIiwgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bUxldmVsKTsKLSAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwrKzsKLSAgICAgICAgICAgfQotICAgICAgICAgICBwT214Q29tcG9uZW50cysrOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVyKys7Ci0gICAgfQotfQotCi1NNE9TQV9FUlIgcXVlcnlWaWRlb0RlY29kZXJDYXBhYmlsaXRpZXMKLSAgICAoTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMqKiBkZWNvZGVycykgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIGNvbnN0IGNoYXIgKmtNaW1lVHlwZXNbXSA9IHsKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MwotICAgIH07Ci0KLSAgICBpbnQzMl90IHN1cHBvcnRGb3JtYXRzID0gc2l6ZW9mKGtNaW1lVHlwZXMpIC8gc2l6ZW9mKGtNaW1lVHlwZXNbMF0pOwotICAgIE00REVDT0RFUl9WaWRlb0RlY29kZXJzICpwRGVjb2RlcnM7Ci0gICAgVmlkZW9EZWNvZGVyICpwRGVjb2RlcjsKLSAgICBWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllcyAqcE9teENvbXBvbmVudHMgPSBOVUxMOwotICAgIFZpZGVvUHJvZmlsZUxldmVsICpwUHJvZmlsZUxldmVsID0gTlVMTDsKLSAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotICAgIFNBRkVfTUFMTE9DKHBEZWNvZGVycywgTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMsIDEsICJWaWRlb0RlY29kZXJzIik7Ci0gICAgU0FGRV9NQUxMT0MocERlY29kZXIsIFZpZGVvRGVjb2Rlciwgc3VwcG9ydEZvcm1hdHMsCi0gICAgICAgICJWaWRlb0RlY29kZXIiKTsKLSAgICBwRGVjb2RlcnMtPmRlY29kZXIgPSBwRGVjb2RlcjsKLQotICAgIHBEZWNvZGVycy0+ZGVjb2Rlck51bWJlcj0gc3VwcG9ydEZvcm1hdHM7Ci0gICAgc3RhdHVzID0gY2xpZW50LmNvbm5lY3QoKTsKLSAgICBDSEVDSyhzdGF0dXMgPT0gT0spOwotICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgc2l6ZW9mKGtNaW1lVHlwZXMpIC8gc2l6ZW9mKGtNaW1lVHlwZXNbMF0pOwotICAgICAgICAgICAgICsraykgewotICAgICAgICAgICAgVmVjdG9yPENvZGVjQ2FwYWJpbGl0aWVzPiByZXN1bHRzOwotICAgICAgICAgICAgQ0hFQ0tfRVEoUXVlcnlDb2RlY3MoY2xpZW50LmludGVyZmFjZSgpLCBrTWltZVR5cGVzW2tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLy8gcXVlcnlEZWNvZGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdHMpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBTQUZFX01BTExPQyhwT214Q29tcG9uZW50cywgVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuc2l6ZSgpLCAiVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXMiKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiSz0lZCIsayk7Ci0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvbXBvbmVudCA9IHBPbXhDb21wb25lbnRzOwotICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5jb21wb25lbnROdW1iZXIgPSByZXN1bHRzLnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiAgZGVjb2RlciAnJXMnIHN1cHBvcnRzICIsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0ubUNvbXBvbmVudE5hbWUuc3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHNbaV0ubVByb2ZpbGVMZXZlbHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk5PVEhJTkcuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0jaWYgMAotICAgICAgICAgICAgICAgIC8vIEZJWE1FOgotICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBpZ25vcmUgdGhlIHNvZnR3YXJlIGNvZGVjcyBhbmQgbWFrZSBJc1NvZnR3YXJlQ29kZWMoKQotICAgICAgICAgICAgICAgIC8vIHBhcnQgb2YgcHViaWMgQVBJIGZyb20gT01YQ29kZWMuY3BwCi0gICAgICAgICAgICAgICAgaWYgKElzU29mdHdhcmVDb2RlYyhyZXN1bHRzW2ldLm1Db21wb25lbnROYW1lLnN0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiSWdub3JlIHNvZnR3YXJlIGNvZGVjICVzIiwgcmVzdWx0c1tpXS5tQ29tcG9uZW50TmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgLy8gQ291bnQgdGhlIHN1cHBvcnRlZCBwcm9maWxlcwotICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZmlsZU51bWJlciA9IDA7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBwcm9maWxlID0gLTE7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsICZwcm9maWxlTGV2ZWwgPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpXS5tUHJvZmlsZUxldmVsc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGFzc3VtZSB0aGF0IHRoZSBwcm9maWxlcyBhcmUgb3JkZXJlZAotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZUxldmVsLm1Qcm9maWxlICE9IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBwcm9maWxlTGV2ZWwubVByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlTnVtYmVyKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU0FGRV9NQUxMT0MocFByb2ZpbGVMZXZlbCwgVmlkZW9Qcm9maWxlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVOdW1iZXIsICJWaWRlb1Byb2ZpbGVMZXZlbCIpOwotICAgICAgICAgICAgICAgIHBPbXhDb21wb25lbnRzLT5wcm9maWxlTGV2ZWwgPSBwUHJvZmlsZUxldmVsOwotICAgICAgICAgICAgICAgIHBPbXhDb21wb25lbnRzLT5wcm9maWxlTnVtYmVyID0gcHJvZmlsZU51bWJlcjsKLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbWF4IExldmVsIGZvciBlYWNoIHByb2ZpbGUuCi0gICAgICAgICAgICAgICAgaW50MzJfdCBtYXhMZXZlbCA9IC0xOwotICAgICAgICAgICAgICAgIHByb2ZpbGUgPSAtMTsKLSAgICAgICAgICAgICAgICBwcm9maWxlTnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlc3VsdHNbaV0ubVByb2ZpbGVMZXZlbHMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzW2pdOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZSA9PSAtMSAmJiBtYXhMZXZlbCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IHByb2ZpbGVMZXZlbC5tUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heExldmVsID0gcHJvZmlsZUxldmVsLm1MZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlID0gcHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCA9IG1heExldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVkIHByb2ZpbGU6ICVsZCwgbWF4IGxldmVsOiAlbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSwgcFByb2ZpbGVMZXZlbC0+bUxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZUxldmVsLm1Qcm9maWxlICE9IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBwcm9maWxlTGV2ZWwubVByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IHByb2ZpbGVMZXZlbC5tTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlTnVtYmVyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSA9IHByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tTGV2ZWwgPSBtYXhMZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBwcm9maWxlOiAlbGQsIG1heCBsZXZlbDogJWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUsIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUxldmVsLm1MZXZlbCA+IG1heExldmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IHByb2ZpbGVMZXZlbC5tTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tTGV2ZWwgPSBtYXhMZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBwcm9maWxlOiAlbGQsIG1heCBsZXZlbDogJWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUsIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwT214Q29tcG9uZW50cysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzdHJjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBrTWltZVR5cGVzW2tdKSkKLSAgICAgICAgICAgICAgICBwRGVjb2Rlci0+Y29kZWMgPSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOwotICAgICAgICAgICAgaWYgKCFzdHJjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIGtNaW1lVHlwZXNba10pKQotICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5jb2RlYyA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBrTWltZVR5cGVzW2tdKSkKLSAgICAgICAgICAgICAgICBwRGVjb2Rlci0+Y29kZWMgPSBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM7Ci0KLSAgICAgICAgICAgIHBEZWNvZGVyKys7Ci0gICAgfQotCi0gICAgbG9nU3VwcG9ydERlY29kZXJzQW5kQ2FwYWJpbGl0aWVzKHBEZWNvZGVycyk7Ci0gICAgKmRlY29kZXJzID0gcERlY29kZXJzOwotY2xlYW5VcDoKLSAgICByZXR1cm4gZXJyOwotfQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiBFTkdJTkUgSU5URVJGQUNFICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTWV0YURhdGEqIG1ldGEpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBib29sIHN1Y2Nlc3MgPSBPSzsKLSAgICBpbnQzMl90IHdpZHRoID0gMDsKLSAgICBpbnQzMl90IGhlaWdodCA9IDA7Ci0gICAgaW50MzJfdCBmcmFtZVNpemUgPSAwOwotICAgIGludDMyX3QgdldpZHRoLCB2SGVpZ2h0OwotICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBtZXRhLCAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgYmVnaW4iKTsKLQotICAgIHBEZWNTaGVsbENvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzdWNjZXNzID0gbWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJnZXaWR0aCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soVFJVRSA9PSBzdWNjZXNzLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHN1Y2Nlc3MgPSBtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJnZIZWlnaHQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKFRSVUUgPT0gc3VjY2VzcywgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJ2V2lkdGggPSAlZCwgdkhlaWdodCA9ICVkIiwgdldpZHRoLCB2SGVpZ2h0KTsKLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoID0gdldpZHRoOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCA9IHZIZWlnaHQ7Ci0KLSAgICBpZiAoIW1ldGEtPmZpbmRSZWN0KAotICAgICAgICAgICAgICAgIGtLZXlDcm9wUmVjdCwgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKSB7Ci0KLSAgICAgICAgY3JvcExlZnQgPSBjcm9wVG9wID0gMDsKLSAgICAgICAgY3JvcFJpZ2h0ID0gdldpZHRoIC0gMTsKLSAgICAgICAgY3JvcEJvdHRvbSA9IHZIZWlnaHQgLSAxOwotCi0gICAgICAgIEFMT0dWKCJnb3QgZGltZW5zaW9ucyBvbmx5ICVkIHggJWQiLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZ290IGNyb3AgcmVjdCAlZCwgJWQsICVkLCAlZCIsCi0gICAgICAgICAgICAgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbSk7Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bUNyb3BSZWN0LmxlZnQgPSBjcm9wTGVmdDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ3JvcFJlY3QucmlnaHQgPSBjcm9wUmlnaHQ7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUNyb3BSZWN0LnRvcCA9IGNyb3BUb3A7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUNyb3BSZWN0LmJvdHRvbSA9IGNyb3BCb3R0b207Ci0KLSAgICB3aWR0aCA9IGNyb3BSaWdodCAtIGNyb3BMZWZ0ICsgMTsKLSAgICBoZWlnaHQgPSBjcm9wQm90dG9tIC0gY3JvcFRvcCArIDE7Ci0KLSAgICBBTE9HVigiVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSA6IFc9JWQgSD0lZCIsIHdpZHRoLCBoZWlnaHQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKCgwICE9IHdpZHRoKSAmJiAoMCAhPSBoZWlnaHQpLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgaWYoIChNNE9TQV9OVUxMICE9IHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wpICYmCi0gICAgICAgIChwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aCAgPT0gXAotICAgICAgICAgICAgKHVpbnQzMl90KXdpZHRoKSAmJgotICAgICAgICAocERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0ID09IFwKLSAgICAgICAgICAgICh1aW50MzJfdCloZWlnaHQpICkgewotICAgICAgICAvLyBObyBuZWVkIHRvIHJlY29uZmlndXJlCi0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgIHJlc2V0OiBXPSVkIEg9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAvLyBVcGRhdGUgdGhlIHN0cmVhbSBoYW5kbGVyIHBhcmFtZXRlcnMKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aCAgPSB3aWR0aDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQgPSBoZWlnaHQ7Ci0gICAgZnJhbWVTaXplID0gKHdpZHRoICogaGVpZ2h0ICogMykgLyAyOwotCi0gICAgLy8gQ29uZmlndXJlIHRoZSBidWZmZXIgcG9vbAotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIDogcmVzZXQgdGhlIGJ1ZmZlciBwb29sIik7Ci0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGVyciA9ICBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKCZwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sLAotICAgICAgICBNQVhfREVDX0JVRkZFUlMsIChNNE9TQV9DaGFyKikiVklERU9FRElUT1JfRGVjb2RlZEJ1ZmZlclBvb2wiKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICBlcnIgPSBWSURFT0VESVRPUl9CVUZGRVJfaW5pdFBvb2xCdWZmZXJzKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wsCi0gICAgICAgICAgICAgICAgZnJhbWVTaXplICsgcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggKiAyKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgKSB7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2wocERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCk7Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95KE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IGJlZ2luIik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIFJlbGVhc2UgdGhlIGNvbG9yIGNvbnZlcnRlcgotICAgIGRlbGV0ZSBwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyOwotCi0gICAgLy8gRGVzdHJveSB0aGUgZ3JhcGgKLSAgICBpZiggcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2RlciAhPSBOVUxMICkgewotICAgICAgICBBTE9HVigiIyMjIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3kgOiByZWxlYXNpbmcgZGVjb2RlciIpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5zdG9wKCk7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXIuY2xlYXIoKTsKLSAgICB9Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5kaXNjb25uZWN0KCk7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZS5jbGVhcigpOwotCi0gICAgLy8gUmVsZWFzZSBtZW1vcnkKLSAgICBpZiggcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCAhPSBNNE9TQV9OVUxMICkgewotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2wocERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCk7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBTQUZFX0ZSRUUocERlY1NoZWxsQ29udGV4dCk7Ci0gICAgcENvbnRleHQgPSBOVUxMOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3kgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3kgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJlYWRlckRhdGFJbnRlcmZhY2UsCi0gICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0LCBNNE9TQV9Wb2lkICpwVXNlckRhdGEpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLSAgICBib29sIHN1Y2Nlc3MgPSBUUlVFOwotICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzaXplID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gZGVjb2Rlck1ldGFkYXRhID0gTlVMTDsKLSAgICBpbnQgZGVjb2Rlck91dHB1dCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwU3RyZWFtSGFuZGxlciwgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZWFkZXJEYXRhSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gQ29udGV4dCBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24KLSAgICBTQUZFX01BTExPQyhwRGVjU2hlbGxDb250ZXh0LCBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIiKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIgPQotICAgICAgICAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilwU3RyZWFtSGFuZGxlcjsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlID0gcEFjY2Vzc1VuaXQ7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyR2xvYmFsID0gcFJlYWRlckdsb2JhbEludGVyZmFjZTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXIgPSBwUmVhZGVyRGF0YUludGVyZmFjZTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzID0gLTE7Ci0gICAgc3dpdGNoKCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlICkgewotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa01wZWc0VmlkZW9EZWM7Ci0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgVk9MIGhlYWRlcgotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWxQYXJzZVZpZGVvRFNJKAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgJnBEZWNTaGVsbENvbnRleHQtPm1fRGNpLCAmcERlY1NoZWxsQ29udGV4dC0+bV9WaWRlb1NpemUpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa0gyNjRWaWRlb0RlYzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0RlY29kZXJfY3JlYXRlIDogaW5jb3JyZWN0IHN0cmVhbSB0eXBlIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgICAgID0gMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyAgICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0SW5wdXRDdHMgICAgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iUmVuZGVyZWRGcmFtZXMgID0gMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RSZW5kZXJlZEN0cyAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0UmVuZGVyZWRDdHMgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzICAgID0gMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgICAgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdE91dHB1dEN0cyAgICAgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICAgPSBNNE9TQV9OVUxMOwotCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIHR3byB2aWRlbyBmcmFtZXMuCi0gICAgQ0hFQ0socERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX2F2ZXJhZ2VGcmFtZVJhdGUgPiAwKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tRnJhbWVJbnRlcnZhbE1zID0KLSAgICAgICAgICAgIDEwMDAuMCAvIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlOwotCi0gICAgLyoqCi0gICAgICogU3RhZ2VGcmlnaHQgZ3JhcGggYnVpbGRpbmcKLSAgICAgKi8KLSAgICBkZWNvZGVyTWV0YWRhdGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc3dpdGNoKCBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgKSB7Ci0gICAgICAgIGNhc2UgVklERU9FRElUT1Jfa0gyNjNWaWRlb0RlYzoKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9FRElUT1Jfa01wZWc0VmlkZW9EZWM6Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fRVNEU0luZm9TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tIMjY0VmlkZW9EZWM6Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiVmlkZW9EZWNvZGVyX2NyZWF0ZSA6IGluY29ycmVjdCBzdHJlYW0gdHlwZSIsCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplKTsKLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGgpOwotICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUhlaWdodCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0KTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZGVjb2RlciBzb3VyY2UKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlID0gbmV3IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKAotICAgICAgICBkZWNvZGVyTWV0YWRhdGEsIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSwKLSAgICAgICAgKHZvaWQgKilwRGVjU2hlbGxDb250ZXh0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UuZ2V0KCksCi0gICAgICAgIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIE9NWCBjbGllbnQKLSAgICBzdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tQ2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSBzdGF0dXMsIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZGVjb2RlcgotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ2xpZW50LmludGVyZmFjZSgpLAotICAgICAgICBkZWNvZGVyTWV0YWRhdGEsIGZhbHNlLCBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXIuZ2V0KCksCi0gICAgICAgIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMKTsKLQotCi0gICAgLy8gR2V0IHRoZSBvdXRwdXQgY29sb3IgZm9ybWF0Ci0gICAgc3VjY2VzcyA9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCi0gICAgICAgIGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhUUlVFID09IHN1Y2Nlc3MsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+ZGVjT3VwdXRDb2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSljb2xvckZvcm1hdDsKLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+c2V0SW50MzIoa0tleUhlaWdodCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0KTsKLQotICAgIC8vIEdldCB0aGUgY29sb3IgY29udmVydGVyCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlciA9IG5ldyBJNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgaWYgKHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXItPmlzTG9hZGVkKCkpIHsKLSAgICAgICAgZGVjb2Rlck91dHB1dCA9IHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXItPmdldERlY29kZXJPdXRwdXRGb3JtYXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoZGVjb2Rlck91dHB1dCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgIGRlbGV0ZSBwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBBTE9HSSgiZGVjb2RlciBvdXRwdXQgZm9ybWF0ID0gMHglWFxuIiwgZGVjb2Rlck91dHB1dCk7Ci0KLSAgICAvLyBDb25maWd1cmUgdGhlIGJ1ZmZlciBwb29sIGZyb20gdGhlIG1ldGFkYXRhCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhKHBEZWNTaGVsbENvbnRleHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLmdldCgpKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgIC8vIFN0YXJ0IHRoZSBncmFwaAotICAgIHN0YXR1cyA9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gc3RhdHVzLCBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAqcENvbnRleHQgPSAoTTRPU0FfQ29udGV4dClwRGVjU2hlbGxDb250ZXh0OwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3kocERlY1NoZWxsQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBET05FIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9Tb2Z0d2FyZURlY29kZXJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmVhZGVyRGF0YUludGVyZmFjZSwKLSAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQsIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotICAgIGJvb2wgc3VjY2VzcyA9IFRSVUU7Ci0gICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHNpemUgPSAwOwotICAgIHNwPE1ldGFEYXRhPiBkZWNvZGVyTWV0YWRhdGEgPSBOVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFN0cmVhbUhhbmRsZXIsICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmVhZGVyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uCi0gICAgU0FGRV9NQUxMT0MocERlY1NoZWxsQ29udGV4dCwgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyIik7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyID0KLSAgICAgICAgKE00X1ZpZGVvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZSA9IHBBY2Nlc3NVbml0OwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlckdsb2JhbCA9IHBSZWFkZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyID0gcFJlYWRlckRhdGFJbnRlcmZhY2U7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cyA9IC0xOwotICAgIHN3aXRjaCggcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rSDI2M1ZpZGVvRGVjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjOwotICAgICAgICAgICAgLy8gUGFyc2UgdGhlIFZPTCBoZWFkZXIKLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsUGFyc2VWaWRlb0RTSSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKXBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+XAotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+XAotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICZwRGVjU2hlbGxDb250ZXh0LT5tX0RjaSwgJnBEZWNTaGVsbENvbnRleHQtPm1fVmlkZW9TaXplKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tIMjY0VmlkZW9EZWM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiVmlkZW9EZWNvZGVyX2NyZWF0ZSA6IGluY29ycmVjdCBzdHJlYW0gdHlwZSIsCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYklucHV0RnJhbWVzICAgICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgICAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdElucHV0Q3RzICAgICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYlJlbmRlcmVkRnJhbWVzICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0UmVuZGVyZWRDdHMgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdFJlbmRlcmVkQ3RzICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYk91dHB1dEZyYW1lcyAgICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICAgID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgICAgID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCAgID0gTTRPU0FfTlVMTDsKLQotICAgIC8vIENhbGN1bGF0ZSB0aGUgaW50ZXJ2YWwgYmV0d2VlbiB0d28gdmlkZW8gZnJhbWVzLgotICAgIGlmKHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlID4gMCl7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1GcmFtZUludGVydmFsTXMgPQotICAgICAgICAgICAgMTAwMC4wIC8gcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhZ2VGcmlnaHQgZ3JhcGggYnVpbGRpbmcKLSAgICAgKi8KLSAgICBkZWNvZGVyTWV0YWRhdGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc3dpdGNoKCBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgKSB7Ci0gICAgICAgIGNhc2UgVklERU9FRElUT1Jfa0gyNjNWaWRlb0RlYzoKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9FRElUT1Jfa01wZWc0VmlkZW9EZWM6Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fRVNEU0luZm9TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tIMjY0VmlkZW9EZWM6Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiVmlkZW9EZWNvZGVyX2NyZWF0ZSA6IGluY29ycmVjdCBzdHJlYW0gdHlwZSIsCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplKTsKLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGgpOwotICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUhlaWdodCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0KTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZGVjb2RlciBzb3VyY2UKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlID0gbmV3IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKAotICAgICAgICBkZWNvZGVyTWV0YWRhdGEsIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSwKLSAgICAgICAgKHZvaWQgKilwRGVjU2hlbGxDb250ZXh0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UuZ2V0KCksCi0gICAgICAgIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIE9NWCBjbGllbnQKLSAgICBzdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tQ2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSBzdGF0dXMsIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMKTsKLQotICAgICBBTE9HSSgiVXNpbmcgc29mdHdhcmUgY29kZWNzIG9ubHkiKTsKLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwKLSAgICAgICAgZGVjb2Rlck1ldGFkYXRhLCBmYWxzZSwgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZSxOVUxMLE9NWENvZGVjOjprU29mdHdhcmVDb2RlY3NPbmx5KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXIuZ2V0KCksCi0gICAgICAgIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMKTsKLQotICAgIC8vIEdldCB0aGUgb3V0cHV0IGNvbG9yIGZvcm1hdAotICAgIHN1Y2Nlc3MgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAotICAgICAgICBrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soVFJVRSA9PSBzdWNjZXNzLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPmRlY091cHV0Q29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpY29sb3JGb3JtYXQ7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+c2V0SW50MzIoa0tleVdpZHRoLAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aCk7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBDb25maWd1cmUgdGhlIGJ1ZmZlciBwb29sIGZyb20gdGhlIG1ldGFkYXRhCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhKHBEZWNTaGVsbENvbnRleHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLmdldCgpKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgIC8vIFN0YXJ0IHRoZSBncmFwaAotICAgIHN0YXR1cyA9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gc3RhdHVzLCBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAqcENvbnRleHQgPSAoTTRPU0FfQ29udGV4dClwRGVjU2hlbGxDb250ZXh0OwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3kocERlY1NoZWxsQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBET05FIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCopIGNvbnRleHQ7Ci0gICAgTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbzsKLSAgICBNNERFQ09ERVJfVmlkZW9TaXplKiBwVmlkZW9TaXplOwotICAgIE00T1NBX1VJbnQzMiogcE5leHRGcmFtZUN0czsKLSAgICBNNE9TQV9VSW50MzIgKnBsYXN0RGVjb2RlZEZyYW1lQ3RzOwotICAgIE00REVDT0RFUl9BVkNQcm9maWxlTGV2ZWwqIHByb2ZpbGU7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKiBwRGVjQ29uZkluZm87Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uIGJlZ2luIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklkKSB7Ci0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9BVkNMYXN0RGVjb2RlZEZyYW1lQ1RTOgotICAgICAgICAgICAgIHBsYXN0RGVjb2RlZEZyYW1lQ3RzID0gKE00T1NBX1VJbnQzMiAqKSBwVmFsdWU7Ci0gICAgICAgICAgICAgKnBsYXN0RGVjb2RlZEZyYW1lQ3RzID0gcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUzsKLSAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfVmVyc2lvbjoKLSAgICAgICAgICAgIHBWZXJzaW9uSW5mbyA9IChNNF9WZXJzaW9uSW5mbyopcFZhbHVlOwotCi0gICAgICAgICAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgPSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfTUFKT1I7Ci0gICAgICAgICAgICBwVmVyc2lvbkluZm8tPm1fbWlub3I9IFZJREVPRURJVE9SX1ZJREVDX1NIRUxMX1ZFUl9NSU5PUjsKLSAgICAgICAgICAgIHBWZXJzaW9uSW5mby0+bV9yZXZpc2lvbiA9IFZJREVPRURJVE9SX1ZJREVDX1NIRUxMX1ZFUl9SRVZJU0lPTjsKLSAgICAgICAgICAgIHBWZXJzaW9uSW5mby0+bV9zdHJ1Y3RTaXplPXNpemVvZihNNF9WZXJzaW9uSW5mbyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfVmlkZW9TaXplOgotICAgICAgICAgICAgLyoqIE9ubHkgVlBTIHVzZXMgdGhpcyBPcHRpb24gSUQuICovCi0gICAgICAgICAgICBwVmlkZW9TaXplID0gKE00REVDT0RFUl9WaWRlb1NpemUqKXBWYWx1ZTsKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVdpZHRoLAotICAgICAgICAgICAgICAgIChpbnQzMl90KikoJnBWaWRlb1NpemUtPm1fdWlXaWR0aCkpOwotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICAgICAgICAgIChpbnQzMl90KikoJnBWaWRlb1NpemUtPm1fdWlIZWlnaHQpKTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRPcHRpb24gOiBXPSVkIEg9JWQiLAotICAgICAgICAgICAgICAgIHBWaWRlb1NpemUtPm1fdWlXaWR0aCwgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfTmV4dFJlbmRlcmVkRnJhbWVDVFM6Ci0gICAgICAgICAgICAvKiogSG93IHRvIGdldCB0aGlzIGluZm9ybWF0aW9uLiBTRiBkZWNvZGVyIGRvZXMgbm90IHByb3ZpZGUgdGhpcy4gKgotICAgICAgICAgICAgKiogTGV0IHVzIHByb3ZpZGUgbGFzdCBkZWNvZGVkIGZyYW1lIENUUyBhcyBvZiBub3cuICoKLSAgICAgICAgICAgICoqIE9ubHkgVlBTIHVzZXMgdGhpcyBPcHRpb24gSUQuICovCi0gICAgICAgICAgICBwTmV4dEZyYW1lQ3RzID0gKE00T1NBX1VJbnQzMiAqKXBWYWx1ZTsKLSAgICAgICAgICAgICpwTmV4dEZyYW1lQ3RzID0gcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REVDT0RFUl9NUEVHNF9rT3B0aW9uSURfRGVjb2RlckNvbmZpZ0luZm86Ci0gICAgICAgICAgICBpZihwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPT0gVklERU9FRElUT1Jfa01wZWc0VmlkZW9EZWMpIHsKLSAgICAgICAgICAgICAgICAoKihNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8qKXBWYWx1ZSkgPQotICAgICAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX0RjaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbGVyciA9IE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRPcHRpb246IGVuZCB3aXRoIGVyciA9IDB4JXgiLCBsZXJyKTsKLSAgICByZXR1cm4gbGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0ICpwRGVjU2hlbGxDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBjb250ZXh0OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3NldE9wdGlvbiBiZWdpbiIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkgewotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyOiB7Ci0gICAgICAgICAgICAgICAgTTRERUNPREVSX091dHB1dEZpbHRlciogcE91dHB1dEZpbHRlciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNERFQ09ERVJfT3V0cHV0RmlsdGVyKikgcFZhbHVlOwotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcEZpbHRlciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfUGxhbkNvbnZlcnRlckZ1bmN0aW9uVHlwZSopcE91dHB1dEZpbHRlci0+XAotICAgICAgICAgICAgICAgICAgICBtX3BGaWx0ZXJGdW5jdGlvbjsKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BGaWx0ZXJVc2VyRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHBPdXRwdXRGaWx0ZXItPm1fcEZpbHRlclVzZXJEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9EZWJsb2NraW5nRmlsdGVyOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBsZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uOiBlbmQgd2l0aCBlcnIgPSAweCV4IiwgbGVycik7Ci0gICAgcmV0dXJuIGxlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9NZWRpYVRpbWUqIHBUaW1lLCBNNE9TQV9Cb29sIGJKdW1wLCBNNE9TQV9VSW50MzIgdG9sZXJhbmNlKSB7Ci0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCopIGNvbnRleHQ7Ci0gICAgaW50NjRfdCBsRnJhbWVUaW1lOwotICAgIE1lZGlhQnVmZmVyKiBwRGVjb2RlckJ1ZmZlciA9IE5VTEw7Ci0gICAgTWVkaWFCdWZmZXIqIHBOZXh0QnVmZmVyID0gTlVMTDsKLSAgICBzdGF0dXNfdCBlcnJTdGF0dXM7Ci0gICAgYm9vbCBuZWVkU2VlayA9IGJKdW1wOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZSBiZWdpbiIpOwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcERlY1NoZWxsQ29udGV4dC0+bVJlYWNoZWRFT1MgKSB7Ci0gICAgICAgIC8vIERvIG5vdCBjYWxsIHJlYWQoKSwgaXQgY291bGQgbGVhZCB0byBhIGZyZWV6ZQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlIDogRU9TIGFscmVhZHkgcmVhY2hlZCIpOwotICAgICAgICBsZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOwotICAgIH0KLSAgICBpZihwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTID49ICpwVGltZSkgewotICAgICAgICBBTE9HVigiVmlkZW9EZWNvZGVyX2RlY29kZTogQWxyZWFkeSBkZWNvZGVkIHVwIHRvIHRoaXMgdGltZSBDVFMgPSAlbGYuIiwKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMpOwotICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgfQotICAgIGlmKE00T1NBX1RSVUUgPT0gYkp1bXApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZTogSnVtcCBjYWxsZWQiKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA9IC0xOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMgPSAtMTsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJJbnB1dEZyYW1lcysrOwotICAgIGlmICgwID4gcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMpewotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyA9ICpwVGltZTsKLSAgICB9Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RJbnB1dEN0cyA9ICpwVGltZTsKLQotICAgIHdoaWxlIChwRGVjb2RlckJ1ZmZlciA9PSBOVUxMIHx8IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgKyB0b2xlcmFuY2UgPCAqcFRpbWUpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZSwgZnJhbWVDVFMgPSAlbGYsIERlY29kZVVwVG8gPSAlbGYiLAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUywgKnBUaW1lKTsKLQotICAgICAgICAvLyBSZWFkIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RhZ2VmcmlnaHQgZGVjb2RlcgotICAgICAgICBpZiAobmVlZFNlZWspIHsKLSAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICAgICAgaW50NjRfdCB0aW1lX3VzID0gKnBUaW1lICogMTAwMDsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHRpbWVfdXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICAgICAgICAgIGVyclN0YXR1cyA9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPnJlYWQoJnBOZXh0QnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICBuZWVkU2VlayA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXJyU3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+cmVhZCgmcE5leHRCdWZmZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIEVPUyBhbmQgZm9ybWF0IGNoYW5nZQotICAgICAgICBpZiAoZXJyU3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgIEFMT0dWKCJFbmQgb2Ygc3RyZWFtIHJlYWNoZWQsIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVICIpOwotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVJlYWNoZWRFT1MgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgbGVyciA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBkZWNvZGVkIGEgYnVmZmVyIGJlZm9yZSBFT1MsIHdlIHN0aWxsIG5lZWQgdG8gcHV0IGl0Ci0gICAgICAgICAgICAvLyBpbnRvIHRoZSBxdWV1ZS4KLSAgICAgICAgICAgIGlmIChwRGVjb2RlckJ1ZmZlciAmJiBiSnVtcCkgewotICAgICAgICAgICAgICAgIGNvcHlCdWZmZXJUb1F1ZXVlKHBEZWNTaGVsbENvbnRleHQsIHBEZWNvZGVyQnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdvdG8gVklERU9FRElUT1JfVmlkZW9EZWNvZGVfY2xlYW5VUDsKLSAgICAgICAgfSBlbHNlIGlmIChJTkZPX0ZPUk1BVF9DSEFOR0VEID09IGVyclN0YXR1cykgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9kZWNvZGUgOiBzb3VyY2UgcmV0dXJucyBJTkZPX0ZPUk1BVF9DSEFOR0VEIik7Ci0gICAgICAgICAgICBsZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhKAotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQsCi0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCkuZ2V0KCkpOwotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gbGVyciApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiISEhIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZSBFUlJPUiA6ICIKLSAgICAgICAgICAgICAgICAgICAgIlZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgcmV0dXJucyAweCVYIiwgbGVycik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChlcnJTdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUgRVJST1I6MHgleCglZCkiLAotICAgICAgICAgICAgICAgIGVyclN0YXR1cyxlcnJTdGF0dXMpOwotICAgICAgICAgICAgbGVyciA9IGVyclN0YXR1czsKLSAgICAgICAgICAgIGdvdG8gVklERU9FRElUT1JfVmlkZW9EZWNvZGVfY2xlYW5VUDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBPTVhDb2RlYyBjbGllbnQgc2hvdWxkIGV4cGVjdCB0byByZWNlaXZlIDAtbGVuZ3RoIGJ1ZmZlcnMKLSAgICAgICAgLy8gYW5kIGRyb3AgdGhlIDAtbGVuZ3RoIGJ1ZmZlcnMuCi0gICAgICAgIGlmIChwTmV4dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcE5leHRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHdlIGhhdmUgYSBnb29kIG5leHQgYnVmZmVyLCByZWxlYXNlIHRoZSBwcmV2aW91cyBvbmUuCi0gICAgICAgIGlmIChwRGVjb2RlckJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBwRGVjb2RlckJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgcERlY29kZXJCdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVyQnVmZmVyID0gcE5leHRCdWZmZXI7Ci0KLSAgICAgICAgLy8gUmVjb3JkIHRoZSB0aW1lc3RhbXAgb2YgbGFzdCBkZWNvZGVkIGJ1ZmZlcgotICAgICAgICBwRGVjb2RlckJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJmxGcmFtZVRpbWUpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTID0gKE00X01lZGlhVGltZSkobEZyYW1lVGltZS8xMDAwKTsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZSxkZWNvZGVkIGZyYW1ldGltZSA9ICVsZixzaXplID0gJWQiLAotICAgICAgICAgICAgKE00X01lZGlhVGltZSlsRnJhbWVUaW1lLCBwRGVjb2RlckJ1ZmZlci0+c2l6ZSgpICk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgbmVlZCB0byBzYXZlIGEgYnVmZmVyIGlmIGJKdW1wID09IGZhbHNlIHRvIGEgcXVldWUuIFRoZXNlCi0gICAgICAgICAqIGJ1ZmZlcnMgaGF2ZSBhIHRpbWVzdGFtcCA+PSB0aGUgdGFyZ2V0IHRpbWUsICpwVGltZSAoZm9yIGluc3RhbmNlLAotICAgICAgICAgKiB0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIHR3byB2aWRlb3MsIG9yIGEgdHJpbW1pbmcgcG9zdGlvbiBpbnNpZGUKLSAgICAgICAgICogb25lIHZpZGVvKSwgc2luY2UgdGhleSBhcmUgcGFydCBvZiB0aGUgdHJhbnNpdGlvbiBjbGlwIG9yIHRoZQotICAgICAgICAgKiB0cmltbWVkIHZpZGVvLgotICAgICAgICAgKgotICAgICAgICAgKiBJZiAqcFRpbWUgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBhbnkgb2YgdGhlIGV4aXN0aW5nCi0gICAgICAgICAqIHZpZGVvIGZyYW1lcywgd2Ugd291bGQgbGlrZSB0byBnZXQgdGhlIGJ1ZmZlciByaWdodCBiZWZvcmUgKnBUaW1lCi0gICAgICAgICAqIGFuZCBpbiB0aGUgdHJhbnNjb2RpbmcgcGhyYXNlLCB0aGlzIHZpZGVvIGZyYW1lIHdpbGwgYmUgZW5jb2RlZAotICAgICAgICAgKiBhcyBhIGtleSBmcmFtZSBhbmQgYmVjb21lcyB0aGUgZmlyc3QgdmlkZW8gZnJhbWUgZm9yIHRoZSB0cmFuc2l0aW9uIG9yIHRoZQotICAgICAgICAgKiB0cmltbWVkIHZpZGVvIHRvIGJlIGdlbmVyYXRlZC4gVGhpcyBidWZmZXIgbXVzdCBhbHNvIGJlIHF1ZXVlZC4KLSAgICAgICAgICoKLSAgICAgICAgICovCi0gICAgICAgIGludDY0X3QgdGFyZ2V0VGltZU1zID0KLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTICsKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRnJhbWVJbnRlcnZhbE1zICsKLSAgICAgICAgICAgICAgICB0b2xlcmFuY2U7Ci0gICAgICAgIGlmICghYkp1bXAgfHwgdGFyZ2V0VGltZU1zID4gKnBUaW1lKSB7Ci0gICAgICAgICAgICBsZXJyID0gY29weUJ1ZmZlclRvUXVldWUocERlY1NoZWxsQ29udGV4dCwgcERlY29kZXJCdWZmZXIpOwotICAgICAgICAgICAgaWYgKGxlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIGdvdG8gVklERU9FRElUT1JfVmlkZW9EZWNvZGVfY2xlYW5VUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYk91dHB1dEZyYW1lcysrOwotICAgIGlmICggMCA+IHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdE91dHB1dEN0cyApIHsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gKnBUaW1lOwotICAgIH0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdE91dHB1dEN0cyA9ICpwVGltZTsKLQotVklERU9FRElUT1JfVmlkZW9EZWNvZGVfY2xlYW5VUDoKLSAgICAqcFRpbWUgPSBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTOwotICAgIGlmIChwRGVjb2RlckJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIHBEZWNvZGVyQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIHBEZWNvZGVyQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlOiBlbmQgd2l0aCAweCV4IiwgbGVycik7Ci0gICAgcmV0dXJuIGxlcnI7Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgY29weUJ1ZmZlclRvUXVldWUoCi0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCwKLSAgICBNZWRpYUJ1ZmZlciogcERlY29kZXJCdWZmZXIpIHsKLQotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiB0bXBEZWNCdWZmZXI7Ci0KLSAgICAvLyBHZXQgYSBidWZmZXIgZnJvbSB0aGUgcXVldWUKLSAgICBsZXJyID0gVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfa0VtcHR5LCAmdG1wRGVjQnVmZmVyKTsKLSAgICBpZiAobGVyciA9PSAoTTRPU0FfVUludDMyKU00RVJSX05PX0JVRkZFUl9BVkFJTEFCTEUpIHsKLSAgICAgICAgbGVyciA9IFZJREVPRURJVE9SX0JVRkZFUl9nZXRPbGRlc3RCdWZmZXIoCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sLAotICAgICAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2tGaWxsZWQsICZ0bXBEZWNCdWZmZXIpOwotICAgICAgICB0bXBEZWNCdWZmZXItPnN0YXRlID0gVklERU9FRElUT1JfQlVGRkVSX2tFbXB0eTsKLSAgICAgICAgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKGxlcnIgIT0gTTROT19FUlJPUikgcmV0dXJuIGxlcnI7Ci0KLSAgICAvLyBDb2xvciBjb252ZXJ0IG9yIGNvcHkgZnJvbSB0aGUgZ2l2ZW4gTWVkaWFCdWZmZXIgdG8gb3VyIGJ1ZmZlcgotICAgIGlmIChwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyKSB7Ci0gICAgICAgIGlmIChwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5jb252ZXJ0RGVjb2Rlck91dHB1dFRvSTQyMCgKLSAgICAgICAgICAgICh1aW50OF90ICopcERlY29kZXJCdWZmZXItPmRhdGEoKSwvLyA/PyArIHBEZWNvZGVyQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwgICAvLyBkZWNvZGVyQml0cwotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGgsICAvLyBkZWNvZGVyV2lkdGgKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCwgIC8vIGRlY29kZXJIZWlnaHQKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdCwgIC8vIGRlY29kZXJSZWN0Ci0gICAgICAgICAgICB0bXBEZWNCdWZmZXItPnBEYXRhIC8qIGRzdEJpdHMgKi8pIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImNvbnZlcnREZWNvZGVyT3V0cHV0VG9JNDIwIGZhaWxlZCIpOwotICAgICAgICAgICAgbGVyciA9IE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocERlY1NoZWxsQ29udGV4dC0+ZGVjT3VwdXRDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgIGludDMyX3Qgd2lkdGggPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aDsKLSAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQ7Ci0gICAgICAgIGludDMyX3QgeVBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBpbnQzMl90IHV2UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQgLyA0OwotICAgICAgICBpbnQzMl90IG9mZnNldFNyYyA9IDA7Ci0KLSAgICAgICAgaWYgKCggd2lkdGggPT0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggKSAgJiYKLSAgICAgICAgICAgICggaGVpZ2h0ID09IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCApKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwVG1wQnVmZiA9IChNNE9TQV9NZW1BZGRyOClwRGVjb2RlckJ1ZmZlci0+ZGF0YSgpICsgcERlY29kZXJCdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKil0bXBEZWNCdWZmZXItPnBEYXRhLCAodm9pZCAqKXBUbXBCdWZmLCB5UGxhbmVTaXplKTsKLQotICAgICAgICAgICAgb2Zmc2V0U3JjICs9IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICogcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0OwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKChNNE9TQV9NZW1BZGRyOCl0bXBEZWNCdWZmZXItPnBEYXRhICsgeVBsYW5lU2l6ZSksCi0gICAgICAgICAgICAgICAgKHZvaWQgKikocFRtcEJ1ZmYgKyBvZmZzZXRTcmMpLCB1dlBsYW5lU2l6ZSk7Ci0KLSAgICAgICAgICAgIG9mZnNldFNyYyArPSAocERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggPj4gMSkgKiAocERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0ID4+IDEpOwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKChNNE9TQV9NZW1BZGRyOCl0bXBEZWNCdWZmZXItPnBEYXRhICsgeVBsYW5lU2l6ZSArIHV2UGxhbmVTaXplKSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKShwVG1wQnVmZiArIG9mZnNldFNyYyksIHV2UGxhbmVTaXplKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBUbXBCdWZmID0gKE00T1NBX01lbUFkZHI4KXBEZWNvZGVyQnVmZmVyLT5kYXRhKCkgKyBwRGVjb2RlckJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwVG1wQnVmZkRzdCA9IChNNE9TQV9NZW1BZGRyOCl0bXBEZWNCdWZmZXItPnBEYXRhOwotICAgICAgICAgICAgaW50MzJfdCBpbmRleDsKLQotICAgICAgICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGhlaWdodDsgaW5kZXgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wQnVmZkRzdCwgKHZvaWQgKilwVG1wQnVmZiwgd2lkdGgpOwotICAgICAgICAgICAgICAgIHBUbXBCdWZmRHN0ICs9IHdpZHRoOwotICAgICAgICAgICAgICAgIHBUbXBCdWZmICs9IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwVG1wQnVmZiArPSAocERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggKiAoIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCAtIGhlaWdodCkpOwotICAgICAgICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGhlaWdodCA+PiAxOyBpbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBCdWZmRHN0LCAodm9pZCAqKXBUbXBCdWZmLCB3aWR0aCA+PiAxKTsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZkRzdCArPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgIHBUbXBCdWZmICs9IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoID4+IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBUbXBCdWZmICs9ICgocERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggKiAocERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0IC0gaGVpZ2h0KSkgLyA0KTsKLSAgICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBoZWlnaHQgPj4gMTsgaW5kZXgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wQnVmZkRzdCwgKHZvaWQgKilwVG1wQnVmZiwgd2lkdGggPj4gMSk7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmZEc3QgKz0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZiArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCA+PiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIlZpZGVvRGVjb2Rlcl9kZWNvZGU6IHVuZXhwZWN0ZWQgY29sb3IgZm9ybWF0IDB4JVgiLAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+ZGVjT3VwdXRDb2xvckZvcm1hdCk7Ci0gICAgICAgIGxlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgdG1wRGVjQnVmZmVyLT5idWZmQ1RTID0gcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUzsKLSAgICB0bXBEZWNCdWZmZXItPnN0YXRlID0gVklERU9FRElUT1JfQlVGRkVSX2tGaWxsZWQ7Ci0gICAgdG1wRGVjQnVmZmVyLT5zaXplID0gcERlY29kZXJCdWZmZXItPnNpemUoKTsKLQotICAgIHJldHVybiBsZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfTWVkaWFUaW1lKiBwVGltZSwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwdXRQbGFuZSwKLSAgICAgICAgTTRPU0FfQm9vbCBiRm9yY2VSZW5kZXIpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBjb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiBsaW5kZXgsIGk7Ci0gICAgTTRPU0FfVUludDgqIHBfYnVmX3NyYywgKnBfYnVmX2Rlc3Q7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgdG1wUGxhbmVJbiwgdG1wUGxhbmVPdXQ7Ci0gICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlciogcFRtcFZJREVPRURJVE9SQnVmZmVyLCAqcFJlbmRlclZJREVPRURJVE9SQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgTTRfTWVkaWFUaW1lIGNhbmRpZGF0ZVRpbWVTdGFtcCA9IC0xOwotICAgIE00T1NBX0Jvb2wgYkZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gY29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBUaW1lLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcE91dHB1dFBsYW5lLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gVGhlIG91dHB1dCBidWZmZXIgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIGp1c3QgY29weSB0aGUgZGF0YQotICAgIGlmICggKCpwVGltZSA8PSBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMpICYmCi0gICAgICAgICAgICAoTTRPU0FfRkFMU0UgPT0gYkZvcmNlUmVuZGVyKSApIHsKLSAgICAgICAgQUxPR1YoIlZJREVPRURJVE9SX1ZJREVPX3JlbmRlciBGcmFtZSBpbiB0aGUgcGFzdCIpOwotICAgICAgICBlcnIgPSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRTsKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9EZWNvZGVyX3JlbmRlcjogbGFzdFJlbmRlcmVkIHRpbWUgPSAlbGYscmVxdWVzdGVkIHJlbmRlciB0aW1lID0gIgotICAgICAgICAiJWxmIiwgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzLCAqcFRpbWUpOwotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgYnVmZmVyIGFwcHJvcHJpYXRlIGZvciByZW5kZXJpbmcuICAqLwotICAgIGZvciAoaT0wOyBpIDwgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbC0+TkI7IGkrKykgewotICAgICAgICBwVG1wVklERU9FRElUT1JCdWZmZXIgPSAmcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbFwKLSAgICAgICAgICAgIC0+cE5YUEJ1ZmZlcltpXTsKLSAgICAgICAgaWYgKHBUbXBWSURFT0VESVRPUkJ1ZmZlci0+c3RhdGUgPT0gVklERU9FRElUT1JfQlVGRkVSX2tGaWxsZWQpIHsKLSAgICAgICAgICAgIC8qKiBGcmVlIGFsbCB0aG9zZSBidWZmZXJzIG9sZGVyIHRoYW4gbGFzdCByZW5kZXJlZCBmcmFtZS4gKi8KLSAgICAgICAgICAgIGlmIChwVG1wVklERU9FRElUT1JCdWZmZXItPmJ1ZmZDVFMgPCBwRGVjU2hlbGxDb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgICAgIG1fbGFzdFJlbmRlckN0cykgewotICAgICAgICAgICAgICAgIHBUbXBWSURFT0VESVRPUkJ1ZmZlci0+c3RhdGUgPSBWSURFT0VESVRPUl9CVUZGRVJfa0VtcHR5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiogR2V0IHRoZSBidWZmZXIgd2l0aCBhcHByb3ByaWF0ZSB0aW1lc3RhbXAgICovCi0gICAgICAgICAgICBpZiAoIChwVG1wVklERU9FRElUT1JCdWZmZXItPmJ1ZmZDVFMgPj0gcERlY1NoZWxsQ29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBtX2xhc3RSZW5kZXJDdHMpICYmCi0gICAgICAgICAgICAgICAgKHBUbXBWSURFT0VESVRPUkJ1ZmZlci0+YnVmZkNUUyA8PSAqcFRpbWUpICYmCi0gICAgICAgICAgICAgICAgKHBUbXBWSURFT0VESVRPUkJ1ZmZlci0+YnVmZkNUUyA+IGNhbmRpZGF0ZVRpbWVTdGFtcCkpIHsKLSAgICAgICAgICAgICAgICBiRm91bmQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIHBSZW5kZXJWSURFT0VESVRPUkJ1ZmZlciA9IHBUbXBWSURFT0VESVRPUkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBjYW5kaWRhdGVUaW1lU3RhbXAgPSBwVG1wVklERU9FRElUT1JCdWZmZXItPmJ1ZmZDVFM7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9yZW5kZXI6IGZvdW5kIGEgYnVmZmVyIHdpdGggdGltZXN0YW1wID0gJWxmIiwKLSAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlVGltZVN0YW1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoTTRPU0FfRkFMU0UgPT0gYkZvdW5kKSB7Ci0gICAgICAgIGVyciA9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FOwotICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciAzIG91cHV0ICVkICVkICVkICVkIiwKLSAgICAgICAgcE91dHB1dFBsYW5lWzBdLnVfd2lkdGgsIHBPdXRwdXRQbGFuZVswXS51X2hlaWdodCwKLSAgICAgICAgcE91dHB1dFBsYW5lWzBdLnVfdG9wbGVmdCwgcE91dHB1dFBsYW5lWzBdLnVfc3RyaWRlKTsKLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cyA9IGNhbmRpZGF0ZVRpbWVTdGFtcDsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBEZWNTaGVsbENvbnRleHQtPm1fcEZpbHRlciApIHsKLSAgICAgICAgLy8gRmlsdGVyaW5nIHdhcyByZXF1ZXN0ZWQKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgdG1wUGxhbmVbM107Ci0gICAgICAgIC8vIFByZXBhcmUgdGhlIG91dHB1dCBpbWFnZSBmb3IgY29udmVyc2lvbgotICAgICAgICB0bXBQbGFuZVswXS51X3dpZHRoICAgPQotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIHRtcFBsYW5lWzBdLnVfaGVpZ2h0ICA9Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQ7Ci0gICAgICAgIHRtcFBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHRtcFBsYW5lWzBdLnVfc3RyaWRlICA9IHRtcFBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgIHRtcFBsYW5lWzBdLnBhY19kYXRhICA9IChNNFZJRklfVUludDgqKXBSZW5kZXJWSURFT0VESVRPUkJ1ZmZlci0+cERhdGE7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnVfd2lkdGggICA9IHRtcFBsYW5lWzBdLnVfd2lkdGgvMjsKLSAgICAgICAgdG1wUGxhbmVbMV0udV9oZWlnaHQgID0gdG1wUGxhbmVbMF0udV9oZWlnaHQvMjsKLSAgICAgICAgdG1wUGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgdG1wUGxhbmVbMV0udV9zdHJpZGUgID0gdG1wUGxhbmVbMF0udV9zdHJpZGUvMjsKLSAgICAgICAgdG1wUGxhbmVbMV0ucGFjX2RhdGEgID0gdG1wUGxhbmVbMF0ucGFjX2RhdGEgKwotICAgICAgICAgICAgKHRtcFBsYW5lWzBdLnVfc3RyaWRlICogdG1wUGxhbmVbMF0udV9oZWlnaHQpOwotICAgICAgICB0bXBQbGFuZVsyXS51X3dpZHRoICAgPSB0bXBQbGFuZVsxXS51X3dpZHRoOwotICAgICAgICB0bXBQbGFuZVsyXS51X2hlaWdodCAgPSB0bXBQbGFuZVsxXS51X2hlaWdodDsKLSAgICAgICAgdG1wUGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgdG1wUGxhbmVbMl0udV9zdHJpZGUgID0gdG1wUGxhbmVbMV0udV9zdHJpZGU7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnBhY19kYXRhICA9IHRtcFBsYW5lWzFdLnBhY19kYXRhICsKLSAgICAgICAgICAgICh0bXBQbGFuZVsxXS51X3N0cmlkZSAqIHRtcFBsYW5lWzFdLnVfaGVpZ2h0KTsKLQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyIHcgPSAlZCBIID0gJWQiLAotICAgICAgICAgICAgdG1wUGxhbmVbMF0udV93aWR0aCx0bXBQbGFuZVswXS51X2hlaWdodCk7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcEZpbHRlcihNNE9TQV9OVUxMLCAmdG1wUGxhbmVbMF0sIHBPdXRwdXRQbGFuZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gSnVzdCBjb3B5IHRoZSBZVVY0MjBQIGJ1ZmZlcgotICAgICAgICBNNE9TQV9NZW1BZGRyOCB0ZW1wQnVmZlB0ciA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcFJlbmRlclZJREVPRURJVE9SQnVmZmVyLT5wRGF0YTsKLSAgICAgICAgTTRPU0FfVUludDMyIHRlbXBXaWR0aCA9Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aDsKLSAgICAgICAgTTRPU0FfVUludDMyIHRlbXBIZWlnaHQgPQotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0OwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKSBwT3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEsICh2b2lkICopdGVtcEJ1ZmZQdHIsCi0gICAgICAgICAgICB0ZW1wV2lkdGggKiB0ZW1wSGVpZ2h0KTsKLSAgICAgICAgdGVtcEJ1ZmZQdHIgKz0gKHRlbXBXaWR0aCAqIHRlbXBIZWlnaHQpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKikgcE91dHB1dFBsYW5lWzFdLnBhY19kYXRhLCAodm9pZCAqKXRlbXBCdWZmUHRyLAotICAgICAgICAgICAgKHRlbXBXaWR0aC8yKSAqICh0ZW1wSGVpZ2h0LzIpKTsKLSAgICAgICAgdGVtcEJ1ZmZQdHIgKz0gKCh0ZW1wV2lkdGgvMikgKiAodGVtcEhlaWdodC8yKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSBwT3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEsICh2b2lkICopdGVtcEJ1ZmZQdHIsCi0gICAgICAgICAgICAodGVtcFdpZHRoLzIpICogKHRlbXBIZWlnaHQvMikpOwotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYlJlbmRlcmVkRnJhbWVzKys7Ci0gICAgaWYgKCAwID4gcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0UmVuZGVyZWRDdHMgKSB7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdFJlbmRlcmVkQ3RzID0gKnBUaW1lOwotICAgIH0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdFJlbmRlcmVkQ3RzID0gKnBUaW1lOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgKnBUaW1lID0gcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlKE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogcERlY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotCi0gICAgcERlY29kZXJJbnRlcmZhY2UgPSAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIHNpemVvZihNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UpLCBNNERFQ09ERVJfRVhURVJOQUwsCi0gICAgICAgIChNNE9TQV9DaGFyKikiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlIiApOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcERlY29kZXJUeXBlID0gZGVjb2RlclR5cGU7Ci0KLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0Q3JlYXRlICAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3REZXN0cm95ICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95OwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RHZXRPcHRpb24gPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRPcHRpb247Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdFNldE9wdGlvbiA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3NldE9wdGlvbjsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0RGVjb2RlICAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RSZW5kZXIgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXI7Ci0KLSAgICAqcERlY0ludGVyZmFjZSA9IChNNE9TQV9Db250ZXh0KXBEZWNvZGVySW50ZXJmYWNlOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2UoTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiBwRGVjb2RlckludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0KLSAgICBwRGVjb2RlckludGVyZmFjZSA9IChNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgc2l6ZW9mKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSksIE00REVDT0RFUl9FWFRFUk5BTCwKLSAgICAgICAgKE00T1NBX0NoYXIqKSJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UiICk7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwRGVjb2RlclR5cGUgPSBkZWNvZGVyVHlwZTsKLQotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RDcmVhdGUgICAgPSBWaWRlb0VkaXRvclZpZGVvU29mdHdhcmVEZWNvZGVyX2NyZWF0ZTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0RGVzdHJveSAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0R2V0T3B0aW9uID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RTZXRPcHRpb24gPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb247Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdERlY29kZSAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0UmVuZGVyICAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyOwotCi0gICAgKnBEZWNJbnRlcmZhY2UgPSAoTTRPU0FfQ29udGV4dClwRGVjb2RlckludGVyZmFjZTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLWV4dGVybiAiQyIgewotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlKE00REVDT0RFUl9rVmlkZW9UeXBlTVBFRzQsCi0gICAgICAgIHBEZWNvZGVyVHlwZSwgcERlY0ludGVyZmFjZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZShNNERFQ09ERVJfa1ZpZGVvVHlwZUFWQywKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLQotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2VfTVBFRzQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZShNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0LAotICAgICAgICBwRGVjb2RlclR5cGUsIHBEZWNJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2VfSDI2NCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlKE00REVDT0RFUl9rVmlkZW9UeXBlQVZDLAotICAgICAgICBwRGVjb2RlclR5cGUsIHBEZWNJbnRlcmZhY2UpOwotCi19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRWaWRlb0RlY29kZXJzQW5kQ2FwYWJpbGl0aWVzKAotICAgIE00REVDT0RFUl9WaWRlb0RlY29kZXJzKiogZGVjb2RlcnMpIHsKLSAgICByZXR1cm4gcXVlcnlWaWRlb0RlY29kZXJDYXBhYmlsaXRpZXMoZGVjb2RlcnMpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTdkYjY4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIHZpZGVvIGVuY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9WSURFT0VOQ09ERVIiCi0KLS8qKioqKioqKioqKioqKioqKioqCi0gKiAgICAgSEVBREVSUyAgICAgKgotICoqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0jaW5jbHVkZSAiTWVkaWFCdWZmZXJQdWxsZXIuaCIKLSNpbmNsdWRlIDxJNDIwQ29sb3JDb252ZXJ0ZXIuaD4KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgotI2luY2x1ZGUgIk9NWF9WaWRlby5oIgotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgREVGSU5JVElPTlMgICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi0vLyBGb3JjZSB1c2luZyBoYXJkd2FyZSBlbmNvZGVyCi0jZGVmaW5lIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMga0hhcmR3YXJlQ29kZWNzT25seQotCi0jaWYgIWRlZmluZWQoVklERU9FRElUT1JfRk9SQ0VDT0RFQykKLSAgICAjZXJyb3IgIkNhbm5vdCBmb3JjZSBEU0kgcmV0cmlldmFsIGlmIGNvZGVjIHR5cGUgaXMgbm90IGZpeGVkIgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKgotICogICBTT1VSQ0UgQ0xBU1MgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXRpYyBzcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIGludDMyX3Qgc3RvcmVCdWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0gICAgICAgIHZpcnR1YWwgaW50MzJfdCBnZXROdW1iZXJPZkJ1ZmZlcnNJblF1ZXVlKCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgflZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzdHJ1Y3QgTWVkaWFCdWZmZXJDaGFpbiB7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyOwotICAgICAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbmV4dExpbms7Ci0gICAgICAgIH07Ci0gICAgICAgIGVudW0gU3RhdGUgewotICAgICAgICAgICAgQ1JFQVRFRCwKLSAgICAgICAgICAgIFNUQVJURUQsCi0gICAgICAgICAgICBFUlJPUgotICAgICAgICB9OwotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZShjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk7Ci0KLSAgICAgICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZShjb25zdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSAmKTsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UgJm9wZXJhdG9yPSgKLSAgICAgICAgICAgICAgICBjb25zdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSAmKTsKLQotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBtTGFzdEJ1ZmZlckxpbms7Ci0gICAgICAgIGludDMyX3QgICAgICAgICAgIG1OYkJ1ZmZlcjsKLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgbUlzRU9TOwotICAgICAgICBTdGF0ZSAgICAgICAgICAgICBtU3RhdGU7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiAgICAgIG1FbmNGb3JtYXQ7Ci0gICAgICAgIE11dGV4ICAgICAgICAgICAgIG1Mb2NrOwotICAgICAgICBDb25kaXRpb24gICAgICAgICBtQnVmZmVyQ29uZDsKLX07Ci0KLXNwPFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlPiBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KSB7Ci0KLSAgICBzcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gYVNvdXJjZSA9Ci0gICAgICAgIG5ldyBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZShmb3JtYXQpOwotICAgIHJldHVybiBhU291cmNlOwotfQotCi1WaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoCi0gICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpOgotICAgICAgICBtRmlyc3RCdWZmZXJMaW5rKE5VTEwpLAotICAgICAgICBtTGFzdEJ1ZmZlckxpbmsoTlVMTCksCi0gICAgICAgIG1OYkJ1ZmZlcigwKSwKLSAgICAgICAgbUlzRU9TKGZhbHNlKSwKLSAgICAgICAgbVN0YXRlKENSRUFURUQpLAotICAgICAgICBtRW5jRm9ybWF0KGZvcm1hdCkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UiKTsKLX0KLQotVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSgpIHsKLQotICAgIC8vIFNhZmV0eSBjbGVhbiB1cAotICAgIGlmKCBTVEFSVEVEID09IG1TdGF0ZSApIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0YXJ0KCkgYmVnaW4iKTsKLQotICAgIGlmKCBDUkVBVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdGFydDogaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLSAgICBtU3RhdGUgPSBTVEFSVEVEOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdGFydCgpIEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9wKCkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9wKCkgYmVnaW4iKTsKLQotICAgIGlmKCBTVEFSVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9wOiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gUmVsZWFzZSB0aGUgYnVmZmVyIGNoYWluCi0gICAgaW50MzJfdCBpID0gMDsKLSAgICBNZWRpYUJ1ZmZlckNoYWluKiB0bXBMaW5rID0gTlVMTDsKLSAgICB3aGlsZSggbUZpcnN0QnVmZmVyTGluayApIHsKLSAgICAgICAgaSsrOwotICAgICAgICB0bXBMaW5rID0gbUZpcnN0QnVmZmVyTGluazsKLSAgICAgICAgbUZpcnN0QnVmZmVyTGluayA9IG1GaXJzdEJ1ZmZlckxpbmstPm5leHRMaW5rOwotICAgICAgICBkZWxldGUgdG1wTGluazsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9wIDogJWQgYnVmZmVyIHJlbWFpbmVkIiwgaSk7Ci0gICAgbUZpcnN0QnVmZmVyTGluayA9IE5VTEw7Ci0gICAgbUxhc3RCdWZmZXJMaW5rID0gTlVMTDsKLQotICAgIG1TdGF0ZSA9IENSRUFURUQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3AoKSBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Z2V0Rm9ybWF0Iik7Ci0gICAgcmV0dXJuIG1FbmNGb3JtYXQ7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIHJlYWRPcHRpb25zOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIE1lZGlhQnVmZmVyQ2hhaW4qIHRtcExpbmsgPSBOVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpyZWFkKCkgYmVnaW4iKTsKLQotICAgIGlmICggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6cmVhZDogaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHdoaWxlIChtRmlyc3RCdWZmZXJMaW5rID09IE5VTEwgJiYgIW1Jc0VPUykgewotICAgICAgICBtQnVmZmVyQ29uZC53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICAvLyBFbmQgb2Ygc3RyZWFtPwotICAgIGlmIChtRmlyc3RCdWZmZXJMaW5rID09IE5VTEwpIHsKLSAgICAgICAgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6cmVhZCA6IEVPUyIpOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgYSBidWZmZXIgZnJvbSB0aGUgY2hhaW4KLSAgICAqYnVmZmVyID0gbUZpcnN0QnVmZmVyTGluay0+YnVmZmVyOwotICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBtRmlyc3RCdWZmZXJMaW5rLT5uZXh0TGluazsKLQotICAgIGlmICggTlVMTCA9PSBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotICAgIH0KLSAgICBkZWxldGUgdG1wTGluazsKLSAgICBtTmJCdWZmZXItLTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6cmVhZCgpIEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludDMyX3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcigpIGJlZ2luIik7Ci0KLSAgICBpZiggTlVMTCA9PSBidWZmZXIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIgOiByZWFjaGVkIEVPUyIpOwotICAgICAgICBtSXNFT1MgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG5ld0xpbmsgPSBuZXcgTWVkaWFCdWZmZXJDaGFpbjsKLSAgICAgICAgbmV3TGluay0+YnVmZmVyID0gYnVmZmVyOwotICAgICAgICBuZXdMaW5rLT5uZXh0TGluayA9IE5VTEw7Ci0gICAgICAgIGlmKCBOVUxMICE9IG1MYXN0QnVmZmVyTGluayApIHsKLSAgICAgICAgICAgIG1MYXN0QnVmZmVyTGluay0+bmV4dExpbmsgPSBuZXdMaW5rOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZpcnN0QnVmZmVyTGluayA9IG5ld0xpbms7Ci0gICAgICAgIH0KLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rID0gbmV3TGluazsKLSAgICAgICAgbU5iQnVmZmVyKys7Ci0gICAgfQotICAgIG1CdWZmZXJDb25kLnNpZ25hbCgpOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoKSBlbmQiKTsKLSAgICByZXR1cm4gbU5iQnVmZmVyOwotfQotCi1pbnQzMl90IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpnZXROdW1iZXJPZkJ1ZmZlcnNJblF1ZXVlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIG1OYkJ1ZmZlcjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFN0YWdlRnJpZ2h0IHZpZGVvIGVuY29kZXIKLSAqICAgICAgICAgICBzaGVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgQ1JFQVRFRCAgID0gMHgxLAotICAgIE9QRU5FRCAgICA9IDB4MiwKLSAgICBTVEFSVEVEICAgPSAweDQsCi0gICAgQlVGRkVSSU5HID0gMHg4LAotICAgIFJFQURJTkcgICA9IDB4MTAKLX0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfU3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9TdGF0ZSAgICAgbVN0YXRlOwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgICAgICAgICAgICBtRm9ybWF0OwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICAgICAgICBtV3JpdGVyRGF0YUludGVyZmFjZTsKLSAgICBNNFZQUF9hcHBseV9mY3QqICAgICAgICAgICAgICAgICAgbVByZVByb2NGdW5jdGlvbjsKLSAgICBNNFZQUF9Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgbVByZVByb2NDb250ZXh0OwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgICAgICAgICAgICBtQWNjZXNzVW5pdDsKLSAgICBNNEVOQ09ERVJfUGFyYW1zKiAgICAgICAgICAgICAgICAgbUNvZGVjUGFyYW1zOwotICAgIE00RU5DT0RFUl9IZWFkZXIgICAgICAgICAgICAgICAgICBtSGVhZGVyOwotICAgIEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVX2ZjdCogICBtSDI2NE5BTFVQb3N0UHJvY2Vzc0ZjdDsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgbUgyNjROQUxVUG9zdFByb2Nlc3NDdHg7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgIG1MYXN0Q1RTOwotICAgIHNwPFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlPiBtRW5jb2RlclNvdXJjZTsKLSAgICBPTVhDbGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudDsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgICAgICAgbUVuY29kZXI7Ci0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgICAgICAgICAgICAgIG1FbmNvZGVyQ29sb3JGb3JtYXQ7Ci0gICAgTWVkaWFCdWZmZXJQdWxsZXIqICAgICAgICAgICAgICAgIG1QdWxsZXI7Ci0gICAgSTQyMENvbG9yQ29udmVydGVyKiAgICAgICAgICAgICAgIG1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0KLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iSW5wdXRGcmFtZXM7Ci0gICAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdElucHV0Q3RzOwotICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdElucHV0Q3RzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJPdXRwdXRGcmFtZXM7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdE91dHB1dEN0czsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RPdXRwdXRDdHM7Ci0KLSAgICBNZWRpYVByb2ZpbGVzICptVmlkZW9FZGl0b3JQcm9maWxlOwotICAgIGludDMyX3QgbU1heFByZWZldGNoRnJhbWVzOwotfSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgVE9PTFMgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0RFNJKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YURhdGEpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiAgcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBpbnQzMl90IG5iQnVmZmVyID0gMDsKLSAgICBpbnQzMl90IHN0cmlkZSA9IDA7Ci0gICAgaW50MzJfdCBoZWlnaHQgPSAwOwotICAgIGludDMyX3QgZnJhbWVyYXRlID0gMDsKLSAgICBpbnQzMl90IGlzQ29kZWNDb25maWcgPSAwOwotICAgIHNpemVfdCBzaXplID0gMDsKLSAgICB1aW50MzJfdCBjb2RlY0ZsYWdzID0gMDsKLSAgICBNZWRpYUJ1ZmZlciogaW5wdXRCdWZmZXIgPSBOVUxMOwotICAgIE1lZGlhQnVmZmVyKiBvdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgIHNwPFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlPiBlbmNvZGVyU291cmNlID0gTlVMTDsKLSAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9IE5VTEw7OwotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0RFNJIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBtZXRhRGF0YS5nZXQoKSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhDUkVBVEVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGVuY29kZXIgc291cmNlCi0gICAgZW5jb2RlclNvdXJjZSA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpDcmVhdGUobWV0YURhdGEpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gZW5jb2RlclNvdXJjZS5nZXQoKSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHJlc3VsdCA9IGNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIE9NWCBjb2RlYwotICAgIC8vIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMgTVVTVCBiZSBkZWZpbmVkIGhlcmUKLSAgICBjb2RlY0ZsYWdzIHw9IE9NWENvZGVjOjpWSURFT0VESVRPUl9GT1JDRUNPREVDOwotICAgIGVuY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKGNsaWVudC5pbnRlcmZhY2UoKSwgbWV0YURhdGEsIHRydWUsCi0gICAgICAgIGVuY29kZXJTb3VyY2UsIE5VTEwsIGNvZGVjRmxhZ3MpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gZW5jb2Rlci5nZXQoKSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLyoqCi0gICAgICogU2VuZCBmYWtlIGZyYW1lcyBhbmQgcmV0cmlldmUgdGhlIERTSQotICAgICAqLwotICAgIC8vIFNlbmQgYSBmYWtlIGZyYW1lIHRvIHRoZSBzb3VyY2UKLSAgICBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICAgICAmc3RyaWRlKTsKLSAgICBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICAgICAmaGVpZ2h0KTsKLSAgICBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmZnJhbWVyYXRlKTsKLSAgICBzaXplID0gKHNpemVfdCkoc3RyaWRlKmhlaWdodCozKS8yOwotICAgIGlucHV0QnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKHNpemUpOwotICAgIGlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIDApOwotICAgIG5iQnVmZmVyID0gZW5jb2RlclNvdXJjZS0+c3RvcmVCdWZmZXIoaW5wdXRCdWZmZXIpOwotICAgIGVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKE5VTEwpOyAvLyBTaWduYWwgRU9TCi0KLSAgICAvLyBDYWxsIHJlYWQgb25jZSB0byBnZXQgdGhlIERTSQotICAgIHJlc3VsdCA9IGVuY29kZXItPnN0YXJ0KCk7OwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotICAgIHJlc3VsdCA9IGVuY29kZXItPnJlYWQoJm91dHB1dEJ1ZmZlciwgTlVMTCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0sob3V0cHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKAotICAgICAgICBrS2V5SXNDb2RlY0NvbmZpZywgJmlzQ29kZWNDb25maWcpICYmIGlzQ29kZWNDb25maWcsIE00RVJSX1NUQVRFKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgPT0gcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYsIE00RVJSX1NUQVRFKTsKLSAgICBpZiAoIE00RU5DT0RFUl9rSDI2NCA9PSBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQgKSB7Ci0gICAgICAgIC8vIEZvciBIMjY0LCBmb3JtYXQgdGhlIERTSQotICAgICAgICByZXN1bHQgPSBidWlsZEFWQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgKHVpbnQ4X3QqKikoJihwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZikpLAotICAgICAgICAgICAgKHNpemVfdCopKCYocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUpKSwKLSAgICAgICAgICAgIChjb25zdCB1aW50OF90KilvdXRwdXRCdWZmZXItPmRhdGEoKSArIG91dHB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICBvdXRwdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpLCBlbmNvZGVyLT5nZXRGb3JtYXQoKS5nZXQoKSk7Ci0gICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBGb3IgTVBFRzQsIGp1c3QgY29weSB0aGUgRFNJCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5TaXplID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpb3V0cHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYsIE00T1NBX0ludDgsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSwgIkVuY29kZXIgaGVhZGVyIik7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLAotICAgICAgICAgICAgKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KShvdXRwdXRCdWZmZXItPmRhdGEoKSkrb3V0cHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSk7Ci0gICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgIH0KLQotICAgIHJlc3VsdCA9IGVuY29kZXItPnN0b3AoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotY2xlYW5VcDoKLSAgICAvLyBEZXN0cm95IHRoZSBncmFwaAotICAgIGlmICggZW5jb2RlciAhPSBOVUxMICkgeyBlbmNvZGVyLmNsZWFyKCk7IH0KLSAgICBjbGllbnQuZGlzY29ubmVjdCgpOwotICAgIGlmICggZW5jb2RlclNvdXJjZSAhPSBOVUxMICkgeyBlbmNvZGVyU291cmNlLmNsZWFyKCk7IH0KLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0RFNJIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiBFTkdJTkUgSU5URVJGQUNFICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXAgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhDUkVBVEVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBSZWxlYXNlIG1lbW9yeQotICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1Zik7Ci0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXAgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9Gb3JtYXQgZm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIGludCBlbmNvZGVySW5wdXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQgYmVnaW46IGZvcm1hdCAgJWQiLCBmb3JtYXQpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwVlBQZmN0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFZQUGN0eHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBDb250ZXh0IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbgotICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dCwgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyIik7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBDUkVBVEVEOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCA9IGZvcm1hdDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlID0gcFdyaXRlckRhdGFJbnRlcmZhY2U7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHJlUHJvY0Z1bmN0aW9uID0gcFZQUGZjdDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1QcmVQcm9jQ29udGV4dCA9IHBWUFBjdHh0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlciA9IE5VTEw7Ci0KLSAgICAvLyBHZXQgY29sb3IgY29udmVydGVyIGFuZCBkZXRlcm1pbmUgZW5jb2RlciBpbnB1dCBmb3JtYXQKLSAgICBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIgPSBuZXcgSTQyMENvbG9yQ29udmVydGVyOwotICAgIGlmIChwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXItPmlzTG9hZGVkKCkpIHsKLSAgICAgICAgZW5jb2RlcklucHV0ID0gcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5nZXRFbmNvZGVySW5wdXRGb3JtYXQoKTsKLSAgICB9Ci0gICAgaWYgKGVuY29kZXJJbnB1dCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgIGRlbGV0ZSBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlciA9IE5VTEw7Ci0gICAgfQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJDb2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSllbmNvZGVySW5wdXQ7Ci0gICAgQUxPR0koImVuY29kZXIgaW5wdXQgZm9ybWF0ID0gMHglWFxuIiwgZW5jb2RlcklucHV0KTsKLQotICAgICpwQ29udGV4dCA9IHBFbmNvZGVyQ29udGV4dDsKLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXAocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjMoTTRFTkNPREVSX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludGVyZmFjZSwgTTRWUFBfYXBwbHlfZmN0KiBwVlBQZmN0LAotICAgICAgICBNNFZQUF9Db250ZXh0IHBWUFBjdHh0LCBNNE9TQV9Wb2lkKiBwRXh0ZXJuYWxBUEksIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkKLSAgICAgICAgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tIMjYzLCBwQ29udGV4dCwKLSAgICAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2UsIHBWUFBmY3QsIHBWUFBjdHh0LCBwRXh0ZXJuYWxBUEksIHBVc2VyRGF0YSk7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfTVBFRzQoTTRFTkNPREVSX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludGVyZmFjZSwgTTRWUFBfYXBwbHlfZmN0KiBwVlBQZmN0LAotICAgICAgICBNNFZQUF9Db250ZXh0IHBWUFBjdHh0LCBNNE9TQV9Wb2lkKiBwRXh0ZXJuYWxBUEksIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkKLSAgICAgICAgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tNUEVHNCwgcENvbnRleHQsCi0gICAgICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBwVlBQZmN0LCBwVlBQY3R4dCwgcEV4dGVybmFsQVBJLCBwVXNlckRhdGEpOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjQoTTRFTkNPREVSX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludGVyZmFjZSwgTTRWUFBfYXBwbHlfZmN0KiBwVlBQZmN0LAotICAgICAgICBNNFZQUF9Db250ZXh0IHBWUFBjdHh0LCBNNE9TQV9Wb2lkKiBwRXh0ZXJuYWxBUEksIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkKLSAgICAgICAgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tIMjY0LCBwQ29udGV4dCwKLSAgICAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2UsIHBWUFBmY3QsIHBWUFBjdHh0LCBwRXh0ZXJuYWxBUEksIHBVc2VyRGF0YSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZShNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPUEVORUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIFJlbGVhc2UgbWVtb3J5Ci0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zKTsKLQotICAgIC8vIERlc3Ryb3kgdGhlIGdyYXBoCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci5jbGVhcigpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5kaXNjb25uZWN0KCk7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS5jbGVhcigpOwotCi0gICAgZGVsZXRlIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlcjsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXIgPSBOVUxMOwotCi0gICAgZGVsZXRlIHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIgPSBOVUxMOwotCi0gICAgLy8gU2V0IHRoZSBuZXcgc3RhdGUKLSAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IENSRUFURUQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUsIE00T1NBX1ZvaWQqIHBQYXJhbXMpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00RU5DT0RFUl9QYXJhbXMqIHBDb2RlY1BhcmFtcyA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgc3A8TWV0YURhdGE+IGVuY29kZXJNZXRhZGF0YSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciogbWltZSA9IE5VTEw7Ci0gICAgaW50MzJfdCBpUHJvZmlsZSA9IDA7Ci0gICAgaW50MzJfdCBpTGV2ZWwgPSAwOwotCi0gICAgaW50MzJfdCBpRnJhbWVSYXRlID0gMDsKLSAgICB1aW50MzJfdCBjb2RlY0ZsYWdzID0gMDsKLQotICAgIEFMT0dWKCI+Pj4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbiBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEFVLCAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUGFyYW1zLCAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBwQ29kZWNQYXJhbXMgPSAoTTRFTkNPREVSX1BhcmFtcyopcFBhcmFtczsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhDUkVBVEVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDb250ZXh0IGluaXRpYWxpemF0aW9uCi0gICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdCA9IHBBVTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1WaWRlb0VkaXRvclByb2ZpbGUgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bU1heFByZWZldGNoRnJhbWVzID0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tVmlkZW9FZGl0b3JQcm9maWxlLT5nZXRWaWRlb0VkaXRvckNhcFBhcmFtQnlOYW1lKAotICAgICAgICAibWF4UHJlZmV0Y2hZVVZGcmFtZXMiKTsKLQotICAgIC8vIEFsbG9jYXRlICYgaW5pdGlhbGl6ZSB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycwotICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLCBNNEVOQ09ERVJfUGFyYW1zLCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIiKTsKLQotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPklucHV0Rm9ybWF0ID0gcENvZGVjUGFyYW1zLT5JbnB1dEZvcm1hdDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+SW5wdXRGcmFtZVdpZHRoID0KLSAgICAgICAgcENvZGVjUGFyYW1zLT5JbnB1dEZyYW1lV2lkdGg7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPklucHV0RnJhbWVIZWlnaHQgPQotICAgICAgICBwQ29kZWNQYXJhbXMtPklucHV0RnJhbWVIZWlnaHQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGggPSBwQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGg7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0ID0gcENvZGVjUGFyYW1zLT5GcmFtZUhlaWdodDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSA9IHBDb2RlY1BhcmFtcy0+Qml0cmF0ZTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVSYXRlID0gcENvZGVjUGFyYW1zLT5GcmFtZVJhdGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9IHBDb2RlY1BhcmFtcy0+Rm9ybWF0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT52aWRlb1Byb2ZpbGUgPSBwQ29kZWNQYXJhbXMtPnZpZGVvUHJvZmlsZTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+dmlkZW9MZXZlbD0gcENvZGVjUGFyYW1zLT52aWRlb0xldmVsOwotCi0gICAgLy8gQ2hlY2sgb3V0cHV0IGZvcm1hdCBjb25zaXN0ZW5jeSBhbmQgcmVzb2x1dGlvbgotICAgIFZJREVPRURJVE9SX0NIRUNLKAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ID09IHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygwID09IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoICAlIDE2LAotICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKDAgPT0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0ICUgMTYsCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFnZUZyaWdodCBncmFwaCBidWlsZGluZwotICAgICAqLwotCi0gICAgLy8gQ3JlYXRlIHRoZSBtZXRhIGRhdGEgZm9yIHRoZSBlbmNvZGVyCi0gICAgZW5jb2Rlck1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHN3aXRjaCggcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjM6Ci0gICAgICAgICAgICBtaW1lICAgICA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QRUc0OgotICAgICAgICAgICAgbWltZSAgICAgPSBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2NDoKLSAgICAgICAgICAgIG1pbWUgICAgID0gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRW5jb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGlucHV0IGZvcm1hdCIsCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpUHJvZmlsZSA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT52aWRlb1Byb2ZpbGU7Ci0gICAgaUxldmVsID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPnZpZGVvTGV2ZWw7Ci0gICAgQUxPR1YoIkVuY29kZXIgbWltZSAlcyBwcm9maWxlICVkLCBsZXZlbCAlZCIsCi0gICAgICAgIG1pbWUsaVByb2ZpbGUsIGlMZXZlbCk7Ci0gICAgQUxPR1YoIkVuY29kZXIgdyAlZCwgaCAlZCwgYml0cmF0ZSAlZCwgZnBzICVkIiwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGgsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVJhdGUpOwotICAgIENIRUNLKGlQcm9maWxlICE9IDB4N2ZmZmZmZmYpOwotICAgIENIRUNLKGlMZXZlbCAhPSAweDdmZmZmZmZmKTsKLQotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVZpZGVvUHJvZmlsZSwgaVByb2ZpbGUpOwotICAgIC8vRklYTUU6Ci0gICAgLy8gVGVtcDogRG8gbm90IHNldCB0aGUgbGV2ZWwgZm9yIE1wZWc0IC8gSC4yNjMgRW5jCi0gICAgLy8gYXMgT01YLk52aWRpYS5tcDQuZW5jb2RlciBhbmQgT01YLk52aWRpYS5oMjYzLmVuY29kZXIKLSAgICAvLyByZXR1cm4gMHg4MDAwMTAxOQotICAgIGlmIChwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ID09IE00RU5DT0RFUl9rSDI2NCkgewotICAgICAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCBpTGV2ZWwpOwotICAgIH0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGgpOwotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGgpOwotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUhlaWdodCwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0KTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0KTsKLQotICAgIHN3aXRjaCggcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lUmF0ZSApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazVfRlBTOiAgICBpRnJhbWVSYXRlID0gNTsgIGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rN181X0ZQUzogIGlGcmFtZVJhdGUgPSA4OyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2sxMF9GUFM6ICAgaUZyYW1lUmF0ZSA9IDEwOyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEyXzVfRlBTOiBpRnJhbWVSYXRlID0gMTM7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTVfRlBTOiAgIGlGcmFtZVJhdGUgPSAxNTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2syMF9GUFM6ICAgaUZyYW1lUmF0ZSA9IDIwOyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazI1X0ZQUzogICBpRnJhbWVSYXRlID0gMjU7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMzBfRlBTOiAgIGlGcmFtZVJhdGUgPSAzMDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tWQVJJQUJMRV9GUFM6Ci0gICAgICAgICAgICBpRnJhbWVSYXRlID0gMzA7Ci0gICAgICAgICAgICBBTE9HSSgiRnJhbWUgcmF0ZSBzZXQgdG8gTTRFTkNPREVSX2tWQVJJQUJMRV9GUFM6IHNldCB0byAzMCIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rVVNFX1RJTUVTQ0FMRToKLSAgICAgICAgICAgIGlGcmFtZVJhdGUgPSAzMDsKLSAgICAgICAgICAgIEFMT0dJKCJGcmFtZSByYXRlIHNldCB0byBNNEVOQ09ERVJfa1VTRV9USU1FU0NBTEU6ICBzZXQgdG8gMzAiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRW5jb2Rlcl9vcGVuOmluY29ycmVjdCBmcmFtZXJhdGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGlGcmFtZVJhdGUpOwotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5CaXRyYXRlKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsIDEpOwotCi0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJDb2xvckZvcm1hdCk7Ci0KLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCAhPSBNNEVOQ09ERVJfa0gyNjMpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBlbmNvZGVyIERTSQotICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kocEVuY29kZXJDb250ZXh0LCBlbmNvZGVyTWV0YWRhdGEpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGVuY29kZXIgc291cmNlCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZSA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpDcmVhdGUoCi0gICAgICAgIGVuY29kZXJNZXRhZGF0YSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soCi0gICAgICAgIE5VTEwgIT0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS5nZXQoKSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIE9NWCBjb2RlYwotI2lmZGVmIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMKLSAgICBjb2RlY0ZsYWdzIHw9IE9NWENvZGVjOjpWSURFT0VESVRPUl9GT1JDRUNPREVDOwotI2VuZGlmIC8qIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMgKi8KLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ2xpZW50LmludGVyZmFjZSgpLCBlbmNvZGVyTWV0YWRhdGEsIHRydWUsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UsIE5VTEwsIGNvZGVjRmxhZ3MpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci5nZXQoKSwgTTRFUlJfU1RBVEUpOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIDogRE9ORSIpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlciA9IG5ldyBNZWRpYUJ1ZmZlclB1bGxlcigKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlcik7Ci0KLSAgICAvLyBTZXQgdGhlIG5ldyBzdGF0ZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gT1BFTkVEOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZShwRW5jb2RlckNvbnRleHQpOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcigKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0RvdWJsZSBDdHMsCi0gICAgICAgIE00T1NBX0Jvb2wgYlJlYWNoZWRFT1MpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBPdXRQbGFuZVszXTsKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyID0gTlVMTDsKLSAgICBpbnQzMl90IG5iQnVmZmVyID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgYmVnaW46IGN0cyAgJWYiLCBDdHMpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBPdXRQbGFuZVswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcE91dFBsYW5lWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwT3V0UGxhbmVbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgaWYgKCBNNE9TQV9GQUxTRSA9PSBiUmVhY2hlZEVPUyApIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHNpemVZID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGggKgotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0OwotICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZVUgPSBzaXplWSA+PiAyOwotICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSAgPSBzaXplWSArIDIqc2l6ZVU7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcigoc2l6ZV90KXNpemUpOwotICAgICAgICBwRGF0YSA9IChNNE9TQV9VSW50OCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIG91dHB1dCBpbWFnZSBmb3IgcHJlLXByb2Nlc3NpbmcKLSAgICAgICAgcE91dFBsYW5lWzBdLnVfd2lkdGggICA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoOwotICAgICAgICBwT3V0UGxhbmVbMF0udV9oZWlnaHQgID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0OwotICAgICAgICBwT3V0UGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcE91dFBsYW5lWzBdLnVfc3RyaWRlICA9IHBPdXRQbGFuZVswXS51X3dpZHRoOwotICAgICAgICBwT3V0UGxhbmVbMV0udV93aWR0aCAgID0gcE91dFBsYW5lWzBdLnVfd2lkdGgvMjsKLSAgICAgICAgcE91dFBsYW5lWzFdLnVfaGVpZ2h0ICA9IHBPdXRQbGFuZVswXS51X2hlaWdodC8yOwotICAgICAgICBwT3V0UGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcE91dFBsYW5lWzFdLnVfc3RyaWRlICA9IHBPdXRQbGFuZVswXS51X3N0cmlkZS8yOwotICAgICAgICBwT3V0UGxhbmVbMl0udV93aWR0aCAgID0gcE91dFBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgIHBPdXRQbGFuZVsyXS51X2hlaWdodCAgPSBwT3V0UGxhbmVbMV0udV9oZWlnaHQ7Ci0gICAgICAgIHBPdXRQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwT3V0UGxhbmVbMl0udV9zdHJpZGUgID0gcE91dFBsYW5lWzFdLnVfc3RyaWRlOwotCi0gICAgICAgIHBPdXRQbGFuZVswXS5wYWNfZGF0YSA9IHBEYXRhOwotICAgICAgICBwT3V0UGxhbmVbMV0ucGFjX2RhdGEgPSBwRGF0YSArIHNpemVZOwotICAgICAgICBwT3V0UGxhbmVbMl0ucGFjX2RhdGEgPSBwRGF0YSArIHNpemVZICsgc2l6ZVU7Ci0KLSAgICAgICAgLy8gQXBwbHkgcHJlLXByb2Nlc3NpbmcKLSAgICAgICAgZXJyID0gcEVuY29kZXJDb250ZXh0LT5tUHJlUHJvY0Z1bmN0aW9uKAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHJlUHJvY0NvbnRleHQsIE00T1NBX05VTEwsIHBPdXRQbGFuZSk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgICAgIC8vIENvbnZlcnQgTWVkaWFCdWZmZXIgdG8gdGhlIGVuY29kZXIgaW5wdXQgZm9ybWF0IGlmIG5lY2Vzc2FyeQotICAgICAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyKSB7Ci0gICAgICAgICAgICBJNDIwQ29sb3JDb252ZXJ0ZXIqIGNvbnZlcnRlciA9IHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICAgICAgICAgIGludCBhY3R1YWxXaWR0aCA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoOwotICAgICAgICAgICAgaW50IGFjdHVhbEhlaWdodCA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodDsKLQotICAgICAgICAgICAgaW50IGVuY29kZXJXaWR0aCwgZW5jb2RlckhlaWdodDsKLSAgICAgICAgICAgIEFSZWN0IGVuY29kZXJSZWN0OwotICAgICAgICAgICAgaW50IGVuY29kZXJCdWZmZXJTaXplOwotCi0gICAgICAgICAgICBpZiAoY29udmVydGVyLT5nZXRFbmNvZGVySW5wdXRCdWZmZXJJbmZvKAotICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQsCi0gICAgICAgICAgICAgICAgJmVuY29kZXJXaWR0aCwgJmVuY29kZXJIZWlnaHQsCi0gICAgICAgICAgICAgICAgJmVuY29kZXJSZWN0LCAmZW5jb2RlckJ1ZmZlclNpemUpID09IDApIHsKLQotICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyKiBuZXdCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoZW5jb2RlckJ1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRlci0+Y29udmVydEk0MjBUb0VuY29kZXJJbnB1dCgKLSAgICAgICAgICAgICAgICAgICAgcERhdGEsICAvLyBzcmNCaXRzCi0gICAgICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZXJXaWR0aCwgZW5jb2RlckhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlclJlY3QsCi0gICAgICAgICAgICAgICAgICAgICh1aW50OF90KiluZXdCdWZmZXItPmRhdGEoKSArIG5ld0J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY29udmVydEk0MjBUb0VuY29kZXJJbnB1dCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gbmV3IGJ1ZmZlcgotICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB0aGUgbWV0YWRhdGEKLSAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIChpbnQ2NF90KShDdHMqMTAwMCkpOwotICAgIH0KLQotICAgIC8vIFB1c2ggdGhlIGJ1ZmZlciB0byB0aGUgc291cmNlLCBhIE5VTEwgYnVmZmVyLCBub3RpZmllcyB0aGUgc291cmNlIG9mIEVPUwotICAgIG5iQnVmZmVyID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS0+c3RvcmVCdWZmZXIoYnVmZmVyKTsKLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGVycm9yIDB4JVgiLCBlcnIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKCBOVUxMICE9IGJ1ZmZlciApIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LCBNZWRpYUJ1ZmZlciogYnVmZmVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgQ3RzID0gMDsKLSAgICBpbnQzMl90IGkzMlRtcCA9IDA7Ci0gICAgaW50NjRfdCBpNjRUbXAgPSAwOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IGJ1ZmZlciwgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgLy8gUHJvY2VzcyB0aGUgcmV0dXJuZWQgQVUKLSAgICBpZiAoIDAgPT0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSApIHsKLSAgICAgICAgLy8gRW5jb2RlciBoYXMgbm8gZGF0YSB5ZXQsIG5vdGhpbmcgdW51c3VhbAotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciA6IGJ1ZmZlciBpcyBlbXB0eSIpOwotICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgfQotICAgIFZJREVPRURJVE9SX0NIRUNLKDAgPT0gKCgoaW50cHRyX3QpYnVmZmVyLT5kYXRhKCkpJTQpLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZ2V0KCksIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgaWYgKCBidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpMzJUbXApICYmIGkzMlRtcCApewotICAgICAgICB7ICAgLy8gRGlzcGxheSB0aGUgRFNJCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBEU0kgJWQiLAotICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgdWludDhfdCogdG1wID0gKHVpbnQ4X3QqKShidWZmZXItPmRhdGEoKSk7Ci0gICAgICAgICAgICBmb3IoIHVpbnQzMl90IGk9MDsgaTxidWZmZXItPnJhbmdlX2xlbmd0aCgpOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkRTSSBbJWRdICUuMlgiLCBpLCB0bXBbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIENUUwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZpNjRUbXApLAotICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKys7Ci0gICAgICAgIGlmICggMCA+IHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICkgewotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyA9IGk2NFRtcDsKLQotICAgICAgICBDdHMgPSAoTTRPU0FfSW50MzIpKGk2NFRtcC8xMDAwKTsKLSAgICAgICAgQUxPR1YoIltUU19DSEVDS10gVkkvRU5DIFdSSVRFIGZyYW1lICVkIEAgJWxsZCAtPiAlZCAobGFzdCAlZCkiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMsIGk2NFRtcCwgQ3RzLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0gICAgICAgIGlmICggQ3RzIDwgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyApIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBXQVJOSU5HIDogQ3RzIGlzIGdvaW5nICIKLSAgICAgICAgICAgICJiYWNrd2FyZHMgJWQgPCAlZCIsIEN0cywgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0gICAgICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiAlZCAlZCIsCi0gICAgICAgICAgICBDdHMsIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMpOwotCi0gICAgICAgIC8vIFJldHJpZXZlIHRoZSBBVSBjb250YWluZXIKLSAgICAgICAgZXJyID0gcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZS0+cFN0YXJ0QVUoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnN0cmVhbS0+c3RyZWFtSUQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0KTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAgICAgLy8gRm9ybWF0IHRoZSBBVQotICAgICAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPD0gcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSwKLSAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIC8vIFJlbW92ZSBIMjY0IEFVIHN0YXJ0IGNvZGUKLSAgICAgICAgaWYgKCBNNEVOQ09ERVJfa0gyNjQgPT0gcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0ICkgewotICAgICAgICAgICAgaWYgKCFtZW1jbXAoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIFwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KSApIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpICsgNCwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoTTRFTkNPREVSX2tIMjY0ID09IHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCkgJiYKLSAgICAgICAgICAgIChNNE9TQV9OVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NGY3QpICkgewotICAgICAgICAvLyBIMjY0IHRyaW1taW5nIGNhc2UsIE5BTFUgcG9zdCBwcm9jZXNzaW5nIGlzIG5lZWRlZAotICAgICAgICBNNE9TQV9JbnQzMiBvdXRwdXRTaXplID0gcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZTsKLSAgICAgICAgZXJyID0gcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0ZjdCgKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NDdHgsCi0gICAgICAgICAgICAoTTRPU0FfVUludDgqKWJ1ZmZlci0+ZGF0YSgpK2J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICZvdXRwdXRTaXplKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUgPSAoTTRPU0FfVUludDMyKW91dHB1dFNpemU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGUgQVUgY2FuIGp1c3QgYmUgY29waWVkCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5cCi0gICAgICAgICAgICAgICAgZGF0YUFkZHJlc3MsICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkoYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+XAotICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCgpKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKWJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsJmkzMlRtcCkgJiYgaTMyVG1wKXsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmF0dHJpYnV0ZSA9IEFVX1BfRnJhbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyA9IEN0czsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+Q1RTID0gQ3RzOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5EVFMgPSBDdHM7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXI6IEFVIEAgMHglWCAweCVYICVkICVkIiwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKnBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPkNUUyk7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIEFVCi0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bVdyaXRlckRhdGFJbnRlcmZhY2UtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnN0cmVhbS0+c3RyZWFtSUQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0KTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEluUGxhbmUsIE00T1NBX0RvdWJsZSBDdHMsCi0gICAgICAgIE00RU5DT0RFUl9GcmFtZU1vZGUgRnJhbWVNb2RlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciogb3V0cHV0QnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgMHglWCAlZiAlZCIsIHBJblBsYW5lLCBDdHMsIEZyYW1lTW9kZSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBpZiAoIFNUQVJURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgKSB7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQlVGRkVSSU5HOwotICAgIH0KLSAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgKEJVRkZFUklORyB8IFJFQURJTkcpICYgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLSAgICBpZiAoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzICkgewotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzID0gQ3RzOwotICAgIH0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0SW5wdXRDdHMgPSBDdHM7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIDB4JVggJWQgJWYgKCVkKSIsIHBJblBsYW5lLCBGcmFtZU1vZGUsCi0gICAgICAgIEN0cywgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0KLSAgICAvLyBQdXNoIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIGVuY29kZXIgc291cmNlCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwgQ3RzLAotICAgICAgICBNNE9TQV9GQUxTRSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBOb3RpZnkgdGhlIHNvdXJjZSBpbiBjYXNlIG9mIEVPUwotICAgIGlmICggTTRFTkNPREVSX2tMYXN0RnJhbWUgPT0gRnJhbWVNb2RlICkgewotICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQsIDAsIE00T1NBX1RSVUUpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICB9Ci0KLSAgICBpZiAoIEJVRkZFUklORyA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSApIHsKLSAgICAgICAgLy8gUHJlZmV0Y2ggaXMgY29tcGxldGUsIHN0YXJ0IHJlYWRpbmcKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBSRUFESU5HOwotICAgIH0KLSAgICAvLyBSZWFkCi0gICAgd2hpbGUgKDEpICB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+Z2V0QnVmZmVyTm9uQmxvY2tpbmcoKTsKLQotICAgICAgICBpZiAob3V0cHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGludDMyX3QgWVVWQnVmZmVyTnVtYmVyID0KLSAgICAgICAgICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS0+Z2V0TnVtYmVyT2ZCdWZmZXJzSW5RdWV1ZSgpOwotICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZ3VyZWQgbWF4aW11bSBudW1iZXIgb2YgcHJlZmV0Y2ggWVVWIGZyYW1lcyBpcwotICAgICAgICAgICAgICogbm90IGV4Y2VlZGVkLiBUaGlzIGlzIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzYWdlIG9mIHZpZGVvIGVkaXRvciBlbmdpbmUuCi0gICAgICAgICAgICAgKiBUaGUgdmFsdWUgb2YgbWF4aW11bSBwcmVmZXRjaCBZdXYgZnJhbWVzIGlzIGRlZmluZWQgaW4gbWVkaWFfcHJvZmlsZXMueG1sICovCi0gICAgICAgICAgICBpZiAoKFlVVkJ1ZmZlck51bWJlciA8IHBFbmNvZGVyQ29udGV4dC0+bU1heFByZWZldGNoRnJhbWVzKSB8fAotICAgICAgICAgICAgICAgIChwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPmhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpCi0gICAgICAgICAgICAgICAgICAgID09IHRydWUpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBQcm92aWRlIHRoZSBlbmNvZGVkIEFVIHRvIHRoZSB3cml0ZXIKLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5wdXRCdWZmZXIob3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgIGVyciAgICAgICAgICAgICA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICByZXN1bHQgICAgICAgICAgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9QRU5FRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgPSAwOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgID0gLTEuMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0SW5wdXRDdHMgICA9IC0xLjA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgPSAwOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gLTE7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyAgPSAtMTsKLQotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPnN0YXJ0KCk7Ci0KLSAgICAvLyBTZXQgdGhlIG5ldyBzdGF0ZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gU1RBUlRFRDsKLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFNlbmQgRU9TIGFnYWluIHRvIG1ha2Ugc3VyZSB0aGUgc291cmNlIGRvZXNuJ3QgYmxvY2suCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwgMCwKLSAgICAgICAgTTRPU0FfVFJVRSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZW1haW5pbmcgYnVmZmVycyBpZiBuZWNlc3NhcnkKLSAgICBpZiAoIChCVUZGRVJJTkcgfCBSRUFESU5HKSAmIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICB3aGlsZSAoMSkgIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+Z2V0QnVmZmVyQmxvY2tpbmcoKTsKLQotICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciA9PSBOVUxMKSBicmVhazsKLQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQsIG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5wdXRCdWZmZXIob3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gU1RBUlRFRDsKLSAgICB9Ci0KLSAgICAvLyBTdG9wIHRoZSBncmFwaCBtb2R1bGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgKCBTVEFSVEVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPnN0b3AoKTsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+c3RvcCgpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IE9QRU5FRDsKLSAgICB9Ci0KLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAhPSBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcykgewotICAgICAgICBBTE9HVygiU29tZSBmcmFtZXMgd2VyZSBub3QgZW5jb2RlZDogaW5wdXQoJWQpICE9IG91dHB1dCglZCkiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcmVndWxCaXRSYXRlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgQUxPR1coInJlZ3VsQml0UmF0ZSBpcyBub3QgaW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbihNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gc3RhcnQgb3B0aW9uSUQgMHglWCIsIG9wdGlvbklEKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN3aXRjaCggb3B0aW9uSUQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tPcHRpb25JRF9TZXRIMjY0UHJvY2Vzc05BTFVmY3RzUHRyOgotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0ZjdCA9Ci0gICAgICAgICAgICAgICAgKEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVX2ZjdCopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa09wdGlvbklEX0gyNjRQcm9jZXNzTkFMVUNvbnRleHQ6Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IMjY0TkFMVVBvc3RQcm9jZXNzQ3R4ID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfQ29udGV4dClvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24oTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIGJlZ2luIG9wdGluSWQgMHglWCIsIG9wdGlvbklEKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlcjoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICAqKE00RU5DT0RFUl9IZWFkZXIqKilvcHRpb25WYWx1ZSA9ICYocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlKE00RU5DT0RFUl9Gb3JtYXQgZm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBGb3JtYXQsICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEVuY29kZXJJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIGJlZ2luIDB4JXggMHgleCAlZCIsIHBGb3JtYXQsCi0gICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyIik7Ci0KLSAgICAqcEZvcm1hdCA9IGZvcm1hdDsKLQotICAgIHN3aXRjaCggZm9ybWF0ICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUEVHNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X01QRUc0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIDogdW5zdXBwb3J0ZWQgZm9ybWF0ICVkIiwKLSAgICAgICAgICAgICAgICBmb3JtYXQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW47Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RTdGFydCAgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFN0b3AgICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3A7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RQYXVzZSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0UmVzdW1lICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsb3NlICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0Q2xlYW51cCAgICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFJlZ3VsQml0UmF0ZSA9Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3JlZ3VsQml0UmF0ZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEVuY29kZSAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFNldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbjsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEdldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbjsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcEVuY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX2tIMjYzLCBwRm9ybWF0LAotICAgICAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UsIG1vZGUpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX2tNUEVHNCwgcEZvcm1hdCwKLSAgICAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UsIG1vZGUpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSl7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZShNNEVOQ09ERVJfa0gyNjQsIHBGb3JtYXQsCi0gICAgICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLQotfQotCi19ICAvLyBleHRlcm4gIkMiCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTJkMjExMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0jaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1YTUzMGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2ZpbHRlcnMKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX3ZpZGVvZmlsdGVycwotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjAuYyBcCi0gICAgICBNNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYyBcCi0gICAgICBNNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYyBcCi0gICAgICBNNFZJRklfQ2xpcC5jIFwKLSAgICAgIE00VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jIFwKLSAgICAgIE00VklGSV9SR0I4ODh0b1lVVjQyMC5jIFwKLSAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMC5jIFwKLSAgICAgIE00VkZMX3RyYW5zaXRpb24uYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VkZMX3RyYW5zaXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE1ZTBiNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRUUkFOX3RyYW5zaXRpb24uYwotICogQGJyaWVmCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqIE9TQUwgKG1lbXNldCBhbmQgbWVtY3B5KSAqKiovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpbmNsdWRlICJNNFZGTF90cmFuc2l0aW9uLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIExJVFRMRV9FTkRJQU4KLSNkZWZpbmUgTTRWRkxfU1dBUF9TSE9SVChhKSBhID0gKChhICYgMHhGRikgPDwgOCkgfCAoKGEgJiAweEZGMDApID4+IDgpCi0jZWxzZQotI2RlZmluZSBNNFZGTF9TV0FQX1NIT1JUKGEpCi0jZW5kaWYKLQotI2RlZmluZSBMVU1fRkFDVE9SX01BWCAxMAotCi0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYUJ5U3RlcChNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRkxfTW9kaWZMdW1QYXJhbSAqbHVtX3BhcmFtLCB2b2lkICp1c2VyX2RhdGEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgKnBfc3JjLCAqcF9kZXN0LCAqcF9zcmNfbGluZSwgKnBfZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGxvbmcgcGl4X3NyYzsKLSAgICB1bnNpZ25lZCBsb25nIHVfb3V0cHgsIHVfb3V0cHgyOwotICAgIHVuc2lnbmVkIGxvbmcgdV93aWR0aCwgdV9zdHJpZGUsIHVfc3RyaWRlX291dCx1X2hlaWdodCwgcGl4OwotICAgIHVuc2lnbmVkIGxvbmcgbGYxLCBsZjIsIGxmMzsKLSAgICBsb25nIGksIGo7Ci0KLSAgICBpZiAobHVtX3BhcmFtLT5jb3B5X2Nocm9tYSAhPSAwKQotICAgIHsKLSAgICAgICAgLyogY29weSBjaHJvbWEgcGxhbmUgKi8KLQotICAgIH0KLQotICAgIC8qIGFwcGx5IGx1bWEgZmFjdG9yICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzBdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblswXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IChwbGFuZV9pblswXS51X3N0cmlkZSA+PiAxKTsKLSAgICB1X3N0cmlkZV9vdXQgPSAocGxhbmVfb3V0WzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHBfZGVzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfb3V0WzBdLnBhY19kYXRhW3BsYW5lX291dFswXS51X3RvcGxlZnRdOwotICAgIHBfc3JjID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9pblswXS5wYWNfZGF0YVtwbGFuZV9pblswXS51X3RvcGxlZnRdOwotICAgIHBfZGVzdF9saW5lID0gcF9kZXN0OwotICAgIHBfc3JjX2xpbmUgPSBwX3NyYzsKLQotICAgIHN3aXRjaChsdW1fcGFyYW0tPmx1bV9mYWN0b3IpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgICAgLyogdmVyeSBzcGVjaWZpYyBjYXNlIDogc2V0IGx1bWEgcGxhbmUgdG8gMTYgKi8KLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2Rlc3QsMTYsIHVfd2lkdGgpOwotICAgICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgMToKLSAgICAgICAgLyogMC4yNSAqLwotICAgICAgICBsZjEgPSA2OyBsZjIgPSA2OyBsZjMgPSA3OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIC8qIDAuMzc1ICovCi0gICAgICAgIGxmMSA9IDc7IGxmMiA9IDc7IGxmMyA9IDc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgICAgLyogMC41ICovCi0gICAgICAgIGxmMSA9IDc7IGxmMiA9IDc7IGxmMyA9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICAgLyogMC42MjUgKi8KLSAgICAgICAgbGYxID0gNzsgbGYyID0gODsgbGYzID0gODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgICAvKiAwLjc1ICovCi0gICAgICAgIGxmMSA9IDg7IGxmMiA9IDg7IGxmMyA9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgLyogMC44NzUgKi8KLSAgICAgICAgbGYxID0gOTsgbGYyID0gODsgbGYzID0gNzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgbGYxID0gODsgbGYyID0gODsgbGYzID0gOTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgcF9kZXN0ID0gcF9kZXN0X2xpbmU7Ci0gICAgICAgIHBfc3JjID0gcF9zcmNfbGluZTsKLSAgICAgICAgZm9yIChpID0gKHVfd2lkdGggPj4gMSk7IGkgIT0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwaXhfc3JjID0gKHVuc2lnbmVkIGxvbmcpICpwX3NyYysrOwotICAgICAgICAgICAgcGl4ID0gcGl4X3NyYyAmIDB4RkY7Ci0gICAgICAgICAgICB1X291dHB4ID0gKCgocGl4IDw8IGxmMSkgKyAocGl4IDw8IGxmMikgKyAocGl4IDw8IGxmMykgKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICBwaXggPSAoKHBpeF9zcmMgJiAweEZGMDApID4+IDgpOwotICAgICAgICAgICAgdV9vdXRweDIgPSAoKCgocGl4IDw8IGxmMSkgKyAocGl4IDw8IGxmMikgKyAocGl4IDw8IGxmMykgKSA+PiBMVU1fRkFDVE9SX01BWCk8PCA4KSA7Ci0gICAgICAgICAgICAqcF9kZXN0KysgPSAodW5zaWduZWQgc2hvcnQpICh1X291dHB4MiB8IHVfb3V0cHgpOwotICAgICAgICB9Ci0gICAgICAgIHBfZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgcF9zcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsdW1fZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgKnBfc3JjLCAqcF9kZXN0LCAqcF9zcmNfbGluZSwgKnBfZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGNoYXIgKnBfY3NyYywgKnBfY2Rlc3QsICpwX2NzcmNfbGluZSwgKnBfY2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBsb25nIHBpeF9zcmM7Ci0gICAgdW5zaWduZWQgbG9uZyB1X291dHB4LCB1X291dHB4MjsKLSAgICB1bnNpZ25lZCBsb25nIHVfd2lkdGgsIHVfc3RyaWRlLCB1X3N0cmlkZV9vdXQsdV9oZWlnaHQsIHBpeDsKLSAgICBsb25nIGksIGo7Ci0KLSAgICAvKiBjb3B5IG9yIGZpbHRlciBjaHJvbWEgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMV0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzFdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gcGxhbmVfaW5bMV0udV9zdHJpZGU7Ci0gICAgdV9zdHJpZGVfb3V0ID0gcGxhbmVfb3V0WzFdLnVfc3RyaWRlOwotICAgIHBfY2Rlc3RfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMV0ucGFjX2RhdGFbcGxhbmVfb3V0WzFdLnVfdG9wbGVmdF07Ci0gICAgcF9jc3JjX2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMV0ucGFjX2RhdGFbcGxhbmVfaW5bMV0udV90b3BsZWZ0XTsKLQotICAgIGlmIChsdW1fZmFjdG9yID4gMjU2KQotICAgIHsKLSAgICAgICAgcF9jZGVzdCA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMl0ucGFjX2RhdGFbcGxhbmVfb3V0WzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIHBfY3NyYyA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsyXS5wYWNfZGF0YVtwbGFuZV9pblsyXS51X3RvcGxlZnRdOwotICAgICAgICAvKiBjb3B5IGNocm9tYSAqLwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3RfbGluZSwgKHZvaWQgKilwX2NzcmNfbGluZSwgdV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9jZGVzdCwodm9pZCAqKSBwX2NzcmMsIHVfd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgICAgICBwX2NzcmMgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogZmlsdGVyIGNocm9tYSAqLwotICAgICAgICBwaXggPSAoMTAyNCAtIGx1bV9mYWN0b3IpIDw8IDc7Ci0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9jZGVzdCA9IHBfY2Rlc3RfbGluZTsKLSAgICAgICAgICAgIHBfY3NyYyA9IHBfY3NyY19saW5lOwotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY2Rlc3QrKyA9ICgocGl4ICsgKCpwX2NzcmMrKyAmIDB4RkYpICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIHBfY2Rlc3RfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMl0ucGFjX2RhdGFbcGxhbmVfb3V0WzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIHBfY3NyY19saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzJdLnBhY19kYXRhW3BsYW5lX2luWzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9jZGVzdCA9IHBfY2Rlc3RfbGluZTsKLSAgICAgICAgICAgIHBfY3NyYyA9IHBfY3NyY19saW5lOwotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY2Rlc3QrKyA9ICgocGl4ICsgKCpwX2NzcmMgJiAweEZGKSAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBhcHBseSBsdW1hIGZhY3RvciAqLwotICAgIHVfd2lkdGggPSBwbGFuZV9pblswXS51X3dpZHRoOwotICAgIHVfaGVpZ2h0ID0gcGxhbmVfaW5bMF0udV9oZWlnaHQ7Ci0gICAgdV9zdHJpZGUgPSAocGxhbmVfaW5bMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgdV9zdHJpZGVfb3V0ID0gKHBsYW5lX291dFswXS51X3N0cmlkZSA+PiAxKTsKLSAgICBwX2Rlc3QgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX291dFswXS5wYWNfZGF0YVtwbGFuZV9vdXRbMF0udV90b3BsZWZ0XTsKLSAgICBwX3NyYyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfaW5bMF0ucGFjX2RhdGFbcGxhbmVfaW5bMF0udV90b3BsZWZ0XTsKLSAgICBwX2Rlc3RfbGluZSA9IHBfZGVzdDsKLSAgICBwX3NyY19saW5lID0gcF9zcmM7Ci0KLSAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgewotICAgICAgICBwX2Rlc3QgPSBwX2Rlc3RfbGluZTsKLSAgICAgICAgcF9zcmMgPSBwX3NyY19saW5lOwotICAgICAgICBmb3IgKGkgPSAodV93aWR0aCA+PiAxKTsgaSAhPSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBpeF9zcmMgPSAodW5zaWduZWQgbG9uZykgKnBfc3JjKys7Ci0gICAgICAgICAgICBwaXggPSBwaXhfc3JjICYgMHhGRjsKLSAgICAgICAgICAgIHVfb3V0cHggPSAoKHBpeCAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIHBpeCA9ICgocGl4X3NyYyAmIDB4RkYwMCkgPj4gOCk7Ci0gICAgICAgICAgICB1X291dHB4MiA9ICgoKHBpeCAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTw8IDgpIDsKLSAgICAgICAgICAgICpwX2Rlc3QrKyA9ICh1bnNpZ25lZCBzaG9ydCkgKHVfb3V0cHgyIHwgdV9vdXRweCk7Ci0gICAgICAgIH0KLSAgICAgICAgcF9kZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICBwX3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluMiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBQcm9ncmVzcykKLSAqIEBicmllZiAgIEJsZW5kcyB0d28gWVVWIDQ6MjowIFBsYW5hciBpbWFnZXMuCi0gKiBAbm90ZSAgICBCbGVuZHMgWVVWNDIwIHBsYW5hciBpbWFnZXMsCi0gKiAgICAgICAgICBNYXAgdGhlIHZhbHVlIG9mIHByb2dyZXNzIGZyb20gKDAgLSAxMDAwKSB0byAoMCAtIDEwMjQpCi0gKiAgICAgICAgICBTZXQgdGhlIHJhbmdlIG9mIGJsZW5kaW5nZmFjdG9yLAotICogICAgICAgICAgICAgICAgICAxLiBmcm9tIDAgdG8gKFByb2dyZXNzIDw8IDEpICAgICAgICAgICAgO2ZvciBQcm9ncmVzcyA8PSA1MTIKLSAqICAgICAgICAgICAgICAgICAgMi4gZnJvbSAoKCBQcm9ncmVzcyAtIDUxMik8PCAxKSB0byAxMDI0IDtvdGhlcndpc2UKLSAqICAgICAgICAgIFNldCB0aGUgaW5jcmVtZW50IG9mIGJsZW5kaW5nZmFjdG9yIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGltYWdlIHJvdyBieSB0aGUgZmFjdG9yLAotICogICAgICAgICAgICAgICAgICA9ICAoUmFuZ2UtMSkgLyAoaW1hZ2Ugd2lkdGgtMSkgIDtmb3Igd2lkdGggPj0gcmFuZ2UKLSAqICAgICAgICAgICAgICAgICAgPSAgKFJhbmdlKSAvIChpbWFnZSB3aWR0aCkgICAgICA7b3RoZXJ3aXNlCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2goPSBpKSByb3cgb2Ygb3V0cHV0IFkgcGxhbmUgKHN0ZXBzIG9mIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoKD0gaikgY29sdW1uIG9mIG91dHB1dCBZIHBsYW5lIChzdGVwcyBvZiAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIG9uZSBVICYgViBzYW1wbGUgZnJvbSB0d28gaW5wdXQgWVVWNDoyOjAgaW1hZ2VzIGFuZAotICogICAgICAgICAgICAgICAgICBDb21wdXRlIGZvdXIgWSBzYW1wbGUgYW5kIG9uZSBVICYgViBzYW1wbGUgZm9yIG91dHB1dCBZVVY0OjI6MCBpbWFnZQotICogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIGZvbGxvd2luZywKLSAqICAgICAgICAgICAgICAgICAgT3V0KGksaikgPSBibGVuZGluZ2ZhY3RvcihpLGopICogSW4xKGksaikrIChsIC0gYmxlbmRpbmdmYWN0b3IoaSxqKSkgKkluMihpLGopCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgIFVzZXIgU3BlY2lmaWMgUGFyYW1ldGVyCi0gKiBAcGFyYW0gICBwUGxhbmVJbjE6IChJTikgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkCi0gKiAgICAgICAgICAgZm9yIFksIFUgYW5kIFYgcGxhbmVzLgotICogQHBhcmFtICAgcFBsYW5lSW4yOiAoSU4pICBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMgbWFpbnRhaW5lZAotICogICAgICAgICAgIGZvciBZLCBVIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQKLSAqICAgICAgICAgICBmb3IgWSwgVSBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBQcm9ncmVzczogIChJTikgIFByb2dyZXNzIHZhbHVlICh2YXJpZXMgYmV0d2VlbiAwIGFuZCAxMDAwKQotICogQHJldHVybiAgTTRWSUZJX09LOiBObyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiogQ2hlY2sgZm9yIHZhbHVlIGlzIEVWRU4gKi8KLSNpZm5kZWYgSVNfRVZFTgotI2RlZmluZSBJU19FVkVOKGEpICAoIShhICYgMHgwMSkpCi0jZW5kaWYKLQotLyoqIFVzZWQgZm9yIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uICovCi0jaWZuZGVmIE1BWF9TSE9SVAotI2RlZmluZSBNQVhfU0hPUlQgICAweDEwMDAwCi0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgICAgMAotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAwCi0jZGVmaW5lIFRSVUUgICAgIUZBTFNFCi0jZW5kaWYKLQotdW5zaWduZWQgY2hhciBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBQcm9ncmVzcykKLXsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDEsKnB1OF9kYXRhX1Vfc3RhcnQxLCpwdThfZGF0YV9WX3N0YXJ0MTsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDIsKnB1OF9kYXRhX1Vfc3RhcnQyLCpwdThfZGF0YV9WX3N0YXJ0MjsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDMsKnB1OF9kYXRhX1Vfc3RhcnQzLCpwdThfZGF0YV9WX3N0YXJ0MzsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9jdXJyZW50MSwgKnB1OF9kYXRhX1lfbmV4dDEsICpwdThfZGF0YV9VMSwgKnB1OF9kYXRhX1YxOwotICAgIFVJbnQ4ICAgICpwdThfZGF0YV9ZX2N1cnJlbnQyLCAqcHU4X2RhdGFfWV9uZXh0MiwgKnB1OF9kYXRhX1UyLCAqcHU4X2RhdGFfVjI7Ci0gICAgVUludDggICAgKnB1OF9kYXRhX1lfY3VycmVudDMsKnB1OF9kYXRhX1lfbmV4dDMsICpwdThfZGF0YV9VMywgKnB1OF9kYXRhX1YzOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTEsIHUzMl9zdHJpZGUyX1kxLCB1MzJfc3RyaWRlX1UxLCB1MzJfc3RyaWRlX1YxOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTIsIHUzMl9zdHJpZGUyX1kyLCB1MzJfc3RyaWRlX1UyLCB1MzJfc3RyaWRlX1YyOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTMsIHUzMl9zdHJpZGUyX1kzLCB1MzJfc3RyaWRlX1UzLCB1MzJfc3RyaWRlX1YzOwotICAgIFVJbnQzMiAgIHUzMl9oZWlnaHQsICB1MzJfd2lkdGg7Ci0gICAgVUludDMyICAgdTMyX2JsZW5kZmFjdG9yLCB1MzJfc3RhcnRBLCB1MzJfZW5kQSwgdTMyX2JsZW5kX2luYywgdTMyX3hfYWNjdW07Ci0gICAgVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdywgdTMyX3JhbmdlQSwgdTMyX3Byb2dyZXNzOwotICAgIFVJbnQzMiAgIHUzMl9VMSx1MzJfVjEsdTMyX1UyLHUzMl9WMiwgdTMyX1kxLCB1MzJfWTI7Ci0KLQotICAgIC8qIENoZWNrIHRoZSBZIHBsYW5lIGhlaWdodCBpcyBFVkVOIGFuZCBpbWFnZSBwbGFuZSBoZWlnaHRzIGFyZSBzYW1lICovCi0gICAgaWYoIChJU19FVkVOKHBQbGFuZUluMVswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZUluMlswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVJbjFbMF0udV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVJbjJbMF0udV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHRoZSBZIHBsYW5lIHdpZHRoIGlzIEVWRU4gYW5kIGltYWdlIHBsYW5lIHdpZHRocyBhcmUgc2FtZSAqLwotICAgIGlmKCAoSVNfRVZFTihwUGxhbmVJbjFbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVJbjJbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXRbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lSW4xWzBdLnVfd2lkdGggICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lSW4yWzBdLnVfd2lkdGggICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dDEgWVVWNDIwIGltYWdlIHBsYW5lcyAqLwotICAgIHB1OF9kYXRhX1lfc3RhcnQxID0gcFBsYW5lSW4xWzBdLnBhY19kYXRhICsgcFBsYW5lSW4xWzBdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9VX3N0YXJ0MSA9IHBQbGFuZUluMVsxXS5wYWNfZGF0YSArIHBQbGFuZUluMVsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVl9zdGFydDEgPSBwUGxhbmVJbjFbMl0ucGFjX2RhdGEgKyBwUGxhbmVJbjFbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0MiBZVVY0MjAgaW1hZ2UgcGxhbmVzICovCi0gICAgcHU4X2RhdGFfWV9zdGFydDIgPSBwUGxhbmVJbjJbMF0ucGFjX2RhdGEgKyBwUGxhbmVJbjJbMF0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Vfc3RhcnQyID0gcFBsYW5lSW4yWzFdLnBhY19kYXRhICsgcFBsYW5lSW4yWzFdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9WX3N0YXJ0MiA9IHBQbGFuZUluMlsyXS5wYWNfZGF0YSArIHBQbGFuZUluMlsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IFlVVjQyMCBpbWFnZSBwbGFuZXMgKi8KLSAgICBwdThfZGF0YV9ZX3N0YXJ0MyA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVV9zdGFydDMgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Zfc3RhcnQzID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgc3RyaWRlIGZvciB0aGUgbmV4dCByb3cgaW4gZWFjaCBpbnB1dDEgWVVWNDIwIHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZMSA9IHBQbGFuZUluMVswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1UxID0gcFBsYW5lSW4xWzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVjEgPSBwUGxhbmVJbjFbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgcm93IGluIGVhY2ggaW5wdXQyIFlVVjQyMCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWTIgPSBwUGxhbmVJbjJbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9VMiA9IHBQbGFuZUluMlsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YyID0gcFBsYW5lSW4yWzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzdHJpZGUgZm9yIHRoZSBuZXh0IHJvdyBpbiBlYWNoIG91dHB1dCBZVVY0MjAgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kzID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVTMgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WMyA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIHUzMl9zdHJpZGUyX1kxICAgPSB1MzJfc3RyaWRlX1kxIDw8IDE7Ci0gICAgdTMyX3N0cmlkZTJfWTIgICA9IHUzMl9zdHJpZGVfWTIgPDwgMTsKLSAgICB1MzJfc3RyaWRlMl9ZMyAgID0gdTMyX3N0cmlkZV9ZMyA8PCAxOwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgIHUzMl93aWR0aCAgPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLQotICAgIC8qIFVzZXIgU3BlY2lmaWVkIFByb2dyZXNzIHZhbHVlICovCi0gICAgdTMyX3Byb2dyZXNzID0gUHJvZ3Jlc3M7Ci0KLSAgICAvKiBNYXAgUHJvZ3Jlc3MgdmFsdWUgZnJvbSAoMCAtIDEwMDApIHRvICgwIC0gMTAyNCkgLT4gZm9yIG9wdGltaXNhdGlvbiAqLwotICAgIGlmKHUzMl9wcm9ncmVzcyA8IDEwMDApCi0gICAgICAgIHUzMl9wcm9ncmVzcyA9ICgodTMyX3Byb2dyZXNzIDw8IDEwKSAvIDEwMDApOwotICAgIGVsc2UKLSAgICAgICAgdTMyX3Byb2dyZXNzID0gMTAyNDsKLQotICAgIC8qIFNldCB0aGUgcmFuZ2Ugb2YgYmxlbmRpbmdmYWN0b3IgKi8KLSAgICBpZih1MzJfcHJvZ3Jlc3MgPD0gNTEyKQotICAgIHsKLSAgICAgICAgdTMyX3N0YXJ0QSA9IDA7Ci0gICAgICAgIHUzMl9lbmRBICAgPSAodTMyX3Byb2dyZXNzIDw8IDEpOwotICAgIH0KLSAgICBlbHNlIC8qIHUzMl9wcm9ncmVzcyA+IDUxMiAqLwotICAgIHsKLSAgICAgICAgdTMyX3N0YXJ0QSA9ICh1MzJfcHJvZ3Jlc3MgLSA1MTIpIDw8IDE7Ci0gICAgICAgIHUzMl9lbmRBICAgPSAgMTAyNDsKLSAgICB9Ci0gICAgdTMyX3JhbmdlQSA9IHUzMl9lbmRBIC0gdTMyX3N0YXJ0QTsKLQotICAgIC8qIFNldCB0aGUgaW5jcmVtZW50IG9mIGJsZW5kaW5nZmFjdG9yIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGltYWdlIHJvdyAqLwotICAgIGlmICgodTMyX3dpZHRoID49IHUzMl9yYW5nZUEpICYmICh1MzJfcmFuZ2VBID4gMCkgKQotICAgIHsKLSAgICAgICAgdTMyX2JsZW5kX2luYyAgID0gKCh1MzJfcmFuZ2VBLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGggLSAxKTsKLSAgICB9Ci0gICAgZWxzZSAvKiAodTMyX3dpZHRoIDwgdTMyX3JhbmdlQSkgfHwgKHUzMl9yYW5nZUEgPCAwKSAqLwotICAgIHsKLSAgICAgICAgdTMyX2JsZW5kX2luYyAgID0gKHUzMl9yYW5nZUEgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aCk7Ci0gICAgfQotCi0gICAgLyogVHdvIFlVVjQyMCByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0OyB1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogU2V0IHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJvdyBmb3IgZWFjaCBpbnB1dCBpbWFnZTEgcGxhbmUgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9jdXJyZW50MSA9IHB1OF9kYXRhX1lfc3RhcnQxOwotICAgICAgICBwdThfZGF0YV9VMSA9IHB1OF9kYXRhX1Vfc3RhcnQxOwotICAgICAgICBwdThfZGF0YV9WMSA9IHB1OF9kYXRhX1Zfc3RhcnQxOwotCi0gICAgICAgIC8qIFNldCBwb2ludGVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3cgZm9yIGVhY2ggaW5wdXQgaW1hZ2UyIHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX1lfY3VycmVudDIgPSBwdThfZGF0YV9ZX3N0YXJ0MjsKLSAgICAgICAgcHU4X2RhdGFfVTIgPSBwdThfZGF0YV9VX3N0YXJ0MjsKLSAgICAgICAgcHU4X2RhdGFfVjIgPSBwdThfZGF0YV9WX3N0YXJ0MjsKLQotICAgICAgICAvKiBTZXQgcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcm93IGZvciBlYWNoIG91dHB1dCBpbWFnZSBwbGFuZSAqLwotICAgICAgICBwdThfZGF0YV9ZX2N1cnJlbnQzID0gcHU4X2RhdGFfWV9zdGFydDM7Ci0gICAgICAgIHB1OF9kYXRhX1UzID0gcHU4X2RhdGFfVV9zdGFydDM7Ci0gICAgICAgIHB1OF9kYXRhX1YzID0gcHU4X2RhdGFfVl9zdGFydDM7Ci0KLSAgICAgICAgLyogU2V0IHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcm93IGZvciBpbWFnZSBsdW1hIHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX1lfbmV4dDEgPSBwdThfZGF0YV9ZX2N1cnJlbnQxICsgdTMyX3N0cmlkZV9ZMTsKLSAgICAgICAgcHU4X2RhdGFfWV9uZXh0MiA9IHB1OF9kYXRhX1lfY3VycmVudDIgKyB1MzJfc3RyaWRlX1kyOwotICAgICAgICBwdThfZGF0YV9ZX25leHQzID0gcHU4X2RhdGFfWV9jdXJyZW50MyArIHUzMl9zdHJpZGVfWTM7Ci0KLSAgICAgICAgLyogSW5pdGlhbGlzZSBibGVuZGZhY3RvciAqLwotICAgICAgICB1MzJfYmxlbmRmYWN0b3IgICA9IHUzMl9zdGFydEE7Ci0gICAgICAgIC8qIEJsZW5kZmFjdG9yIEluY3JlbWVudCBhY2N1bXVsYXRvciAqLwotICAgICAgICB1MzJfeF9hY2N1bSA9IDA7Ci0KLSAgICAgICAgLyogTG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmxlbmRpbmcgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfYmxlbmRmYWN0b3IgPSB1MzJfc3RhcnRBICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgseSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9jdXJyZW50MSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgY2hyb21pbmFuY2UyIHZhbHVlICovCi0gICAgICAgICAgICB1MzJfVTEgPSAqcHU4X2RhdGFfVTErKzsKLSAgICAgICAgICAgIHUzMl9WMSA9ICpwdThfZGF0YV9WMSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCx5KSBvZiBpbnB1dCBJbWFnZTIgKi8KLSAgICAgICAgICAgIHUzMl9ZMiA9ICpwdThfZGF0YV9ZX2N1cnJlbnQyKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBjaHJvbWluYW5jZTIgdmFsdWUgKi8KLSAgICAgICAgICAgIHUzMl9VMiA9ICpwdThfZGF0YV9VMisrOwotICAgICAgICAgICAgdTMyX1YyID0gKnB1OF9kYXRhX1YyKys7Ci0KLSAgICAgICAgICAgIC8qIENvbXB1dGUgTHVtYSB2YWx1ZSAoeCx5KSBvZiBPdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgICAgICpwdThfZGF0YV9ZX2N1cnJlbnQzKysgID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9ZMSkgPj4gMTApOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBjaHJvbWEoVSkgdmFsdWUgb2YgT3V0cHV0IGltYWdlICovCi0gICAgICAgICAgICAqcHU4X2RhdGFfVTMrKyAgICAgICAgICA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9VMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDI0IC0gdTMyX2JsZW5kZmFjdG9yKSp1MzJfVTEpID4+IDEwKTsKLSAgICAgICAgICAgIC8qIENvbXB1dGUgY2hyb21hKFYpIHZhbHVlIG9mIE91dHB1dCBpbWFnZSAqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1YzKysgICAgICAgICAgPSAoVUludDgpKCh1MzJfYmxlbmRmYWN0b3IgKiB1MzJfVjIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1YxKSA+PiAxMCk7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4LHkrMSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9uZXh0MSsrOwotCi0gICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgseSsxKSBvZiBpbnB1dCBJbWFnZTIgKi8KLSAgICAgICAgICAgIHUzMl9ZMiA9ICpwdThfZGF0YV9ZX25leHQyKys7Ci0KLSAgICAgICAgICAgIC8qIENvbXB1dGUgTHVtYSB2YWx1ZSAoeCx5KzEpIG9mIE91dHB1dCBpbWFnZSovCi0gICAgICAgICAgICAqcHU4X2RhdGFfWV9uZXh0MysrID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1kxKSA+PiAxMCk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl9ibGVuZF9pbmM7Ci0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmxlbmRpbmcgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfYmxlbmRmYWN0b3IgPSB1MzJfc3RhcnRBICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgrMSx5KSBvZiBpbnB1dCBJbWFnZTEgKi8KLSAgICAgICAgICAgIHUzMl9ZMSA9ICpwdThfZGF0YV9ZX2N1cnJlbnQxKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4KzEseSkgb2YgaW5wdXQgSW1hZ2UyICovCi0gICAgICAgICAgICB1MzJfWTIgPSAqcHU4X2RhdGFfWV9jdXJyZW50MisrOwotCi0gICAgICAgICAgICAvKiBDb21wdXRlIEx1bWEgdmFsdWUgKHgrMSx5KSBvZiBPdXRwdXQgaW1hZ2UqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1lfY3VycmVudDMrKyA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9ZMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9ZMSkgPj4gMTApOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCsxLHkrMSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9uZXh0MSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCsxLHkrMSkgb2YgaW5wdXQgSW1hZ2UyICovCi0gICAgICAgICAgICB1MzJfWTIgPSAqcHU4X2RhdGFfWV9uZXh0MisrOwotCi0gICAgICAgICAgICAvKiBDb21wdXRlIEx1bWEgdmFsdWUgKHgrMSx5KzEpIG9mIE91dHB1dCBpbWFnZSovCi0gICAgICAgICAgICAqcHU4X2RhdGFfWV9uZXh0MysrID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1kxKSA+PiAxMCk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl9ibGVuZF9pbmM7Ci0KLSAgICAgICAgICAgIC8qIFdvcmtpbmcgcG9pbnRlcnMgYXJlIGluY3JlbWVudGVkIGp1c3QgYWZ0ZXIgZWFjaCBzdG9yYWdlICovCi0KLSAgICAgICAgfS8qIEVuZCBvZiByb3cgc2Nhbm5pbmcgKi8KLQotICAgICAgICAvKiBVcGRhdGUgd29ya2luZyBwb2ludGVyIG9mIGlucHV0IGltYWdlMSBmb3IgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9zdGFydDEgKz0gdTMyX3N0cmlkZTJfWTE7Ci0gICAgICAgIHB1OF9kYXRhX1Vfc3RhcnQxICs9IHUzMl9zdHJpZGVfVTE7Ci0gICAgICAgIHB1OF9kYXRhX1Zfc3RhcnQxICs9IHUzMl9zdHJpZGVfVjE7Ci0KLSAgICAgICAgLyogVXBkYXRlIHdvcmtpbmcgcG9pbnRlciBvZiBpbnB1dCBpbWFnZTIgZm9yIG5leHQgcm93ICovCi0gICAgICAgIHB1OF9kYXRhX1lfc3RhcnQyICs9IHUzMl9zdHJpZGUyX1kyOwotICAgICAgICBwdThfZGF0YV9VX3N0YXJ0MiArPSB1MzJfc3RyaWRlX1UyOwotICAgICAgICBwdThfZGF0YV9WX3N0YXJ0MiArPSB1MzJfc3RyaWRlX1YyOwotCi0gICAgICAgIC8qIFVwZGF0ZSB3b3JraW5nIHBvaW50ZXIgb2Ygb3V0cHV0IGltYWdlIGZvciBuZXh0IHJvdyAqLwotICAgICAgICBwdThfZGF0YV9ZX3N0YXJ0MyArPSB1MzJfc3RyaWRlMl9ZMzsKLSAgICAgICAgcHU4X2RhdGFfVV9zdGFydDMgKz0gdTMyX3N0cmlkZV9VMzsKLSAgICAgICAgcHU4X2RhdGFfVl9zdGFydDMgKz0gdTMyX3N0cmlkZV9WMzsKLQotICAgIH0vKiBFbmQgb2YgY29sdW1uIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMC5jICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQkdSNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQkdSNTY1dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYwODc2Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBDb2xvciBDb252ZXJzaW9uIEZpbHRlcgotICogICAgICAgICAgIC0jIENvbnRhaW5zIHRoZSBmb3JtYXQgY29udmVyc2lvbiBmaWx0ZXJzIGZyb20gQkdSNTY1IHRvIFlVVjQyMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICBUcmFuc2Zvcm0gQkdSNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBCR1I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IEJHUiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gQkdSNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNFZJRklfVUludDggICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX1ksIHUzMl9zdHJpZGUyX1ksIHUzMl9zdHJpZGVfVSwgdTMyX3N0cmlkZV9WOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2JnciwgdTMyX3N0cmlkZV8yYmdyOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY29sLCB1MzJfcm93OwotCi0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9yMDAsIGkzMl9yMDEsIGkzMl9yMTAsIGkzMl9yMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9nMDAsIGkzMl9nMDEsIGkzMl9nMTAsIGkzMl9nMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9iMDAsIGkzMl9iMDEsIGkzMl9iMTAsIGkzMl9iMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl95MDAsIGkzMl95MDEsIGkzMl95MTAsIGkzMl95MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl91MDAsIGkzMl91MDEsIGkzMl91MTAsIGkzMl91MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl92MDAsIGkzMl92MDEsIGkzMl92MTAsIGkzMl92MTE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeW4sICpwdThfeXMsICpwdThfdSwgKnB1OF92OwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3lfZGF0YSwgKnB1OF91X2RhdGEsICpwdThfdl9kYXRhOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2Jncm5fZGF0YSwgKnB1OF9iZ3JuOwotICAgIE00VklGSV9VSW50MTYgICB1MTZfcGl4MSwgdTE2X3BpeDIsIHUxNl9waXgzLCB1MTZfcGl4NDsKLQotICAgIC8qIENoZWNrIHBsYW5lcyBoZWlnaHQgYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcGxhbmVzIHdpZHRoIGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfd2lkdGggIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhICA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSAgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF9iZ3JuX2RhdGEgICA9IHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCAgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1kgPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfYmdyID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMmJnciA9IHUzMl9zdHJpZGVfYmdyIDw8IDE7Ci0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X2Jncm4gPSBwdThfYmdybl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBCR1IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9iZ3JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9iZ3JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfYmdybiArIHUzMl9zdHJpZGVfYmdyKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfYmdybiArIHUzMl9zdHJpZGVfYmdyICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9CR1I1NjUoaTMyX2IwMCwgaTMyX2cwMCwgaTMyX3IwMCwgdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX0JHUjU2NShpMzJfYjEwLCBpMzJfZzEwLCBpMzJfcjEwLCB1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfQkdSNTY1KGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDEsIHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX0JHUjU2NShpMzJfYjExLCBpMzJfZzExLCBpMzJfcjExLCB1MTZfcGl4NCk7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgQkdSIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGNocm9tYSBkYXRhICovCi0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9iZ3JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICAgICAgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X2Jncm5fZGF0YSAgICs9IHUzMl9zdHJpZGVfMmJncjsKLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9DbGlwLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0NsaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQyOTBiMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0NsaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9DbGlwLmMKLSAqIEBicmllZiAgICBNYW5hZ2VtZW50IG9mIHRoZSBSR0IgQ2xpcHBpbmcgbWF0cml4IGluY2x1c2lvbiBhbmQgRGl2aXNpb24gVGFibGUKLSAqIEBub3RlICAgICAtIyBDbGlwcGluZyBNYXRyaXggaXMgdXNlZCBpbiBvcmRlciB0byBwcm9wZXJseSBtYW5hZ2UgdGhlIGluY2x1c2lvbiBvZgotICogICAgICAgICAgIHRoZSBleHRlcm5hbCBSR0IgQ2xpcHBpbmcgbWF0cml4IHVzZWQgZm9yIGNvbG9yIGNvbnZlcnNpb24uCi0gKiAgICAgICAgICAgVGhpcyBmaWxlIEhBUyBUTyBCRSBjb21waWxlZCB3aXRoIGFsbCBjb2xvciBjb252ZXJzaW9uIGZpbHRlcnMgcHJvamVjdAotICogICAgICAgICAgIC0jIERpdmlzaW9uIHRhYmxlIGlzIHVzZWQgaW4gUkdCIHRvIEhMUyBjb2xvciBjb252ZXJzaW9uCi0gKiAgICAgICAgICAgSW1wb3J0YW50OiBUaGlzIGZpbGUgbXVzdCBiZSBjb21waWxlZCBkdXJpbmcgdGhlIGFzc2VtYmx5IGxpYnJhcnkgYnVpbGRpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLUNOU1QgTTRWSUZJX1VJbnQ4ICAgTTRWSUZJX0NsaXBUYWJsZVsxMjU2XQotPSB7Ci0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsCi0weDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLAotMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKLTB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsCi0weDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLCAweDIzLAotMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwKLTB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsCi0weDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDNiLAotMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywKLTB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsCi0weDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLCAweDUxLCAweDUyLCAweDUzLAotMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwKLTB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsCi0weDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLAotMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywKLTB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsCi0weDdjLCAweDdkLCAweDdlLCAweDdmLCAweDgwLCAweDgxLCAweDgyLCAweDgzLAotMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwKLTB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsCi0weDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweDliLAotMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywKLTB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YWIsCi0weGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLCAweGIxLCAweGIyLCAweGIzLAotMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwKLTB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsCi0weGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGNiLAotMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywKLTB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsCi0weGRjLCAweGRkLCAweGRlLCAweGRmLCAweGUwLCAweGUxLCAweGUyLCAweGUzLAotMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwKLTB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsCi0weGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZiLAotMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCi19OwotCi0vKiBEaXZpc2lvbiB0YWJsZSBmb3IgKCA2NTUzNS94ICk7IHggPSAwIHRvIDUxMiAqLwotQ05TVCBNNFZJRklfVUludDE2ICBNNFZJRklfRGl2VGFibGVbNTEyXQotPSB7Ci0wLCA2NTUzNSwgMzI3NjgsIDIxODQ1LCAxNjM4NCwgMTMxMDcsIDEwOTIyLCA5MzYyLAotODE5MiwgNzI4MSwgNjU1MywgNTk1NywgNTQ2MSwgNTA0MSwgNDY4MSwgNDM2OSwKLTQwOTYsIDM4NTUsIDM2NDAsIDM0NDksIDMyNzYsIDMxMjAsIDI5NzgsIDI4NDksCi0yNzMwLCAyNjIxLCAyNTIwLCAyNDI3LCAyMzQwLCAyMjU5LCAyMTg0LCAyMTE0LAotMjA0OCwgMTk4NSwgMTkyNywgMTg3MiwgMTgyMCwgMTc3MSwgMTcyNCwgMTY4MCwKLTE2MzgsIDE1OTgsIDE1NjAsIDE1MjQsIDE0ODksIDE0NTYsIDE0MjQsIDEzOTQsCi0xMzY1LCAxMzM3LCAxMzEwLCAxMjg1LCAxMjYwLCAxMjM2LCAxMjEzLCAxMTkxLAotMTE3MCwgMTE0OSwgMTEyOSwgMTExMCwgMTA5MiwgMTA3NCwgMTA1NywgMTA0MCwKLTEwMjQsIDEwMDgsIDk5MiwgOTc4LCA5NjMsIDk0OSwgOTM2LCA5MjMsCi05MTAsIDg5NywgODg1LCA4NzMsIDg2MiwgODUxLCA4NDAsIDgyOSwKLTgxOSwgODA5LCA3OTksIDc4OSwgNzgwLCA3NzEsIDc2MiwgNzUzLAotNzQ0LCA3MzYsIDcyOCwgNzIwLCA3MTIsIDcwNCwgNjk3LCA2ODksCi02ODIsIDY3NSwgNjY4LCA2NjEsIDY1NSwgNjQ4LCA2NDIsIDYzNiwKLTYzMCwgNjI0LCA2MTgsIDYxMiwgNjA2LCA2MDEsIDU5NSwgNTkwLAotNTg1LCA1NzksIDU3NCwgNTY5LCA1NjQsIDU2MCwgNTU1LCA1NTAsCi01NDYsIDU0MSwgNTM3LCA1MzIsIDUyOCwgNTI0LCA1MjAsIDUxNiwKLTUxMiwgNTA4LCA1MDQsIDUwMCwgNDk2LCA0OTIsIDQ4OSwgNDg1LAotNDgxLCA0NzgsIDQ3NCwgNDcxLCA0NjgsIDQ2NCwgNDYxLCA0NTgsCi00NTUsIDQ1MSwgNDQ4LCA0NDUsIDQ0MiwgNDM5LCA0MzYsIDQzNCwKLTQzMSwgNDI4LCA0MjUsIDQyMiwgNDIwLCA0MTcsIDQxNCwgNDEyLAotNDA5LCA0MDcsIDQwNCwgNDAyLCAzOTksIDM5NywgMzk0LCAzOTIsCi0zOTAsIDM4NywgMzg1LCAzODMsIDM4MSwgMzc4LCAzNzYsIDM3NCwKLTM3MiwgMzcwLCAzNjgsIDM2NiwgMzY0LCAzNjIsIDM2MCwgMzU4LAotMzU2LCAzNTQsIDM1MiwgMzUwLCAzNDgsIDM0NiwgMzQ0LCAzNDMsCi0zNDEsIDMzOSwgMzM3LCAzMzYsIDMzNCwgMzMyLCAzMzAsIDMyOSwKLTMyNywgMzI2LCAzMjQsIDMyMiwgMzIxLCAzMTksIDMxOCwgMzE2LAotMzE1LCAzMTMsIDMxMiwgMzEwLCAzMDksIDMwNywgMzA2LCAzMDQsCi0zMDMsIDMwMiwgMzAwLCAyOTksIDI5NywgMjk2LCAyOTUsIDI5MywKLTI5MiwgMjkxLCAyODksIDI4OCwgMjg3LCAyODYsIDI4NCwgMjgzLAotMjgyLCAyODEsIDI4MCwgMjc4LCAyNzcsIDI3NiwgMjc1LCAyNzQsCi0yNzMsIDI3MSwgMjcwLCAyNjksIDI2OCwgMjY3LCAyNjYsIDI2NSwKLTI2NCwgMjYzLCAyNjIsIDI2MSwgMjYwLCAyNTksIDI1OCwgMjU3LAotMjU2LCAyNTUsIDI1NCwgMjUzLCAyNTIsIDI1MSwgMjUwLCAyNDksCi0yNDgsIDI0NywgMjQ2LCAyNDUsIDI0NCwgMjQzLCAyNDIsIDI0MSwKLTI0MCwgMjQwLCAyMzksIDIzOCwgMjM3LCAyMzYsIDIzNSwgMjM0LAotMjM0LCAyMzMsIDIzMiwgMjMxLCAyMzAsIDIyOSwgMjI5LCAyMjgsCi0yMjcsIDIyNiwgMjI1LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMiwKLTIyMSwgMjIwLCAyMTksIDIxOSwgMjE4LCAyMTcsIDIxNywgMjE2LAotMjE1LCAyMTQsIDIxNCwgMjEzLCAyMTIsIDIxMiwgMjExLCAyMTAsCi0yMTAsIDIwOSwgMjA4LCAyMDgsIDIwNywgMjA2LCAyMDYsIDIwNSwKLTIwNCwgMjA0LCAyMDMsIDIwMiwgMjAyLCAyMDEsIDIwMSwgMjAwLAotMTk5LCAxOTksIDE5OCwgMTk3LCAxOTcsIDE5NiwgMTk2LCAxOTUsCi0xOTUsIDE5NCwgMTkzLCAxOTMsIDE5MiwgMTkyLCAxOTEsIDE5MSwKLTE5MCwgMTg5LCAxODksIDE4OCwgMTg4LCAxODcsIDE4NywgMTg2LAotMTg2LCAxODUsIDE4NSwgMTg0LCAxODQsIDE4MywgMTgzLCAxODIsCi0xODIsIDE4MSwgMTgxLCAxODAsIDE4MCwgMTc5LCAxNzksIDE3OCwKLTE3OCwgMTc3LCAxNzcsIDE3NiwgMTc2LCAxNzUsIDE3NSwgMTc0LAotMTc0LCAxNzMsIDE3MywgMTcyLCAxNzIsIDE3MiwgMTcxLCAxNzEsCi0xNzAsIDE3MCwgMTY5LCAxNjksIDE2OCwgMTY4LCAxNjgsIDE2NywKLTE2NywgMTY2LCAxNjYsIDE2NSwgMTY1LCAxNjUsIDE2NCwgMTY0LAotMTYzLCAxNjMsIDE2MywgMTYyLCAxNjIsIDE2MSwgMTYxLCAxNjEsCi0xNjAsIDE2MCwgMTU5LCAxNTksIDE1OSwgMTU4LCAxNTgsIDE1NywKLTE1NywgMTU3LCAxNTYsIDE1NiwgMTU2LCAxNTUsIDE1NSwgMTU0LAotMTU0LCAxNTQsIDE1MywgMTUzLCAxNTMsIDE1MiwgMTUyLCAxNTIsCi0xNTEsIDE1MSwgMTUxLCAxNTAsIDE1MCwgMTQ5LCAxNDksIDE0OSwKLTE0OCwgMTQ4LCAxNDgsIDE0NywgMTQ3LCAxNDcsIDE0NiwgMTQ2LAotMTQ2LCAxNDUsIDE0NSwgMTQ1LCAxNDQsIDE0NCwgMTQ0LCAxNDQsCi0xNDMsIDE0MywgMTQzLCAxNDIsIDE0MiwgMTQyLCAxNDEsIDE0MSwKLTE0MSwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxMzksIDEzOSwgMTM5LAotMTM4LCAxMzgsIDEzOCwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzYsCi0xMzYsIDEzNiwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzQsIDEzNCwKLTEzNCwgMTM0LCAxMzMsIDEzMywgMTMzLCAxMzIsIDEzMiwgMTMyLAotMTMyLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMCwgMTMwLCAxMzAsCi0xMzAsIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI4LCAxMjgsIDEyOAotfTsKLQotQ05TVCBNNFZJRklfSW50MzIgIGNvbnN0X3N0b3JhZ2UxWzhdCi09IHsKLTB4MDAwMDI1NjgsIDB4MDAwMDMzNDMsMHgwMDAwMDY0OSwweDAwMDAwZDBmLCAweDAwMDBEODZDLCAweDAwMDBEODNCLCAweDAwMDEwMDAwLCAweDAwMDEwMDAwCi19OwotCi1DTlNUIE00VklGSV9JbnQzMiAgY29uc3Rfc3RvcmFnZVs4XQotPSB7Ci0weDAwMDAyNTY4LCAweDAwMDAzMzQzLCAweDFCRjgwMCwgMHgwMDAwMDY0OSwgMHgwMDAwMGQwZiwgMHgxMTAxODAsIDB4NDBjZiwgMHgyMkJFMDAKLX07Ci0KLQotQ05TVCBNNFZJRklfVUludDE2ICAqTTRWSUZJX0RpdlRhYmxlX3plcm8KLSA9ICZNNFZJRklfRGl2VGFibGVbMF07Ci0KLUNOU1QgTTRWSUZJX1VJbnQ4ICAgKk00VklGSV9DbGlwVGFibGVfemVybwotID0gJk00VklGSV9DbGlwVGFibGVbNTAwXTsKLQotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfQ2xpcC5jICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRjYmQ1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjU2NXRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIENvbG9yIENvbnZlcnNpb24gRmlsdGVyCi0gKiAgICAgICAgICAgQ29udGFpbnMgdGhlIGZvcm1hdCBjb252ZXJzaW9uIGZpbHRlcnMgZnJvbSBSR0I1NjUgdG8gWVVWNDIwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICB0cmFuc2Zvcm0gUkdCNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBSR0I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IFJHQiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotCi0gICAgLyogQ2hlY2sgcGxhbmVzIGhlaWdodCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiAoKHBQbGFuZUluLT51X2hlaWdodCAhPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMV0udV9oZWlnaHQ8PDEpKSAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsyXS51X2hlaWdodDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgd2lkdGggYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYgKChwUGxhbmVJbi0+dV93aWR0aCAhPSBwUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsxXS51X3dpZHRoPDwxKSkgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gcFBsYW5lSW4tPnBhY19kYXRhICsgcFBsYW5lSW4tPnVfdG9wbGVmdDsKLQotICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gZWFjaCBvdXRwdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kgPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZTJfWSA9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YgPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGlucHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9yZ2IgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV8ycmdiID0gdTMyX3N0cmlkZV9yZ2IgPDwgMTsKLQotCi0gICAgLyogTG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlLCBpbnB1dCBjb29yZGluYXRlcyBhcmUgZXN0aW1hdGVkIGZyb20gb3V0cHV0IG9uZXMgKi8KLSAgICAvKiBUd28gWVVWIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHQgO3UzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiBDdXJyZW50IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biA9IHB1OF95X2RhdGE7Ci0gICAgICAgIC8qIE5leHQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3lzID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotICAgICAgICAvKiBDdXJyZW50IFUgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3UgPSBwdThfdV9kYXRhOwotICAgICAgICAvKiBDdXJyZW50IFYgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3YgPSBwdThfdl9kYXRhOwotCi0gICAgICAgIHB1OF9yZ2JuID0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBMb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogR2V0IGZvdXIgUkdCIDU2NSBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgdTE2X3BpeDEgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSBwdThfcmdibik7Ci0gICAgICAgICAgICB1MTZfcGl4MiA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIENTVF9SR0JfMTZfU0laRSkpOwotICAgICAgICAgICAgdTE2X3BpeDMgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYikpOwotICAgICAgICAgICAgdTE2X3BpeDQgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYiArIENTVF9SR0JfMTZfU0laRSkpOwotCi0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX3IwMCxpMzJfZzAwLGkzMl9iMDAsdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjEwLGkzMl9nMTAsaTMyX2IxMCx1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9yMDEsaTMyX2cwMSxpMzJfYjAxLHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjExLGkzMl9nMTEsaTMyX2IxMSx1MTZfcGl4NCk7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGNocm9tYSBkYXRhICovCi0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9yZ2JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICs9IHUzMl9zdHJpZGUyX1k7Ci0gICAgICAgIHB1OF91X2RhdGEgKz0gdTMyX3N0cmlkZV9VOwotICAgICAgICBwdThfdl9kYXRhICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCODg4dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCODg4dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg1YTJhNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjg4OHRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Qcm90bzoKLU00VklGSV9VSW50OCAgICBNNFZJRklfUkdCODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci1QdXJwb3NlOiAgICBmaWxsaW5nIG9mIHRoZSBZVVY0MjAgcGxhbmUgZnJvbSBhIEJHUjI0IHBsYW5lCi1BYnN0cmFjdDogICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICAgICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gICAgICAgICAgICAgICAgICAgIEdldCA0IEJHUiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzIGFuZAotICAgICAgICAgICAgICAgICAgICBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gICAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gICAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLQotSW46ICAgICAgICAgICAgUkdCMjQgcGxhbmUKLUluT3V0OiAgICAgICAgbm9uZQotT3V0OiAgICAgICAgYXJyYXkgb2YgMyBNNFZJRklfSW1hZ2VQbGFuZSBzdHJ1Y3R1cmVzCi1Nb2RpZmllZDogICAgTUw6IFJHQiBmdW5jdGlvbiBtb2RpZmllZCB0byBCR1IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNFZJRklfVUludDggTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSkKLXsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1YsIHUzMl9zdHJpZGVfcmdiLFwKLSAgICAgICAgICAgICAgICAgICAgIHUzMl9zdHJpZGVfMnJnYjsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0KLSAgICAvKiBjaGVjayBzaXplcyAqLwotICAgIGlmKCAoUGxhbmVJbi0+dV9oZWlnaHQgIT0gUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X2hlaWdodCAhPSAoUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLQotICAgIGlmKCAoUGxhbmVJbi0+dV93aWR0aCAhPSBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV93aWR0aCAhPSAoUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLQotICAgIC8qIHNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSAgICA9IFBsYW5lT3V0WzBdLnBhY19kYXRhICsgUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgICAgPSBQbGFuZU91dFsxXS5wYWNfZGF0YSArIFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhICAgID0gUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBpZGVtIGZvciBpbnB1dCBidWZmZXIgKi8KLSAgICBwdThfcmdibl9kYXRhICAgID0gUGxhbmVJbi0+cGFjX2RhdGEgKyBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgICA9IFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCAgICA9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogc2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1k9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLSAgICAvKiBsb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIHR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICAgICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSB3b3JraW5nIHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biAgICA9IHB1OF95X2RhdGE7Ci0gICAgICAgIHB1OF95cyAgICA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLQotICAgICAgICBwdThfdSAgICA9IHB1OF91X2RhdGE7Ci0gICAgICAgIHB1OF92ICAgID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibj0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBsb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UqLwotICAgICAgICBmb3IgICAgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBnZXQgUkdCIHNhbXBsZXMgb2YgNCBwaXhlbHMgKi8KLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwLCBwdThfcmdibiwgMCk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCwgcHU4X3JnYm4sIENTVF9SR0JfMjRfU0laRSk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSwgcHU4X3JnYm4sIHUzMl9zdHJpZGVfcmdiKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExLCBwdThfcmdibiwgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzI0X1NJWkUpOwotCi0gICAgICAgICAgICBpMzJfdTAwICAgID0gVTI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCAgICA9IFYyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl95MDAgICAgPSBZMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7ICAgICAgICAvKiBtYXRyaXggbHVtaW5hbmNlICovCi0gICAgICAgICAgICBwdThfeW5bMF09IChNNFZJRklfVUludDgpaTMyX3kwMDsKLQotICAgICAgICAgICAgaTMyX3UxMCAgICA9IFUyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl92MTAgICAgPSBWMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfeTEwICAgID0gWTI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgcHU4X3luWzFdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0KLSAgICAgICAgICAgIGkzMl91MDEgICAgPSBVMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfdjAxICAgID0gVjI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3kwMSAgICA9IFkyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIHB1OF95c1swXT0gKE00VklGSV9VSW50OClpMzJfeTAxOwotCi0gICAgICAgICAgICBpMzJfdTExICAgID0gVTI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3YxMSAgICA9IFYyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl95MTEgICAgPSBZMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgICpwdThfdSAgICA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgICAgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpID4+IDIpOwotCi0gICAgICAgICAgICBwdThfcmdibiAgICArPSAgKENTVF9SR0JfMjRfU0laRTw8MSk7Ci0gICAgICAgICAgICBwdThfeW4gICAgICAgICs9IDI7Ci0gICAgICAgICAgICBwdThfeXMgICAgICAgICs9IDI7Ci0KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogZW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICBwdThfeV9kYXRhICAgICAgICArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICAgICAgICArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgICAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSAgICArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTdlNGVkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBUaGlzIGZpbGUgaGFzIGEgUmVzaXplIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgIEdlbmVyaWMgcmVzaXppbmcgb2YgUkdCNTY1IChQbGFuYXIpIGltYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFJlc2l6ZXMgUkdCNTY1IFBsYW5hciBwbGFuZS4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IChQbGFuYXIpIHBsYW5lIGJ1ZmZlcgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIFJHQjU2NSAoUGxhbmFyKSBwbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X2RhdGFfaW47Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X2RhdGFfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luLCB1MzJfc3RyaWRlX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jLCB1MzJfeV9pbmM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtLCB1MzJfeV9hY2N1bSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX1J0ZW1wX3ZhbHVlLHUzMl9HdGVtcF92YWx1ZSx1MzJfQnRlbXBfdmFsdWU7Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X3NyY190b3A7Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X3NyY19ib3R0b207Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDAsIGkzMl9nMDAsIGkzMl9yMDA7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDE7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDIsIGkzMl9nMDIsIGkzMl9yMDI7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDMsIGkzMl9nMDMsIGkzMl9yMDM7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIGNvdW50X3RyYW5zPTA7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFJHQiB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgaWYgKChJU19FVkVOKHBQbGFuZUluLT51X2hlaWdodCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV9oZWlnaHQpID09IEZBTFNFKSkgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJbi0+dV93aWR0aCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV93aWR0aCkgPT0gRkFMU0UpKSB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICBwdTE2X2RhdGFfaW4gICAgPSAoTTRWSUZJX1VJbnQxNiopKHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQpOwotICAgIHB1MTZfZGF0YV9vdXQgICA9IChNNFZJRklfVUludDE2KikocFBsYW5lT3V0LT5wYWNfZGF0YSArIHBQbGFuZU91dC0+dV90b3BsZWZ0KTsKLQotICAgIC8qIEdldCB0aGUgbWVtb3J5IGp1bXAgY29ycmVzcG9uZGluZyB0byBhIHJvdyBqdW1wICovCi0gICAgdTMyX3N0cmlkZV9pbiAgID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfb3V0ICA9IHBQbGFuZU91dC0+dV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgdTMyX3dpZHRoX2luICAgID0gcFBsYW5lSW4tPnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotCi0gICAgdTMyX3dpZHRoX291dCAgID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgIHUzMl9oZWlnaHRfb3V0ICA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKSB7Ci0gICAgICAgIHUzMl94X2luYyAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3hfaW5jICAgPSAodTMyX3dpZHRoX2luICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikgewotICAgICAgICB1MzJfeV9pbmMgICA9ICgodTMyX2hlaWdodF9pbiAtIDEpICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1MzJfeV9pbmMgPSAodTMyX2hlaWdodF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qCi0gICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3lfaW5jID49IE1BWF9TSE9SVCkgewotICAgICAgICAvKgotICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25hbCBwYXJ0LCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgIHUzMl95X2FjY3VtID0gdTMyX3lfaW5jICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3lfYWNjdW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3lfYWNjdW0gPj49IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3lfYWNjdW0gPSAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeF9pbmMgPj0gTUFYX1NIT1JUKSB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgIH0KLQotICAgIHUzMl9oZWlnaHQgPSB1MzJfaGVpZ2h0X291dDsKLQotICAgIC8qCi0gICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdAotICAgIHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZQotICAgIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOgotICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXggIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKXdlaWdodGluZyBjb2VmZmljaWVudAotICAgIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAqLwotCi0gICAgZG8geyAvKiBTY2FuIGFsbCB0aGUgcm93ICovCi0KLSAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtPj4xMikmMTU7Ci0KLSAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgIHUzMl94X2FjY3VtID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgdTMyX3dpZHRoID0gdTMyX3dpZHRoX291dDsKLQotICAgICAgICBkbyB7IC8qIFNjYW4gYWxvbmcgZWFjaCByb3cgKi8KLSAgICAgICAgICAgIHB1MTZfc3JjX3RvcCA9IHB1MTZfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0gICAgICAgICAgICBwdTE2X3NyY19ib3R0b20gPSBwdTE2X3NyY190b3AgKyAodTMyX3N0cmlkZV9pbj4+MSk7Ci0gICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBpZiAoKHUzMl9oZWlnaHQgPT0gMSkgJiYgKHUzMl9oZWlnaHRfaW4gPT0gdTMyX2hlaWdodF9vdXQpKSB7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMF0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfdG9wWzFdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFswXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAzLGkzMl9nMDMsaTMyX3IwMywoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFswXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMV0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfYm90dG9tWzBdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLChNNFZJRklfVUludDE2KXB1MTZfc3JjX2JvdHRvbVsxXSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU29sdXRpb24gdG8gYXZvaWQgZ3JlZW4gZWZmZWN0cyBkdWUgdG8gdHJhbnNwYXJlbmN5ICovCi0gICAgICAgICAgICBjb3VudF90cmFucyA9IDA7Ci0KLSAgICAgICAgICAgIC8qIElmIFJHQiBpcyB0cmFuc3BhcmVudCBjb2xvciAoMCwgNjMsIDApLCB3ZSB0cmFuc2Zvcm0gaXQgdG8gd2hpdGUgKDMxLDYzLDMxKSAqLwotICAgICAgICAgICAgaWYgKGkzMl9iMDAgPT0gMCAmJiBpMzJfZzAwID09IDYzICYmIGkzMl9yMDAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMCA9IDMxOwotICAgICAgICAgICAgICAgIGNvdW50X3RyYW5zKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaTMyX2IwMSA9PSAwICYmIGkzMl9nMDEgPT0gNjMgJiYgaTMyX3IwMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgY291bnRfdHJhbnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpMzJfYjAyID09IDAgJiYgaTMyX2cwMiA9PSA2MyAmJiBpMzJfcjAyID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMiA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDIgPSAzMTsKLSAgICAgICAgICAgICAgICBjb3VudF90cmFucysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkzMl9iMDMgPT0gMCAmJiBpMzJfZzAzID09IDYzICYmIGkzMl9yMDMgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAzID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMyA9IDMxOwotICAgICAgICAgICAgICAgIGNvdW50X3RyYW5zKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb3VudF90cmFucyA+IDIpIHsKLSAgICAgICAgICAgICAgICAvKiBwaXhlbCBpcyB0cmFuc3BhcmVudCAqLwotICAgICAgICAgICAgICAgIHUzMl9SdGVtcF92YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgdTMyX0d0ZW1wX3ZhbHVlID0gNjM7Ci0gICAgICAgICAgICAgICAgdTMyX0J0ZW1wX3ZhbHVlID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdTMyX1J0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfcjAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfcjAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICB1MzJfR3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9nMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9nMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9nMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9nMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgIHUzMl9CdGVtcF92YWx1ZSA9ICAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9iMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9iMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9iMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9iMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnB1MTZfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDE2KSggKCgodTMyX0d0ZW1wX3ZhbHVlICYgMHgzOCkgPj4gMykgfCAodTMyX0J0ZW1wX3ZhbHVlIDw8IDMpKSB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoKHUzMl9HdGVtcF92YWx1ZSAmIDB4NykgPDwgNSApIHwgdTMyX1J0ZW1wX3ZhbHVlKTw8OCApKTsKLQotICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl94X2luYzsKLQotICAgICAgICB9IHdoaWxlKC0tdTMyX3dpZHRoKTsKLQotCi0gICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICB1MzJfeV9hY2N1bSArPSB1MzJfeV9pbmM7Ci0gICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpIHsKLSAgICAgICAgICAgIHB1MTZfZGF0YV9pbiA9IHB1MTZfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbj4+MSk7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLQotICAgIH0gd2hpbGUoLS11MzJfaGVpZ2h0KTsKLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGViOWQ0NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjg4OHRvUkdCODg4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUmVzaXplWVVWNDIwdG9ZVVY0MjAuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIFRoaXMgZmlsZSBoYXMgYSBSZXNpemUgZmlsdGVyIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgLSMgR2VuZXJpYyByZXNpemluZyBvZiBZVVY0MjAgKFBsYW5hcikgaW1hZ2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFJlc2l6ZXMgWVVWNDIwIFBsYW5hciBwbGFuZS4KLSAqIEBub3RlICAgIEJhc2ljIHN0cnVjdHVyZSBvZiB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKHN0ZXAgMikKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uIChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgICAgIEdldCBmb3VyIFkgc2FtcGxlcyBhbmQgMSBVICYgViBzYW1wbGUKLSAqICAgICAgICAgICAgICAgICAgUmVzaXplIHRoZSBZIHdpdGggY29ycmVzcG9uaW5nIFUgYW5kIFYgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgWVVWIGluIHRoZSBvdXB1dCBwbGFuZQotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVY0MjAgKFBsYW5hcikgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gWVVWNDIwIChQbGFuYXIpIHBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9kYXRhX2luOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luLCB1MzJfc3RyaWRlX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jLCB1MzJfeV9pbmM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtLCB1MzJfeV9hY2N1bSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX1J0ZW1wX3ZhbHVlLHUzMl9HdGVtcF92YWx1ZSx1MzJfQnRlbXBfdmFsdWU7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMCwgaTMyX2cwMCwgaTMyX3IwMDsKLSAgICBNNFZJRklfVUludDMyICAgIGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDE7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICBpMzJfYjAyLCBpMzJfZzAyLCBpMzJfcjAyOwotICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMywgaTMyX2cwMywgaTMyX3IwMzsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgWVVWIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfaGVpZ2h0KSA9PSBGQUxTRSkgICAgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0LT51X2hlaWdodCkgPT0gRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfd2lkdGgpID09IEZBTFNFKSB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXQtPnVfd2lkdGgpID09IEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLQotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4gICAgID0gKE00VklGSV9VSW50OCopKHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQpOwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSAoTTRWSUZJX1VJbnQ4KikocFBsYW5lT3V0LT5wYWNfZGF0YSArIHBQbGFuZU91dC0+dV90b3BsZWZ0KTsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luICAgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgICAgIHUzMl9zdHJpZGVfb3V0ICA9IHBQbGFuZU91dC0+dV9zdHJpZGU7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgICAgICB1MzJfd2lkdGhfaW4gICAgPSBwUGxhbmVJbi0+dV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotCi0gICAgICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9vdXQgID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLQotICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfaW5jICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2luYyAgID0gKHUzMl93aWR0aF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2luYyAgID0gKCh1MzJfaGVpZ2h0X2luIC0gMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfaW5jID0gKHUzMl9oZWlnaHRfaW4gKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl95X2luYyA+PSBNQVhfU0hPUlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gdTMyX3lfaW5jICYgMHhmZmZmOwotCi0gICAgICAgICAgICBpZiAoIXUzMl95X2FjY3VtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gMDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfeF9pbmMgPj0gTUFYX1NIT1JUKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfaGVpZ2h0ID0gdTMyX2hlaWdodF9vdXQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdAotICAgICAgICByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb253IGVhY2ggY29sdW1uLiBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUKLSAgICAgICAgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3VycyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6Ci0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgICAgIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14ICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYil3ZWlnaHRpbmcgY29lZmZpY2llbnQKLSAgICAgICAgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICAgICAqLwotCi0gICAgICAgIGRvIHsgLyogU2NhbiBhbGwgdGhlIHJvdyAqLwotCi0gICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtPj4xMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSB1MzJfeF9hY2N1bV9zdGFydDsKLQotICAgICAgICAgICAgdTMyX3dpZHRoID0gdTMyX3dpZHRoX291dDsKLQotICAgICAgICAgICAgZG8geyAvKiBTY2FuIGFsb25nIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNikqMzsKLSAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgKHUzMl9zdHJpZGVfaW4pOwotICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgIGlmICgodTMyX3dpZHRoID09IDEpICYmICh1MzJfd2lkdGhfaW4gPT0gdTMyX3dpZHRoX291dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBpbnB1dCBoZWlnaHQgaXMgZXF1YWwgdG8gb3V0cHV0IGhlaWdodCBhbmQgaW5wdXQgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gb3V0cHV0IHdpZHRoLCByZXBsaWNhdGUgdGhlIGNvcm5lciBwaXhlbHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1MzJfaGVpZ2h0ID09IDEpICYmICh1MzJfaGVpZ2h0X2luID09IHUzMl9oZWlnaHRfb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgIFdoZW4gaW5wdXQgaGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBvdXRwdXQgaGVpZ2h0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCB3aWR0aCBlcXVhbCB0byBvdXRwdXQgd2lkdGgsIHJlcGxpY2F0ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBpbnB1dCBoZWlnaHQgaXMgZXF1YWwgdG8gb3V0cHV0IGhlaWdodCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgd2lkdGggbm90IGVxdWFsIHRvIG91dHB1dCB3aWR0aCwgcmVwbGljYXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICByb3cgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1MzJfaGVpZ2h0ID09IDEpICYmICh1MzJfaGVpZ2h0X2luID09IHUzMl9oZWlnaHRfb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfYm90dG9tLDMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHUzMl9SdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgoaTMyX3IwMCooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3IwMSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyX3IwMiooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3IwMyp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgdTMyX0d0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfZzAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfZzAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfZzAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfZzAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICB1MzJfQnRlbXBfdmFsdWUgPSAgKE00VklGSV9VSW50OCkoKChpMzJfYjAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfYjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfYjAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfYjAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSB1MzJfQnRlbXBfdmFsdWUgOwotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IHUzMl9HdGVtcF92YWx1ZSA7Ci0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gdTMyX1J0ZW1wX3ZhbHVlIDsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX3hfaW5jOwotCi0gICAgICAgICAgICB9IHdoaWxlKC0tdTMyX3dpZHRoKTsKLQotICAgICAgICAgICAgLy9wdTE2X2RhdGFfb3V0ID0gcHUxNl9kYXRhX291dCArICh1MzJfc3RyaWRlX291dD4+MSkgLSAodTMyX3dpZHRoX291dCk7Ci0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gdTMyX3lfaW5jOwotICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqICh1MzJfc3RyaWRlX2luKSA7Ci0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKC0tdTMyX2hlaWdodCk7Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDQyZTgwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9CR1I1NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SZXNpemVZVVY0MjB0b0JHUjU2NS5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgVGhpcyBmaWxlIGhhcyBhIENvbWJvIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgIC0jIFJlc2l6ZXMgWVVWNDIwIGFuZCBjb252ZXJ0cyB0byBSR1I1NjUgd2l0aCByb3RhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkICpwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgUmVzaXplIFlVVjQyMCBwbGFuZSBhbmQgY29udmVydHMgdG8gQkdSNTY1IHdpdGggKzkwIHJvdGF0aW9uLgotICogQG5vdGUgICAgQmFzaWMgc3R1cnR1cmUgb2YgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93IChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoc3RlcCAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIDEgdSAmIFYgc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIFJlc2l6ZSB0aGUgWSB3aXRoIGNvcnJlc3BvbmluZyBVIGFuZCBWIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSB0aGUgZm91ciBjb3JyZXNwb25kaW5nIFIgRyBCIHZhbHVlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgUiBHIEIgaW4gdGhlIG91cHV0IHBsYW5lIGluIHJvdGF0ZWQgZmFzaGlvbgotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVYgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKElOKSBDb250ZXh0IFBvaW50ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBCR1I1NjUgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW5bUExBTkVTXSwgKnB1OF9kYXRhX2luMVtQTEFORVNdLCpwdThfZGF0YV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICpwdTMyX3JnYl9kYXRhX2N1cnJlbnQsICpwdTMyX3JnYl9kYXRhX25leHQsICpwdTMyX3JnYl9kYXRhX3N0YXJ0OwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbltQTEFORVNdLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luW1BMQU5FU10sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luW1BMQU5FU107Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfb3V0LCB1MzJfc3RyaWRlMl9vdXQsIHUzMl93aWR0aDJfUkdCLCB1MzJfaGVpZ2h0Ml9SR0I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luY1tQTEFORVNdLCB1MzJfeV9pbmNbUExBTkVTXTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW1fWSwgdTMyX3hfYWNjdW1fVSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2FjY3VtX1ksIHUzMl95X2FjY3VtX1U7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWNfWSwgdTMyX3hfZnJhY19VLCB1MzJfeV9mcmFjX1ksdTMyX3lfZnJhY19VOwotICAgIE00VklGSV9JbnQzMiAgICBVXzMyLCBWXzMyLCBZXzMyLCBZdmFsXzMyOwotICAgIE00VklGSV9VSW50OCAgICB1OF9SZWQsIHU4X0dyZWVuLCB1OF9CbHVlOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcm93LCB1MzJfY29sOwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMSwgdTMyX3JnYl90ZW1wMjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMyx1MzJfcmdiX3RlbXA0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY2hlY2tfc2l6ZTsKLQotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3BfWSwqcHU4X3NyY190b3BfVSwqcHU4X3NyY190b3BfViA7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbV9ZLCAqcHU4X3NyY19ib3R0b21fVSwgKnB1OF9zcmNfYm90dG9tX1Y7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFlVViB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfaGVpZ2h0KTsKLSAgICBpZiggdTMyX2NoZWNrX3NpemUgPT0gRkFMU0UgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfd2lkdGgpOwotICAgIGlmICh1MzJfY2hlY2tfc2l6ZSA9PSBGQUxTRSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLSAgICB9Ci0gICAgLyogTWFrZSB0aGUgb3VwdXQgd2lkdGggYW5kIGhlaWdodCBhcyBldmVuICovCi0gICAgcFBsYW5lT3V0LT51X2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQgJiAweEZGRkZGRkZFOwotICAgIHBQbGFuZU91dC0+dV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aCAmIDB4RkZGRkZGRkU7Ci0gICAgcFBsYW5lT3V0LT51X3N0cmlkZSA9IHBQbGFuZU91dC0+dV9zdHJpZGUgJiAweEZGRkZGRkZDOwotCi0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgcG9pbnRlciAqLwotICAgIHB1OF9kYXRhX291dCAgICA9IHBQbGFuZU91dC0+cGFjX2RhdGEgKyBwUGxhbmVPdXQtPnVfdG9wbGVmdDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCB3aWR0aChyb3RhdGVkKSAqLwotICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCBoZWlnaHQocm90YXRlZCkgKi8KLSAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotCi0gICAgdTMyX3dpZHRoMl9SR0IgID0gcFBsYW5lT3V0LT51X3dpZHRoID4+IDE7Ci0gICAgdTMyX2hlaWdodDJfUkdCID0gcFBsYW5lT3V0LT51X2hlaWdodCA+PiAxOwotCi0gICAgdTMyX3N0cmlkZV9vdXQgPSBwUGxhbmVPdXQtPnVfc3RyaWRlID4+IDE7Ci0gICAgdTMyX3N0cmlkZTJfb3V0ID0gcFBsYW5lT3V0LT51X3N0cmlkZSA+PiAyOwotCi0gICAgZm9yKHUzMl9wbGFuZSA9IDA7IHUzMl9wbGFuZSA8IFBMQU5FUzsgdTMyX3BsYW5lKyspCi0gICAgewotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0ucGFjX2RhdGEgKyBwUGxhbmVJblt1MzJfcGxhbmVdLnVfdG9wbGVmdDsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfc3RyaWRlOwotCi0gICAgICAgIC8qIFNldCB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgaW1hZ2UgKi8KLSAgICAgICAgdTMyX3dpZHRoX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfd2lkdGg7Ci0gICAgICAgIHUzMl9oZWlnaHRfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV9oZWlnaHQ7Ci0gICAgfQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFkgUGxhbmUuICovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luW1lQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbWVBsYW5lXSAgID0gKCh1MzJfd2lkdGhfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1lQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW5bWVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdID0gKHUzMl9oZWlnaHRfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFUgYW5kIFYgUGxhbmVzLiAqLwotICAgIGlmICh1MzJfd2lkdGgyX1JHQiA+PSB1MzJfd2lkdGhfaW5bVVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tVUGxhbmVdICAgPSAoKHUzMl93aWR0aF9pbltVUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgyX1JHQi0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1VQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bVVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoMl9SR0IpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodCBmb3IgVSBhbmQgViBQbGFuZXMuICovCi0KLSAgICBpZiAodTMyX2hlaWdodDJfUkdCID49IHUzMl9oZWlnaHRfaW5bVVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tVUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bVVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodDJfUkdCLTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbVVBsYW5lXSAgPSAodTMyX2hlaWdodF9pbltVUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0Ml9SR0IpOwotICAgIH0KLQotICAgIHUzMl95X2luY1tWUGxhbmVdID0gdTMyX3lfaW5jW1VQbGFuZV07Ci0gICAgdTMyX3hfaW5jW1ZQbGFuZV0gPSB1MzJfeF9pbmNbVVBsYW5lXTsKLQotICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl95X2luY1tZUGxhbmVdID4gTUFYX1NIT1JUKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICAgIEtlZXAgdGhlIGZyYWN0aW9ubmFsIHBhcnQsIGFzc2ltdW5nIHRoYXQgaW50ZWdlciAgcGFydCBpcyBjb2RlZCBvbiB0aGUgMTYgaGlnaCBiaXRzLAotICAgICAgICAgICAgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgKi8KLSAgICAgICAgdTMyX3lfYWNjdW1fWSA9IHUzMl95X2luY1tZUGxhbmVdICYgMHhmZmZmOwotICAgICAgICB1MzJfeV9hY2N1bV9VID0gdTMyX3lfaW5jW1VQbGFuZV0gJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeV9hY2N1bV9ZKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9ZID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSA9IE1BWF9TSE9SVDsKLSAgICAgICAgfQotICAgICAgICB1MzJfeV9hY2N1bV9ZID4+PSAxOwotICAgICAgICB1MzJfeV9hY2N1bV9VID4+PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9hY2N1bV9ZID0gMDsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA9IDA7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3hfaW5jW1lQbGFuZV0gPiBNQVhfU0hPUlQpCi0gICAgewotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luY1tZUGxhbmVdICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICB9Ci0KLSAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ID0gKE00VklGSV9VSW50MzIqKXB1OF9kYXRhX291dDsKLQotICAgIC8qCi0gICAgICAgIEJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQKLSAgICAgICAgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG9udyBlYWNoIGNvbHVtbi4gRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlCi0gICAgICAgIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhIDoKLSAgICAgICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpK2YocCsmLHErMSlSKDEtYSlSKGItMSkKLSAgICAgICAgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXggIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKSB3ZWlnaHRpbmcgY29lZmZpY2llbnQKLSAgICAgICAgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodF9vdXQ7IHUzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPSAyKQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fWSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotICAgICAgICB1MzJfeF9hY2N1bV9VID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICB1MzJfeV9mcmFjX1kgPSAodTMyX3lfYWNjdW1fWSA+PiAxMikgJiAxNTsKLSAgICAgICAgdTMyX3lfZnJhY19VID0gKHUzMl95X2FjY3VtX1UgPj4gMTIpICYgMTU7Ci0KLSAgICAgICAgLyogUkdCIGN1cnJlbnQgbGluZSBwb3NpdGlvbiBwb2ludGVyICovCi0gICAgICAgIHB1MzJfcmdiX2RhdGFfY3VycmVudCA9IHB1MzJfcmdiX2RhdGFfc3RhcnQgOwotCi0gICAgICAgIC8qIFJHQiBuZXh0IGxpbmUgcG9zaXRpb24gcG9pbnRlciAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX25leHQgICAgPSBwdTMyX3JnYl9kYXRhX2N1cnJlbnQgKyAodTMyX3N0cmlkZTJfb3V0KTsKLQotICAgICAgICAvKiBZIFBsYW5lIG5leHQgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gPSBwdThfZGF0YV9pbltZUGxhbmVdOwotCi0gICAgICAgIHUzMl9yZ2JfdGVtcDMgPSB1MzJfeV9hY2N1bV9ZICsgKHUzMl95X2luY1tZUGxhbmVdKTsKLSAgICAgICAgaWYgKHUzMl9yZ2JfdGVtcDMgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luMVtZUGxhbmVdID0gIHB1OF9kYXRhX2luW1lQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl9yZ2JfdGVtcDMgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bWVBsYW5lXSk7Ci0gICAgICAgICAgICB1MzJfcmdiX3RlbXAzICY9IDB4ZmZmZjsKLSAgICAgICAgfQotICAgICAgICB1MzJfcmdiX3RlbXA0ID0gKHUzMl9yZ2JfdGVtcDMgPj4gMTIpICYgMTU7Ci0KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoX291dDsgdTMyX2NvbCAhPSAwOyB1MzJfY29sIC09IDIpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLyogSW5wdXQgWSBwbGFuZSBlbGVtZW50cyAqLwotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luW1lQbGFuZV0gKyAodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogSW5wdXQgVSBQbGFuZSBlbGVtZW50cyAqLwotICAgICAgICAgICAgcHU4X3NyY190b3BfVSA9IHB1OF9kYXRhX2luW1VQbGFuZV0gKyAodTMyX3hfYWNjdW1fVSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9VID0gcHU4X3NyY190b3BfVSArIHUzMl9zdHJpZGVfaW5bVVBsYW5lXTsKLQotICAgICAgICAgICAgcHU4X3NyY190b3BfViA9IHB1OF9kYXRhX2luW1ZQbGFuZV0gKyAodTMyX3hfYWNjdW1fVSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9WID0gcHU4X3NyY190b3BfViArIHUzMl9zdHJpZGVfaW5bVlBsYW5lXTsKLQotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yIGZvciBZIHBsYW5lICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1kgPSAodTMyX3hfYWNjdW1fWSA+PiAxMikmMTU7Ci0gICAgICAgICAgICAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgZm9yIFUgYW5kIFYgcGxhbmVzICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1UgPSAodTMyX3hfYWNjdW1fVSA+PiAxMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBVXzMyID0gKCgocHU4X3NyY190b3BfVVswXSooMTYtdTMyX3hfZnJhY19VKSArIHB1OF9zcmNfdG9wX1VbMV0qdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfVSkgKyAocHU4X3NyY19ib3R0b21fVVswXSooMTYtdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1VbMV0qdTMyX3hfZnJhY19VKSp1MzJfeV9mcmFjX1UgKSA+PiA4KTsKLQotICAgICAgICAgICAgVl8zMiA9ICgoKHB1OF9zcmNfdG9wX1ZbMF0qKDE2LXUzMl94X2ZyYWNfVSkgKyBwdThfc3JjX3RvcF9WWzFdKnUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1UpKyAocHU4X3NyY19ib3R0b21fVlswXSooMTYtdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1ZbMV0qdTMyX3hfZnJhY19VKSp1MzJfeV9mcmFjX1UgKSA+PiA4KTsKLQotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1kpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3lfZnJhY19ZICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1UgKz0gKHUzMl94X2luY1tVUGxhbmVdKTsKLQotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAxID0gUEFDS19CR1I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMSA9IFBBQ0tfQkdSNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbjFbWVBsYW5lXSsodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3JnYl90ZW1wNCkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfcmdiX3RlbXA0ICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1kgKz0gdTMyX3hfaW5jW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMiA9IFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDIgPSBQQUNLX0JHUjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW5bWVBsYW5lXSArICh1MzJfeF9hY2N1bV9ZID4+IDE2KSA7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19ZKSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl95X2ZyYWNfWSApID4+IDgpOwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX2N1cnJlbnQpKysgPSB1MzJfcmdiX3RlbXAxIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19CR1I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9jdXJyZW50KSsrID0gdTMyX3JnYl90ZW1wMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdKyAodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3JnYl90ZW1wNCkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfcmdiX3RlbXA0ICk+PjgpOwotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9ZICs9IHUzMl94X2luY1tZUGxhbmVdOwotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMj1ZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyPVlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX25leHQpKysgPSB1MzJfcmdiX3RlbXAyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19CR1I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9uZXh0KSsrID0gdTMyX3JnYl90ZW1wMiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLSAgICAgICAgfSAgIC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgdTMyX3lfYWNjdW1fWSAgPSAgdTMyX3JnYl90ZW1wMyArICh1MzJfeV9pbmNbWVBsYW5lXSk7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgKz0gKHUzMl95X2luY1tVUGxhbmVdKTsKLQotICAgICAgICAvKiBZIHBsYW5lIHJvdyB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHUzMl95X2FjY3VtX1kgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1lQbGFuZV0gPSAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzJfeV9hY2N1bV9ZID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1lQbGFuZV0pKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1kgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bWVBsYW5lXSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdOwotICAgICAgICB9Ci0gICAgICAgIC8qIFUgYW5kIFYgcGxhbmVzIHJvdyB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHUzMl95X2FjY3VtX1UgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1VQbGFuZV0gPSAgcHU4X2RhdGFfaW5bVVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3lfYWNjdW1fVSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltVUGxhbmVdKTsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1ZQbGFuZV0gPSAgcHU4X2RhdGFfaW5bVlBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3lfYWNjdW1fVSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltWUGxhbmVdKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1UgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIC8qIEJHUiBwb2ludGVyIFVwZGF0ZSAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ICs9IHUzMl9zdHJpZGVfb3V0OwotCi0gICAgfSAgIC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9SR0I1NjUuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9SR0I1NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWRhOWQwNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVlVVnRvUkdCNTY1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUmVzaXplWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIFRoaXMgZmlsZSBoYXMgYSBDb21ibyBmaWx0ZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAtIyBSZXNpemVzIFlVVjQyMCBhbmQgY29udmVydHMgdG8gUkdSNTY1IHdpdGggcm90YXRpb24KLSAqIEBkYXRlCi0gKiAgICAgICAgICAgLSAyMDA0LzA4LzExOiBDcmVhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0KHZvaWQgKnBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgUmVzaXplIFlVVjQyMCBwbGFuZSBhbmQgY29udmVydHMgdG8gUkdCNTY1IHdpdGggKzkwIHJvdGF0aW9uLgotICogQG5vdGUgICAgQmFzaWMgc3R1cnR1cmUgb2YgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93IChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoc3RlcCAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIDEgdSAmIFYgc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIFJlc2l6ZSB0aGUgWSB3aXRoIGNvcnJlc3BvbmluZyBVIGFuZCBWIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSB0aGUgZm91ciBjb3JyZXNwb25kaW5nIFIgRyBCIHZhbHVlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgUiBHIEIgaW4gdGhlIG91cHV0IHBsYW5lIGluIHJvdGF0ZWQgZmFzaGlvbgotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVYgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKElOKSBDb250ZXh0IFBvaW50ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBCR1I1NjUgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1KHZvaWQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW5bUExBTkVTXSwgKnB1OF9kYXRhX2luMVtQTEFORVNdLCpwdThfZGF0YV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICpwdTMyX3JnYl9kYXRhX2N1cnJlbnQsICpwdTMyX3JnYl9kYXRhX25leHQsICpwdTMyX3JnYl9kYXRhX3N0YXJ0OwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbltQTEFORVNdLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luW1BMQU5FU10sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luW1BMQU5FU107Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfb3V0LCB1MzJfc3RyaWRlMl9vdXQsIHUzMl93aWR0aDJfUkdCLCB1MzJfaGVpZ2h0Ml9SR0I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luY1tQTEFORVNdLCB1MzJfeV9pbmNbUExBTkVTXTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW1fWSwgdTMyX3hfYWNjdW1fVSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2FjY3VtX1ksIHUzMl95X2FjY3VtX1U7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWNfWSwgdTMyX3hfZnJhY19VLCB1MzJfeV9mcmFjX1ksdTMyX3lfZnJhY19VOwotICAgIE00VklGSV9JbnQzMiAgICBVXzMyLCBWXzMyLCBZXzMyLCBZdmFsXzMyOwotICAgIE00VklGSV9VSW50OCAgICB1OF9SZWQsIHU4X0dyZWVuLCB1OF9CbHVlOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcm93LCB1MzJfY29sOwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMSwgdTMyX3JnYl90ZW1wMjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMyx1MzJfcmdiX3RlbXA0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY2hlY2tfc2l6ZTsKLQotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3BfWSwqcHU4X3NyY190b3BfVSwqcHU4X3NyY190b3BfViA7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbV9ZLCAqcHU4X3NyY19ib3R0b21fVSwgKnB1OF9zcmNfYm90dG9tX1Y7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlICB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfaGVpZ2h0KTsKLSAgICBpZiggdTMyX2NoZWNrX3NpemUgPT0gRkFMU0UgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfd2lkdGgpOwotICAgIGlmICh1MzJfY2hlY2tfc2l6ZSA9PSBGQUxTRSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLSAgICB9Ci0gICAgLyogTWFrZSB0aGUgb3VwdXQgd2lkdGggYW5kIGhlaWdodCBhcyBldmVuICovCi0gICAgcFBsYW5lT3V0LT51X2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQgJiAweEZGRkZGRkZFOwotICAgIHBQbGFuZU91dC0+dV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aCAmIDB4RkZGRkZGRkU7Ci0gICAgcFBsYW5lT3V0LT51X3N0cmlkZSA9IHBQbGFuZU91dC0+dV9zdHJpZGUgJiAweEZGRkZGRkZDOwotCi0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgcG9pbnRlciAqLwotICAgIHB1OF9kYXRhX291dCAgICA9IHBQbGFuZU91dC0+cGFjX2RhdGEgKyBwUGxhbmVPdXQtPnVfdG9wbGVmdDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCB3aWR0aChyb3RhdGVkKSAqLwotICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCBoZWlnaHQocm90YXRlZCkgKi8KLSAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgIHUzMl93aWR0aDJfUkdCICA9IHBQbGFuZU91dC0+dV93aWR0aCA+PiAxOwotICAgIHUzMl9oZWlnaHQyX1JHQiA9IHBQbGFuZU91dC0+dV9oZWlnaHQgPj4gMTsKLSAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgIHUzMl9zdHJpZGVfb3V0ID0gcFBsYW5lT3V0LT51X3N0cmlkZSA+PiAxOwotICAgIHUzMl9zdHJpZGUyX291dCA9IHBQbGFuZU91dC0+dV9zdHJpZGUgPj4gMjsKLQotICAgIGZvcih1MzJfcGxhbmUgPSAwOyB1MzJfcGxhbmUgPCBQTEFORVM7IHUzMl9wbGFuZSsrKQotICAgIHsKLSAgICAgICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0gICAgICAgIHB1OF9kYXRhX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnBhY19kYXRhICsgcFBsYW5lSW5bdTMyX3BsYW5lXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkganVtcCBjb3JyZXNwb25kaW5nIHRvIGEgcm93IGp1bXAgKi8KLSAgICAgICAgdTMyX3N0cmlkZV9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgICAgIHUzMl93aWR0aF9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfaGVpZ2h0OwotICAgIH0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoIGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luW1lQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbWVBsYW5lXSAgID0gKCh1MzJfd2lkdGhfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1lQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW5bWVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdID0gKHUzMl9oZWlnaHRfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFUgYW5kIFYgUGxhbmVzLiovCi0gICAgaWYgKHUzMl93aWR0aDJfUkdCID49IHUzMl93aWR0aF9pbltVUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1VQbGFuZV0gICA9ICgodTMyX3dpZHRoX2luW1VQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aDJfUkdCLTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbVVBsYW5lXSAgID0gKHUzMl93aWR0aF9pbltVUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgyX1JHQik7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBVIGFuZCBWIFBsYW5lcy4qLwotCi0gICAgaWYgKHUzMl9oZWlnaHQyX1JHQiA+PSB1MzJfaGVpZ2h0X2luW1VQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbVVBsYW5lXSAgID0gKCh1MzJfaGVpZ2h0X2luW1VQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHQyX1JHQi0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1VQbGFuZV0gID0gKHUzMl9oZWlnaHRfaW5bVVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodDJfUkdCKTsKLSAgICB9Ci0KLSAgICB1MzJfeV9pbmNbVlBsYW5lXSA9IHUzMl95X2luY1tVUGxhbmVdOwotICAgIHUzMl94X2luY1tWUGxhbmVdID0gdTMyX3hfaW5jW1VQbGFuZV07Ci0KLSAgICAvKgotICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl95X2luY1tZUGxhbmVdID4gTUFYX1NIT1JUKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkIG9uIHRoZSAxNiBoaWdoIGJpdHMsCi0gICAgICAgIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgIHUzMl95X2FjY3VtX1kgPSB1MzJfeV9pbmNbWVBsYW5lXSAmIDB4ZmZmZjsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA9IHUzMl95X2luY1tVUGxhbmVdICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3lfYWNjdW1fWSkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfYWNjdW1fWSA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1UgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLSAgICAgICAgdTMyX3lfYWNjdW1fWSA+Pj0gMTsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfYWNjdW1fWSA9IDA7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgPSAwOwotCi0gICAgfQotCi0gICAgLyoKLSAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeF9pbmNbWVBsYW5lXSA+IE1BWF9TSE9SVCkKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jW1lQbGFuZV0gJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgIH0KLSAgICAvKiBJbnRpYWxpc2UgdGhlIFJHQiBwb2ludGVyICovCi0gICAgcHUzMl9yZ2JfZGF0YV9zdGFydCA9IChNNFZJRklfVUludDMyKilwdThfZGF0YV9vdXQ7Ci0KLSAgICAvKgotICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0Ci0gICAgICAgIHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZQotICAgICAgICBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYSA6Ci0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgICAgIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14ICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYikgd2VpZ2h0aW5nIGNvZWZmaWNpZW50Ci0gICAgICAgIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHRfb3V0OyB1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0gMikKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX1kgPSB1MzJfeF9hY2N1bV9zdGFydDsKLSAgICAgICAgdTMyX3hfYWNjdW1fVSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgdTMyX3lfZnJhY19ZID0gKHUzMl95X2FjY3VtX1kgPj4gMTIpICYgMTU7Ci0gICAgICAgIHUzMl95X2ZyYWNfVSA9ICh1MzJfeV9hY2N1bV9VID4+IDEyKSAmIDE1OwotCi0gICAgICAgIC8qIFJHQiBjdXJyZW50IGxpbmUgUG9zaXRpb24gUG9pbnRlciAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX2N1cnJlbnQgPSBwdTMyX3JnYl9kYXRhX3N0YXJ0IDsKLQotICAgICAgICAvKiBSR0IgbmV4dCBsaW5lIHBvc2l0aW9uIHBvaW50ZXIgKi8KLSAgICAgICAgcHUzMl9yZ2JfZGF0YV9uZXh0ICAgID0gcHUzMl9yZ2JfZGF0YV9jdXJyZW50ICsgKHUzMl9zdHJpZGUyX291dCk7Ci0KLSAgICAgICAgLyogWSBQbGFuZSBuZXh0IHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF9kYXRhX2luMVtZUGxhbmVdID0gcHU4X2RhdGFfaW5bWVBsYW5lXTsKLQotICAgICAgICB1MzJfcmdiX3RlbXAzID0gdTMyX3lfYWNjdW1fWSArICh1MzJfeV9pbmNbWVBsYW5lXSk7Ci0gICAgICAgIGlmICh1MzJfcmdiX3RlbXAzID4+IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbjFbWVBsYW5lXSA9ICBwdThfZGF0YV9pbltZUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfcmdiX3RlbXAzID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1lQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3JnYl90ZW1wMyAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgdTMyX3JnYl90ZW1wNCA9ICh1MzJfcmdiX3RlbXAzID4+IDEyKSAmIDE1OwotCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aF9vdXQ7IHUzMl9jb2wgIT0gMDsgdTMyX2NvbCAtPSAyKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qIElucHV0IFkgcGxhbmUgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbltZUGxhbmVdICsgKHUzMl94X2FjY3VtX1kgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIElucHV0IFUgUGxhbmUgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1UgPSBwdThfZGF0YV9pbltVUGxhbmVdICsgKHUzMl94X2FjY3VtX1UgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fVSA9IHB1OF9zcmNfdG9wX1UgKyB1MzJfc3RyaWRlX2luW1VQbGFuZV07Ci0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1YgPSBwdThfZGF0YV9pbltWUGxhbmVdICsgKHUzMl94X2FjY3VtX1UgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fViA9IHB1OF9zcmNfdG9wX1YgKyB1MzJfc3RyaWRlX2luW1ZQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciBmb3IgWSBQbGFuZSAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yIGZvciBVIGFuZCBWIFBsYW5lcyAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19VID0gKHUzMl94X2FjY3VtX1UgPj4gMTIpJjE1OwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgVV8zMiA9ICgoKHB1OF9zcmNfdG9wX1VbMF0qKDE2LXUzMl94X2ZyYWNfVSkgKyBwdThfc3JjX3RvcF9VWzFdKnUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1UpICsgKHB1OF9zcmNfYm90dG9tX1VbMF0qKDE2LXUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9VWzFdKnUzMl94X2ZyYWNfVSkqdTMyX3lfZnJhY19VICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIFZfMzIgPSAoKChwdThfc3JjX3RvcF9WWzBdKigxNi11MzJfeF9mcmFjX1UpICsgcHU4X3NyY190b3BfVlsxXSp1MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19VKSArIChwdThfc3JjX2JvdHRvbV9WWzBdKigxNi11MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fVlsxXSp1MzJfeF9mcmFjX1UpKnUzMl95X2ZyYWNfVSApID4+IDgpOwotCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfWSkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfeV9mcmFjX1kgKSA+PiA4KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fVSArPSAodTMyX3hfaW5jW1VQbGFuZV0pOwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDEgPSBQQUNLX1JHQjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAxID0gUEFDS19SR0I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdKyh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfcmdiX3RlbXA0KSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl9yZ2JfdGVtcDQgKSA+PiA4KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fWSArPSB1MzJfeF9pbmNbWVBsYW5lXTsKLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDIgPSBQQUNLX1JHQjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAyID0gUEFDS19SR0I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luW1lQbGFuZV0gKyAodTMyX3hfYWNjdW1fWSA+PiAxNikgOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfWSkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfeV9mcmFjX1kgKSA+PiA4KTsKLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfY3VycmVudCkrKyA9IHUzMl9yZ2JfdGVtcDEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX1JHQjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX2N1cnJlbnQpKysgPSB1MzJfcmdiX3RlbXAxIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19SR0I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW4xW1lQbGFuZV0rICh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfcmdiX3RlbXA0KSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl9yZ2JfdGVtcDQgKT4+OCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1kgKz0gdTMyX3hfaW5jW1lQbGFuZV07Ci0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyPVlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzI9WV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfbmV4dCkrKyA9IHUzMl9yZ2JfdGVtcDIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX1JHQjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX25leHQpKysgPSB1MzJfcmdiX3RlbXAyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19SR0I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotICAgICAgICB9ICAgLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICB1MzJfeV9hY2N1bV9ZICA9ICB1MzJfcmdiX3RlbXAzICsgKHUzMl95X2luY1tZUGxhbmVdKTsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSArPSAodTMyX3lfaW5jW1VQbGFuZV0pOwotCi0gICAgICAgIC8qIFkgcGxhbmUgcm93IHVwZGF0ZSAqLwotICAgICAgICBpZiAodTMyX3lfYWNjdW1fWSA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bWVBsYW5lXSA9ICBwdThfZGF0YV9pbjFbWVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMl95X2FjY3VtX1kgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bWVBsYW5lXSkpOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fWSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltZUGxhbmVdID0gcHU4X2RhdGFfaW4xW1lQbGFuZV07Ci0gICAgICAgIH0KLSAgICAgICAgLyogVSBhbmQgViBwbGFuZXMgcm93IHVwZGF0ZSAqLwotICAgICAgICBpZiAodTMyX3lfYWNjdW1fVSA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bVVBsYW5lXSA9ICBwdThfZGF0YV9pbltVUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfeV9hY2N1bV9VID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1VQbGFuZV0pOwotICAgICAgICAgICAgcHU4X2RhdGFfaW5bVlBsYW5lXSA9ICBwdThfZGF0YV9pbltWUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfeV9hY2N1bV9VID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1ZQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ICs9IHUzMl9zdHJpZGVfb3V0OwotCi0gICAgfSAgIC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKaW5kZXggMTY2M2Q0Ny4uNjYxZmRlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCkBAIC0zMCwyNSArMzAsMTMgQEAKIAogI2RlZmluZSBNSU5VU18zX0RCX0lOX1ExOV8xMiAyODk2IC8vIC0zZEIgPSAwLjcwNyAqIDJeMTIgPSAyODk2CiAKKy8vIHN1YnNldCBvZiBwb3NzaWJsZSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZXMsIGFuZCBBVURJT19DSEFOTkVMX09VVF8qIHJlbmFtZWQgdG8gQ0hBTk5FTF9NQVNLXyoKIHR5cGVkZWYgZW51bSB7Ci0gICAgQ0hBTk5FTF9NQVNLX1NVUlJPVU5EID0gQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQsCi0gICAgQ0hBTk5FTF9NQVNLX1FVQURfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQUQsCi0gICAgLy8gbGlrZSBBVURJT19DSEFOTkVMX09VVF9RVUFEIHdpdGggKl9TSURFXyogaW5zdGVhZCBvZiAqX0JBQ0tfKiwgc2FtZSBjaGFubmVsIG9yZGVyCi0gICAgQ0hBTk5FTF9NQVNLX1FVQURfU0lERSA9Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hULAotICAgIENIQU5ORUxfTUFTS181UE9JTlQxX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLAotICAgIC8vIGxpa2UgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSB3aXRoICpfU0lERV8qIGluc3RlYWQgb2YgKl9CQUNLXyosIHNhbWUgY2hhbm5lbCBvcmRlcgotICAgIENIQU5ORUxfTUFTS181UE9JTlQxX1NJREUgPQotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVCwKLSAgICBDSEFOTkVMX01BU0tfN1BPSU5UMV9TSURFX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxLAorICAgIENIQU5ORUxfTUFTS19RVUFEX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgQ0hBTk5FTF9NQVNLX1FVQURfU0lERSA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSwKKyAgICBDSEFOTkVMX01BU0tfNVBPSU5UMV9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLLAorICAgIENIQU5ORUxfTUFTS181UE9JTlQxX1NJREUgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUsCisgICAgQ0hBTk5FTF9NQVNLXzdQT0lOVDEgPSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxLAogfSBkb3dubWl4X2lucHV0X2NoYW5uZWxfbWFza190OwogCiAvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBkb3dubWl4IGVmZmVjdApAQCAtMzQwLDE0ICszMjgsMTEgQEAKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfUVVBRF9TSURFOgogICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVF1YWQocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIQU5ORUxfTUFTS19TVVJST1VORDoKLSAgICAgICAgICAgIERvd25taXhfZm9sZEZyb21TdXJyb3VuZChwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSzoKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFOgogICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTVQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIQU5ORUxfTUFTS183UE9JTlQxX1NJREVfQkFDSzoKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfN1BPSU5UMToKICAgICAgICAgICAgIERvd25taXhfZm9sZEZyb203UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTgyOCw2NSArODEzLDYgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfZm9sZEZyb21TdXJyb3VuZCgpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFB1cnBvc2U6Ci0gKiBkb3dubWl4IGEgInN1cnJvdW5kIHNvdW5kIiAobW9ubyByZWFyKSBzaWduYWwgdG8gc3RlcmVvCi0gKgotICogSW5wdXRzOgotICogIHBTcmMgICAgICAgc3Vycm91bmQgc2lnbmFsIHRvIGRvd25taXgKLSAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2Ygc3Vycm91bmQgZnJhbWVzIHRvIGRvd25taXgKLSAqICBhY2N1bXVsYXRlIHdoZXRoZXIgdG8gbWl4ICh3aGVuIHRydWUpIHRoZSByZXN1bHQgb2YgdGhlIGRvd25taXggd2l0aCB0aGUgY29udGVudHMgb2YgcERzdCwKLSAqICAgICAgICAgICAgICAgb3Igb3ZlcndyaXRlIHBEc3QgKHdoZW4gZmFsc2UpCi0gKgotICogT3V0cHV0czoKLSAqICBwRHN0ICAgICAgIGRvd25taXhlZCBzdGVyZW8gYXVkaW8gc2FtcGxlcwotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi12b2lkIERvd25taXhfZm9sZEZyb21TdXJyb3VuZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzUmVhckNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQwotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIFJDCi0gICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0Ci0gICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IEZDKC0zZEIpICsgUkMoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgbHQgPSAocFNyY1swXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgcnQgPSAocFNyY1sxXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXAxNihwRHN0WzBdICsgKGx0ID4+IDEzKSk7Ci0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXAxNihwRHN0WzFdICsgKHJ0ID4+IDEzKSk7Ci0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCi0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IEZDKC0zZEIpICsgUkMoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgbHQgPSAocFNyY1swXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgcnQgPSAocFNyY1sxXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wMTYobHQgPj4gMTMpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcDE2KHJ0ID4+IDEzKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEZyb201UG9pbnQxKCkKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUHVycG9zZToKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCmluZGV4IGZjYjNjOWUuLjIzOTlhYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaApAQCAtOTcsNyArOTcsNiBAQAogaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKIAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Ci12b2lkIERvd25taXhfZm9sZEZyb21TdXJyb3VuZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiB2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIHZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCBkZDJkMzA2Li5jOTJjNTQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtMTcsNyArMTcsNiBAQAogTE9DQUxfTU9EVUxFOj0gbGlidmlzdWFsaXplcgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKaW5kZXggNTZlNzc4Ny4uZjM3NzBlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCkBAIC0yNSw2ICsyNSw4IEBACiAgICAgQXVkaW9SZWNvcmQuY3BwIFwKICAgICBBdWRpb1N5c3RlbS5jcHAgXAogICAgIG1lZGlhcGxheWVyLmNwcCBcCisgICAgSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwIFwKKyAgICBJTWVkaWFIVFRQU2VydmljZS5jcHAgXAogICAgIElNZWRpYUxvZ1NlcnZpY2UuY3BwIFwKICAgICBJTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBcCiAgICAgSU1lZGlhUGxheWVyQ2xpZW50LmNwcCBcCkBAIC00NCw3ICs0Niw3IEBACiAgICAgSUF1ZGlvUG9saWN5U2VydmljZS5jcHAgXAogICAgIE1lZGlhU2Nhbm5lci5jcHAgXAogICAgIE1lZGlhU2Nhbm5lckNsaWVudC5jcHAgXAotICAgIGF1dG9kZXRlY3QuY3BwIFwKKyAgICBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcCBcCiAgICAgSU1lZGlhRGVhdGhOb3RpZmllci5jcHAgXAogICAgIE1lZGlhUHJvZmlsZXMuY3BwIFwKICAgICBJRWZmZWN0LmNwcCBcCkBAIC01OCwyNiArNjAsMzQgQEAKIAogTE9DQUxfU1JDX0ZJTEVTICs9IC4uL2xpYm5iYWlvL3JvdW5kdXAuYwogCi0jIGZvciA8Y3V0aWxzL2F0b21pYy1pbmxpbmUuaD4KLUxPQ0FMX0NGTEFHUyArPSAtREFORFJPSURfU01QPSQoaWYgJChmaW5kc3RyaW5nIHRydWUsJChUQVJHRVRfQ1BVX1NNUCkpLDEsMCkKLUxPQ0FMX1NSQ19GSUxFUyArPSBTaW5nbGVTdGF0ZVF1ZXVlLmNwcAotTE9DQUxfQ0ZMQUdTICs9IC1EU0lOR0xFX1NUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPSciU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCInCi0jIENvbnNpZGVyIGEgc2VwYXJhdGUgYSBsaWJyYXJ5IGZvciBTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuCi0KIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYnVpIGxpYmxvZyBsaWJjdXRpbHMgbGlidXRpbHMgbGliYmluZGVyIGxpYnNvbml2b3ggbGliaWN1dWMgbGliZXhwYXQgXAorCWxpYnVpIGxpYmxvZyBsaWJjdXRpbHMgbGlidXRpbHMgbGliYmluZGVyIGxpYnNvbml2b3ggbGliaWN1dWMgbGliaWN1aTE4biBsaWJleHBhdCBcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYmd1aSBsaWJkbCBsaWJhdWRpb3V0aWxzCisgICAgICAgIGxpYmd1aSBsaWJkbCBsaWJhdWRpb3V0aWxzIGxpYm5iYWlvCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliaW5zdGFudHNzcQogCiBMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSWSA6PSBsaWJtZWRpYV9oZWxwZXIKIAogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWEKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgIGV4dGVybmFsL2ljdTRjL2NvbW1vbiBcCisgICAgZXh0ZXJuYWwvaWN1NGMvaTE4biBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgZm9yIDxjdXRpbHMvYXRvbWljLWlubGluZS5oPgorTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TTVA9JChpZiAkKGZpbmRzdHJpbmcgdHJ1ZSwkKFRBUkdFVF9DUFVfU01QKSksMSwwKQorTE9DQUxfU1JDX0ZJTEVTICs9IFNpbmdsZVN0YXRlUXVldWUuY3BwCitMT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKKworTE9DQUxfTU9EVUxFIDo9IGxpYmluc3RhbnRzc3EKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcAppbmRleCA4ZGZmZmIzLi4zNWY2NTU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCkBAIC0zODAsOSArMzgwLDkgQEAKIH0KIAogdm9pZCBBdWRpb0VmZmVjdDo6Y29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXBseURhdGEpCiB7CiAgICAgaWYgKGNtZERhdGEgPT0gTlVMTCB8fCByZXBseURhdGEgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCmluZGV4IGNjYmM1YTMuLmE3YmYzODAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKQEAgLTQxLDM3ICs0MSwyOSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8vIGRlZmF1bHQgdG8gMCBpbiBjYXNlIG9mIGVycm9yCi0gICAgKmZyYW1lQ291bnQgPSAwOwotCi0gICAgc2l6ZV90IHNpemUgPSAwOworICAgIHNpemVfdCBzaXplOwogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJnNpemUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemU7IHN0YXR1cyAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW0gY291bGQgbm90IHF1ZXJ5IHRoZSBpbnB1dCBidWZmZXIgc2l6ZSBmb3Igc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgICAiY2hhbm5lbE1hc2sgJSN4OyBzdGF0dXMgJWQiLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJSN4IiwKKyAgICAvLyBXZSBkb3VibGUgdGhlIHNpemUgb2YgaW5wdXQgYnVmZmVyIGZvciBwaW5nIHBvbmcgdXNlIG9mIHJlY29yZCBidWZmZXIuCisgICAgLy8gQXNzdW1lcyBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKKyAgICBpZiAoKCpmcmFtZUNvdW50ID0gKHNpemUgKiAyKSAvIChwb3Bjb3VudChjaGFubmVsTWFzaykgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAogICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gV2UgZG91YmxlIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBmb3IgcGluZyBwb25nIHVzZSBvZiByZWNvcmQgYnVmZmVyLgotICAgIHNpemUgPDw9IDE7Ci0KLSAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKLSAgICBzaXplIC89IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLQotICAgICpmcmFtZUNvdW50ID0gc2l6ZTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmQoKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZCgwKSwKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKQogewogfQpAQCAtODEsMTQgKzczLDE0IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKDApLAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzIF9fdW51c2VkKQorICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKICAgICAgIG1Qcm94eShOVUxMKQpAQCAtMTEwLDEyICsxMDIsMTAgQEAKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvUmVjb3JkICE9IDApIHsKLSAgICAgICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7Ci0gICAgICAgICAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKLSAgICAgICAgfQorICAgICAgICBtQXVkaW9SZWNvcmQtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOworICAgICAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIC0xKTsKICAgICB9CiB9CiAKQEAgLTEyNCwxNSArMTE0LDIwIEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBmcmFtZUNvdW50SW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSwKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCiB7CisgICAgQUxPR1YoInNldCgpOiBpbnB1dFNvdXJjZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgorICAgICAgICAgICJub3RpZmljYXRpb25GcmFtZXMgJXUsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCBmbGFncyAlI3giLAorICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzKTsKKwogICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7CiAgICAgY2FzZSBUUkFOU0ZFUl9ERUZBVUxUOgogICAgICAgICBpZiAoY2JmID09IE5VTEwgfHwgdGhyZWFkQ2FuQ2FsbEphdmEpIHsKQEAgLTE1NiwyMyArMTUxLDE1IEBACiAgICAgfQogICAgIG1UcmFuc2ZlciA9IHRyYW5zZmVyVHlwZTsKIAotICAgIC8vIEZJWE1FICJpbnQiIGhlcmUgaXMgbGVnYWN5IGFuZCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHNpemVfdCBsYXRlcgotICAgIGlmIChmcmFtZUNvdW50SW50IDwgMCkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmcmFtZSBjb3VudCAlZCIsIGZyYW1lQ291bnRJbnQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzaXplX3QgZnJhbWVDb3VudCA9IGZyYW1lQ291bnRJbnQ7Ci0KLSAgICBBTE9HVigic2V0KCk6IHNhbXBsZVJhdGUgJXUsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAldSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgZnJhbWVDb3VudCk7Ci0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAKKyAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9SZWNvcmQgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvUmVjb3JkICE9IDApIHsKICAgICAgICAgQUxPR0UoIlRyYWNrIGFscmVhZHkgaW4gdXNlIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICAvLyBoYW5kbGUgZGVmYXVsdCB2YWx1ZXMgZmlyc3QuCiAgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CiAgICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKICAgICB9CkBAIC0xOTEsMTIgKzE3OCwxMiBAQAogCiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZm9ybWF0ICVkIiwgZm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIFRlbXBvcmFyeSByZXN0cmljdGlvbjogQXVkaW9GbGluZ2VyIGN1cnJlbnRseSBzdXBwb3J0cyAxNi1iaXQgUENNIG9ubHkKICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgIEFMT0dFKCJGb3JtYXQgJWQgaXMgbm90IHN1cHBvcnRlZCIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCJGb3JtYXQgJSN4IGlzIG5vdCBzdXBwb3J0ZWQiLCBmb3JtYXQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwpAQCAtMjA5LDE1ICsxOTYsMTkgQEAKICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChjaGFubmVsTWFzayk7CiAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAotICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLCBlbHNlIHNpemVvZih1aW50OF90KQotICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1GcmFtZVNpemUgPSBzaXplb2YodWludDhfdCk7CisgICAgfQogCiAgICAgLy8gdmFsaWRhdGUgZnJhbWVjb3VudAotICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gMDsKKyAgICBzaXplX3QgbWluRnJhbWVDb3VudDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1JlY29yZDo6Z2V0TWluRnJhbWVDb3VudCgmbWluRnJhbWVDb3VudCwKICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldE1pbkZyYW1lQ291bnQoKSBmYWlsZWQ7IHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCJnZXRNaW5GcmFtZUNvdW50KCkgZmFpbGVkIGZvciBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3g7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgQUxPR1YoIkF1ZGlvUmVjb3JkOjpzZXQoKSBtaW5GcmFtZUNvdW50ID0gJWQiLCBtaW5GcmFtZUNvdW50KTsKQEAgLTIyOCwxMiArMjE5LDEzIEBACiAgICAgICAgIEFMT0dFKCJmcmFtZUNvdW50ICV1IDwgbWluRnJhbWVDb3VudCAldSIsIGZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgLy8gbUZyYW1lQ291bnQgaXMgaW5pdGlhbGl6ZWQgaW4gb3BlblJlY29yZF9sCisgICAgbVJlcUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogCiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSA9IG5vdGlmaWNhdGlvbkZyYW1lczsKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gMDsKIAotICAgIGlmIChzZXNzaW9uSWQgPT0gMCApIHsKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKICAgICAgICAgbVNlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CkBAIC0yNDEsMjYgKzIzMywyNyBAQAogICAgIEFMT0dWKCJzZXQoKTogbVNlc3Npb25JZCAlZCIsIG1TZXNzaW9uSWQpOwogCiAgICAgbUZsYWdzID0gZmxhZ3M7Ci0KLSAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1JlY29yZAotICAgIHN0YXR1cyA9IG9wZW5SZWNvcmRfbCgwIC8qZXBvY2gqLyk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KKyAgICBtQ2JmID0gY2JmOwogCiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZCA9IG5ldyBBdWRpb1JlY29yZFRocmVhZCgqdGhpcywgdGhyZWFkQ2FuQ2FsbEphdmEpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJ1bigiQXVkaW9SZWNvcmQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICB9CiAKKyAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1JlY29yZAorICAgIHN0YXR1cyA9IG9wZW5SZWNvcmRfbCgwIC8qZXBvY2gqLyk7CisKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOyAgIC8vIHNlZSBjb21tZW50IGluIEF1ZGlvUmVjb3JkLmgKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CisgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogICAgIG1TdGF0dXMgPSBOT19FUlJPUjsKLQotICAgIC8vIFVwZGF0ZSBidWZmZXIgc2l6ZSBpbiBjYXNlIGl0IGhhcyBiZWVuIGxpbWl0ZWQgYnkgQXVkaW9GbGluZ2VyIGR1cmluZyB0cmFjayBjcmVhdGlvbgotICAgIG1GcmFtZUNvdW50ID0gbUNibGstPmZyYW1lQ291bnRfOwotCiAgICAgbUFjdGl2ZSA9IGZhbHNlOwotICAgIG1DYmYgPSBjYmY7Ci0gICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogICAgIG1Vc2VyRGF0YSA9IHVzZXI7CiAgICAgLy8gVE9ETzogYWRkIGF1ZGlvIGhhcmR3YXJlIGlucHV0IGxhdGVuY3kgaGVyZQogICAgIG1MYXRlbmN5ID0gKDEwMDAqbUZyYW1lQ291bnQpIC8gc2FtcGxlUmF0ZTsKQEAgLTI2OCw3ICsyNjEsNyBAQAogICAgIG1NYXJrZXJSZWFjaGVkID0gZmFsc2U7CiAgICAgbU5ld1Bvc2l0aW9uID0gMDsKICAgICBtVXBkYXRlUGVyaW9kID0gMDsKLSAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQpOworICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgLTEpOwogICAgIG1TZXF1ZW5jZSA9IDE7CiAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAgICAgbUluT3ZlcnJ1biA9IGZhbHNlOwpAQCAtMjg5LDYgKzI4Miw5IEBACiAKICAgICAvLyByZXNldCBjdXJyZW50IHBvc2l0aW9uIGFzIHNlZW4gYnkgY2xpZW50IHRvIDAKICAgICBtUHJveHktPnNldEVwb2NoKG1Qcm94eS0+Z2V0RXBvY2goKSAtIG1Qcm94eS0+Z2V0UG9zaXRpb24oKSk7CisgICAgLy8gZm9yY2UgcmVmcmVzaCBvZiByZW1haW5pbmcgZnJhbWVzIGJ5IHByb2Nlc3NBdWRpb0J1ZmZlcigpIGFzIGxhc3QKKyAgICAvLyByZWFkIGJlZm9yZSBzdG9wIGNvdWxkIGJlIHBhcnRpYWwuCisgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogCiAgICAgbU5ld1Bvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpICsgbVVwZGF0ZVBlcmlvZDsKICAgICBpbnQzMl90IGZsYWdzID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtQ2Jsay0+bUZsYWdzKTsKQEAgLTM1Miw2ICszNDgsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0TWFya2VyUG9zaXRpb24odWludDMyX3QgbWFya2VyKQogeworICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBtYXJrZXIgcG9zaXRpb24gaXMgdG8gZ2V0IGEgY2FsbGJhY2sKICAgICBpZiAobUNiZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0zNzcsNiArMzc0LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldFBvc2l0aW9uVXBkYXRlUGVyaW9kKHVpbnQzMl90IHVwZGF0ZVBlcmlvZCkKIHsKKyAgICAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHNldHRpbmcgcG9zaXRpb24gdXBkYXRlIHBlcmlvZCBpcyB0byBnZXQgYSBjYWxsYmFjawogICAgIGlmIChtQ2JmID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTQxMiw3ICs0MTAsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdW5zaWduZWQgaW50IEF1ZGlvUmVjb3JkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdAordWludDMyX3QgQXVkaW9SZWNvcmQ6OmdldElucHV0RnJhbWVzTG9zdCgpIGNvbnN0CiB7CiAgICAgLy8gbm8gbmVlZCB0byBjaGVjayBtQWN0aXZlLCBiZWNhdXNlIGlmIGluYWN0aXZlIHRoaXMgd2lsbCByZXR1cm4gMCwgd2hpY2ggaXMgd2hhdCB3ZSB3YW50CiAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZyYW1lc0xvc3QoZ2V0SW5wdXQoKSk7CkBAIC00MzAsNTUgKzQyOCw4MiBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IHRyYWNrRmxhZ3MgPSBJQXVkaW9GbGluZ2VyOjpUUkFDS19ERUZBVUxUOwotICAgIHBpZF90IHRpZCA9IC0xOworICAgIC8vIEZhc3QgdHJhY2tzIG11c3QgYmUgYXQgdGhlIHByaW1hcnkgX291dHB1dF8gW3NpY10gc2FtcGxpbmcgcmF0ZSwKKyAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIGN1cnJlbnRseSBubyBjb25jZXB0IG9mIGEgcHJpbWFyeSBpbnB1dCBzYW1wbGluZyByYXRlCisgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlID0gQXVkaW9TeXN0ZW06OmdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUoKTsKKyAgICBpZiAoYWZTYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgQUxPR1coImdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUgZmFpbGVkIik7CisgICAgfQogCiAgICAgLy8gQ2xpZW50IGNhbiBvbmx5IGV4cHJlc3MgYSBwcmVmZXJlbmNlIGZvciBGQVNULiAgU2VydmVyIHdpbGwgcGVyZm9ybSBhZGRpdGlvbmFsIHRlc3RzLgotICAgIC8vIFRoZSBvbmx5IHN1cHBvcnRlZCB1c2UgY2FzZSBmb3IgRkFTVCBpcyBjYWxsYmFjayB0cmFuc2ZlciBtb2RlLgorICAgIGlmICgobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSAmJiAhKAorICAgICAgICAgICAgLy8gdXNlIGNhc2U6IGNhbGxiYWNrIHRyYW5zZmVyIG1vZGUKKyAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0spICYmCisgICAgICAgICAgICAvLyBtYXRjaGluZyBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgKG1TYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkpKSB7CisgICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCIpOworICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQKKyAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19GQVNUKTsKKyAgICB9CisKKyAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IHRyYWNrRmxhZ3MgPSBJQXVkaW9GbGluZ2VyOjpUUkFDS19ERUZBVUxUOworCisgICAgcGlkX3QgdGlkID0gLTE7CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICBpZiAoKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSykgfHwgKG1BdWRpb1JlY29yZFRocmVhZCA9PSAwKSkgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50Iik7Ci0gICAgICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQKLSAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmFja0ZsYWdzIHw9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7CisgICAgICAgIHRyYWNrRmxhZ3MgfD0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVDsKKyAgICAgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICB0aWQgPSBtQXVkaW9SZWNvcmRUaHJlYWQtPmdldFRpZCgpOwogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gRklYTUUgQXNzdW1lIGRvdWJsZSBidWZmZXJpbmcsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgdHJ1ZSBIQUwgc2FtcGxlIHJhdGUKKyAgICBjb25zdCB1aW50MzJfdCBuQnVmZmVyaW5nID0gMjsKKwogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gbVJlcUZyYW1lQ291bnQ7CiAKICAgICBpZiAoIShtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpKSB7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFwcGxpY2F0aW9uIGlzIG5vdGlmaWVkIHdpdGggc3VmZmljaWVudCBtYXJnaW4gYmVmb3JlIG92ZXJydW4KLSAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gbUZyYW1lQ291bnQvMikgewotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IG1GcmFtZUNvdW50LzI7CisgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IGZyYW1lQ291bnQvMikgeworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IGZyYW1lQ291bnQvMjsKICAgICAgICAgfQogICAgIH0KIAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0KG1JbnB1dFNvdXJjZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQpOwotICAgIGlmIChpbnB1dCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIGlucHV0IGZvciByZWNvcmQgc291cmNlICVkIiwgbUlucHV0U291cmNlKTsKKyAgICBpZiAoaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gaW5wdXQgZm9yIHJlY29yZCBzb3VyY2UgJWQsIHNhbXBsZSByYXRlICV1LCBmb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAgICJjaGFubmVsIG1hc2sgJSN4LCBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgbUlucHV0U291cmNlLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gSS9PIGhhbmRsZSBhbmQgaGF2ZSBub3QgeWV0IGhhbmRlZCBpdCBvZmYgdG8gQXVkaW9GbGluZ2VyLAorICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KIAorICAgIHNpemVfdCB0ZW1wID0gZnJhbWVDb3VudDsgICAvLyB0ZW1wIG1heSBiZSByZXBsYWNlZCBieSBhIHJldmlzZWQgdmFsdWUgb2YgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgc3RpbGwgbmVlZCB0aGUgb3JpZ2luYWwgdmFsdWUgYWxzbwogICAgIGludCBvcmlnaW5hbFNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CiAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBhdWRpb0ZsaW5nZXItPm9wZW5SZWNvcmQoaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLSAgICBBTE9HRV9JRihvcmlnaW5hbFNlc3Npb25JZCAhPSAwICYmIG1TZXNzaW9uSWQgIT0gb3JpZ2luYWxTZXNzaW9uSWQsCisgICAgQUxPR0VfSUYob3JpZ2luYWxTZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSAmJiBtU2Vzc2lvbklkICE9IG9yaWdpbmFsU2Vzc2lvbklkLAogICAgICAgICAgICAgInNlc3Npb24gSUQgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwgb3JpZ2luYWxTZXNzaW9uSWQsIG1TZXNzaW9uSWQpOwogCi0gICAgaWYgKHJlY29yZCA9PSAwIHx8IHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHJlY29yZCB0cmFjaywgc3RhdHVzOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoaW5wdXQpOwotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQorICAgIEFMT0dfQVNTRVJUKHJlY29yZCAhPSAwKTsKKworICAgIC8vIEF1ZGlvRmxpbmdlciBub3cgb3ducyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBJL08gaGFuZGxlLAorICAgIC8vIHNvIHdlIGFyZSBubyBsb25nZXIgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdC4KKwogICAgIHNwPElNZW1vcnk+IGlNZW0gPSByZWNvcmQtPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKQEAgLTQ4OSwzOCArNTE0LDU2IEBACiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7CiAgICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQotICAgIG1JbnB1dCA9IGlucHV0OwogICAgIG1BdWRpb1JlY29yZCA9IHJlY29yZDsKKwogICAgIG1DYmxrTWVtb3J5ID0gaU1lbTsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QqPihpTWVtUG9pbnRlcik7CiAgICAgbUNibGsgPSBjYmxrOwotICAgIC8vIEZJWE1FIG1pc3NpbmcgZmFzdCB0cmFjayBmcmFtZUNvdW50IGxvZ2ljCisgICAgLy8gbm90ZSB0aGF0IHRlbXAgaXMgdGhlIChwb3NzaWJseSByZXZpc2VkKSB2YWx1ZSBvZiBmcmFtZUNvdW50CisgICAgaWYgKHRlbXAgPCBmcmFtZUNvdW50IHx8IChmcmFtZUNvdW50ID09IDAgJiYgdGVtcCA9PSAwKSkgeworICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50LCB0ZW1wKTsKKyAgICB9CisgICAgZnJhbWVDb3VudCA9IHRlbXA7CisKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgIGlmIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgaWYgKHRyYWNrRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXUiLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIG1Bd2FpdEJvb3N0ID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIGRvdWJsZS1idWZmZXJpbmcgaXMgbm90IHJlcXVpcmVkIGZvciBmYXN0IHRyYWNrcywgZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZwotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gbUZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXUiLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZAogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19GQVNUKTsKLSAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IG1GcmFtZUNvdW50LzIpIHsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbUZyYW1lQ291bnQvMjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUaGVvcmV0aWNhbGx5IGRvdWJsZS1idWZmZXJpbmcgaXMgbm90IHJlcXVpcmVkIGZvciBmYXN0IHRyYWNrcywKKyAgICAgICAgLy8gZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZy4gIEJ1dCBpbiBwcmFjdGljZSwgdG8gYWNjb21vZGF0ZSBrZXJuZWxzIHdpdGgKKyAgICAgICAgLy8gc2NoZWR1bGluZyBqaXR0ZXIsIGFuZCBhcHBzIHdpdGggY29tcHV0YXRpb24gaml0dGVyLCB3ZSB1c2UgZG91YmxlLWJ1ZmZlcmluZy4KKyAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gZnJhbWVDb3VudC9uQnVmZmVyaW5nKSB7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudC9uQnVmZmVyaW5nOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gc3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXJzIGluIHNoYXJlZCBtZW1vcnkKKyAgICAvLyBXZSByZXRhaW4gYSBjb3B5IG9mIHRoZSBJL08gaGFuZGxlLCBidXQgZG9uJ3Qgb3duIHRoZSByZWZlcmVuY2UKKyAgICBtSW5wdXQgPSBpbnB1dDsKKyAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CisKKyAgICAvLyBTdGFydGluZyBhZGRyZXNzIG9mIGJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbnRyb2wgYmxvY2suICBUaGlzCisgICAgLy8gYWRkcmVzcyBpcyBmb3IgdGhlIG1hcHBpbmcgd2l0aGluIGNsaWVudCBhZGRyZXNzIHNwYWNlLiAgQXVkaW9GbGluZ2VyOjpUcmFja0Jhc2U6Om1CdWZmZXIKKyAgICAvLyBpcyBmb3IgdGhlIHNlcnZlciBhZGRyZXNzIHNwYWNlLgogICAgIHZvaWQgKmJ1ZmZlcnMgPSAoY2hhciopY2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogCisgICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIC8vIElmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLCBkb24ndCBsZXQgdGhlIHJlcXVlc3RlZCBmcmFtZUNvdW50CisgICAgLy8gZGVjcmVhc2UuICBUaGlzIGNhbiBjb25mdXNlIGNsaWVudHMgdGhhdCBjYWNoZSBmcmFtZUNvdW50KCkuCisgICAgaWYgKGZyYW1lQ291bnQgPiBtUmVxRnJhbWVDb3VudCkgeworICAgICAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgfQorCiAgICAgLy8gdXBkYXRlIHByb3h5CiAgICAgbVByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgbUZyYW1lQ291bnQsIG1GcmFtZVNpemUpOwogICAgIG1Qcm94eS0+c2V0RXBvY2goZXBvY2gpOwpAQCAtNTMwLDYgKzU3MywxNCBAQAogICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworcmVsZWFzZToKKyAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGlucHV0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgaW50MzJfdCB3YWl0Q291bnQpCkBAIC01OTEsNiArNjQyLDkgQEAKICAgICAgICAgICAgICAgICBpZiAobmV3U2VxdWVuY2UgPT0gb2xkU2VxdWVuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmVzdG9yZVJlY29yZF9sKCJvYnRhaW5CdWZmZXIiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLm1GcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tUmF3ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tTm9uQ29udGlnID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNjkyLDcgKzc0Niw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotbnNlY3NfdCBBdWRpb1JlY29yZDo6cHJvY2Vzc0F1ZGlvQnVmZmVyKGNvbnN0IHNwPEF1ZGlvUmVjb3JkVGhyZWFkPiYgdGhyZWFkKQorbnNlY3NfdCBBdWRpb1JlY29yZDo6cHJvY2Vzc0F1ZGlvQnVmZmVyKCkKIHsKICAgICBtTG9jay5sb2NrKCk7CiAgICAgaWYgKG1Bd2FpdEJvb3N0KSB7CkBAIC03NjAsMTcgKzgxNCwxNyBAQAogICAgIH0KIAogICAgIC8vIENhY2hlIG90aGVyIGZpZWxkcyB0aGF0IHdpbGwgYmUgbmVlZGVkIHNvb24KLSAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKKyAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OwogICAgIGlmIChtUmVmcmVzaFJlbWFpbmluZykgewogICAgICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IGZhbHNlOwogICAgICAgICBtUmVtYWluaW5nRnJhbWVzID0gbm90aWZpY2F0aW9uRnJhbWVzOwogICAgICAgICBtUmV0cnlPblBhcnRpYWxCdWZmZXIgPSBmYWxzZTsKICAgICB9CiAgICAgc2l6ZV90IG1pc2FsaWdubWVudCA9IG1Qcm94eS0+Z2V0TWlzYWxpZ25tZW50KCk7Ci0gICAgaW50MzJfdCBzZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKKyAgICB1aW50MzJfdCBzZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKIAogICAgIC8vIFRoZXNlIGZpZWxkcyBkb24ndCBuZWVkIHRvIGJlIGNhY2hlZCwgYmVjYXVzZSB0aGV5IGFyZSBhc3NpZ25lZCBvbmx5IGJ5IHNldCgpOgotICAgIC8vICAgICAgbVRyYW5zZmVyLCBtQ2JmLCBtVXNlckRhdGEsIG1TYW1wbGVSYXRlCisgICAgLy8gICAgICBtVHJhbnNmZXIsIG1DYmYsIG1Vc2VyRGF0YSwgbVNhbXBsZVJhdGUsIG1GcmFtZVNpemUKIAogICAgIG1Mb2NrLnVubG9jaygpOwogCkBAIC04NDQsOCArODk4LDggQEAKICAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXUgPSAldSArICV1IiwKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzLCBhdmFpbCwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCwgbm9uQ29udGlnKTsKKyAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXUgPSAldSArICV1IGVyciAlZCIsCisgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIpIHsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTk1NCw3ICsxMDA4LDcgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi12b2lkIEF1ZGlvUmVjb3JkOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCit2b2lkIEF1ZGlvUmVjb3JkOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCiB7CiAgICAgc3A8QXVkaW9SZWNvcmQ+IGF1ZGlvUmVjb3JkID0gbUF1ZGlvUmVjb3JkLnByb21vdGUoKTsKICAgICBpZiAoYXVkaW9SZWNvcmQgIT0gMCkgewpAQCAtOTY2LDcgKzEwMjAsOCBAQAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmRUaHJlYWQ6OkF1ZGlvUmVjb3JkVGhyZWFkKEF1ZGlvUmVjb3JkJiByZWNlaXZlciwgYm9vbCBiQ2FuQ2FsbEphdmEpCi0gICAgOiBUaHJlYWQoYkNhbkNhbGxKYXZhKSwgbVJlY2VpdmVyKHJlY2VpdmVyKSwgbVBhdXNlZCh0cnVlKSwgbVBhdXNlZEludChmYWxzZSksIG1QYXVzZWROcygwTEwpCisgICAgOiBUaHJlYWQoYkNhbkNhbGxKYXZhKSwgbVJlY2VpdmVyKHJlY2VpdmVyKSwgbVBhdXNlZCh0cnVlKSwgbVBhdXNlZEludChmYWxzZSksIG1QYXVzZWROcygwTEwpLAorICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQoZmFsc2UpCiB7CiB9CiAKQEAgLTk4Myw2ICsxMDM4LDEwIEBACiAgICAgICAgICAgICAvLyBjYWxsZXIgd2lsbCBjaGVjayBmb3IgZXhpdFBlbmRpbmcoKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1JZ25vcmVOZXh0UGF1c2VkSW50KSB7CisgICAgICAgICAgICBtSWdub3JlTmV4dFBhdXNlZEludCA9IGZhbHNlOworICAgICAgICAgICAgbVBhdXNlZEludCA9IGZhbHNlOworICAgICAgICB9CiAgICAgICAgIGlmIChtUGF1c2VkSW50KSB7CiAgICAgICAgICAgICBpZiAobVBhdXNlZE5zID4gMCkgewogICAgICAgICAgICAgICAgICh2b2lkKSBtTXlDb25kLndhaXRSZWxhdGl2ZShtTXlMb2NrLCBtUGF1c2VkTnMpOwpAQCAtOTkzLDcgKzEwNTIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbnNlY3NfdCBucyA9ICBtUmVjZWl2ZXIucHJvY2Vzc0F1ZGlvQnVmZmVyKHRoaXMpOworICAgIG5zZWNzX3QgbnMgPSAgbVJlY2VpdmVyLnByb2Nlc3NBdWRpb0J1ZmZlcigpOwogICAgIHN3aXRjaCAobnMpIHsKICAgICBjYXNlIDA6CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTAxNywxMiArMTA3Niw3IEBACiB7CiAgICAgLy8gbXVzdCBiZSBpbiB0aGlzIG9yZGVyIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24KICAgICBUaHJlYWQ6OnJlcXVlc3RFeGl0KCk7Ci0gICAgQXV0b011dGV4IF9sKG1NeUxvY2spOwotICAgIGlmIChtUGF1c2VkIHx8IG1QYXVzZWRJbnQpIHsKLSAgICAgICAgbVBhdXNlZCA9IGZhbHNlOwotICAgICAgICBtUGF1c2VkSW50ID0gZmFsc2U7Ci0gICAgICAgIG1NeUNvbmQuc2lnbmFsKCk7Ci0gICAgfQorICAgIHJlc3VtZSgpOwogfQogCiB2b2lkIEF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6cGF1c2UoKQpAQCAtMTAzNCw2ICsxMDg4LDcgQEAKIHZvaWQgQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpyZXN1bWUoKQogewogICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyAgICBtSWdub3JlTmV4dFBhdXNlZEludCA9IHRydWU7CiAgICAgaWYgKG1QYXVzZWQgfHwgbVBhdXNlZEludCkgewogICAgICAgICBtUGF1c2VkID0gZmFsc2U7CiAgICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCBjYzViODEwLi4yZjE2NDQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC0zNSwxNSArMzUsMTUgQEAKIHNwPElBdWRpb0ZsaW5nZXI+IEF1ZGlvU3lzdGVtOjpnQXVkaW9GbGluZ2VyOwogc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudD4gQXVkaW9TeXN0ZW06OmdBdWRpb0ZsaW5nZXJDbGllbnQ7CiBhdWRpb19lcnJvcl9jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z0F1ZGlvRXJyb3JDYWxsYmFjayA9IE5VTEw7Ci0vLyBDYWNoZWQgdmFsdWVzCiAKLURlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgKj4gQXVkaW9TeXN0ZW06OmdPdXRwdXRzKDApOworLy8gQ2FjaGVkIHZhbHVlcyBmb3Igb3V0cHV0IGhhbmRsZXMKK0RlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgKj4gQXVkaW9TeXN0ZW06OmdPdXRwdXRzKE5VTEwpOwogCiAvLyBDYWNoZWQgdmFsdWVzIGZvciByZWNvcmRpbmcgcXVlcmllcywgYWxsIHByb3RlY3RlZCBieSBnTG9jawotdWludDMyX3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5TYW1wbGluZ1JhdGUgPSAxNjAwMDsKLWF1ZGlvX2Zvcm1hdF90IEF1ZGlvU3lzdGVtOjpnUHJldkluRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci1hdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJbkNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9NT05POwotc2l6ZV90IEF1ZGlvU3lzdGVtOjpnSW5CdWZmU2l6ZSA9IDA7Cit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJblNhbXBsaW5nUmF0ZTsKK2F1ZGlvX2Zvcm1hdF90IEF1ZGlvU3lzdGVtOjpnUHJldkluRm9ybWF0OworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5DaGFubmVsTWFzazsKK3NpemVfdCBBdWRpb1N5c3RlbTo6Z0luQnVmZlNpemUgPSAwOyAgICAvLyB6ZXJvIGluZGljYXRlcyBjYWNoZSBpcyBpbnZhbGlkCiAKIAogLy8gZXN0YWJsaXNoIGJpbmRlciBpbnRlcmZhY2UgdG8gQXVkaW9GbGluZ2VyIHNlcnZpY2UKQEAgLTg0LDEzICs4NCwxNSBAQAogICAgIHJldHVybiBERUFEX09CSkVDVDsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06Om11dGVNaWNyb3Bob25lKGJvb2wgc3RhdGUpIHsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjptdXRlTWljcm9waG9uZShib29sIHN0YXRlKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFmLT5zZXRNaWNNdXRlKHN0YXRlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmlzTWljcm9waG9uZU11dGVkKGJvb2wqIHN0YXRlKSB7CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aXNNaWNyb3Bob25lTXV0ZWQoYm9vbCogc3RhdGUpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAqc3RhdGUgPSBhZi0+Z2V0TWljTXV0ZSgpOwpAQCAtMTc1LDEzICsxNzcsMTUgQEAKICAgICByZXR1cm4gYWYtPnNldE1vZGUobW9kZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSB7CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIHJldHVybiBhZi0+c2V0UGFyYW1ldGVycyhpb0hhbmRsZSwga2V5VmFsdWVQYWlycyk7CiB9CiAKLVN0cmluZzggQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpIHsKK1N0cmluZzggQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgU3RyaW5nOCByZXN1bHQgPSBTdHJpbmc4KCIiKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIHJlc3VsdDsKQEAgLTE5MCw2ICsxOTQsMTYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQoreworICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBrZXlWYWx1ZVBhaXJzKTsKK30KKworU3RyaW5nOCBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQoreworICAgIHJldHVybiBnZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBrZXlzKTsKK30KKwogLy8gY29udmVydCB2b2x1bWUgc3RlcHMgdG8gbmF0dXJhbCBsb2cgc2NhbGUKIAogLy8gY2hhbmdlIHRoaXMgdmFsdWUgdG8gY2hhbmdlIHZvbHVtZSBzY2FsaW5nCkBAIC0yNDksNiArMjYzLDExIEBACiAgICAgICAgICpzYW1wbGluZ1JhdGUgPSBvdXRwdXREZXNjLT5zYW1wbGluZ1JhdGU7CiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KKyAgICBpZiAoKnNhbXBsaW5nUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlIGZhaWxlZCBmb3Igb3V0cHV0ICVkIHN0cmVhbSB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICBvdXRwdXQsIHN0cmVhbVR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIEFMT0dWKCJnZXRTYW1wbGluZ1JhdGUoKSBzdHJlYW1UeXBlICVkLCBvdXRwdXQgJWQsIHNhbXBsaW5nIHJhdGUgJXUiLCBzdHJlYW1UeXBlLCBvdXRwdXQsCiAgICAgICAgICAgICAqc2FtcGxpbmdSYXRlKTsKQEAgLTI2NSw3ICsyODQsNyBAQAogICAgIH0KIAogICAgIG91dHB1dCA9IGdldE91dHB1dChzdHJlYW1UeXBlKTsKLSAgICBpZiAob3V0cHV0ID09IDApIHsKKyAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKQEAgLTI4OSw2ICszMDgsMTEgQEAKICAgICAgICAgKmZyYW1lQ291bnQgPSBvdXRwdXREZXNjLT5mcmFtZUNvdW50OwogICAgICAgICBnTG9jay51bmxvY2soKTsKICAgICB9CisgICAgaWYgKCpmcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50IGZhaWxlZCBmb3Igb3V0cHV0ICVkIHN0cmVhbSB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICBvdXRwdXQsIHN0cmVhbVR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIEFMT0dWKCJnZXRGcmFtZUNvdW50KCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBmcmFtZUNvdW50ICVkIiwgc3RyZWFtVHlwZSwgb3V0cHV0LAogICAgICAgICAgICAgKmZyYW1lQ291bnQpOwpAQCAtMzA1LDE1ICszMjksMTQgQEAKICAgICB9CiAKICAgICBvdXRwdXQgPSBnZXRPdXRwdXQoc3RyZWFtVHlwZSk7Ci0gICAgaWYgKG91dHB1dCA9PSAwKSB7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIGdldExhdGVuY3kob3V0cHV0LCBzdHJlYW1UeXBlLCBsYXRlbmN5KTsKKyAgICByZXR1cm4gZ2V0TGF0ZW5jeShvdXRwdXQsIGxhdGVuY3kpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbGF0ZW5jeSkKIHsKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwpAQCAtMzMwLDcgKzM1Myw3IEBACiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KIAotICAgIEFMT0dWKCJnZXRMYXRlbmN5KCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBsYXRlbmN5ICVkIiwgc3RyZWFtVHlwZSwgb3V0cHV0LCAqbGF0ZW5jeSk7CisgICAgQUxPR1YoImdldExhdGVuY3koKSBvdXRwdXQgJWQsIGxhdGVuY3kgJWQiLCBvdXRwdXQsICpsYXRlbmN5KTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTM0OSw2ICszNzIsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgfQogICAgICAgICBpbkJ1ZmZTaXplID0gYWYtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgaWYgKGluQnVmZlNpemUgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUgZmFpbGVkIHNhbXBsZVJhdGUgJWQgZm9ybWF0ICUjeCBjaGFubmVsTWFzayAleCIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvLyBBIGJlbmlnbiByYWNlIGlzIHBvc3NpYmxlIGhlcmU6IHdlIGNvdWxkIG92ZXJ3cml0ZSBhIGZyZXNoZXIgY2FjaGUgZW50cnkKICAgICAgICAgZ0xvY2subG9jaygpOwogICAgICAgICAvLyBzYXZlIHRoZSByZXF1ZXN0IHBhcmFtcwogICAgICAgICBnUHJldkluU2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKQEAgLTM3MSw1NSArNDAwLDUyIEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHVpbnQzMl90ICpoYWxGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRzcEZyYW1lcywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRzcEZyYW1lcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewotICAgICAgICBzdHJlYW0gPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotCi0gICAgaWYgKG91dHB1dCA9PSAwKSB7Ci0gICAgICAgIG91dHB1dCA9IGdldE91dHB1dChzdHJlYW0pOwotICAgIH0KLQogICAgIHJldHVybiBhZi0+Z2V0UmVuZGVyUG9zaXRpb24oaGFsRnJhbWVzLCBkc3BGcmFtZXMsIG91dHB1dCk7CiB9CiAKLXNpemVfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSB7Cit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgICAgaWYgKGFmID09IDApIHJldHVybiByZXN1bHQ7Ci0gICAgaWYgKGlvSGFuZGxlID09IDApIHJldHVybiByZXN1bHQ7CisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm4gcmVzdWx0OwogCiAgICAgcmVzdWx0ID0gYWYtPmdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpIHsKK2ludCBBdWRpb1N5c3RlbTo6bmV3QXVkaW9TZXNzaW9uSWQoKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIEFVRElPX1NFU1NJT05fQUxMT0NBVEU7CiAgICAgcmV0dXJuIGFmLT5uZXdBdWRpb1Nlc3Npb25JZCgpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikgewordm9pZCBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgIT0gMCkgewotICAgICAgICBhZi0+YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGFmLT5hY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uLCBwaWQpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pIHsKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmICE9IDApIHsKLSAgICAgICAgYWYtPnJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24pOworICAgICAgICBhZi0+cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbiwgcGlkKTsKICAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCit7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKEF1ZGlvU3lzdGVtOjpnTG9jayk7CiAKICAgICBBdWRpb1N5c3RlbTo6Z0F1ZGlvRmxpbmdlci5jbGVhcigpOwpAQCAtNDM4LDcgKzQ2NCw3IEBACiAgICAgY29uc3QgT3V0cHV0RGVzY3JpcHRvciAqZGVzYzsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKIAotICAgIGlmIChpb0hhbmRsZSA9PSAwKSByZXR1cm47CisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm47CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKIApAQCAtNDU1LDcgKzQ4MSw3IEBACiAKICAgICAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9ICBuZXcgT3V0cHV0RGVzY3JpcHRvcigqZGVzYyk7CiAgICAgICAgIGdPdXRwdXRzLmFkZChpb0hhbmRsZSwgb3V0cHV0RGVzYyk7Ci0gICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgb3V0cHV0IHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICVkIGNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAldSAiCisgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgb3V0cHV0IHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4IGZyYW1lQ291bnQgJXUgIgogICAgICAgICAgICAgICAgICJsYXRlbmN5ICVkIiwKICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zYW1wbGluZ1JhdGUsIG91dHB1dERlc2MtPmZvcm1hdCwgb3V0cHV0RGVzYy0+Y2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZnJhbWVDb3VudCwgb3V0cHV0RGVzYy0+bGF0ZW5jeSk7CkBAIC00NzksNyArNTA1LDcgQEAKICAgICAgICAgaWYgKHBhcmFtMiA9PSBOVUxMKSBicmVhazsKICAgICAgICAgZGVzYyA9IChjb25zdCBPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOwogCi0gICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJWQgY2hhbm5lbCBtYXNrICUjeCAiCisgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggIgogICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICVkIGxhdGVuY3kgJWQiLAogICAgICAgICAgICAgICAgIGlvSGFuZGxlLCBkZXNjLT5zYW1wbGluZ1JhdGUsIGRlc2MtPmZvcm1hdCwKICAgICAgICAgICAgICAgICBkZXNjLT5jaGFubmVsTWFzaywgZGVzYy0+ZnJhbWVDb3VudCwgZGVzYy0+bGF0ZW5jeSk7CkBAIC00OTYsMTIgKzUyMiwxNCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6c2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYikgewordm9pZCBBdWRpb1N5c3RlbTo6c2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYikKK3sKICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwogICAgIGdBdWRpb0Vycm9yQ2FsbGJhY2sgPSBjYjsKIH0KIAotYm9vbCBBdWRpb1N5c3RlbTo6cm91dGVkVG9BMmRwT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgeworYm9vbCBBdWRpb1N5c3RlbTo6cm91dGVkVG9BMmRwT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKICAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKICAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKICAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgpAQCAtNzAyLDE0ICs3MzAsMTUgQEAKIGF1ZGlvX2RldmljZXNfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwotICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpMDsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKICAgICByZXR1cm4gYXBzLT5nZXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSk7CiB9CiAKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwotICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIC8vIEZJWE1FIGNoYW5nZSByZXR1cm4gdHlwZSB0byBzdGF0dXNfdCwgYW5kIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRCBoZXJlCisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0Rm9yRWZmZWN0KGRlc2MpOwogfQogCkBAIC04MDQsNyArODMzLDggQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7Cit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKK3sKICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKICAgICBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9saWN5U2VydmljZS5jbGVhcigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCmluZGV4IDNmM2E4OGMuLmZiZmQzZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCkBAIC00NCw5ICs0NCw2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gZGVmYXVsdCB0byAwIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAqZnJhbWVDb3VudCA9IDA7Ci0KICAgICAvLyBGSVhNRSBtZXJnZSB3aXRoIHNpbWlsYXIgY29kZSBpbiBjcmVhdGVUcmFja19sKCksIGV4Y2VwdCB3ZSdyZSBtaXNzaW5nCiAgICAgLy8gICAgICAgc29tZSBpbmZvcm1hdGlvbiBoZXJlIHRoYXQgaXMgYXZhaWxhYmxlIGluIGNyZWF0ZVRyYWNrX2woKToKICAgICAvLyAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQKQEAgLTU0LDE2ICs1MSwyNiBAQAogICAgIC8vICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrCiAgICAgLy8gICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MKICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBmcmFtZSBjb3VudCBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgdWludDMyX3QgYWZMYXRlbmN5OwotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGRlcHRoIGNvdmVycyBhdCBsZWFzdCBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5CkBAIC03NCw2ICs4MSwxMyBAQAogCiAgICAgKmZyYW1lQ291bnQgPSAoc2FtcGxlUmF0ZSA9PSAwKSA/IGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50IDoKICAgICAgICAgICAgIGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogc2FtcGxlUmF0ZSAvIGFmU2FtcGxlUmF0ZTsKKyAgICAvLyBUaGUgZm9ybXVsYSBhYm92ZSBzaG91bGQgYWx3YXlzIHByb2R1Y2UgYSBub24temVybyB2YWx1ZSwgYnV0IHJldHVybiBhbiBlcnJvcgorICAgIC8vIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IGl0IGRvZXMgbm90LCBhcyB0aGF0J3MgcGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0LgorICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIEFMT0dWKCJnZXRNaW5GcmFtZUNvdW50PSVkOiBhZkZyYW1lQ291bnQ9JWQsIG1pbkJ1ZkNvdW50PSVkLCBhZlNhbXBsZVJhdGU9JWQsIGFmTGF0ZW5jeT0lZCIsCiAgICAgICAgICAgICAqZnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOwogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTk1LDE1ICsxMDksMTYgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgaW50IHVpZCkKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1Jc1RpbWVkKGZhbHNlKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKQEAgLTExMyw3ICsxMjgsNyBAQAogICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQpOworICAgICAgICAgICAgb2ZmbG9hZEluZm8sIHVpZCwgcGlkKTsKIH0KIAogQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKQEAgLTEyNSwxMSArMTQwLDEyIEBACiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICBjYWxsYmFja190IGNiZiwKICAgICAgICAgdm9pZCogdXNlciwKLSAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAotICAgICAgICBpbnQgdWlkKQorICAgICAgICBpbnQgdWlkLAorICAgICAgICBwaWRfdCBwaWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpLAogICAgICAgbUlzVGltZWQoZmFsc2UpLAogICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLApAQCAtMTM4LDcgKzE1NCw4IEBACiB7CiAgICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywgdWlkKTsKKyAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sCisgICAgICAgICAgICB1aWQsIHBpZCk7CiB9CiAKIEF1ZGlvVHJhY2s6On5BdWRpb1RyYWNrKCkKQEAgLTE1Nyw3ICsxNzQsOSBAQAogICAgICAgICBtQXVkaW9UcmFjay0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkKTsKKyAgICAgICAgQUxPR1YoIn5BdWRpb1RyYWNrLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCBmcm9tICVkIG9uIGJlaGFsZiBvZiAlZCIsCisgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKICAgICB9CiB9CiAKQEAgLTE2NiwxOCArMTg1LDI0IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBmcmFtZUNvdW50SW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCi0gICAgICAgIGludCB1aWQpCisgICAgICAgIGludCB1aWQsCisgICAgICAgIHBpZF90IHBpZCkKIHsKKyAgICBBTE9HVigic2V0KCk6IHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKKyAgICAgICAgICAiZmxhZ3MgIyV4LCBub3RpZmljYXRpb25GcmFtZXMgJXUsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkIiwKKyAgICAgICAgICBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlKTsKKwogICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7CiAgICAgY2FzZSBUUkFOU0ZFUl9ERUZBVUxUOgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKQEAgLTIxMSwxNSArMjM2LDkgQEAKICAgICAgICAgQUxPR0UoIkludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIHRyYW5zZmVyVHlwZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7CiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwogCi0gICAgLy8gRklYTUUgImludCIgaGVyZSBpcyBsZWdhY3kgYW5kIHdpbGwgYmUgcmVwbGFjZWQgYnkgc2l6ZV90IGxhdGVyCi0gICAgaWYgKGZyYW1lQ291bnRJbnQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZyYW1lIGNvdW50ICVkIiwgZnJhbWVDb3VudEludCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZnJhbWVDb3VudEludDsKLQogICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIApAQCAtMjMzLDE5ICsyNTIsMjQgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIG1PdXRwdXQgPSAwOwotCiAgICAgLy8gaGFuZGxlIGRlZmF1bHQgdmFsdWVzIGZpcnN0LgogICAgIGlmIChzdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CiAgICAgICAgIHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKIAorICAgIHN0YXR1c190IHN0YXR1czsKICAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwKSB7Ci0gICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZzYW1wbGVSYXRlLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KLSAgICAgICAgc2FtcGxlUmF0ZSA9IGFmU2FtcGxlUmF0ZTsKICAgICB9CiAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwogCkBAIC0yNTMsMTUgKzI3NywyMSBAQAogICAgIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgfQotICAgIGlmIChjaGFubmVsTWFzayA9PSAwKSB7Ci0gICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIH0KIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlZCIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBtRm9ybWF0ID0gZm9ybWF0OworCisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOworICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CiAKICAgICAvLyBBdWRpb0ZsaW5nZXIgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgOC1iaXQgZGF0YSBpbiBzaGFyZWQgbWVtb3J5CiAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSB7CkBAIC0yODUsMTQgKzMxNSw2IEBACiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmfkFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKTsKICAgICB9CiAKLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChjaGFubmVsTWFzayk7Ci0gICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKLQogICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKICAgICAgICAgbUZyYW1lU2l6ZUFGID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOwpAQCAtMzAxLDMwICszMjMsMzYgQEAKICAgICAgICAgbUZyYW1lU2l6ZUFGID0gc2l6ZW9mKHVpbnQ4X3QpOwogICAgIH0KIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8pOwotCi0gICAgaWYgKG91dHB1dCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIG91dHB1dCBmb3Igc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW1UeXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAvLyBNYWtlIGNvcHkgb2YgaW5wdXQgcGFyYW1ldGVyIG9mZmxvYWRJbmZvIHNvIHRoYXQgaW4gdGhlIGZ1dHVyZToKKyAgICAvLyAgKGEpIGNyZWF0ZVRyYWNrX2wgZG9lc24ndCBuZWVkIGl0IGFzIGFuIGlucHV0IHBhcmFtZXRlcgorICAgIC8vICAoYikgd2UgY2FuIHN1cHBvcnQgcmUtY3JlYXRpb24gb2Ygb2ZmbG9hZGVkIHRyYWNrcworICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgIG1PZmZsb2FkSW5mb0NvcHkgPSAqb2ZmbG9hZEluZm87CisgICAgICAgIG1PZmZsb2FkSW5mbyA9ICZtT2ZmbG9hZEluZm9Db3B5OworICAgIH0gZWxzZSB7CisgICAgICAgIG1PZmZsb2FkSW5mbyA9IE5VTEw7CiAgICAgfQogCi0gICAgbVZvbHVtZVtMRUZUXSA9IDEuMGY7Ci0gICAgbVZvbHVtZVtSSUdIVF0gPSAxLjBmOworICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSA9IDEuMGY7CisgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSA9IDEuMGY7CiAgICAgbVNlbmRMZXZlbCA9IDAuMGY7Ci0gICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIC8vIG1GcmFtZUNvdW50IGlzIGluaXRpYWxpemVkIGluIGNyZWF0ZVRyYWNrX2wKICAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSA9IG5vdGlmaWNhdGlvbkZyYW1lczsKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gMDsKICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIGlmICh1aWQgPT0gLTEgfHwgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSkpIHsKKyAgICBpbnQgY2FsbGluZ3BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgbXlwaWQgPSBnZXRwaWQoKTsKKyAgICBpZiAodWlkID09IC0xIHx8IChjYWxsaW5ncGlkICE9IG15cGlkKSkgewogICAgICAgICBtQ2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DbGllbnRVaWQgPSB1aWQ7CiAgICAgfQorICAgIGlmIChwaWQgPT0gLTEgfHwgKGNhbGxpbmdwaWQgIT0gbXlwaWQpKSB7CisgICAgICAgIG1DbGllbnRQaWQgPSBjYWxsaW5ncGlkOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DbGllbnRQaWQgPSBwaWQ7CisgICAgfQogICAgIG1BdXhFZmZlY3RJZCA9IDA7CiAgICAgbUZsYWdzID0gZmxhZ3M7CiAgICAgbUNiZiA9IGNiZjsKQEAgLTMzNSwxNCArMzYzLDcgQEAKICAgICB9CiAKICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1RyYWNrCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlVHJhY2tfbChzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qZXBvY2gqLyk7CisgICAgc3RhdHVzID0gY3JlYXRlVHJhY2tfbCgwIC8qZXBvY2gqLyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7CkBAIC0zNTAsMTcgKzM3MSwxMCBAQAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQotICAgICAgICAvL1VzZSBvZiBkaXJlY3QgYW5kIG9mZmxvYWRlZCBvdXRwdXQgc3RyZWFtcyBpcyByZWYgY291bnRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KLSAgICAgICAgLy8gQXMgZ2V0T3V0cHV0IHdhcyBjYWxsZWQgYWJvdmUgYW5kIHJlc3VsdGVkIGluIGFuIG91dHB1dCBzdHJlYW0gdG8gYmUgb3BlbmVkLAotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbGVhc2UgaXQuCi0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwotICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICBtRm9ybWF0ID0gZm9ybWF0OwotICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7CiAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKICAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIG1Mb29wUGVyaW9kID0gMDsKQEAgLTM2OCwxMSArMzgyLDEwIEBACiAgICAgbU1hcmtlclJlYWNoZWQgPSBmYWxzZTsKICAgICBtTmV3UG9zaXRpb24gPSAwOwogICAgIG1VcGRhdGVQZXJpb2QgPSAwOwotICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCk7CisgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKICAgICBtU2VxdWVuY2UgPSAxOwogICAgIG1PYnNlcnZlZFNlcXVlbmNlID0gbVNlcXVlbmNlOwogICAgIG1JblVuZGVycnVuID0gZmFsc2U7Ci0gICAgbU91dHB1dCA9IG91dHB1dDsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTQ0OCwxMiArNDYxLDExIEBACiB2b2lkIEF1ZGlvVHJhY2s6OnN0b3AoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICAvLyBGSVhNRSBwYXVzZSB0aGVuIHN0b3Agc2hvdWxkIG5vdCBiZSBhIG5vcAotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFKSB7CisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUgJiYgbVN0YXRlICE9IFNUQVRFX1BBVVNFRCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQSU5HOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CkBAIC00NzUsNyArNDg3LDcgQEAKIAogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKICAgICBpZiAodCAhPSAwKSB7Ci0gICAgICAgIGlmICghaXNPZmZsb2FkZWQoKSkgeworICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkX2woKSkgewogICAgICAgICAgICAgdC0+cGF1c2UoKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC01MTMsNyArNTI1LDcgQEAKICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAKICAgICBtU3RhdGUgPSBTVEFURV9GTFVTSEVEOwotICAgIGlmIChpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkX2woKSkgewogICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgIH0KICAgICBtUHJveHktPmZsdXNoKCk7CkBAIC01MzMsOCArNTQ1LDggQEAKICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwogCi0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKLSAgICAgICAgaWYgKG1PdXRwdXQgIT0gMCkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKKyAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lczsKICAgICAgICAgICAgIC8vIE9mZmxvYWRUaHJlYWQgc2VuZHMgSEFMIHBhdXNlIGluIGl0cyB0aHJlYWRMb29wLi4gdGltZSBzYXZlZAogICAgICAgICAgICAgLy8gaGVyZSBjYW4gYmUgc2xpZ2h0bHkgb2ZmCkBAIC01NTEsMTIgKzU2MywxMiBAQAogICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBtVm9sdW1lW0xFRlRdID0gbGVmdDsKLSAgICBtVm9sdW1lW1JJR0hUXSA9IHJpZ2h0OworICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSA9IGxlZnQ7CisgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSA9IHJpZ2h0OwogCiAgICAgbVByb3h5LT5zZXRWb2x1bWVMUigodWludDMyX3QodWludDE2X3QocmlnaHQgKiAweDEwMDApKSA8PCAxNikgfCB1aW50MTZfdChsZWZ0ICogMHgxMDAwKSk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgbUF1ZGlvVHJhY2stPnNpZ25hbCgpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC02MjAsOCArNjMyLDggQEAKICAgICAvLyBzYW1wbGUgcmF0ZSBjYW4gYmUgdXBkYXRlZCBkdXJpbmcgcGxheWJhY2sgYnkgdGhlIG9mZmxvYWRlZCBkZWNvZGVyIHNvIHdlIG5lZWQgdG8KICAgICAvLyBxdWVyeSB0aGUgSEFMIGFuZCB1cGRhdGUgaWYgbmVlZGVkLgogLy8gRklYTUUgdXNlIFByb3h5IHJldHVybiBjaGFubmVsIHRvIHVwZGF0ZSB0aGUgcmF0ZSBmcm9tIHNlcnZlciBhbmQgYXZvaWQgcG9sbGluZyBoZXJlCi0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKLSAgICAgICAgaWYgKG1PdXRwdXQgIT0gMCkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKKyAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShtT3V0cHV0LCBtU3RyZWFtVHlwZSwgJnNhbXBsZVJhdGUpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtNzA0LDYgKzcxNiw3IEBACiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIHVwZGF0ZVBlcmlvZDsKICAgICBtVXBkYXRlUGVyaW9kID0gdXBkYXRlUGVyaW9kOworCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC03NTcsNyArNzcwLDcgQEAKICAgICB9CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgIHVpbnQzMl90IGRzcEZyYW1lcyA9IDA7CiAKICAgICAgICAgaWYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpIHsKQEAgLTc2Niw3ICs3NzksNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1PdXRwdXQgIT0gMCkgeworICAgICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFJlbmRlclBvc2l0aW9uKG1PdXRwdXQsICZoYWxGcmFtZXMsICZkc3BGcmFtZXMpOwogICAgICAgICB9CkBAIC04MTIsMjMgKzgyNSwxMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0T3V0cHV0KCkKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvVHJhY2s6OmdldE91dHB1dCgpIGNvbnN0CiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIHJldHVybiBtT3V0cHV0OwogfQogCi0vLyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvVHJhY2s6OmdldE91dHB1dF9sKCkKLXsKLSAgICBpZiAobU91dHB1dCkgewotICAgICAgICByZXR1cm4gbU91dHB1dDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldE91dHB1dChtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUZsYWdzKTsKLSAgICB9Ci19Ci0KIHN0YXR1c190IEF1ZGlvVHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtODQyLDE1ICs4NDQsNyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKLXN0YXR1c190IEF1ZGlvVHJhY2s6OmNyZWF0ZVRyYWNrX2woCi0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgc2l6ZV90IGVwb2NoKQorc3RhdHVzX3QgQXVkaW9UcmFjazo6Y3JlYXRlVHJhY2tfbChzaXplX3QgZXBvY2gpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKQEAgLTg1OSw1MCArODUzLDU3IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAorICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQobVN0cmVhbVR5cGUsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LAorICAgICAgICAgICAgbUNoYW5uZWxNYXNrLCBtRmxhZ3MsIG1PZmZsb2FkSW5mbyk7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBvdXRwdXQgZm9yIHN0cmVhbSB0eXBlICVkLCBzYW1wbGUgcmF0ZSAldSwgZm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgICAiY2hhbm5lbCBtYXNrICUjeCwgZmxhZ3MgJSN4IiwKKyAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GbGFncyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHsKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGFuIEkvTyBoYW5kbGUgYW5kIGhhdmUgbm90IHlldCBoYW5kZWQgaXQgb2ZmIHRvIEF1ZGlvRmxpbmdlciwKKyAgICAvLyB3ZSBtdXN0IHJlbGVhc2UgaXQgb3Vyc2VsdmVzIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCisKICAgICAvLyBOb3QgYWxsIG9mIHRoZXNlIHZhbHVlcyBhcmUgbmVlZGVkIHVuZGVyIGFsbCBjb25kaXRpb25zLCBidXQgaXQgaXMgZWFzaWVyIHRvIGdldCB0aGVtIGFsbAogCiAgICAgdWludDMyX3QgYWZMYXRlbmN5OwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRMYXRlbmN5KG91dHB1dCwgc3RyZWFtVHlwZSwgJmFmTGF0ZW5jeSk7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kob3V0cHV0LCAmYWZMYXRlbmN5KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgb3V0cHV0LCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KIAogICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQob3V0cHV0LCBzdHJlYW1UeXBlLCAmYWZGcmFtZUNvdW50KTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudChvdXRwdXQsIG1TdHJlYW1UeXBlLCAmYWZGcmFtZUNvdW50KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRGcmFtZUNvdW50KG91dHB1dD0lZCwgc3RyZWFtVHlwZT0lZCkgc3RhdHVzICVkIiwgb3V0cHV0LCBzdHJlYW1UeXBlLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgQUxPR0UoImdldEZyYW1lQ291bnQob3V0cHV0PSVkLCBzdHJlYW1UeXBlPSVkKSBzdGF0dXMgJWQiLCBvdXRwdXQsIG1TdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogCiAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzdHJlYW1UeXBlLCAmYWZTYW1wbGVSYXRlKTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgbVN0cmVhbVR5cGUsICZhZlNhbXBsZVJhdGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldFNhbXBsaW5nUmF0ZShvdXRwdXQ9JWQsIHN0cmVhbVR5cGU9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RyZWFtVHlwZSwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIEFMT0dFKCJnZXRTYW1wbGluZ1JhdGUob3V0cHV0PSVkLCBzdHJlYW1UeXBlPSVkKSBzdGF0dXMgJWQiLCBvdXRwdXQsIG1TdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogCiAgICAgLy8gQ2xpZW50IGRlY2lkZXMgd2hldGhlciB0aGUgdHJhY2sgaXMgVElNRUQgKHNlZSBiZWxvdyksIGJ1dCBjYW4gb25seSBleHByZXNzIGEgcHJlZmVyZW5jZQogICAgIC8vIGZvciBGQVNULiAgU2VydmVyIHdpbGwgcGVyZm9ybSBhZGRpdGlvbmFsIHRlc3RzLgotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAmJiAhKAorICAgIGlmICgobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgJiYgISgoCiAgICAgICAgICAgICAvLyBlaXRoZXIgb2YgdGhlc2UgdXNlIGNhc2VzOgogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMTogc2hhcmVkIGJ1ZmZlcgotICAgICAgICAgICAgKHNoYXJlZEJ1ZmZlciAhPSAwKSB8fAotICAgICAgICAgICAgLy8gdXNlIGNhc2UgMjogY2FsbGJhY2sgaGFuZGxlcgotICAgICAgICAgICAgKG1DYmYgIT0gTlVMTCkpKSB7CisgICAgICAgICAgICAobVNoYXJlZEJ1ZmZlciAhPSAwKSB8fAorICAgICAgICAgICAgLy8gdXNlIGNhc2UgMjogY2FsbGJhY2sgdHJhbnNmZXIgbW9kZQorICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSykpICYmCisgICAgICAgICAgICAvLyBtYXRjaGluZyBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgKG1TYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkpKSB7CiAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQiKTsKICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKLSAgICAgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKICAgICB9CiAgICAgQUxPR1YoImNyZWF0ZVRyYWNrX2woKSBvdXRwdXQgJWQgYWZMYXRlbmN5ICVkIiwgb3V0cHV0LCBhZkxhdGVuY3kpOwogCi0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpICYmIHNhbXBsZVJhdGUgIT0gYWZTYW1wbGVSYXRlKSB7Ci0gICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQgZHVlIHRvIG1pc21hdGNoaW5nIHNhbXBsZSByYXRlICglZCB2cyAlZCkiLAotICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBhZlNhbXBsZVJhdGUpOwotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwotICAgIH0KLQogICAgIC8vIFRoZSBjbGllbnQncyBBdWRpb1RyYWNrIGJ1ZmZlciBpcyBkaXZpZGVkIGludG8gbiBwYXJ0cyBmb3IgcHVycG9zZSBvZiB3YWtldXAgYnkgc2VydmVyLCB3aGVyZQogICAgIC8vICBuID0gMSAgIGZhc3QgdHJhY2sgd2l0aCBzaW5nbGUgYnVmZmVyaW5nOyBuQnVmZmVyaW5nIGlzIGlnbm9yZWQKICAgICAvLyAgbiA9IDIgICBmYXN0IHRyYWNrIHdpdGggZG91YmxlIGJ1ZmZlcmluZwpAQCAtOTEwLDQzICs5MTEsNDUgQEAKICAgICAvLyAgbiA9IDMgICBub3JtYWwgdHJhY2ssIHdpdGggc2FtcGxlIHJhdGUgY29udmVyc2lvbgogICAgIC8vICAgICAgICAgIChwZXNzaW1pc3RpYzsgc29tZSBub24tMToxIGNvbnZlcnNpb24gcmF0aW9zIGRvbid0IGFjdHVhbGx5IG5lZWQgdHJpcGxlLWJ1ZmZlcmluZykKICAgICAvLyAgbiA+IDMgICB2ZXJ5IGhpZ2ggbGF0ZW5jeSBvciB2ZXJ5IHNtYWxsIG5vdGlmaWNhdGlvbiBpbnRlcnZhbDsgbkJ1ZmZlcmluZyBpcyBpZ25vcmVkCi0gICAgY29uc3QgdWludDMyX3QgbkJ1ZmZlcmluZyA9IChzYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkgPyAyIDogMzsKKyAgICBjb25zdCB1aW50MzJfdCBuQnVmZmVyaW5nID0gKG1TYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkgPyAyIDogMzsKIAogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOwogCi0gICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IG1SZXFGcmFtZUNvdW50OworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewogCi0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgICAgICAvLyBTYW1lIGNvbW1lbnQgYXMgYmVsb3cgYWJvdXQgaWdub3JpbmcgZnJhbWVDb3VudCBwYXJhbWV0ZXIgZm9yIHNldCgpCi0gICAgICAgICAgICBmcmFtZUNvdW50ID0gc2hhcmVkQnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gbVNoYXJlZEJ1ZmZlci0+c2l6ZSgpOwogICAgICAgICB9IGVsc2UgaWYgKGZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICAgICAgZnJhbWVDb3VudCA9IGFmRnJhbWVDb3VudDsKICAgICAgICAgfQogICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCAhPSBmcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudDsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKKyAgICB9IGVsc2UgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogCiAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBhbGlnbm1lbnQgbWF0Y2hlcyBjaGFubmVsIGNvdW50CiAgICAgICAgIC8vIDgtYml0IGRhdGEgaW4gc2hhcmVkIG1lbW9yeSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IC8qIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUID8gMSA6ICovIDI7CisgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSAvKiBtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgPyAxIDogKi8gMjsKICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPiAxKSB7CiAgICAgICAgICAgICAvLyBNb3JlIHRoYW4gMiBjaGFubmVscyBkb2VzIG5vdCByZXF1aXJlIHN0cm9uZ2VyIGFsaWdubWVudCB0aGFuIHN0ZXJlbwogICAgICAgICAgICAgYWxpZ25tZW50IDw8PSAxOwogICAgICAgICB9Ci0gICAgICAgIGlmICgoKHVpbnRwdHJfdClzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSAmIChhbGlnbm1lbnQgLSAxKSkgIT0gMCkgeworICAgICAgICBpZiAoKCh1aW50cHRyX3QpbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGFsaWdubWVudCAtIDEpKSAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBidWZmZXIgYWxpZ25tZW50OiBhZGRyZXNzICVwLCBjaGFubmVsIGNvdW50ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIG1DaGFubmVsQ291bnQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFdoZW4gaW5pdGlhbGl6aW5nIGEgc2hhcmVkIGJ1ZmZlciBBdWRpb1RyYWNrIHZpYSBjb25zdHJ1Y3RvcnMsCiAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gZnJhbWVDb3VudCBwYXJhbWV0ZXIuCiAgICAgICAgIC8vIEJ1dCB3aGVuIGluaXRpYWxpemluZyBhIHNoYXJlZCBidWZmZXIgQXVkaW9UcmFjayB2aWEgc2V0KCksCiAgICAgICAgIC8vIHRoZXJlIF9pc18gYSBmcmFtZUNvdW50IHBhcmFtZXRlci4gIFdlIHNpbGVudGx5IGlnbm9yZSBpdC4KLSAgICAgICAgZnJhbWVDb3VudCA9IHNoYXJlZEJ1ZmZlci0+c2l6ZSgpL21DaGFubmVsQ291bnQvc2l6ZW9mKGludDE2X3QpOworICAgICAgICBmcmFtZUNvdW50ID0gbVNoYXJlZEJ1ZmZlci0+c2l6ZSgpL21DaGFubmVsQ291bnQvc2l6ZW9mKGludDE2X3QpOwogCi0gICAgfSBlbHNlIGlmICghKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKKyAgICB9IGVsc2UgaWYgKCEobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKIAogICAgICAgICAvLyBGSVhNRSBtb3ZlIHRoZXNlIGNhbGN1bGF0aW9ucyBhbmQgYXNzb2NpYXRlZCBjaGVja3MgdG8gc2VydmVyCiAKQEAgLTk1OCwxMCArOTYxLDEwIEBACiAgICAgICAgICAgICBtaW5CdWZDb3VudCA9IG5CdWZmZXJpbmc7CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IChhZkZyYW1lQ291bnQqc2FtcGxlUmF0ZSptaW5CdWZDb3VudCkvYWZTYW1wbGVSYXRlOworICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IChhZkZyYW1lQ291bnQqbVNhbXBsZVJhdGUqbWluQnVmQ291bnQpL2FmU2FtcGxlUmF0ZTsKICAgICAgICAgQUxPR1YoIm1pbkZyYW1lQ291bnQ6ICV1LCBhZkZyYW1lQ291bnQ9JWQsIG1pbkJ1ZkNvdW50PSVkLCBzYW1wbGVSYXRlPSV1LCBhZlNhbXBsZVJhdGU9JXUiCiAgICAgICAgICAgICAgICAgIiwgYWZMYXRlbmN5PSVkIiwKLSAgICAgICAgICAgICAgICBtaW5GcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIG1pbkJ1ZkNvdW50LCBzYW1wbGVSYXRlLCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CisgICAgICAgICAgICAgICAgbWluRnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgbVNhbXBsZVJhdGUsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKIAogICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKQEAgLTk4Niw1MiArOTg5LDY0IEBACiAgICAgfQogCiAgICAgcGlkX3QgdGlkID0gLTE7Ci0gICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgeworICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIHRyYWNrRmxhZ3MgfD0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVDsKICAgICAgICAgaWYgKG1BdWRpb1RyYWNrVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIHRpZCA9IG1BdWRpb1RyYWNrVGhyZWFkLT5nZXRUaWQoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKKyAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgewogICAgICAgICB0cmFja0ZsYWdzIHw9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX09GRkxPQUQ7CiAgICAgfQogCi0gICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVUcmFjayhzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICBzaXplX3QgdGVtcCA9IGZyYW1lQ291bnQ7ICAgLy8gdGVtcCBtYXkgYmUgcmVwbGFjZWQgYnkgYSByZXZpc2VkIHZhbHVlIG9mIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSB3aWxsIHN0aWxsIG5lZWQgdGhlIG9yaWdpbmFsIHZhbHVlIGFsc28KKyAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZVRyYWNrKG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0ZsaW5nZXIgb25seSBzZWVzIDE2LWJpdCBQQ00KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCi0gICAgaWYgKHRyYWNrID09IDApIHsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9CisgICAgQUxPR19BU1NFUlQodHJhY2sgIT0gMCk7CisKKyAgICAvLyBBdWRpb0ZsaW5nZXIgbm93IG93bnMgdGhlIHJlZmVyZW5jZSB0byB0aGUgSS9PIGhhbmRsZSwKKyAgICAvLyBzbyB3ZSBhcmUgbm8gbG9uZ2VyIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQuCisKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorICAgIHZvaWQgKmlNZW1Qb2ludGVyID0gaU1lbS0+cG9pbnRlcigpOworICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewogICAgICAgICBtQXVkaW9UcmFjay0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQogICAgIG1BdWRpb1RyYWNrID0gdHJhY2s7CisKICAgICBtQ2Jsa01lbW9yeSA9IGlNZW07Ci0gICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oaU1lbS0+cG9pbnRlcigpKTsKKyAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QqPihpTWVtUG9pbnRlcik7CiAgICAgbUNibGsgPSBjYmxrOwotICAgIHNpemVfdCB0ZW1wID0gY2Jsay0+ZnJhbWVDb3VudF87CisgICAgLy8gbm90ZSB0aGF0IHRlbXAgaXMgdGhlIChwb3NzaWJseSByZXZpc2VkKSB2YWx1ZSBvZiBmcmFtZUNvdW50CiAgICAgaWYgKHRlbXAgPCBmcmFtZUNvdW50IHx8IChmcmFtZUNvdW50ID09IDAgJiYgdGVtcCA9PSAwKSkgewogICAgICAgICAvLyBJbiBjdXJyZW50IGRlc2lnbiwgQXVkaW9UcmFjayBjbGllbnQgY2hlY2tzIGFuZCBlbnN1cmVzIGZyYW1lIGNvdW50IHZhbGlkaXR5IGJlZm9yZQogICAgICAgICAvLyBwYXNzaW5nIGl0IHRvIEF1ZGlvRmxpbmdlciBzbyBBdWRpb0ZsaW5nZXIgc2hvdWxkIG5vdCByZXR1cm4gYSBkaWZmZXJlbnQgdmFsdWUgZXhjZXB0CkBAIC0xMDM5LDEyICsxMDU0LDEzIEBACiAgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgZnJhbWVDb3VudCAldSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAldSIsIGZyYW1lQ291bnQsIHRlbXApOwogICAgIH0KICAgICBmcmFtZUNvdW50ID0gdGVtcDsKKwogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7Ci0gICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgeworICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIGlmICh0cmFja0ZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgewogICAgICAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAldSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwotICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlb3JldGljYWxseSBkb3VibGUtYnVmZmVyaW5nIGlzIG5vdCByZXF1aXJlZCBmb3IgZmFzdCB0cmFja3MsCiAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZy4gIEJ1dCBpbiBwcmFjdGljZSwgdG8gYWNjb21tb2RhdGUga2VybmVscyB3aXRoCiAgICAgICAgICAgICAgICAgLy8gc2NoZWR1bGluZyBqaXR0ZXIsIGFuZCBhcHBzIHdpdGggY29tcHV0YXRpb24gaml0dGVyLCB3ZSB1c2UgZG91YmxlLWJ1ZmZlcmluZy4KQEAgLTEwNTUsMjYgKzEwNzEsMjcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkCi0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwotICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0gICAgICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKKyAgICAgICAgICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwIHx8IG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPiBmcmFtZUNvdW50L25CdWZmZXJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IGZyYW1lQ291bnQvbkJ1ZmZlcmluZzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgeworICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CiAgICAgICAgIGlmICh0cmFja0ZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfT0ZGTE9BRCkgewogICAgICAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX09GRkxPQUQgc3VjY2Vzc2Z1bCIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX09GRkxPQUQgZGVuaWVkIGJ5IHNlcnZlciIpOwotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7CisgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIGEgd2FybmluZywgbm90IGFuIGVycm9yLCBzbyBkb24ndCByZXR1cm4gZXJyb3Igc3RhdHVzCisgICAgICAgICAgICAvL3JldHVybiBOT19JTklUOwogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCisgICAgbU91dHB1dCA9IG91dHB1dDsKICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAKICAgICAvLyBTdGFydGluZyBhZGRyZXNzIG9mIGJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeS4gIElmIHRoZXJlIGlzIGEgc2hhcmVkIGJ1ZmZlciwgYnVmZmVycwpAQCAtMTA4MiwxNSArMTA5OSwxNiBAQAogICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb250cm9sIGJsb2NrLiAgVGhpcyBhZGRyZXNzIGlzIGZvciB0aGUgbWFwcGluZyB3aXRoaW4gY2xpZW50CiAgICAgLy8gYWRkcmVzcyBzcGFjZS4gIEF1ZGlvRmxpbmdlcjo6VHJhY2tCYXNlOjptQnVmZmVyIGlzIGZvciB0aGUgc2VydmVyIGFkZHJlc3Mgc3BhY2UuCiAgICAgdm9pZCogYnVmZmVyczsKLSAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgIGJ1ZmZlcnMgPSAoY2hhciopY2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlcnMgPSBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKKyAgICAgICAgYnVmZmVycyA9IG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKICAgICB9CiAKICAgICBtQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CiAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQotICAgIG1MYXRlbmN5ID0gYWZMYXRlbmN5ICsgKDEwMDAqZnJhbWVDb3VudCkgLyBzYW1wbGVSYXRlOworICAgIG1MYXRlbmN5ID0gYWZMYXRlbmN5ICsgKDEwMDAqZnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKKwogICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICAvLyBJZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkLCBkb24ndCBsZXQgdGhlIHJlcXVlc3RlZCBmcmFtZUNvdW50CiAgICAgLy8gZGVjcmVhc2UuICBUaGlzIGNhbiBjb25mdXNlIGNsaWVudHMgdGhhdCBjYWNoZSBmcmFtZUNvdW50KCkuCkBAIC0xMDk5LDE1ICsxMTE3LDE1IEBACiAgICAgfQogCiAgICAgLy8gdXBkYXRlIHByb3h5Ci0gICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICBtU3RhdGljUHJveHkuY2xlYXIoKTsKICAgICAgICAgbVByb3h5ID0gbmV3IEF1ZGlvVHJhY2tDbGllbnRQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplQUYpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0aWNQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZUFGKTsKICAgICAgICAgbVByb3h5ID0gbVN0YXRpY1Byb3h5OwogICAgIH0KLSAgICBtUHJveHktPnNldFZvbHVtZUxSKCh1aW50MzJfdCh1aW50MTZfdChtVm9sdW1lW1JJR0hUXSAqIDB4MTAwMCkpIDw8IDE2KSB8Ci0gICAgICAgICAgICB1aW50MTZfdChtVm9sdW1lW0xFRlRdICogMHgxMDAwKSk7CisgICAgbVByb3h5LT5zZXRWb2x1bWVMUigodWludDMyX3QodWludDE2X3QobVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSAqIDB4MTAwMCkpIDw8IDE2KSB8CisgICAgICAgICAgICB1aW50MTZfdChtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0gKiAweDEwMDApKTsKICAgICBtUHJveHktPnNldFNlbmRMZXZlbChtU2VuZExldmVsKTsKICAgICBtUHJveHktPnNldFNhbXBsZVJhdGUobVNhbXBsZVJhdGUpOwogICAgIG1Qcm94eS0+c2V0RXBvY2goZXBvY2gpOwpAQCAtMTExNyw2ICsxMTM1LDE0IEBACiAgICAgbUF1ZGlvVHJhY2stPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKK3JlbGVhc2U6CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQob3V0cHV0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCkKQEAgLTEyNDQsOCArMTI3MCw3IEBACiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZjYmxrLT5tRmxhZ3MpICYgQ0JMS19ESVNBQkxFRCkgewotICAgICAgICAgICAgQUxPR1coInJlbGVhc2VCdWZmZXIoKSB0cmFjayAlcCBuYW1lPSVzIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwgdGhpcyk7CiAgICAgICAgICAgICAvLyBGSVhNRSBpZ25vcmluZyBzdGF0dXMKICAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgICAgICB9CkBAIC0xMjU0LDcgKzEyNzksNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXNzaXplX3QgQXVkaW9UcmFjazo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgdXNlclNpemUpCitzc2l6ZV90IEF1ZGlvVHJhY2s6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplLCBib29sIGJsb2NraW5nKQogewogICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQyB8fCBtSXNUaW1lZCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMjczLDcgKzEyOTgsOCBAQAogICAgIHdoaWxlICh1c2VyU2l6ZSA+PSBtRnJhbWVTaXplKSB7CiAgICAgICAgIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSB1c2VyU2l6ZSAvIG1GcmFtZVNpemU7CiAKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgJkNsaWVudFByb3h5OjprRm9yZXZlcik7CisgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsCisgICAgICAgICAgICAgICAgYmxvY2tpbmcgPyAmQ2xpZW50UHJveHk6OmtGb3JldmVyIDogJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmcpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewogICAgICAgICAgICAgaWYgKHdyaXR0ZW4gPiAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMzY5LDcgKzEzOTUsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW5zZWNzX3QgQXVkaW9UcmFjazo6cHJvY2Vzc0F1ZGlvQnVmZmVyKGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+JiB0aHJlYWQpCituc2Vjc190IEF1ZGlvVHJhY2s6OnByb2Nlc3NBdWRpb0J1ZmZlcigpCiB7CiAgICAgLy8gQ3VycmVudGx5IHRoZSBBdWRpb1RyYWNrIHRocmVhZCBpcyBub3QgY3JlYXRlZCBpZiB0aGVyZSBhcmUgbm8gY2FsbGJhY2tzLgogICAgIC8vIFdvdWxkIGl0IGV2ZXIgbWFrZSBzZW5zZSB0byBydW4gdGhlIHRocmVhZCwgZXZlbiB3aXRob3V0IGNhbGxiYWNrcz8KQEAgLTE0MDcsNyArMTQzMyw3IEBACiAgICAgICAgIC8vIGZvciBvZmZsb2FkZWQgdHJhY2tzIHJlc3RvcmVUcmFja19sKCkgd2lsbCBqdXN0IHVwZGF0ZSB0aGUgc2VxdWVuY2UgYW5kIGNsZWFyCiAgICAgICAgIC8vIEF1ZGlvU3lzdGVtIGNhY2hlLiBXZSBzaG91bGQgbm90IGV4aXQgaGVyZSBidXQgYWZ0ZXIgY2FsbGluZyB0aGUgY2FsbGJhY2sgc28KICAgICAgICAgLy8gdGhhdCB0aGUgdXBwZXIgbGF5ZXJzIGNhbiByZWNyZWF0ZSB0aGUgdHJhY2sKLSAgICAgICAgaWYgKCFpc09mZmxvYWRlZCgpIHx8IChtU2VxdWVuY2UgPT0gbU9ic2VydmVkU2VxdWVuY2UpKSB7CisgICAgICAgIGlmICghaXNPZmZsb2FkZWRfbCgpIHx8IChtU2VxdWVuY2UgPT0gbU9ic2VydmVkU2VxdWVuY2UpKSB7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXN0b3JlVHJhY2tfbCgicHJvY2Vzc0F1ZGlvQnVmZmVyIik7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseSwgYnV0IHdpdGggYSBuZXcgSUF1ZGlvVHJhY2sKQEAgLTE0NjIsNyArMTQ4OCw3IEBACiAgICAgLy8gQ2FjaGUgb3RoZXIgZmllbGRzIHRoYXQgd2lsbCBiZSBuZWVkZWQgc29vbgogICAgIHVpbnQzMl90IGxvb3BQZXJpb2QgPSBtTG9vcFBlcmlvZDsKICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CisgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKICAgICBpZiAobVJlZnJlc2hSZW1haW5pbmcpIHsKICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSBmYWxzZTsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKQEAgLTE2MjYsNyArMTY1Miw2IEBACiAgICAgICAgIHNpemVfdCByZXFTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKICAgICAgICAgbUNiZihFVkVOVF9NT1JFX0RBVEEsIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKICAgICAgICAgc2l6ZV90IHdyaXR0ZW5TaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKLSAgICAgICAgc2l6ZV90IHdyaXR0ZW5GcmFtZXMgPSB3cml0dGVuU2l6ZSAvIG1GcmFtZVNpemU7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3Qod3JpdHRlblNpemUpIDwgMCB8fCB3cml0dGVuU2l6ZSA+IHJlcVNpemUpIHsKQEAgLTE2OTIsMjIgKzE3MTcsMTkgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pCiB7CiAgICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKLSAgICAgICAgICBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWRlZCIgOiAiUENNIiwgZnJvbSk7CisgICAgICAgICAgaXNPZmZsb2FkZWRfbCgpID8gIk9mZmxvYWRlZCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAgICAgc3RhdHVzX3QgcmVzdWx0OwogCiAgICAgLy8gcmVmcmVzaCB0aGUgYXVkaW8gY29uZmlndXJhdGlvbiBjYWNoZSBpbiB0aGlzIHByb2Nlc3MgdG8gbWFrZSBzdXJlIHdlIGdldCBuZXcKLSAgICAvLyBvdXRwdXQgcGFyYW1ldGVycyBpbiBnZXRPdXRwdXRfbCgpIGFuZCBjcmVhdGVUcmFja19sKCkKKyAgICAvLyBvdXRwdXQgcGFyYW1ldGVycyBpbiBjcmVhdGVUcmFja19sKCkKICAgICBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKKyAgICAgICAgLy8gRklYTUUgcmUtY3JlYXRpb24gb2Ygb2ZmbG9hZGVkIHRyYWNrcyBpcyBub3QgeWV0IGltcGxlbWVudGVkCiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAKLSAgICAvLyBmb3JjZSBuZXcgb3V0cHV0IHF1ZXJ5IGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXI7Ci0gICAgbU91dHB1dCA9IDA7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gZ2V0T3V0cHV0X2woKTsKLQogICAgIC8vIGlmIHRoZSBuZXcgSUF1ZGlvVHJhY2sgaXMgY3JlYXRlZCwgY3JlYXRlVHJhY2tfbCgpIHdpbGwgbW9kaWZ5IHRoZQogICAgIC8vIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzOiBtQXVkaW9UcmFjaywgbUNibGtNZW1vcnkgYW5kIG1DYmxrLgogICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1RyYWNrIGFuZCBJTWVtb3J5CkBAIC0xNzE1LDE0ICsxNzM3LDcgQEAKICAgICAvLyB0YWtlIHRoZSBmcmFtZXMgdGhhdCB3aWxsIGJlIGxvc3QgYnkgdHJhY2sgcmVjcmVhdGlvbiBpbnRvIGFjY291bnQgaW4gc2F2ZWQgcG9zaXRpb24KICAgICBzaXplX3QgcG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtUHJveHktPmdldEZyYW1lc0ZpbGxlZCgpOwogICAgIHNpemVfdCBidWZmZXJQb3NpdGlvbiA9IG1TdGF0aWNQcm94eSAhPSBOVUxMID8gbVN0YXRpY1Byb3h5LT5nZXRCdWZmZXJQb3NpdGlvbigpIDogMDsKLSAgICByZXN1bHQgPSBjcmVhdGVUcmFja19sKG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsICAvLyBzbyB0aGF0IGZyYW1lIGNvdW50IG5ldmVyIGdvZXMgZG93bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIC8qZXBvY2gqLyk7CisgICAgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbChwb3NpdGlvbiAvKmVwb2NoKi8pOwogCiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICAvLyBjb250aW51ZSBwbGF5YmFjayBmcm9tIGxhc3Qga25vd24gcG9zaXRpb24sIGJ1dApAQCAtMTc1MCwxMCArMTc2NSw2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAvL1VzZSBvZiBkaXJlY3QgYW5kIG9mZmxvYWRlZCBvdXRwdXQgc3RyZWFtcyBpcyByZWYgY291bnRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KLSAgICAgICAgLy8gQXMgZ2V0T3V0cHV0IHdhcyBjYWxsZWQgYWJvdmUgYW5kIHJlc3VsdGVkIGluIGFuIG91dHB1dCBzdHJlYW0gdG8gYmUgb3BlbmVkLAotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbGVhc2UgaXQuCi0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dCk7CiAgICAgICAgIEFMT0dXKCJyZXN0b3JlVHJhY2tfbCgpIGZhaWxlZCBzdGF0dXMgJWQiLCByZXN1bHQpOwogICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwogICAgIH0KQEAgLTE3ODYsMTQgKzE3OTcsMjEgQEAKIAogU3RyaW5nOCBBdWRpb1RyYWNrOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCiB7Ci0gICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKG1PdXRwdXQsIGtleXMpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dCgpOworICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKG91dHB1dCwga2V5cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKK2Jvb2wgQXVkaW9UcmFjazo6aXNPZmZsb2FkZWQoKSBjb25zdAoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gaXNPZmZsb2FkZWRfbCgpOworfQorCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgY29uc3QKIHsKIAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpAQCAtMTgyMyw3ICsxODQxLDcgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi12b2lkIEF1ZGlvVHJhY2s6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3ZvaWQgQXVkaW9UcmFjazo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPEF1ZGlvVHJhY2s+IGF1ZGlvVHJhY2sgPSBtQXVkaW9UcmFjay5wcm9tb3RlKCk7CiAgICAgaWYgKGF1ZGlvVHJhY2sgIT0gMCkgewpAQCAtMTg2Nyw3ICsxODg1LDcgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIG5zZWNzX3QgbnMgPSBtUmVjZWl2ZXIucHJvY2Vzc0F1ZGlvQnVmZmVyKHRoaXMpOworICAgIG5zZWNzX3QgbnMgPSBtUmVjZWl2ZXIucHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAgICAgc3dpdGNoIChucykgewogICAgIGNhc2UgMDoKICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwCmluZGV4IGU4OTgxMDkuLjU4YzlmYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGF1ZGlvX3RyYWNrX2NibGtfdDo6YXVkaW9fdHJhY2tfY2Jsa190KCkKLSAgICA6IG1TZXJ2ZXIoMCksIGZyYW1lQ291bnRfKDApLCBtRnV0ZXgoMCksIG1NaW5pbXVtKDApLAorICAgIDogbVNlcnZlcigwKSwgbUZ1dGV4KDApLCBtTWluaW11bSgwKSwKICAgICBtVm9sdW1lTFIoMHgxMDAwMTAwMCksIG1TYW1wbGVSYXRlKDApLCBtU2VuZExldmVsKDApLCBtRmxhZ3MoMCkKIHsKICAgICBtZW1zZXQoJnUsIDAsIHNpemVvZih1KSk7CkBAIC0yMDAsNyArMjAwLDcgQEAKICAgICAgICAgICAgIHRzID0gJnJlbWFpbmluZzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJvYnRhaW5CdWZmZXIoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJvYnRhaW5CdWZmZXIoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CiAgICAgICAgICAgICB0cyA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDI5LDcgKzQyOSw3IEBACiAgICAgICAgICAgICB0cyA9ICZyZW1haW5pbmc7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgid2FpdFN0cmVhbUVuZERvbmUoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJ3YWl0U3RyZWFtRW5kRG9uZSgpIHRpbWVvdXQ9JWQiLCB0aW1lb3V0KTsKICAgICAgICAgICAgIHRzID0gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC00NzAsNyArNDcwLDcgQEAKIAogdm9pZCBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk6OmZsdXNoKCkKIHsKLSAgICBMT0dfRkFUQUwoInN0YXRpYyBmbHVzaCIpOworICAgIExPR19BTFdBWVNfRkFUQUwoInN0YXRpYyBmbHVzaCIpOwogfQogCiB2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6c2V0TG9vcChzaXplX3QgbG9vcFN0YXJ0LCBzaXplX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCkKQEAgLTc3MSw3ICs3NzEsNyBAQAogICAgIHJldHVybiAoc3NpemVfdCkgcG9zaXRpb247CiB9CiAKLXN0YXR1c190IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBib29sIGFja0ZsdXNoKQorc3RhdHVzX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBidWZmZXIsIGJvb2wgYWNrRmx1c2ggX191bnVzZWQpCiB7CiAgICAgaWYgKG1Jc1NodXRkb3duKSB7CiAgICAgICAgIGJ1ZmZlci0+bUZyYW1lQ291bnQgPSAwOwpAQCAtODU0LDcgKzg1NCw3IEBACiAgICAgYnVmZmVyLT5tTm9uQ29udGlnID0gMDsKIH0KIAotdm9pZCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OnRhbGx5VW5kZXJydW5GcmFtZXModWludDMyX3QgZnJhbWVDb3VudCkKK3ZvaWQgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQgX191bnVzZWQpCiB7CiAgICAgLy8gVW5saWtlIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dGFsbHlVbmRlcnJ1bkZyYW1lcygpIHVzZWQgZm9yIHN0cmVhbWluZyB0cmFja3MsCiAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhIGxvY2F0aW9uIHRvIGNvdW50IHVuZGVycnVuIGZyYW1lcy4gIFRoZSB1bmRlcnJ1biBmcmFtZSBjb3VudGVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTI3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcApAQCAtMCwwICsxLDQ0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2hhcmFjdGVyRW5jb2RpbmdEZWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgiCisjaW5jbHVkZSAiQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvclRhYmxlcy5oIgorCisjaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCisjaW5jbHVkZSAiU3RyaW5nQXJyYXkuaCIKKworI2luY2x1ZGUgInVuaWNvZGUvdWNudi5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNzZGV0LmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvcjo6Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvcigpIHsKKworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIG1VdGY4Q29udiA9IHVjbnZfb3BlbigiVVRGLTgiLCAmc3RhdHVzKTsKKyAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBjcmVhdGUgVUNvbnZlcnRlciBmb3IgVVRGLTgiKTsKKyAgICAgICAgbVV0ZjhDb252ID0gTlVMTDsKKyAgICB9Cit9CisKK0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6On5DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCkgeworICAgIHVjbnZfY2xvc2UobVV0ZjhDb252KTsKK30KKwordm9pZCBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjphZGRUYWcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICBtTmFtZXMucHVzaF9iYWNrKG5hbWUpOworICAgIG1WYWx1ZXMucHVzaF9iYWNrKHZhbHVlKTsKK30KKworc2l6ZV90IENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OnNpemUoKSB7CisgICAgcmV0dXJuIG1OYW1lcy5zaXplKCk7Cit9CisKK3N0YXR1c190IENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmdldFRhZyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyKip2YWx1ZSkgeworICAgIGlmIChpbmRleCA+PSBtTmFtZXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKm5hbWUgPSBtTmFtZXMuZ2V0RW50cnkoaW5kZXgpOworICAgICp2YWx1ZSA9IG1WYWx1ZXMuZ2V0RW50cnkoaW5kZXgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIGJvb2wgaXNQcmludGFibGVBc2NpaShjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IGxlbikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKCh2YWx1ZVtpXSAmIDB4ODApIHx8IHZhbHVlW2ldIDwgMHgyMCB8fCB2YWx1ZVtpXSA9PSAweDdmKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvcjo6ZGV0ZWN0QW5kQ29udmVydCgpIHsKKworICAgIGludCBzaXplID0gbU5hbWVzLnNpemUoKTsKKyAgICBBTE9HVigiJWQgdGFncyBiZWZvcmUgY29udmVyc2lvbiIsIHNpemUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIlczogJXMiLCBtTmFtZXMuZ2V0RW50cnkoaSksIG1WYWx1ZXMuZ2V0RW50cnkoaSkpOworICAgIH0KKworICAgIGlmIChzaXplICYmIG1VdGY4Q29udikgeworCisgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBVQ2hhcnNldERldGVjdG9yICpjc2QgPSB1Y3NkZXRfb3Blbigmc3RhdHVzKTsKKyAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCAqdWNtOworCisgICAgICAgIC8vIHRyeSBjb21iaW5lZCBkZXRlY3Rpb24gb2YgYXJ0aXN0L2FsYnVtL3RpdGxlIGV0Yy4KKyAgICAgICAgY2hhciBidWZbMTAyNF07CisgICAgICAgIGJ1ZlswXSA9IDA7CisgICAgICAgIGludCBpZHg7CisgICAgICAgIGJvb2wgYWxscHJpbnRhYmxlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtTmFtZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSA9IG1WYWx1ZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICBpZiAoIWlzUHJpbnRhYmxlQXNjaWkodmFsdWUsIHN0cmxlbih2YWx1ZSkpICYmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bWFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJjb21wb3NlciIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJnZW5yZSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJ0aXRsZSIpKSkgeworICAgICAgICAgICAgICAgIHN0cmxjYXQoYnVmLCB2YWx1ZSwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIHRhZ3MgYnkgc3BhY2Ugc28gSUNVJ3MgbmdyYW0gZGV0ZWN0b3IgY2FuIGRvIGl0cyBqb2IKKyAgICAgICAgICAgICAgICBzdHJsY2F0KGJ1ZiwgIiAiLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgYWxscHJpbnRhYmxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICpjb21iaW5lZGVuYyA9ICJVVEYtOCI7CisgICAgICAgIGlmIChhbGxwcmludGFibGUpIHsKKyAgICAgICAgICAgIC8vIHNpbmNlICdidWYnIGlzIGVtcHR5LCBJQ1Ugd291bGQgcmV0dXJuIGEgVVRGLTggbWF0Y2hlciB3aXRoIGxvdyBjb25maWRlbmNlLCBzbworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBldmVuIGNhbGwgaXQKKyAgICAgICAgICAgIEFMT0dWKCJhbGwgdGFncyBhcmUgcHJpbnRhYmxlLCBhc3N1bWluZyBhc2NpaSAoJWQpIiwgc3RybGVuKGJ1ZikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWNzZGV0X3NldFRleHQoY3NkLCBidWYsIHN0cmxlbihidWYpLCAmc3RhdHVzKTsKKyAgICAgICAgICAgIGludDMyX3QgbWF0Y2hlczsKKyAgICAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqKiB1Y21hID0gdWNzZGV0X2RldGVjdEFsbChjc2QsICZtYXRjaGVzLCAmc3RhdHVzKTsKKyAgICAgICAgICAgIGJvb2wgZ29vZG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqIGJlc3RDb21iaW5lZE1hdGNoID0gZ2V0UHJlZmVycmVkKGJ1Ziwgc3RybGVuKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgIHVjbWEsIG1hdGNoZXMsICZnb29kbWF0Y2gpOworCisgICAgICAgICAgICBpZiAoIWdvb2RtYXRjaCAmJiBzdHJsZW4oYnVmKSA8IDIwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm5vdCBhIGdvb2QgbWF0Y2gsIHRyeWluZyB3aXRoIG1vcmUgZGF0YSIpOworICAgICAgICAgICAgICAgIC8vIFRoaXMgc3RyaW5nIG1pZ2h0IGJlIHRvbyBzaG9ydCBmb3IgSUNVIHRvIGRvIGFueXRoaW5nIHVzZWZ1bCB3aXRoLgorICAgICAgICAgICAgICAgIC8vIChyZWFsIHdvcmxkIGV4YW1wbGU6ICJCasO2cmsiIGluIElTTy04ODU5LTEgbWlnaHQgYmUgZGV0ZWN0ZWQgYXMgR0IxODAzMCwgYmVjYXVzZQorICAgICAgICAgICAgICAgIC8vICB0aGUgSVNPIGRldGVjdG9yIHJlcG9ydHMgYSBjb25maWRlbmNlIG9mIDAsIHdoaWxlIHRoZSBHQjE4MDMwIGRldGVjdG9yIHJlcG9ydHMKKyAgICAgICAgICAgICAgICAvLyAgYSBjb25maWRlbmNlIG9mIDEwIHdpdGggbm8gaW52YWxpZCBjaGFyYWN0ZXJzKQorICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBhcnRpc3QsIGFsYnVtIGFuZCB0aXRsZSBpZiB0aGV5IHdlcmUgcHJldmlvdXNseSBvbWl0dGVkIGJlY2F1c2UgdGhleQorICAgICAgICAgICAgICAgIC8vIHdlcmUgcHJpbnRhYmxlIGFzY2lpLgorICAgICAgICAgICAgICAgIGJvb2wgYWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gbU5hbWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSA9IG1WYWx1ZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1ByaW50YWJsZUFzY2lpKHZhbHVlLCBzdHJsZW4odmFsdWUpKSAmJiAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFsYnVtIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAidGl0bGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxjYXQoYnVmLCB2YWx1ZSwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RybGNhdChidWYsICIgIiwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhZGRlZCkgeworICAgICAgICAgICAgICAgICAgICB1Y3NkZXRfc2V0VGV4dChjc2QsIGJ1Ziwgc3RybGVuKGJ1ZiksICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB1Y21hID0gdWNzZGV0X2RldGVjdEFsbChjc2QsICZtYXRjaGVzLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgYmVzdENvbWJpbmVkTWF0Y2ggPSBnZXRQcmVmZXJyZWQoYnVmLCBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y21hLCBtYXRjaGVzLCAmZ29vZG1hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnb29kbWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdGlsbCBub3QgYSBnb29kIG1hdGNoIGFmdGVyIGFkZGluZyBwcmludGFibGUgdGFncyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vIHByaW50YWJsZSB0YWdzIHRvIGFkZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJlc3RDb21iaW5lZE1hdGNoICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjb21iaW5lZGVuYyA9IHVjc2RldF9nZXROYW1lKGJlc3RDb21iaW5lZE1hdGNoLCAmc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gbU5hbWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgdWludDhfdCogc3JjID0gKHVpbnQ4X3QgKiltVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigoY2hhciAqKXNyYyk7CisgICAgICAgICAgICB1aW50OF90KiBkZXN0ID0gc3JjOworCisgICAgICAgICAgICBBTE9HVigiQEBAIGNoZWNraW5nICVzIiwgbmFtZSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzID0gbVZhbHVlcy5nZXRFbnRyeShpKTsKKyAgICAgICAgICAgIGludDMyX3QgaW5wdXRMZW5ndGggPSBzdHJsZW4ocyk7CisgICAgICAgICAgICBjb25zdCBjaGFyICplbmM7CisKKyAgICAgICAgICAgIGlmICghYWxscHJpbnRhYmxlICYmICghc3RyY21wKG5hbWUsICJhcnRpc3QiKSB8fAorICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bWFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImNvbXBvc2VyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiZ2VucmUiKSB8fAorICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bSIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgInRpdGxlIikpKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIGVuY29kaW5nIGRldGVybWluZWQgZnJvbSB0aGUgY29tYmluYXRpb24gb2YgYXJ0aXN0L2FsYnVtL3RpdGxlIGV0Yy4KKyAgICAgICAgICAgICAgICBlbmMgPSBjb21iaW5lZGVuYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUHJpbnRhYmxlQXNjaWkocywgaW5wdXRMZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVuYyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJAQEBAICVzIGlzIGFzY2lpIiwgbU5hbWVzLmdldEVudHJ5KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1Y3NkZXRfc2V0VGV4dChjc2QsIHMsIGlucHV0TGVuZ3RoLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgdWNtID0gdWNzZGV0X2RldGVjdChjc2QsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXVjbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlcy5zZXRFbnRyeShpLCAiPz8/Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbmMgPSB1Y3NkZXRfZ2V0TmFtZSh1Y20sICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQEBAQCByZWNvZ25pemVkIGNoYXJzZXQ6ICVzIGZvciAlcyBjb25maWRlbmNlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMsIG1OYW1lcy5nZXRFbnRyeShpKSwgdWNzZGV0X2dldENvbmZpZGVuY2UodWNtLCAmc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RyY21wKGVuYywiVVRGLTgiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gb25seSBjb252ZXJ0IGlmIHRoZSBzb3VyY2UgZW5jb2RpbmcgaXNuJ3QgYWxyZWFkeSBVVEYtOAorICAgICAgICAgICAgICAgIEFMT0dWKCJAQEAgdXNpbmcgY29udmVydGVyICVzIGZvciAlcyIsIGVuYywgbU5hbWVzLmdldEVudHJ5KGkpKTsKKyAgICAgICAgICAgICAgICBVQ29udmVydGVyICpjb252ID0gdWNudl9vcGVuKGVuYywgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yICVzIiwgZW5jKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gY29udmVydCBmcm9tIG5hdGl2ZSBlbmNvZGluZyB0byBVVEYtOAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNvdXJjZSA9IG1WYWx1ZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICAgICAgaW50IHRhcmdldExlbmd0aCA9IGxlbiAqIDMgKyAxOworICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlciA9IG5ldyBjaGFyW3RhcmdldExlbmd0aF07CisgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgbm9ybWFsbHkgY2hlY2sgZm9yIE5VTEwsIGJ1dCBpbiB0aGlzIGNhc2UgdGFyZ2V0TGVuZ3RoIG1heSBiZSBsYXJnZQorICAgICAgICAgICAgICAgIGlmICghYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjaGFyKiB0YXJnZXQgPSBidWZmZXI7CisKKyAgICAgICAgICAgICAgICB1Y252X2NvbnZlcnRFeChtVXRmOENvbnYsIGNvbnYsICZ0YXJnZXQsIHRhcmdldCArIHRhcmdldExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2UsIHNvdXJjZSArIHN0cmxlbihzb3VyY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgVFJVRSwgVFJVRSwgJnN0YXR1cyk7CisKKyAgICAgICAgICAgICAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoInVjbnZfY29udmVydEV4IGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBtVmFsdWVzLnNldEVudHJ5KGksICI/Pz8iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIHRlcm1pbmF0ZQorICAgICAgICAgICAgICAgICAgICAqdGFyZ2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbVZhbHVlcy5zZXRFbnRyeShpLCBidWZmZXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKworICAgICAgICAgICAgICAgIHVjbnZfY2xvc2UoY29udik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBpZiAoc3RybGVuKG1WYWx1ZXMuZ2V0RW50cnkoaSkpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZXJhc2luZyAlcyBiZWNhdXNlIGVudHJ5IGlzIGVtcHR5IiwgbU5hbWVzLmdldEVudHJ5KGkpKTsKKyAgICAgICAgICAgICAgICBtTmFtZXMuZXJhc2UoaSk7CisgICAgICAgICAgICAgICAgbVZhbHVlcy5lcmFzZShpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVjc2RldF9jbG9zZShjc2QpOworICAgIH0KK30KKworLyoKKyAqIFdoZW4gSUNVIGRldGVjdHMgbXVsdGlwbGUgZW5jb2RpbmcgbWF0Y2hlcywgYXBwbHkgYWRkaXRpb25hbCBoZXVyaXN0aWNzIHRvIGRldGVybWluZQorICogd2hpY2ggb25lIGlzIHRoZSBiZXN0IG1hdGNoLCBzaW5jZSBJQ1UgY2FuJ3QgYWx3YXlzIGJlIHRydXN0ZWQgdG8gbWFrZSB0aGUgcmlnaHQgY2hvaWNlLgorICoKKyAqIFdoYXQgdGhpcyBtZXRob2QgZG9lcyBpczoKKyAqIC0gZGVjb2RlIHRoZSBpbnB1dCB1c2luZyBlYWNoIG9mIHRoZSBtYXRjaGVzIGZvdW5kCisgKiAtIHJlY2FsY3VsYXRlIHRoZSBzdGFydGluZyBjb25maWRlbmNlIGxldmVsIGZvciBtdWx0aWJ5dGUgZW5jb2RpbmdzIHVzaW5nIGEgZGlmZmVyZW50CisgKiAgIGFsZ29yaXRobSBhbmQgbGFyZ2VyIGZyZXF1ZW50IGNoYXJhY3RlciBsaXN0cyB0aGFuIElDVQorICogLSBkZXZhbHVlIGVuY29kaW5nIHdoZXJlIHRoZSBjb252ZXJzaW9uIGNvbnRhaW5zIHVubGlrZWx5IGNoYXJhY3RlcnMgKHN5bWJvbHMsIHJlc2VydmVkLCBldGMpCisgKiAtIHBpY2sgdGhlIGhpZ2hlc3QgbWF0Y2gKKyAqIC0gc2lnbmFsIHRvIHRoZSBjYWxsZXIgd2hldGhlciB0aGlzIG1hdGNoIGlzIGNvbnNpZGVyZWQgZ29vZDogY29uZmlkZW5jZSA+IDE1LCBhbmQgY29uZmlkZW5jZQorICogICBkZWx0YSB3aXRoIHRoZSBuZXh0IHJ1bm5lciB1cCA+IDE1CisgKi8KK2NvbnN0IFVDaGFyc2V0TWF0Y2ggKkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmdldFByZWZlcnJlZCgKKyAgICAgICAgY29uc3QgY2hhciAqaW5wdXQsIHNpemVfdCBsZW4sCisgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqKiB1Y21hLCBzaXplX3QgbnVtbWF0Y2hlcywKKyAgICAgICAgYm9vbCAqZ29vZG1hdGNoKSB7CisKKyAgICAqZ29vZG1hdGNoID0gZmFsc2U7CisgICAgVmVjdG9yPGNvbnN0IFVDaGFyc2V0TWF0Y2gqPiBtYXRjaGVzOworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworCisgICAgQUxPR1YoIiVkIG1hdGNoZXMiLCBudW1tYXRjaGVzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bW1hdGNoZXM7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyICplbmNuYW1lID0gdWNzZGV0X2dldE5hbWUodWNtYVtpXSwgJnN0YXR1cyk7CisgICAgICAgIGludCBjb25maWRlbmNlID0gdWNzZGV0X2dldENvbmZpZGVuY2UodWNtYVtpXSwgJnN0YXR1cyk7CisgICAgICAgIEFMT0dWKCIlZDogJXMgJWQiLCBpLCBlbmNuYW1lLCBjb25maWRlbmNlKTsKKyAgICAgICAgbWF0Y2hlcy5wdXNoX2JhY2sodWNtYVtpXSk7CisgICAgfQorCisgICAgc2l6ZV90IG51bSA9IG1hdGNoZXMuc2l6ZSgpOworICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG51bSA9PSAxKSB7CisgICAgICAgIGludCBjb25maWRlbmNlID0gdWNzZGV0X2dldENvbmZpZGVuY2UobWF0Y2hlc1swXSwgJnN0YXR1cyk7CisgICAgICAgIGlmIChjb25maWRlbmNlID4gMTUpIHsKKyAgICAgICAgICAgICpnb29kbWF0Y2ggPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXRjaGVzWzBdOworICAgIH0KKworICAgIEFMT0dWKCJjb25zaWRlcmluZyAlZCBtYXRjaGVzIiwgbnVtKTsKKworICAgIC8vIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgInNwZWNpYWwiIGNoYXJhY3RlcnMgcmVzdWx0IHdoZW4gY29udmVydGluZyB0aGUgaW5wdXQgdXNpbmcgZWFjaAorICAgIC8vIGVuY29kaW5nCisgICAgVmVjdG9yPGludD4gbmV3Y29uZmlkZW5jZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpmcmVxZGF0YSA9IE5VTEw7CisgICAgICAgIGZsb2F0IGZyZXFjb3ZlcmFnZSA9IDA7CisgICAgICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgY29uc3QgY2hhciAqZW5jbmFtZSA9IHVjc2RldF9nZXROYW1lKG1hdGNoZXNbaV0sICZzdGF0dXMpOworICAgICAgICBpbnQgY29uZmlkZW5jZSA9IHVjc2RldF9nZXRDb25maWRlbmNlKG1hdGNoZXNbaV0sICZzdGF0dXMpOworICAgICAgICBpZiAoIXN0cmNtcCgiR0IxODAzMCIsIGVuY25hbWUpKSB7CisgICAgICAgICAgICBmcmVxZGF0YSA9IGZyZXF1ZW50X3poQ047CisgICAgICAgICAgICBmcmVxY292ZXJhZ2UgPSBmcmVxdWVudF96aENOX2NvdmVyYWdlOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkJpZzUiLCBlbmNuYW1lKSkgeworICAgICAgICAgICAgZnJlcWRhdGEgPSBmcmVxdWVudF96aFRXOworICAgICAgICAgICAgZnJlcWNvdmVyYWdlID0gZnJlcXVlbnRfemhUV19jb3ZlcmFnZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJFVUMtS1IiLCBlbmNuYW1lKSkgeworICAgICAgICAgICAgZnJlcWRhdGEgPSBmcmVxdWVudF9rbzsKKyAgICAgICAgICAgIGZyZXFjb3ZlcmFnZSA9IGZyZXF1ZW50X2tvX2NvdmVyYWdlOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkVVQy1KUCIsIGVuY25hbWUpKSB7CisgICAgICAgICAgICBmcmVxZGF0YSA9IGZyZXF1ZW50X2phOworICAgICAgICAgICAgZnJlcWNvdmVyYWdlID0gZnJlcXVlbnRfamFfY292ZXJhZ2U7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiU2hpZnRfSklTIiwgZW5jbmFtZSkpIHsKKyAgICAgICAgICAgIGZyZXFkYXRhID0gZnJlcXVlbnRfamE7CisgICAgICAgICAgICBmcmVxY292ZXJhZ2UgPSBmcmVxdWVudF9qYV9jb3ZlcmFnZTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIlZDogJXMgJWQiLCBpLCBlbmNuYW1lLCBjb25maWRlbmNlKTsKKyAgICAgICAgVUNvbnZlcnRlciAqY29udiA9IHVjbnZfb3BlbihlbmNuYW1lLCAmc3RhdHVzKTsKKyAgICAgICAgY29uc3QgY2hhciAqc291cmNlID0gaW5wdXQ7CisgICAgICAgIGNvbnN0IGNoYXIgKnNvdXJjZUxpbWl0ID0gaW5wdXQgKyBsZW47CisgICAgICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgaW50IGRlbWVyaXQgPSAwOworICAgICAgICBpbnQgZnJlcXVlbnRjaGFycyA9IDA7CisgICAgICAgIGludCB0b3RhbGNoYXJzID0gMDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIC8vIGRlbWVyaXQgdGhlIGN1cnJlbnQgZW5jb2RpbmcgZm9yIGVhY2ggInNwZWNpYWwiIGNoYXJhY3RlciBmb3VuZCBhZnRlciBjb252ZXJzaW9uLgorICAgICAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBkZW1lcml0IGlzIHNvbWV3aGF0IGFyYml0cmFyaWx5IGNob3Nlbi4KKyAgICAgICAgICAgIGludCBpbmNoYXI7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IHNvdXJjZUxpbWl0KSB7CisgICAgICAgICAgICAgICAgaW5jaGFyID0gKHNvdXJjZVswXSA8PCA4KSArIHNvdXJjZVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVDaGFyMzIgYyA9IHVjbnZfZ2V0TmV4dFVDaGFyKGNvbnYsICZzb3VyY2UsIHNvdXJjZUxpbWl0LCAmc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICghVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjIDwgMHgyMCB8fCAoYyA+PSAweDdmICYmIGMgPD0gMHgwMDlmKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjb250cm9sIGNoYXJhY3RlciAleCIsIGMpOworICAgICAgICAgICAgICAgIGRlbWVyaXQgKz0gMTAwOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYyA+PSAweGEwICYmIGMgPD0gMHhiZSkgICAgICAgICAvLyBzeW1ib2xzLCBzdXBlcnNjcmlwdHMKKyAgICAgICAgICAgICAgICAgICAgfHwgKGMgPT0gMHhkNykgfHwgKGMgPT0gMHhmNykgICAgICAgLy8gbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIHNpZ25zCisgICAgICAgICAgICAgICAgICAgIHx8IChjID49IDB4MjAwMCAmJiBjIDw9IDB4MjA5ZikpIHsgIC8vIHB1bmN0dWF0aW9uLCBzdXBlcnNjcmlwdHMKKyAgICAgICAgICAgICAgICBBTE9HVigidW5saWtlbHkgY2hhcmFjdGVyICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAxMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweGUwMDAgJiYgYyA8PSAweGY4ZmYpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicHJpdmF0ZSB1c2UgY2hhcmFjdGVyICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAzMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweDIxOTAgJiYgYyA8PSAweDJiZmYpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJhbmdlIGNvbXByaXNlcyB2YXJpb3VzIHN5bWJvbCByYW5nZXMgdGhhdCBhcmUgdW5saWtlbHkgdG8gYXBwZWFyIGluCisgICAgICAgICAgICAgICAgLy8gbXVzaWMgZmlsZSBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICBBTE9HVigic3ltYm9sICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAxMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAweGZmZmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVwbGFjZW1lbnQgY2hhcmFjdGVyIik7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSA1MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweGZmZjAgJiYgYyA8PSAweGZmZmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigidW5pY29kZSBzcGVjaWFsICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSA1MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJlcWRhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHRvdGFsY2hhcnMrKzsKKyAgICAgICAgICAgICAgICBpZiAoaXNGcmVxdWVudChmcmVxZGF0YSwgYykpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlcXVlbnRjaGFycysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZnJlcWRhdGEgIT0gTlVMTCAmJiB0b3RhbGNoYXJzICE9IDApIHsKKyAgICAgICAgICAgIGludCBteWNvbmZpZGVuY2UgPSAxMCArIGZsb2F0KCgxMDAgKiBmcmVxdWVudGNoYXJzKSAvIHRvdGFsY2hhcnMpIC8gZnJlcWNvdmVyYWdlOworICAgICAgICAgICAgQUxPR1YoIklDVSBjb25maWRlbmNlOiAlZCwgbXkgY29uZmlkZW5jZTogJWQgKCVkICVkKSIsIGNvbmZpZGVuY2UsIG15Y29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgdG90YWxjaGFycywgZnJlcXVlbnRjaGFycyk7CisgICAgICAgICAgICBpZiAobXljb25maWRlbmNlID4gMTAwKSBteWNvbmZpZGVuY2UgPSAxMDA7CisgICAgICAgICAgICBpZiAobXljb25maWRlbmNlIDwgMCkgbXljb25maWRlbmNlID0gMDsKKyAgICAgICAgICAgIGNvbmZpZGVuY2UgPSBteWNvbmZpZGVuY2U7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVkLSVkPSVkIiwgY29uZmlkZW5jZSwgZGVtZXJpdCwgY29uZmlkZW5jZSAtIGRlbWVyaXQpOworICAgICAgICBuZXdjb25maWRlbmNlLnB1c2hfYmFjayhjb25maWRlbmNlIC0gZGVtZXJpdCk7CisgICAgICAgIHVjbnZfY2xvc2UoY29udik7CisgICAgICAgIGlmIChpID09IDAgJiYgKGNvbmZpZGVuY2UgLSBkZW1lcml0KSA9PSAxMDApIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgYW55IGZ1cnRoZXIsIHdlJ2xsIGVuZCB1cCB1c2luZyB0aGlzIG1hdGNoIGFueXdheQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBmaW5kIG1hdGNoIHdpdGggaGlnaGVzdCBjb25maWRlbmNlIGFmdGVyIGFkanVzdGluZyBmb3IgdW5saWtlbHkgY2hhcmFjdGVycworICAgIGludCBoaWdoZXN0ID0gbmV3Y29uZmlkZW5jZVswXTsKKyAgICBzaXplX3QgaGlnaGVzdGlkeCA9IDA7CisgICAgaW50IHJ1bm5lcnVwID0gLTEwMDAwOworICAgIGludCBydW5uZXJ1cGlkeCA9IC0xMDAwMDsKKyAgICBudW0gPSBuZXdjb25maWRlbmNlLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgIGlmIChuZXdjb25maWRlbmNlW2ldID4gaGlnaGVzdCkgeworICAgICAgICAgICAgcnVubmVydXAgPSBoaWdoZXN0OworICAgICAgICAgICAgcnVubmVydXBpZHggPSBoaWdoZXN0aWR4OworICAgICAgICAgICAgaGlnaGVzdCA9IG5ld2NvbmZpZGVuY2VbaV07CisgICAgICAgICAgICBoaWdoZXN0aWR4ID0gaTsKKyAgICAgICAgfSBlbHNlIGlmIChuZXdjb25maWRlbmNlW2ldID4gcnVubmVydXApeworICAgICAgICAgICAgcnVubmVydXAgPSBuZXdjb25maWRlbmNlW2ldOworICAgICAgICAgICAgcnVubmVydXBpZHggPSBpOworICAgICAgICB9CisgICAgfQorICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBBTE9HVigic2VsZWN0aW5nOiAnJXMnIHcvICVkIGNvbmZpZGVuY2UiLAorICAgICAgICAgICAgdWNzZGV0X2dldE5hbWUobWF0Y2hlc1toaWdoZXN0aWR4XSwgJnN0YXR1cyksIGhpZ2hlc3QpOworICAgIGlmIChydW5uZXJ1cGlkeCA8IDApIHsKKyAgICAgICAgQUxPR1YoIm5vIHJ1bm5lciB1cCIpOworICAgICAgICBpZiAoaGlnaGVzdCA+IDE1KSB7CisgICAgICAgICAgICAqZ29vZG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJydW5uZXIgdXA6ICclcycgdy8gJWQgY29uZmlkZW5jZSIsCisgICAgICAgICAgICAgICAgdWNzZGV0X2dldE5hbWUobWF0Y2hlc1tydW5uZXJ1cGlkeF0sICZzdGF0dXMpLCBydW5uZXJ1cCk7CisgICAgICAgIGlmICgoaGlnaGVzdCAtIHJ1bm5lcnVwKSA+IDE1KSB7CisgICAgICAgICAgICAqZ29vZG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWF0Y2hlc1toaWdoZXN0aWR4XTsKK30KKworCitib29sIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmlzRnJlcXVlbnQoY29uc3QgdWludDE2X3QgKnZhbHVlcywgdWludDMyX3QgYykgeworCisgICAgaW50IHN0YXJ0ID0gMDsKKyAgICBpbnQgZW5kID0gNTExOyAvLyBBbGwgdGhlIHRhYmxlcyBoYXZlIDUxMiBlbnRyaWVzCisgICAgaW50IG1pZCA9IChzdGFydCtlbmQpLzI7CisKKyAgICB3aGlsZShzdGFydCA8PSBlbmQpIHsKKyAgICAgICAgaWYoYyA9PSB2YWx1ZXNbbWlkXSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+IHZhbHVlc1ttaWRdKSB7CisgICAgICAgICAgICBzdGFydCA9IG1pZCArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbmQgPSBtaWQgLSAxOworICAgICAgICB9CisKKyAgICAgICAgbWlkID0gKHN0YXJ0ICsgZW5kKSAvIDI7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmggYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1ZWQ4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQ0hBUkFDVEVSX0VOQ09ESU5HX0RFVEVDVE9SX0gKKyNkZWZpbmUgX0NIQVJBQ1RFUl9FTkNPRElOR19ERVRFQ1RPUl9ICisKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KKworI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjc2RldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IgeworCisgICAgcHVibGljOgorICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKyAgICAgICAgfkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKworICAgICAgICB2b2lkIGFkZFRhZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgICAgIHNpemVfdCBzaXplKCk7CisKKyAgICAgICAgdm9pZCBkZXRlY3RBbmRDb252ZXJ0KCk7CisgICAgICAgIHN0YXR1c190IGdldFRhZyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyKip2YWx1ZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoICpnZXRQcmVmZXJyZWQoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5wdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCoqIHVjbWEsIHNpemVfdCBtYXRjaGVzLAorICAgICAgICAgICAgICAgIGJvb2wgKmdvb2RtYXRjaCk7CisKKyAgICAgICAgYm9vbCBpc0ZyZXF1ZW50KGNvbnN0IHVpbnQxNl90ICp2YWx1ZXMsIHVpbnQzMl90IGMpOworCisgICAgICAgIC8vIGNhY2hlZCBuYW1lIGFuZCB2YWx1ZSBzdHJpbmdzLCBmb3IgbmF0aXZlIGVuY29kaW5nIHN1cHBvcnQuCisgICAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlc2Ugd2l0aCBieXRlIGJsb2IgYXJyYXlzIHRoYXQgZG9uJ3QgcmVxdWlyZSB0aGUgZGF0YSB0byBiZQorICAgICAgICAvLyBzaW5nbGVudWxsYnl0ZS10ZXJtaW5hdGVkCisgICAgICAgIFN0cmluZ0FycmF5ICAgICBtTmFtZXM7CisgICAgICAgIFN0cmluZ0FycmF5ICAgICBtVmFsdWVzOworCisgICAgICAgIFVDb252ZXJ0ZXIqICAgICBtVXRmOENvbnY7Cit9OworCisKKworfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvclRhYmxlcy5oIGIvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvclRhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTExMzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yVGFibGVzLmgKQEAgLTAsMCArMSwyMDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhlIDUxMiBtb3N0IGZyZXF1ZW50bHkgb2NjdXJpbmcgY2hhcmFjdGVycyBmb3IgdGhlIHpoQ04gbGFuZ3VhZ2UgaW4gYSBzYW1wbGUgb2YgdGhlIEludGVybmV0LgorLy8gT3JkZXJlZCBieSBjb2RlcG9pbnQsIGNvbW1lbnQgc2hvd3MgY2hhcmFjdGVyIGFuZCByYW5raW5nIGJ5IGZyZXF1ZW5jeQorY29uc3QgdWludDE2X3QgZnJlcXVlbnRfemhDTltdID0geworICAgIDB4NEUwMCwgLy8g5LiALCAjMgorICAgIDB4NEUwNywgLy8g5LiHLCAjMzA2CisgICAgMHg0RTA5LCAvLyDkuIksICMxMzgKKyAgICAweDRFMEEsIC8vIOS4iiwgIzE2CisgICAgMHg0RTBCLCAvLyDkuIssICMyNQorICAgIDB4NEUwRCwgLy8g5LiNLCAjNworICAgIDB4NEUwRSwgLy8g5LiOLCAjMTMzCisgICAgMHg0RTEzLCAvLyDkuJMsICMxNTEKKyAgICAweDRFMTYsIC8vIOS4liwgIzM0NgorICAgIDB4NEUxQSwgLy8g5LiaLCAjMzkKKyAgICAweDRFMUMsIC8vIOS4nCwgIzE5NworICAgIDB4NEUyNCwgLy8g5LikLCAjMzc2CisgICAgMHg0RTJBLCAvLyDkuKosICMyMworICAgIDB4NEUyRCwgLy8g5LitLCAjNAorICAgIDB4NEUzQSwgLy8g5Li6LCAjMzEKKyAgICAweDRFM0IsIC8vIOS4uywgIzk1CisgICAgMHg0RTNFLCAvLyDkuL4sICM0MTgKKyAgICAweDRFNDgsIC8vIOS5iCwgIzkzCisgICAgMHg0RTRCLCAvLyDkuYssICMxMzEKKyAgICAweDRFNTAsIC8vIOS5kCwgIzEzMAorICAgIDB4NEU1RiwgLy8g5LmfLCAjMTQ1CisgICAgMHg0RTY2LCAvLyDkuaYsICMyODMKKyAgICAweDRFNzAsIC8vIOS5sCwgIzQ4MworICAgIDB4NEU4NiwgLy8g5LqGLCAjMTMKKyAgICAweDRFOEIsIC8vIOS6iywgIzE2OAorICAgIDB4NEU4QywgLy8g5LqMLCAjMjE4CisgICAgMHg0RThFLCAvLyDkuo4sICM2NAorICAgIDB4NEU5NCwgLy8g5LqULCAjNDMwCisgICAgMHg0RTlBLCAvLyDkuposICM0NjgKKyAgICAweDRFOUIsIC8vIOS6mywgIzM2NgorICAgIDB4NEVBNCwgLy8g5LqkLCAjMjQzCisgICAgMHg0RUE3LCAvLyDkuqcsICM4NgorICAgIDB4NEVBQiwgLy8g5LqrLCAjMzQ1CisgICAgMHg0RUFDLCAvLyDkuqwsICMyMDYKKyAgICAweDRFQkEsIC8vIOS6uiwgIzMKKyAgICAweDRFQzAsIC8vIOS7gCwgIzI4NworICAgIDB4NEVDQiwgLy8g5LuLLCAjNDc4CisgICAgMHg0RUNFLCAvLyDku44sICMzODEKKyAgICAweDRFRDYsIC8vIOS7liwgIzEyOQorICAgIDB4NEVFMywgLy8g5LujLCAjMjQxCisgICAgMHg0RUU1LCAvLyDku6UsICM1MQorICAgIDB4NEVFQywgLy8g5LusLCAjODMKKyAgICAweDRFRjYsIC8vIOS7tiwgIzE0MQorICAgIDB4NEVGNywgLy8g5Lu3LCAjMTQwCisgICAgMHg0RUZCLCAvLyDku7ssICMzODMKKyAgICAweDRGMDEsIC8vIOS8gSwgIzQzOQorICAgIDB4NEYxOCwgLy8g5LyYLCAjMzc0CisgICAgMHg0RjFBLCAvLyDkvJosICMyOQorICAgIDB4NEYyMCwgLy8g5LygLCAjMjIyCisgICAgMHg0RjQ2LCAvLyDkvYYsICM0NTEKKyAgICAweDRGNEQsIC8vIOS9jSwgIzIwOAorICAgIDB4NEY1MywgLy8g5L2TLCAjOTgKKyAgICAweDRGNTUsIC8vIOS9lSwgIzMzOQorICAgIDB4NEY1QywgLy8g5L2cLCAjNDQKKyAgICAweDRGNjAsIC8vIOS9oCwgIzc2CisgICAgMHg0RjdGLCAvLyDkvb8sICMyNzIKKyAgICAweDRGOUIsIC8vIOS+mywgIzM3NQorICAgIDB4NEZERCwgLy8g5L+dLCAjMTgwCisgICAgMHg0RkUxLCAvLyDkv6EsICM4NAorICAgIDB4NEZFRSwgLy8g5L+uLCAjNDM3CisgICAgMHg1MDNDLCAvLyDlgLwsICM0NTAKKyAgICAweDUwNUEsIC8vIOWBmiwgIzM2OAorICAgIDB4NTA2NSwgLy8g5YGlLCAjNDg0CisgICAgMHg1MENGLCAvLyDlg48sICM0ODcKKyAgICAweDUxM0YsIC8vIOWEvywgIzMyNgorICAgIDB4NTE0MywgLy8g5YWDLCAjMjAyCisgICAgMHg1MTQ4LCAvLyDlhYgsICM0ODUKKyAgICAweDUxNDksIC8vIOWFiSwgIzI1NAorICAgIDB4NTE0QiwgLy8g5YWLLCAjNTAzCisgICAgMHg1MTRELCAvLyDlhY0sICMzNDkKKyAgICAweDUxNjUsIC8vIOWFpSwgIzE1NgorICAgIDB4NTE2OCwgLy8g5YWoLCAjNDcKKyAgICAweDUxNkMsIC8vIOWFrCwgIzM1CisgICAgMHg1MTcxLCAvLyDlhbEsICM0NDgKKyAgICAweDUxNzMsIC8vIOWFsywgIzQ5CisgICAgMHg1MTc2LCAvLyDlhbYsICMxOTUKKyAgICAweDUxNzcsIC8vIOWFtywgIzMyOQorICAgIDB4NTE4NSwgLy8g5YaFLCAjMTA5CisgICAgMHg1MThDLCAvLyDlhowsICMyMjUKKyAgICAweDUxOUIsIC8vIOWGmywgIzQ2NgorICAgIDB4NTFGQSwgLy8g5Ye6LCAjNTMKKyAgICAweDUxRkIsIC8vIOWHuywgIzM1OQorICAgIDB4NTIwNiwgLy8g5YiGLCAjMjIKKyAgICAweDUyMTcsIC8vIOWIlywgIzQxMAorICAgIDB4NTIxQiwgLy8g5YibLCAjMzk5CisgICAgMHg1MjI5LCAvLyDliKksICMyOTYKKyAgICAweDUyMkIsIC8vIOWIqywgIzM3MgorICAgIDB4NTIzMCwgLy8g5YiwLCAjMzMKKyAgICAweDUyMzYsIC8vIOWItiwgIzE5MgorICAgIDB4NTI0RCwgLy8g5YmNLCAjMTE3CisgICAgMHg1MjlCLCAvLyDlipssICMxNzMKKyAgICAweDUyOUUsIC8vIOWKniwgIzQzNgorICAgIDB4NTI5RiwgLy8g5YqfLCAjNDU1CisgICAgMHg1MkEwLCAvLyDliqAsICM5NworICAgIDB4NTJBMSwgLy8g5YqhLCAjMTAwCisgICAgMHg1MkE4LCAvLyDliqgsICM0NgorICAgIDB4NTJBOSwgLy8g5YqpLCAjMzY1CisgICAgMHg1MzA1LCAvLyDljIUsICMzMzEKKyAgICAweDUzMTYsIC8vIOWMliwgIzE1NQorICAgIDB4NTMxNywgLy8g5YyXLCAjMTk0CisgICAgMHg1MzNBLCAvLyDljLosICMxMDUKKyAgICAweDUzM0IsIC8vIOWMuywgIzIzNAorICAgIDB4NTM0MSwgLy8g5Y2BLCAjMjk0CisgICAgMHg1MzRFLCAvLyDljY4sICMyMDUKKyAgICAweDUzNTUsIC8vIOWNlSwgIzI1OQorICAgIDB4NTM1NywgLy8g5Y2XLCAjMTgyCisgICAgMHg1MzVBLCAvLyDljZosICMxNTMKKyAgICAweDUzNjEsIC8vIOWNoSwgIzMzMgorICAgIDB4NTM5RiwgLy8g5Y6fLCAjMjcxCisgICAgMHg1M0JCLCAvLyDljrssICMyODIKKyAgICAweDUzQzIsIC8vIOWPgiwgIzUwMAorICAgIDB4NTNDQSwgLy8g5Y+KLCAjMjU1CisgICAgMHg1M0NCLCAvLyDlj4ssICMxODYKKyAgICAweDUzQ0QsIC8vIOWPjSwgIzQyMgorICAgIDB4NTNEMSwgLy8g5Y+RLCAjMTUKKyAgICAweDUzRDcsIC8vIOWPlywgIzUwNworICAgIDB4NTNEOCwgLy8g5Y+YLCAjMzk1CisgICAgMHg1M0UzLCAvLyDlj6MsICMyOTMKKyAgICAweDUzRUEsIC8vIOWPqiwgIzM0MAorICAgIDB4NTNFRiwgLy8g5Y+vLCAjNDUKKyAgICAweDUzRjAsIC8vIOWPsCwgIzI2NworICAgIDB4NTNGNywgLy8g5Y+3LCAjMTIxCisgICAgMHg1M0Y4LCAvLyDlj7gsICMxNTAKKyAgICAweDU0MDQsIC8vIOWQhCwgIzQ5MQorICAgIDB4NTQwOCwgLy8g5ZCILCAjMTE1CisgICAgMHg1NDBDLCAvLyDlkIwsICMxODkKKyAgICAweDU0MEQsIC8vIOWQjSwgIzEyNworICAgIDB4NTQwRSwgLy8g5ZCOLCAjNzUKKyAgICAweDU0MTEsIC8vIOWQkSwgIzQ1OQorICAgIDB4NTQyNywgLy8g5ZCnLCAjMzUzCisgICAgMHg1NDRBLCAvLyDlkYosICMzMTgKKyAgICAweDU0NTgsIC8vIOWRmCwgIzIzMgorICAgIDB4NTQ2OCwgLy8g5ZGoLCAjMzQ3CisgICAgMHg1NDhDLCAvLyDlkowsICM0MworICAgIDB4NTRDMSwgLy8g5ZOBLCAjMzYKKyAgICAweDU1NDYsIC8vIOWVhiwgIzE0OAorICAgIDB4NTY2OCwgLy8g5ZmoLCAjMjI4CisgICAgMHg1NkRCLCAvLyDlm5ssICMzNTIKKyAgICAweDU2REUsIC8vIOWbniwgIzM4CisgICAgMHg1NkUwLCAvLyDlm6AsICMzNTUKKyAgICAweDU2RTIsIC8vIOWboiwgIzQxMgorICAgIDB4NTZFRCwgLy8g5ZutLCAjNDcwCisgICAgMHg1NkZELCAvLyDlm70sICMxMgorICAgIDB4NTZGRSwgLy8g5Zu+LCAjMzIKKyAgICAweDU3MjgsIC8vIOWcqCwgIzEwCisgICAgMHg1NzMwLCAvLyDlnLAsICMzMAorICAgIDB4NTczQSwgLy8g5Zy6LCAjMTc3CisgICAgMHg1NzVCLCAvLyDlnZssICMzNjQKKyAgICAweDU3OEIsIC8vIOWeiywgIzI3NAorICAgIDB4NTdDRSwgLy8g5Z+OLCAjMTcyCisgICAgMHg1N0ZBLCAvLyDln7osICMzMTUKKyAgICAweDU4RUIsIC8vIOWjqywgIzQzNAorICAgIDB4NThGMCwgLy8g5aOwLCAjMzk3CisgICAgMHg1OTA0LCAvLyDlpIQsICM0MTYKKyAgICAweDU5MDcsIC8vIOWkhywgIzI3MAorICAgIDB4NTkwRCwgLy8g5aSNLCAjMTIyCisgICAgMHg1OTE2LCAvLyDlpJYsICMxOTAKKyAgICAweDU5MUEsIC8vIOWkmiwgIzQwCisgICAgMHg1OTI3LCAvLyDlpKcsICM4CisgICAgMHg1OTI5LCAvLyDlpKksICM1MgorICAgIDB4NTkyQSwgLy8g5aSqLCAjNDU2CisgICAgMHg1OTM0LCAvLyDlpLQsICMyNTgKKyAgICAweDU5NzMsIC8vIOWlsywgIzY1CisgICAgMHg1OTdELCAvLyDlpb0sICM2MgorICAgIDB4NTk4MiwgLy8g5aaCLCAjMTM1CisgICAgMHg1QTMxLCAvLyDlqLEsICM0NTIKKyAgICAweDVCNTAsIC8vIOWtkCwgIzM3CisgICAgMHg1QjU3LCAvLyDlrZcsICMyODUKKyAgICAweDVCNjYsIC8vIOWtpiwgIzE5CisgICAgMHg1Qjg5LCAvLyDlroksICMxNDQKKyAgICAweDVCOEMsIC8vIOWujCwgIzQ2OQorICAgIDB4NUI5QSwgLy8g5a6aLCAjMTc5CisgICAgMHg1QjlELCAvLyDlrp0sICMxODgKKyAgICAweDVCOUUsIC8vIOWuniwgIzE1NAorICAgIDB4NUJBMiwgLy8g5a6iLCAjMTc0CisgICAgMHg1QkI2LCAvLyDlrrYsICMyNgorICAgIDB4NUJCOSwgLy8g5a65LCAjMzA3CisgICAgMHg1QkM2LCAvLyDlr4YsICM0NzEKKyAgICAweDVCRjksIC8vIOWvuSwgIzkwCisgICAgMHg1QkZDLCAvLyDlr7wsICMzNDgKKyAgICAweDVDMDYsIC8vIOWwhiwgIzI2NQorICAgIDB4NUMwRiwgLy8g5bCPLCAjMjgKKyAgICAweDVDMTEsIC8vIOWwkSwgIzM3OQorICAgIDB4NUMxNCwgLy8g5bCULCAjNDkwCisgICAgMHg1QzMxLCAvLyDlsLEsICMxMDEKKyAgICAweDVDNTUsIC8vIOWxlSwgIzI5MQorICAgIDB4NUM3MSwgLy8g5bGxLCAjMjM5CisgICAgMHg1RERFLCAvLyDlt54sICMyMjcKKyAgICAweDVERTUsIC8vIOW3pSwgIzczCisgICAgMHg1REYxLCAvLyDlt7EsICM0ODAKKyAgICAweDVERjIsIC8vIOW3siwgIzMxMAorICAgIDB4NUUwMiwgLy8g5biCLCAjNzgKKyAgICAweDVFMDMsIC8vIOW4gywgIzM1MAorICAgIDB4NUUwOCwgLy8g5biILCAjMjc3CisgICAgMHg1RTE2LCAvLyDluJYsICMzOTYKKyAgICAweDVFMjYsIC8vIOW4piwgIzQ0OQorICAgIDB4NUUyRSwgLy8g5biuLCAjNDYxCisgICAgMHg1RTM4LCAvLyDluLgsICMzMTkKKyAgICAweDVFNzMsIC8vIOW5sywgIzIxNworICAgIDB4NUU3NCwgLy8g5bm0LCAjMjAKKyAgICAweDVFNzYsIC8vIOW5tiwgIzQ0MAorICAgIDB4NUU3RiwgLy8g5bm/LCAjMTY2CisgICAgMHg1RTkzLCAvLyDlupMsICM0NDYKKyAgICAweDVFOTQsIC8vIOW6lCwgIzE4NworICAgIDB4NUU5NywgLy8g5bqXLCAjMzIwCisgICAgMHg1RUE2LCAvLyDluqYsICMxMTQKKyAgICAweDVFQjcsIC8vIOW6tywgIzQ5OQorICAgIDB4NUVGQSwgLy8g5bu6LCAjMjExCisgICAgMHg1RjAwLCAvLyDlvIAsICM3MgorICAgIDB4NUYwRiwgLy8g5byPLCAjMjA3CisgICAgMHg1RjE1LCAvLyDlvJUsICM0OTUKKyAgICAweDVGMjAsIC8vIOW8oCwgIzM4NQorICAgIDB4NUYzQSwgLy8g5by6LCAjNDA0CisgICAgMHg1RjUzLCAvLyDlvZMsICMyMzMKKyAgICAweDVGNTUsIC8vIOW9lSwgIzE0NgorICAgIDB4NUY2MiwgLy8g5b2iLCAjNDk0CisgICAgMHg1RjY5LCAvLyDlvaksICMzNTYKKyAgICAweDVGNzEsIC8vIOW9sSwgIzIxNAorICAgIDB4NUY4OCwgLy8g5b6ILCAjMzAwCisgICAgMHg1Rjk3LCAvLyDlvpcsICMxOTMKKyAgICAweDVGQUUsIC8vIOW+riwgIzI0NQorICAgIDB4NUZDMywgLy8g5b+DLCAjNzAKKyAgICAweDVGRUIsIC8vIOW/qywgIzMyNAorICAgIDB4NjAwMSwgLy8g5oCBLCAjNTA4CisgICAgMHg2MDBFLCAvLyDmgI4sICMzNzAKKyAgICAweDYwMjcsIC8vIOaApywgIzk5CisgICAgMHg2MDNCLCAvLyDmgLssICMzOTgKKyAgICAweDYwNkYsIC8vIOaBrywgIzE3NgorICAgIDB4NjBBOCwgLy8g5oKoLCAjMjUxCisgICAgMHg2MEM1LCAvLyDmg4UsICM4NworICAgIDB4NjBGMywgLy8g5oOzLCAjMjkwCisgICAgMHg2MTBGLCAvLyDmhI8sICMxODQKKyAgICAweDYxMUYsIC8vIOaEnywgIzI1MworICAgIDB4NjIwRiwgLy8g5oiPLCAjMjM3CisgICAgMHg2MjEwLCAvLyDmiJAsICM3MQorICAgIDB4NjIxMSwgLy8g5oiRLCAjMTEKKyAgICAweDYyMTYsIC8vIOaIliwgIzMyMQorICAgIDB4NjIxOCwgLy8g5oiYLCAjMzY5CisgICAgMHg2MjM3LCAvLyDmiLcsICMyMTUKKyAgICAweDYyM0YsIC8vIOaIvywgIzIzNgorICAgIDB4NjI0MCwgLy8g5omALCAjMTQ3CisgICAgMHg2MjRCLCAvLyDmiYssICM1NQorICAgIDB4NjI0RCwgLy8g5omNLCAjNDA3CisgICAgMHg2MjUzLCAvLyDmiZMsICMyODEKKyAgICAweDYyODAsIC8vIOaKgCwgIzIwMworICAgIDB4NjI5NSwgLy8g5oqVLCAjNDA4CisgICAgMHg2MkE0LCAvLyDmiqQsICM1MDIKKyAgICAweDYyQTUsIC8vIOaKpSwgIzExMworICAgIDB4NjJEQiwgLy8g5oubLCAjMzYzCisgICAgMHg2MzAxLCAvLyDmjIEsICM0MDMKKyAgICAweDYzMDcsIC8vIOaMhywgIzQxNAorICAgIDB4NjM2RSwgLy8g5o2uLCAjNDA5CisgICAgMHg2MzkyLCAvLyDmjpIsICMzNzcKKyAgICAweDYzQTUsIC8vIOaOpSwgIzI2NgorICAgIDB4NjNBOCwgLy8g5o6oLCAjMjQ0CisgICAgMHg2M0QwLCAvLyDmj5AsICMxODEKKyAgICAweDY0MUMsIC8vIOaQnCwgIzMwMQorICAgIDB4NjRBRCwgLy8g5pKtLCAjNDAxCisgICAgMHg2NTJGLCAvLyDmlK8sICM0MDAKKyAgICAweDY1MzYsIC8vIOaUtiwgIzE1OAorICAgIDB4NjUzRSwgLy8g5pS+LCAjMzE3CisgICAgMHg2NTNGLCAvLyDmlL8sICMzODAKKyAgICAweDY1NDgsIC8vIOaViCwgIzQ5NgorICAgIDB4NjU1OSwgLy8g5pWZLCAjMTcwCisgICAgMHg2NTcwLCAvLyDmlbAsICMxMzYKKyAgICAweDY1ODcsIC8vIOaWhywgIzIxCisgICAgMHg2NTk5LCAvLyDmlpksICMyOTUKKyAgICAweDY1QUYsIC8vIOaWrywgIzQ3MworICAgIDB4NjVCMCwgLy8g5pawLCAjMTQKKyAgICAweDY1QjksIC8vIOaWuSwgIzY4CisgICAgMHg2NUM1LCAvLyDml4UsICM0NTcKKyAgICAweDY1RTAsIC8vIOaXoCwgIzE2NAorICAgIDB4NjVFNSwgLy8g5pelLCAjNTAKKyAgICAweDY1RjYsIC8vIOaXtiwgIzE4CisgICAgMHg2NjBFLCAvLyDmmI4sICMxMzIKKyAgICAweDY2MTMsIC8vIOaYkywgIzQyOAorICAgIDB4NjYxRiwgLy8g5pifLCAjMjQwCisgICAgMHg2NjJGLCAvLyDmmK8sICM2CisgICAgMHg2NjNFLCAvLyDmmL4sICM0ODYKKyAgICAweDY2RjQsIC8vIOabtCwgIzEwMworICAgIDB4NjcwMCwgLy8g5pyALCAjNjEKKyAgICAweDY3MDgsIC8vIOaciCwgIzgwCisgICAgMHg2NzA5LCAvLyDmnIksICM1CisgICAgMHg2NzBELCAvLyDmnI0sICM5NAorICAgIDB4NjcxRiwgLy8g5pyfLCAjMTM5CisgICAgMHg2NzJDLCAvLyDmnKwsICM1NgorICAgIDB4NjcyRiwgLy8g5pyvLCAjMjE2CisgICAgMHg2NzNBLCAvLyDmnLosICMyNworICAgIDB4Njc0MywgLy8g5p2DLCAjMjUwCisgICAgMHg2NzYxLCAvLyDmnaEsICMzMDkKKyAgICAweDY3NjUsIC8vIOadpSwgIzQyCisgICAgMHg2NzdGLCAvLyDmnb8sICM1MDUKKyAgICAweDY3OTcsIC8vIOaelywgIzQ3NQorICAgIDB4Njc5QywgLy8g5p6cLCAjMjEyCisgICAgMHg2N0U1LCAvLyDmn6UsICMxNjUKKyAgICAweDY4MDcsIC8vIOaghywgIzI2OQorICAgIDB4NjgyMSwgLy8g5qChLCAjNDYyCisgICAgMHg2ODM3LCAvLyDmoLcsICMzMTQKKyAgICAweDY4M0MsIC8vIOagvCwgIzIzOAorICAgIDB4Njg0OCwgLy8g5qGILCAjMzc4CisgICAgMHg2OTdDLCAvLyDmpbwsICMzNDIKKyAgICAweDZBMjEsIC8vIOaooSwgIzQxMworICAgIDB4NkIyMSwgLy8g5qyhLCAjMjYzCisgICAgMHg2QjIyLCAvLyDmrKIsICM0NDMKKyAgICAweDZCM0UsIC8vIOasviwgIzM1OAorICAgIDB4NkI2MywgLy8g5q2jLCAjMjE5CisgICAgMHg2QjY0LCAvLyDmraQsICMzNjIKKyAgICAweDZCRDQsIC8vIOavlCwgIzI5OAorICAgIDB4NkMxMSwgLy8g5rCRLCAjMjc5CisgICAgMHg2QzE0LCAvLyDmsJQsICMzMDMKKyAgICAweDZDMzQsIC8vIOawtCwgIzE2MworICAgIDB4NkM0MiwgLy8g5rGCLCAjMzczCisgICAgMHg2QzVGLCAvLyDmsZ8sICMzMzYKKyAgICAweDZDQTEsIC8vIOayoSwgIzIyOQorICAgIDB4NkNCQiwgLy8g5rK7LCAjNDI1CisgICAgMHg2Q0Q1LCAvLyDms5UsICM4NQorICAgIDB4NkNFOCwgLy8g5rOoLCAjMTE5CisgICAgMHg2RDNCLCAvLyDmtLssICMyMzEKKyAgICAweDZENDEsIC8vIOa1gSwgIzI4MAorICAgIDB4NkQ0QiwgLy8g5rWLLCAjNDYwCisgICAgMHg2RDc3LCAvLyDmtbcsICMxMjQKKyAgICAweDZEODgsIC8vIOa2iCwgIzQxNQorICAgIDB4NkRGMSwgLy8g5rexLCAjNDc3CisgICAgMHg2RTA1LCAvLyDmuIUsICMzMTEKKyAgICAweDZFMzgsIC8vIOa4uCwgIzgxCisgICAgMHg2RTkwLCAvLyDmupAsICMzMjUKKyAgICAweDcwNkIsIC8vIOeBqywgIzQ5OAorICAgIDB4NzBCOSwgLy8g54K5LCAjNTgKKyAgICAweDcwRUQsIC8vIOeDrSwgIzE4MworICAgIDB4NzEzNiwgLy8g54S2LCAjMzA4CisgICAgMHg3MTY3LCAvLyDnhacsICM0MzEKKyAgICAweDcyMzEsIC8vIOeIsSwgIzIyMworICAgIDB4NzI0NywgLy8g54mHLCAjMTI4CisgICAgMHg3MjQ4LCAvLyDniYgsICM5MQorICAgIDB4NzI0QywgLy8g54mMLCAjNDI5CisgICAgMHg3MjY5LCAvLyDniaksICMxNjkKKyAgICAweDcyNzksIC8vIOeJuSwgIzIyNAorICAgIDB4NzM4QiwgLy8g546LLCAjMzUxCisgICAgMHg3M0E5LCAvLyDnjqksICM0NzYKKyAgICAweDczQjAsIC8vIOeOsCwgIzEyNQorICAgIDB4NzQwMywgLy8g55CDLCAjMzY3CisgICAgMHg3NDA2LCAvLyDnkIYsICM2OQorICAgIDB4NzUxRiwgLy8g55SfLCAjMjQKKyAgICAweDc1MjgsIC8vIOeUqCwgIzE3CisgICAgMHg3NTMxLCAvLyDnlLEsICM0NDEKKyAgICAweDc1MzUsIC8vIOeUtSwgIzM0CisgICAgMHg3NTM3LCAvLyDnlLcsICMyNzUKKyAgICAweDc1NEMsIC8vIOeVjCwgIzQxOQorICAgIDB4NzVDNSwgLy8g55eFLCAjMzcxCisgICAgMHg3NjdCLCAvLyDnmbssICMyMDQKKyAgICAweDc2N0QsIC8vIOeZvSwgIzMzOAorICAgIDB4NzY3RSwgLy8g55m+LCAjMTU3CisgICAgMHg3Njg0LCAvLyDnmoQsICMxCisgICAgMHg3NkQ4LCAvLyDnm5gsICM0OTMKKyAgICAweDc2RUUsIC8vIOebriwgIzI2MQorICAgIDB4NzZGNCwgLy8g55u0LCAjMzkxCisgICAgMHg3NkY4LCAvLyDnm7gsICMxNDMKKyAgICAweDc3MDEsIC8vIOecgSwgIzQ2NAorICAgIDB4NzcwQiwgLy8g55yLLCAjNTQKKyAgICAweDc3MUYsIC8vIOecnywgIzI0OQorICAgIDB4Nzc0MCwgLy8g552ALCAjMzAyCisgICAgMHg3N0U1LCAvLyDnn6UsICMxNDIKKyAgICAweDc4MDEsIC8vIOeggSwgIzI1NworICAgIDB4NzgxNCwgLy8g56CULCAjMzg3CisgICAgMHg3OTNBLCAvLyDnpLosICMzMzQKKyAgICAweDc5M0UsIC8vIOekviwgIzM0MworICAgIDB4Nzk1RSwgLy8g56WeLCAjMzMwCisgICAgMHg3OThGLCAvLyDnpo8sICM1MDkKKyAgICAweDc5QkIsIC8vIOemuywgIzQ1NAorICAgIDB4NzlDRCwgLy8g56eNLCAjMjc4CisgICAgMHg3OUQxLCAvLyDnp5EsICMxMjYKKyAgICAweDc5RUYsIC8vIOenrywgIzM5MAorICAgIDB4N0EwQiwgLy8g56iLLCAjMjA5CisgICAgMHg3QTc2LCAvLyDnqbYsICM1MDQKKyAgICAweDdBN0EsIC8vIOepuiwgIzMxMgorICAgIDB4N0FDQiwgLy8g56uLLCAjMzkzCisgICAgMHg3QUQ5LCAvLyDnq5ksICMxMDcKKyAgICAweDdBRTAsIC8vIOeroCwgIzMwNAorICAgIDB4N0IyQywgLy8g56ysLCAjOTYKKyAgICAweDdCNDksIC8vIOetiSwgIzIxMAorICAgIDB4N0I1NCwgLy8g562ULCAjMjU2CisgICAgMHg3QjgwLCAvLyDnroAsICM0NzQKKyAgICAweDdCQTEsIC8vIOeuoSwgIzIyMQorICAgIDB4N0M3QiwgLy8g57G7LCAjMjQ2CisgICAgMHg3Q0JFLCAvLyDnsr4sICMyMjYKKyAgICAweDdDRkIsIC8vIOezuywgIzg5CisgICAgMHg3RDIyLCAvLyDntKIsICMzNTQKKyAgICAweDdFQTIsIC8vIOe6oiwgIzQxNworICAgIDB4N0VBNywgLy8g57qnLCAjMTc4CisgICAgMHg3RUJGLCAvLyDnur8sICMxMDgKKyAgICAweDdFQzQsIC8vIOe7hCwgIzM4OQorICAgIDB4N0VDNiwgLy8g57uGLCAjNDQyCisgICAgMHg3RUNGLCAvLyDnu48sICM3NAorICAgIDB4N0VEMywgLy8g57uTLCAjMzMzCisgICAgMHg3RUQ5LCAvLyDnu5ksICMzODQKKyAgICAweDdFREMsIC8vIOe7nCwgIzQ3MgorICAgIDB4N0VERiwgLy8g57ufLCAjMzQ0CisgICAgMHg3RjE2LCAvLyDnvJYsICM0MjQKKyAgICAweDdGNTEsIC8vIOe9kSwgIzkKKyAgICAweDdGNkUsIC8vIOe9riwgIzQxMQorICAgIDB4N0Y4RSwgLy8g576OLCAjNjAKKyAgICAweDgwMDEsIC8vIOiAgSwgIzI5MgorICAgIDB4ODAwMywgLy8g6ICDLCAjMjg4CisgICAgMHg4MDA1LCAvLyDogIUsICMxMDYKKyAgICAweDgwMEMsIC8vIOiAjCwgIzI5NworICAgIDB4ODA1NCwgLy8g6IGULCAjMTU5CisgICAgMHg4MEIyLCAvLyDogrIsICMzMjcKKyAgICAweDgwRkQsIC8vIOiDvSwgIzU5CisgICAgMHg4MUVBLCAvLyDoh6osICM3NworICAgIDB4ODI3MiwgLy8g6ImyLCAjMTk4CisgICAgMHg4MjgyLCAvLyDoioIsICMzNjEKKyAgICAweDgyQjEsIC8vIOiKsSwgIzI5OQorICAgIDB4ODJGMSwgLy8g6IuxLCAjMzE2CisgICAgMHg4MzUwLCAvLyDojZAsICM0MDIKKyAgICAweDgzNkYsIC8vIOiNrywgIzQ4MQorICAgIDB4ODQyNSwgLy8g6JClLCAjMzk0CisgICAgMHg4NUNGLCAvLyDol48sICMzMzcKKyAgICAweDg4NEMsIC8vIOihjCwgIzQxCisgICAgMHg4ODY4LCAvLyDooagsICMxMDQKKyAgICAweDg4QUIsIC8vIOiiqywgIzI4OQorICAgIDB4ODhDNSwgLy8g6KOFLCAjMTYxCisgICAgMHg4OTdGLCAvLyDopb8sICMxOTkKKyAgICAweDg5ODEsIC8vIOimgSwgIzQ4CisgICAgMHg4OUMxLCAvLyDop4EsICMzNjAKKyAgICAweDg5QzIsIC8vIOingiwgIzQyMworICAgIDB4ODlDNCwgLy8g6KeELCAjNDUzCisgICAgMHg4OUM2LCAvLyDop4YsICMxMjAKKyAgICAweDg5RTMsIC8vIOinoywgIzI2NAorICAgIDB4OEEwMCwgLy8g6KiALCAjNDMzCisgICAgMHg4QkExLCAvLyDorqEsICMxOTEKKyAgICAweDhCQTQsIC8vIOiupCwgIzQ4MgorICAgIDB4OEJBOSwgLy8g6K6pLCAjNDIxCisgICAgMHg4QkFFLCAvLyDorq4sICM0MjcKKyAgICAweDhCQUYsIC8vIOiurywgIzM4OAorICAgIDB4OEJCMCwgLy8g6K6wLCAjMjczCisgICAgMHg4QkJBLCAvLyDorrosICM2NgorICAgIDB4OEJCRSwgLy8g6K6+LCAjMTYyCisgICAgMHg4QkMxLCAvLyDor4EsICMyMDEKKyAgICAweDhCQzQsIC8vIOivhCwgIzExMQorICAgIDB4OEJDNiwgLy8g6K+GLCAjNDYzCisgICAgMHg4QkQ1LCAvLyDor5UsICMzMjMKKyAgICAweDhCREQsIC8vIOivnSwgIzI0NworICAgIDB4OEJFMiwgLy8g6K+iLCAjNDMyCisgICAgMHg4QkU1LCAvLyDor6UsICM0NDcKKyAgICAweDhCRTYsIC8vIOivpiwgIzQ5NworICAgIDB4OEJFRCwgLy8g6K+tLCAjMjY4CisgICAgMHg4QkY0LCAvLyDor7QsICMxMTIKKyAgICAweDhCRjcsIC8vIOivtywgIzIxMworICAgIDB4OEJGQiwgLy8g6K+7LCAjMzQxCisgICAgMHg4QzAzLCAvLyDosIMsICM0MzgKKyAgICAweDhEMjIsIC8vIOi0oiwgIzQ4OAorICAgIDB4OEQyOCwgLy8g6LSoLCAjMzg2CisgICAgMHg4RDJELCAvLyDotK0sICMyNjAKKyAgICAweDhEMzQsIC8vIOi0tCwgIzUxMAorICAgIDB4OEQzOSwgLy8g6LS5LCAjMjQyCisgICAgMHg4RDQ0LCAvLyDotYQsICMxMTYKKyAgICAweDhENzcsIC8vIOi1tywgIzIyMAorICAgIDB4OEQ4NSwgLy8g6LaFLCAjNDA2CisgICAgMHg4REVGLCAvLyDot68sICMyMzUKKyAgICAweDhFQUIsIC8vIOi6qywgIzI2MgorICAgIDB4OEY2NiwgLy8g6L2mLCAjODIKKyAgICAweDhGNkMsIC8vIOi9rCwgIzMyMgorICAgIDB4OEY3RCwgLy8g6L29LCAjMTc1CisgICAgMHg4RkJFLCAvLyDovr4sICM0MzUKKyAgICAweDhGQzcsIC8vIOi/hywgIzExOAorICAgIDB4OEZEMCwgLy8g6L+QLCAjMzU3CisgICAgMHg4RkQxLCAvLyDov5EsICM0OTIKKyAgICAweDhGRDgsIC8vIOi/mCwgIzE3MQorICAgIDB4OEZEOSwgLy8g6L+ZLCAjNTcKKyAgICAweDhGREIsIC8vIOi/mywgIzE2MAorICAgIDB4OEZERSwgLy8g6L+eLCAjNDg5CisgICAgMHg5MDA5LCAvLyDpgIksICMzMjgKKyAgICAweDkwMUEsIC8vIOmAmiwgIzEzNworICAgIDB4OTAxRiwgLy8g6YCfLCAjNDU4CisgICAgMHg5MDIwLCAvLyDpgKAsICM1MTEKKyAgICAweDkwNTMsIC8vIOmBkywgIzc5CisgICAgMHg5MEEzLCAvLyDpgqMsICMzMDUKKyAgICAweDkwRTgsIC8vIOmDqCwgIzEwMgorICAgIDB4OTBGRCwgLy8g6YO9LCAjMTY3CisgICAgMHg5MTRELCAvLyDphY0sICM0NzkKKyAgICAweDkxNTIsIC8vIOmFkiwgIzQ0NAorICAgIDB4OTFDQywgLy8g6YeMLCAjMTk2CisgICAgMHg5MUNELCAvLyDph40sICMyMzAKKyAgICAweDkxQ0YsIC8vIOmHjywgIzI0OAorICAgIDB4OTFEMSwgLy8g6YeRLCAjMTM0CisgICAgMHg5NTAwLCAvLyDplIAsICM0NjUKKyAgICAweDk1N0YsIC8vIOmVvywgIzE1MgorICAgIDB4OTVFOCwgLy8g6ZeoLCAjMTg1CisgICAgMHg5NUVFLCAvLyDpl64sICM5MgorICAgIDB4OTVGNCwgLy8g6Ze0LCAjODgKKyAgICAweDk1RkIsIC8vIOmXuywgIzMxMworICAgIDB4OTYwNSwgLy8g6ZiFLCAjNDY3CisgICAgMHg5NjMzLCAvLyDpmLMsICM0MjAKKyAgICAweDk2NDUsIC8vIOmZhSwgIzUwMQorICAgIDB4OTY1MCwgLy8g6ZmQLCAjMjg2CisgICAgMHg5NjYyLCAvLyDpmaIsICMyNzYKKyAgICAweDk2QzYsIC8vIOmbhiwgIzI4NAorICAgIDB4OTcwMCwgLy8g6ZyALCAjNDA1CisgICAgMHg5NzYyLCAvLyDpnaIsICMxMjMKKyAgICAweDk3RjMsIC8vIOmfsywgIzMzNQorICAgIDB4OTg3NSwgLy8g6aG1LCAjNjMKKyAgICAweDk4NzksIC8vIOmhuSwgIzUwNgorICAgIDB4OTg5MSwgLy8g6aKRLCAjMjAwCisgICAgMHg5ODk4LCAvLyDpopgsICMxMTAKKyAgICAweDk4Q0UsIC8vIOmjjiwgIzI1MgorICAgIDB4OThERiwgLy8g6aOfLCAjNDQ1CisgICAgMHg5OTk2LCAvLyDpppYsICMxNDkKKyAgICAweDk5OTksIC8vIOmmmSwgIzUxMgorICAgIDB4OUE2QywgLy8g6amsLCAjMzkyCisgICAgMHg5QThDLCAvLyDpqowsICMzODIKKyAgICAweDlBRDgsIC8vIOmrmCwgIzY3CisgICAgMHg5Rjk5LCAvLyDpvpksICM0MjYKK307CisvLyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgc2FtcGxlIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNoYXJhY3RlcnMKK3N0YXRpYyBjb25zdCBmbG9hdCBmcmVxdWVudF96aENOX2NvdmVyYWdlPTAuNzE4OTUwMzY5MzM5OTczOworCisvLyBUaGUgNTEyIG1vc3QgZnJlcXVlbnRseSBvY2N1cmluZyBjaGFyYWN0ZXJzIGZvciB0aGUgemhUVyBsYW5ndWFnZSBpbiBhIHNhbXBsZSBvZiB0aGUgSW50ZXJuZXQuCisvLyBPcmRlcmVkIGJ5IGNvZGVwb2ludCwgY29tbWVudCBzaG93cyBjaGFyYWN0ZXIgYW5kIHJhbmtpbmcgYnkgZnJlcXVlbmN5Citjb25zdCB1aW50MTZfdCBmcmVxdWVudF96aFRXW10gPSB7CisgICAgMHg0RTAwLCAvLyDkuIAsICMyCisgICAgMHg0RTA5LCAvLyDkuIksICMxMzEKKyAgICAweDRFMEEsIC8vIOS4iiwgIzEyCisgICAgMHg0RTBCLCAvLyDkuIssICMzNworICAgIDB4NEUwRCwgLy8g5LiNLCAjNgorICAgIDB4NEUxNiwgLy8g5LiWLCAjMzEyCisgICAgMHg0RTI2LCAvLyDkuKYsICM0MzQKKyAgICAweDRFMkQsIC8vIOS4rSwgIzkKKyAgICAweDRFM0IsIC8vIOS4uywgIzk3CisgICAgMHg0RTRCLCAvLyDkuYssICM1NQorICAgIDB4NEU1RiwgLy8g5LmfLCAjOTUKKyAgICAweDRFODYsIC8vIOS6hiwgIzE5CisgICAgMHg0RThCLCAvLyDkuossICMxMjgKKyAgICAweDRFOEMsIC8vIOS6jCwgIzE4NworICAgIDB4NEU5NCwgLy8g5LqULCAjMzM5CisgICAgMHg0RTlCLCAvLyDkupssICM0MzUKKyAgICAweDRFOUUsIC8vIOS6niwgIzQzMgorICAgIDB4NEVBNCwgLy8g5LqkLCAjMjY0CisgICAgMHg0RUFCLCAvLyDkuqssICMxNjAKKyAgICAweDRFQkEsIC8vIOS6uiwgIzMKKyAgICAweDRFQzAsIC8vIOS7gCwgIzQ4MworICAgIDB4NEVDQSwgLy8g5LuKLCAjMzgwCisgICAgMHg0RUNCLCAvLyDku4ssICM0NjgKKyAgICAweDRFRDYsIC8vIOS7liwgIzY1CisgICAgMHg0RUUzLCAvLyDku6MsICMyODQKKyAgICAweDRFRTUsIC8vIOS7pSwgIzI2CisgICAgMHg0RUY2LCAvLyDku7YsICMyMzQKKyAgICAweDRFRkIsIC8vIOS7uywgIzM4MQorICAgIDB4NEVGRCwgLy8g5Lu9LCAjNDQ3CisgICAgMHg0RjQ2LCAvLyDkvYYsICMyODEKKyAgICAweDRGNEQsIC8vIOS9jSwgIzIwMgorICAgIDB4NEY0RiwgLy8g5L2PLCAjNDcxCisgICAgMHg0RjU1LCAvLyDkvZUsICMzMzQKKyAgICAweDRGNUMsIC8vIOS9nCwgIzU2CisgICAgMHg0RjYwLCAvLyDkvaAsICM2NAorICAgIDB4NEY3RiwgLy8g5L2/LCAjMjM2CisgICAgMHg0Rjg2LCAvLyDkvoYsICMzOAorICAgIDB4NEY5QiwgLy8g5L6bLCAjMzk3CisgICAgMHg0RkJGLCAvLyDkvr8sICM0NDAKKyAgICAweDRGQzIsIC8vIOS/giwgIzUwNgorICAgIDB4NEZERCwgLy8g5L+dLCAjMTYxCisgICAgMHg0RkUxLCAvLyDkv6EsICMyNjgKKyAgICAweDRGRUUsIC8vIOS/riwgIzQ3MworICAgIDB4NTAwQiwgLy8g5YCLLCAjMjcKKyAgICAweDUwMTEsIC8vIOWAkSwgIzEwOQorICAgIDB4NTA1QSwgLy8g5YGaLCAjMzgzCisgICAgMHg1MDY1LCAvLyDlgaUsICM0MTUKKyAgICAweDUwOTksIC8vIOWCmSwgIzQ2MQorICAgIDB4NTBCMywgLy8g5YKzLCAjMjc3CisgICAgMHg1MENGLCAvLyDlg48sICM0MDMKKyAgICAweDUwRjksIC8vIOWDuSwgIzkzCisgICAgMHg1MTJBLCAvLyDlhKosICMzOTYKKyAgICAweDUxNDMsIC8vIOWFgywgIzE1OAorICAgIDB4NTE0OCwgLy8g5YWILCAjMzgyCisgICAgMHg1MTQ5LCAvLyDlhYksICMyMTYKKyAgICAweDUxNEQsIC8vIOWFjSwgIzMyMQorICAgIDB4NTE1MiwgLy8g5YWSLCAjMzc0CisgICAgMHg1MTY1LCAvLyDlhaUsICM1OAorICAgIDB4NTE2NywgLy8g5YWnLCAjMTA2CisgICAgMHg1MTY4LCAvLyDlhagsICM2NworICAgIDB4NTE2OSwgLy8g5YWpLCAjMzIyCisgICAgMHg1MTZDLCAvLyDlhawsICM1MworICAgIDB4NTE2RCwgLy8g5YWtLCAjNDkzCisgICAgMHg1MTcxLCAvLyDlhbEsICM0NTYKKyAgICAweDUxNzYsIC8vIOWFtiwgIzE0OAorICAgIDB4NTE3NywgLy8g5YW3LCAjMzI4CisgICAgMHg1MThBLCAvLyDlhoosICMzNjAKKyAgICAweDUxOEQsIC8vIOWGjSwgIzMxMQorICAgIDB4NTFGQSwgLy8g5Ye6LCAjNDQKKyAgICAweDUyMDYsIC8vIOWIhiwgIzE1CisgICAgMHg1MjE3LCAvLyDliJcsICMyNTkKKyAgICAweDUyMjUsIC8vIOWIpSwgIzM2MQorICAgIDB4NTIyOSwgLy8g5YipLCAjMjUxCisgICAgMHg1MjMwLCAvLyDliLAsICMyOQorICAgIDB4NTI0NywgLy8g5YmHLCAjNTExCisgICAgMHg1MjRELCAvLyDliY0sICM4MgorICAgIDB4NTI3NSwgLy8g5Ym1LCAjNDA5CisgICAgMHg1MjlCLCAvLyDlipssICMxNzYKKyAgICAweDUyOUYsIC8vIOWKnywgIzQzMAorICAgIDB4NTJBMCwgLy8g5YqgLCAjODcKKyAgICAweDUyQTksIC8vIOWKqSwgIzQ2NQorICAgIDB4NTJENSwgLy8g5YuVLCAjNDgKKyAgICAweDUyRDksIC8vIOWLmSwgIzEwMgorICAgIDB4NTMwNSwgLy8g5YyFLCAjMjQ4CisgICAgMHg1MzE2LCAvLyDljJYsICMyMjMKKyAgICAweDUzMTcsIC8vIOWMlywgIzE0NQorICAgIDB4NTM0MCwgLy8g5Y2ALCAjNjAKKyAgICAweDUzNDEsIC8vIOWNgSwgIzI0MgorICAgIDB4NTM1NywgLy8g5Y2XLCAjMjYxCisgICAgMHg1MzVBLCAvLyDljZosICM0ODQKKyAgICAweDUzNjEsIC8vIOWNoSwgIzMyNworICAgIDB4NTM3MCwgLy8g5Y2wLCAjNDk4CisgICAgMHg1MzczLCAvLyDljbMsICMzNTEKKyAgICAweDUzOUYsIC8vIOWOnywgIzIzNworICAgIDB4NTNCQiwgLy8g5Y67LCAjMTkwCisgICAgMHg1M0MzLCAvLyDlj4MsICM0NDQKKyAgICAweDUzQzgsIC8vIOWPiCwgIzQyNgorICAgIDB4NTNDQSwgLy8g5Y+KLCAjMTM2CisgICAgMHg1M0NCLCAvLyDlj4ssICMxNDIKKyAgICAweDUzRDYsIC8vIOWPliwgIzQyMgorICAgIDB4NTNENywgLy8g5Y+XLCAjNDEwCisgICAgMHg1M0UzLCAvLyDlj6MsICMzNTcKKyAgICAweDUzRUEsIC8vIOWPqiwgIzI1MAorICAgIDB4NTNFRiwgLy8g5Y+vLCAjMzUKKyAgICAweDUzRjAsIC8vIOWPsCwgIzM0CisgICAgMHg1M0Y4LCAvLyDlj7gsICMyMjYKKyAgICAweDU0MDMsIC8vIOWQgywgIzM2MgorICAgIDB4NTQwNCwgLy8g5ZCELCAjNDU0CisgICAgMHg1NDA4LCAvLyDlkIgsICMxNDcKKyAgICAweDU0MEMsIC8vIOWQjCwgIzE3MworICAgIDB4NTQwRCwgLy8g5ZCNLCAjMTA4CisgICAgMHg1NDRBLCAvLyDlkYosICMxODYKKyAgICAweDU0OEMsIC8vIOWSjCwgIzEzMAorICAgIDB4NTRDMSwgLy8g5ZOBLCAjMjMKKyAgICAweDU0RTEsIC8vIOWToSwgIzE1MAorICAgIDB4NTU0NiwgLy8g5ZWGLCAjNzUKKyAgICAweDU1NEYsIC8vIOWVjywgIzEyMAorICAgIDB4NTU5QywgLy8g5ZacLCAjNTAyCisgICAgMHg1NUFFLCAvLyDllq4sICMyMTAKKyAgICAweDU1Q0UsIC8vIOWXjiwgIzQ0MworICAgIDB4NTY2OCwgLy8g5ZmoLCAjMzA1CisgICAgMHg1NkRCLCAvLyDlm5ssICMzMTgKKyAgICAweDU2REUsIC8vIOWbniwgIzU5CisgICAgMHg1NkUwLCAvLyDlm6AsICMyNTMKKyAgICAweDU3MEIsIC8vIOWciywgIzIxCisgICAgMHg1NzEyLCAvLyDlnJIsICMzNDUKKyAgICAweDU3MTYsIC8vIOWcliwgIzczCisgICAgMHg1NzE4LCAvLyDlnJgsICMzMzgKKyAgICAweDU3MjgsIC8vIOWcqCwgIzExCisgICAgMHg1NzMwLCAvLyDlnLAsICM1MAorICAgIDB4NTc4QiwgLy8g5Z6LLCAjMjcwCisgICAgMHg1N0NFLCAvLyDln44sICM0NjYKKyAgICAweDU3RkEsIC8vIOWfuiwgIzM0OQorICAgIDB4NTgzMSwgLy8g5aCxLCAjMTI3CisgICAgMHg1ODM0LCAvLyDloLQsICMxNjUKKyAgICAweDU4RUIsIC8vIOWjqywgIzM3MgorICAgIDB4NTkxNiwgLy8g5aSWLCAjMTUyCisgICAgMHg1OTFBLCAvLyDlpJosICM1NAorICAgIDB4NTkyNywgLy8g5aSnLCAjOAorICAgIDB4NTkyOSwgLy8g5aSpLCAjNDMKKyAgICAweDU5MkEsIC8vIOWkqiwgIzM0MworICAgIDB4NTk0NywgLy8g5aWHLCAjMzI1CisgICAgMHg1OTczLCAvLyDlpbMsICM4NQorICAgIDB4NTk3OSwgLy8g5aW5LCAjNDIwCisgICAgMHg1OTdELCAvLyDlpb0sICMyMgorICAgIDB4NTk4MiwgLy8g5aaCLCAjMTQ0CisgICAgMHg1QjUwLCAvLyDlrZAsICM0NgorICAgIDB4NUI1NywgLy8g5a2XLCAjMjc1CisgICAgMHg1Qjc4LCAvLyDlrbgsICM0OQorICAgIDB4NUI4OSwgLy8g5a6JLCAjMjM5CisgICAgMHg1QjhDLCAvLyDlrowsICMzMjAKKyAgICAweDVCOUEsIC8vIOWumiwgIzE1OQorICAgIDB4NUJBMiwgLy8g5a6iLCAjMTg4CisgICAgMHg1QkI2LCAvLyDlrrYsICMzMQorICAgIDB4NUJCOSwgLy8g5a65LCAjMjQ0CisgICAgMHg1QkU2LCAvLyDlr6YsICMxOTgKKyAgICAweDVCRjYsIC8vIOWvtiwgIzM2NworICAgIDB4NUMwNywgLy8g5bCHLCAjMjMyCisgICAgMHg1QzA4LCAvLyDlsIgsICMxMzMKKyAgICAweDVDMEIsIC8vIOWwiywgIzM1MgorICAgIDB4NUMwRCwgLy8g5bCNLCAjMTI2CisgICAgMHg1QzBFLCAvLyDlsI4sICM0MTgKKyAgICAweDVDMEYsIC8vIOWwjywgIzIwCisgICAgMHg1QzExLCAvLyDlsJEsICMzNjgKKyAgICAweDVDMzEsIC8vIOWwsSwgIzYzCisgICAgMHg1QzU1LCAvLyDlsZUsICMzNDEKKyAgICAweDVDNzEsIC8vIOWxsSwgIzI3MworICAgIDB4NURFNSwgLy8g5belLCAjMTIxCisgICAgMHg1REYxLCAvLyDlt7EsICM0MDIKKyAgICAweDVERjIsIC8vIOW3siwgIzI5OQorICAgIDB4NUUwMiwgLy8g5biCLCAjODEKKyAgICAweDVFMkIsIC8vIOW4qywgIzI2MgorICAgIDB4NUUzNiwgLy8g5bi2LCAjNDcwCisgICAgMHg1RTM4LCAvLyDluLgsICMzMDMKKyAgICAweDVFNzMsIC8vIOW5sywgIzI5NworICAgIDB4NUU3NCwgLy8g5bm0LCAjMzAKKyAgICAweDVFOTcsIC8vIOW6lywgIzE3MQorICAgIDB4NUVBNiwgLy8g5bqmLCAjMjIwCisgICAgMHg1RUI3LCAvLyDlurcsICM0NDEKKyAgICAweDVFRTMsIC8vIOW7oywgIzI3OQorICAgIDB4NUVGQSwgLy8g5bu6LCAjMjU0CisgICAgMHg1RjBGLCAvLyDlvI8sICMxNTUKKyAgICAweDVGMTUsIC8vIOW8lSwgIzM0NgorICAgIDB4NUYzNSwgLy8g5by1LCAjMzY2CisgICAgMHg1RjM3LCAvLyDlvLcsICM0MzcKKyAgICAweDVGNzEsIC8vIOW9sSwgIzk0CisgICAgMHg1Rjg4LCAvLyDlvogsICMxNzcKKyAgICAweDVGOEMsIC8vIOW+jCwgIzY2CisgICAgMHg1Rjk3LCAvLyDlvpcsICMxMTMKKyAgICAweDVGOUUsIC8vIOW+niwgIzQzNgorICAgIDB4NUZDMywgLy8g5b+DLCAjNTcKKyAgICAweDVGRUIsIC8vIOW/qywgIzI5MgorICAgIDB4NjAyNywgLy8g5oCnLCAjMTc1CisgICAgMHg2MDZGLCAvLyDmga8sICMzNzgKKyAgICAweDYwQTgsIC8vIOaCqCwgIzI1MgorICAgIDB4NjBDNSwgLy8g5oOFLCAjMTIzCisgICAgMHg2MEYzLCAvLyDmg7MsICMxNzgKKyAgICAweDYxMEYsIC8vIOaEjywgIzE2OAorICAgIDB4NjExQiwgLy8g5oSbLCAjMTI1CisgICAgMHg2MTFGLCAvLyDmhJ8sICMyMTEKKyAgICAweDYxQzksIC8vIOaHiSwgIzE2NAorICAgIDB4NjIxMCwgLy8g5oiQLCAjODYKKyAgICAweDYyMTEsIC8vIOaIkSwgIzcKKyAgICAweDYyMTYsIC8vIOaIliwgIzE5OQorICAgIDB4NjIzMCwgLy8g5oiwLCAjNDM4CisgICAgMHg2MjMyLCAvLyDmiLIsICMzMDkKKyAgICAweDYyMzYsIC8vIOaItiwgIzQ5NworICAgIDB4NjIzRiwgLy8g5oi/LCAjMjc0CisgICAgMHg2MjQwLCAvLyDmiYAsICM3OQorICAgIDB4NjI0QiwgLy8g5omLLCAjNjgKKyAgICAweDYyNEQsIC8vIOaJjSwgIzQwMAorICAgIDB4NjI1MywgLy8g5omTLCAjMjc4CisgICAgMHg2MjdFLCAvLyDmib4sICM0NDkKKyAgICAweDYyODAsIC8vIOaKgCwgIzMzMgorICAgIDB4NjI5NSwgLy8g5oqVLCAjNDI1CisgICAgMHg2MkM5LCAvLyDmi4ksICM1MDAKKyAgICAweDYyQ0QsIC8vIOaLjSwgIzM5OAorICAgIDB4NjMwNywgLy8g5oyHLCAjNDA3CisgICAgMHg2MzkyLCAvLyDmjpIsICM0NTgKKyAgICAweDYzQTUsIC8vIOaOpSwgIzMyNgorICAgIDB4NjNBOCwgLy8g5o6oLCAjMTUzCisgICAgMHg2M0QwLCAvLyDmj5AsICMyMzUKKyAgICAweDY0MUMsIC8vIOaQnCwgIzMxNAorICAgIDB4NjQ2OSwgLy8g5pGpLCAjNDcyCisgICAgMHg2NTM2LCAvLyDmlLYsICMyNDkKKyAgICAweDY1MzksIC8vIOaUuSwgIzUwOAorICAgIDB4NjUzRSwgLy8g5pS+LCAjMzMxCisgICAgMHg2NTNGLCAvLyDmlL8sICMyOTUKKyAgICAweDY1NTksIC8vIOaVmSwgIzE4NAorICAgIDB4NjU3NCwgLy8g5pW0LCAjMzk0CisgICAgMHg2NTc4LCAvLyDmlbgsICMxMzQKKyAgICAweDY1ODcsIC8vIOaWhywgIzE2CisgICAgMHg2NTk5LCAvLyDmlpksICMxNjcKKyAgICAweDY1QUYsIC8vIOaWrywgIzQ3NgorICAgIDB4NjVCMCwgLy8g5pawLCAjMTAKKyAgICAweDY1QjksIC8vIOaWuSwgIzk2CisgICAgMHg2NUJDLCAvLyDmlrwsICM3MAorICAgIDB4NjVDNSwgLy8g5peFLCAjMjg5CisgICAgMHg2NUU1LCAvLyDml6UsICMxOAorICAgIDB4NjYwRSwgLy8g5piOLCAjMTE4CisgICAgMHg2NjEzLCAvLyDmmJMsICM0ODIKKyAgICAweDY2MUYsIC8vIOaYnywgIzIwNQorICAgIDB4NjYyRiwgLy8g5pivLCAjNQorICAgIDB4NjY0MiwgLy8g5pmCLCAjMTMKKyAgICAweDY2RjQsIC8vIOabtCwgIzE0OQorICAgIDB4NjZGOCwgLy8g5pu4LCAjMjA5CisgICAgMHg2NzAwLCAvLyDmnIAsICM1MQorICAgIDB4NjcwMywgLy8g5pyDLCAjMTQKKyAgICAweDY3MDgsIC8vIOaciCwgIzI1CisgICAgMHg2NzA5LCAvLyDmnIksICM0CisgICAgMHg2NzBELCAvLyDmnI0sICM5OQorICAgIDB4NjcxRiwgLy8g5pyfLCAjMTM5CisgICAgMHg2NzJBLCAvLyDmnKosICM0MDQKKyAgICAweDY3MkMsIC8vIOacrCwgIzQ1CisgICAgMHg2NzcxLCAvLyDmnbEsICMyMjEKKyAgICAweDY3N0YsIC8vIOadvywgIzM2NAorICAgIDB4Njc5NywgLy8g5p6XLCAjMzMwCisgICAgMHg2NzlDLCAvLyDmnpwsICMxNzkKKyAgICAweDY3RTUsIC8vIOafpSwgIzI4MworICAgIDB4NjgzQywgLy8g5qC8LCAjMTU3CisgICAgMHg2ODQ4LCAvLyDmoYgsICMzOTIKKyAgICAweDY4OUQsIC8vIOainSwgIzQwNgorICAgIDB4Njk2RCwgLy8g5qWtLCAjMTAzCisgICAgMHg2QTAyLCAvLyDmqIIsICMxMTYKKyAgICAweDZBMTMsIC8vIOaokywgIzQxMQorICAgIDB4NkExOSwgLy8g5qiZLCAjMzg0CisgICAgMHg2QTIzLCAvLyDmqKMsICMzMDYKKyAgICAweDZBNUYsIC8vIOapnywgIzQwCisgICAgMHg2QUEyLCAvLyDmqqIsICMzNTkKKyAgICAweDZCMEEsIC8vIOasiiwgIzIyOAorICAgIDB4NkIyMSwgLy8g5qyhLCAjMjI3CisgICAgMHg2QjNFLCAvLyDmrL4sICMyNzYKKyAgICAweDZCNEMsIC8vIOatjCwgIzQ5NgorICAgIDB4NkI2MSwgLy8g5q2hLCAjNDI3CisgICAgMHg2QjYzLCAvLyDmraMsICMyMDYKKyAgICAweDZCNjQsIC8vIOatpCwgIzI0NworICAgIDB4NkJDRiwgLy8g5q+PLCAjMzkxCisgICAgMHg2QkQ0LCAvLyDmr5QsICMyNTcKKyAgICAweDZDMTEsIC8vIOawkSwgIzIzMAorICAgIDB4NkMyMywgLy8g5rCjLCAjMjAwCisgICAgMHg2QzM0LCAvLyDmsLQsICMxNDAKKyAgICAweDZDNDIsIC8vIOaxgiwgIzUwMQorICAgIDB4NkM5MiwgLy8g5rKSLCAjMTYyCisgICAgMHg2Q0Q1LCAvLyDms5UsICM4OQorICAgIDB4NkQzQiwgLy8g5rS7LCAjMTI0CisgICAgMHg2RDQxLCAvLyDmtYEsICMzMTUKKyAgICAweDZENzcsIC8vIOa1tywgIzI1OAorICAgIDB4NkQ4OCwgLy8g5raILCAjMzQyCisgICAgMHg2RTA1LCAvLyDmuIUsICMzMjkKKyAgICAweDZFMkYsIC8vIOa4rywgIzI5MworICAgIDB4NkYxNCwgLy8g5ryULCAjNDkxCisgICAgMHg3MDYzLCAvLyDngaMsICMxOTUKKyAgICAweDcwQkEsIC8vIOeCuiwgIzM5CisgICAgMHg3MTIxLCAvLyDnhKEsICMxMDcKKyAgICAweDcxMzYsIC8vIOeEtiwgIzIxNQorICAgIDB4NzE2NywgLy8g54WnLCAjMzc2CisgICAgMHg3MUIxLCAvLyDnhrEsICMyNDUKKyAgICAweDcyNDcsIC8vIOeJhywgIzkwCisgICAgMHg3MjQ4LCAvLyDniYgsICMxMTIKKyAgICAweDcyNEMsIC8vIOeJjCwgIzQ2NworICAgIDB4NzI2OSwgLy8g54mpLCAjMTEwCisgICAgMHg3Mjc5LCAvLyDnibksICMxODMKKyAgICAweDczOEIsIC8vIOeOiywgIzI4NworICAgIDB4NzNBOSwgLy8g546pLCAjMzU0CisgICAgMHg3M0ZFLCAvLyDnj74sICMxNDMKKyAgICAweDc0MDMsIC8vIOeQgywgIzM1MAorICAgIDB4NzQwNiwgLy8g55CGLCAjMTA1CisgICAgMHg3NTFGLCAvLyDnlJ8sICMyNAorICAgIDB4NzUyMiwgLy8g55SiLCAjMjAxCisgICAgMHg3NTI4LCAvLyDnlKgsICMxNworICAgIDB4NzUzMSwgLy8g55SxLCAjMjg4CisgICAgMHg3NTM3LCAvLyDnlLcsICMyOTgKKyAgICAweDc1NEMsIC8vIOeVjCwgIzM5OQorICAgIDB4NzU1OSwgLy8g55WZLCAjMjE4CisgICAgMHg3NTZCLCAvLyDnlassICM0MTIKKyAgICAweDc1NzYsIC8vIOeVtiwgIzE4NQorICAgIDB4NzY3QiwgLy8g55m7LCAjMTM4CisgICAgMHg3NjdDLCAvLyDnmbwsICMyOAorICAgIDB4NzY3RCwgLy8g55m9LCAjMzc3CisgICAgMHg3NjdFLCAvLyDnmb4sICMzOTMKKyAgICAweDc2ODQsIC8vIOeahCwgIzEKKyAgICAweDc2RUUsIC8vIOebriwgIzI3MQorICAgIDB4NzZGNCwgLy8g55u0LCAjMzc5CisgICAgMHg3NkY4LCAvLyDnm7gsICM5OAorICAgIDB4NzcwQiwgLy8g55yLLCAjNTIKKyAgICAweDc3MUYsIC8vIOecnywgIzE4MAorICAgIDB4NzczQywgLy8g55y8LCAjNDMzCisgICAgMHg3N0U1LCAvLyDnn6UsICMxNzAKKyAgICAweDc4QkMsIC8vIOeivCwgIzQ4MQorICAgIDB4NzkzQSwgLy8g56S6LCAjMzUzCisgICAgMHg3OTNFLCAvLyDnpL4sICMzMzMKKyAgICAweDc5NUUsIC8vIOelniwgIzMwNAorICAgIDB4Nzk2OCwgLy8g56WoLCAjNDc3CisgICAgMHg3OThGLCAvLyDnpo8sICM0OTQKKyAgICAweDc5QzEsIC8vIOengSwgIzUwNworICAgIDB4NzlEMSwgLy8g56eRLCAjMjgwCisgICAgMHg3QTBCLCAvLyDnqIssICMyNzIKKyAgICAweDdBMkUsIC8vIOeoriwgIzMzNworICAgIDB4N0E0RCwgLy8g56mNLCAjMzg1CisgICAgMHg3QTdBLCAvLyDnqbosICMzMjQKKyAgICAweDdBQ0IsIC8vIOeriywgIzI4NgorICAgIDB4N0FEOSwgLy8g56uZLCAjMTE3CisgICAgMHg3QUUwLCAvLyDnq6AsICMxNDEKKyAgICAweDdCMkMsIC8vIOesrCwgIzEzNQorICAgIDB4N0I0OSwgLy8g562JLCAjMjQwCisgICAgMHg3QkExLCAvLyDnrqEsICMzNDAKKyAgICAweDdCQzAsIC8vIOevgCwgIzQzMQorICAgIDB4N0JDNywgLy8g56+HLCAjNDc5CisgICAgMHg3QzIxLCAvLyDnsKEsICM0OTkKKyAgICAweDdDQkUsIC8vIOeyviwgIzIxMworICAgIDB4N0NGQiwgLy8g57O7LCAjMjEyCisgICAgMHg3RDA0LCAvLyDntIQsICM0NjIKKyAgICAweDdEMDUsIC8vIOe0hSwgIzQ1MgorICAgIDB4N0QxQSwgLy8g57SaLCAjMjY3CisgICAgMHg3RDMwLCAvLyDntLAsICM0ODYKKyAgICAweDdENDQsIC8vIOe1hCwgIzMzNQorICAgIDB4N0Q1MCwgLy8g57WQLCAjMjQzCisgICAgMHg3RDY2LCAvLyDntaYsICMzNTUKKyAgICAweDdENzEsIC8vIOe1sSwgIzM3NQorICAgIDB4N0Q5MywgLy8g57aTLCAjMTExCisgICAgMHg3REIyLCAvLyDntrIsICMzMgorICAgIDB4N0REQSwgLy8g57eaLCAjMTUxCisgICAgMHg3RTIzLCAvLyDnuKMsICM0MzkKKyAgICAweDdFM0QsIC8vIOe4vSwgIzM3MAorICAgIDB4N0Y4RSwgLy8g576OLCAjNDEKKyAgICAweDdGQTksIC8vIOe+qSwgIzUwNAorICAgIDB4ODAwMSwgLy8g6ICBLCAjMjkwCisgICAgMHg4MDAzLCAvLyDogIMsICM0MjgKKyAgICAweDgwMDUsIC8vIOiAhSwgIzkyCisgICAgMHg4MDBDLCAvLyDogIwsICMyMTcKKyAgICAweDgwNUUsIC8vIOiBniwgIzE4MQorICAgIDB4ODA2RiwgLy8g6IGvLCAjMzEwCisgICAgMHg4MDcyLCAvLyDogbIsICM0MTMKKyAgICAweDgwQTEsIC8vIOiCoSwgIzM5MAorICAgIDB4ODBCMiwgLy8g6IKyLCAjNDUzCisgICAgMHg4MEZELCAvLyDog70sICM3MQorICAgIDB4ODE2NiwgLy8g6IWmLCAjNDA4CisgICAgMHg4MUVBLCAvLyDoh6osICM2MQorICAgIDB4ODFGMywgLy8g6IezLCAjMzQ0CisgICAgMHg4MjA3LCAvLyDoiIcsICM4NAorICAgIDB4ODIwOSwgLy8g6IiJLCAjNDYzCisgICAgMHg4MjcyLCAvLyDoibIsICMxOTIKKyAgICAweDgyQjEsIC8vIOiKsSwgIzI1NQorICAgIDB4ODJGMSwgLy8g6IuxLCAjMzQ4CisgICAgMHg4M0VGLCAvLyDoj68sICMxOTYKKyAgICAweDg0MkMsIC8vIOiQrCwgIzMxNgorICAgIDB4ODQzRCwgLy8g6JC9LCAjMzA4CisgICAgMHg4NDU3LCAvLyDokZcsICMyMzMKKyAgICAweDg1QTYsIC8vIOiWpiwgIzQwMQorICAgIDB4ODVDRiwgLy8g6JePLCAjNTAzCisgICAgMHg4NURELCAvLyDol50sICM0ODgKKyAgICAweDg2NTUsIC8vIOiZlSwgIzQxOQorICAgIDB4ODY1RiwgLy8g6JmfLCAjMTkxCisgICAgMHg4ODRDLCAvLyDooYwsICM0NworICAgIDB4ODg1MywgLy8g6KGTLCAjMzk1CisgICAgMHg4ODY4LCAvLyDooagsICM3NworICAgIDB4ODhBQiwgLy8g6KKrLCAjMjkxCisgICAgMHg4OERELCAvLyDoo50sICMyNTYKKyAgICAweDg4RTEsIC8vIOijoSwgIzM2OQorICAgIDB4ODhGRCwgLy8g6KO9LCAjNTEwCisgICAgMHg4OTdGLCAvLyDopb8sICMzMDAKKyAgICAweDg5ODEsIC8vIOimgSwgIzM2CisgICAgMHg4OThCLCAvLyDopossICMzMDcKKyAgICAweDg5OTYsIC8vIOimliwgIzIwNAorICAgIDB4ODlCQSwgLy8g6Ka6LCAjNDUwCisgICAgMHg4OUJELCAvLyDopr0sICMzODcKKyAgICAweDg5QzAsIC8vIOingCwgIzM2NQorICAgIDB4ODlFMywgLy8g6KejLCAjMzIzCisgICAgMHg4QTAwLCAvLyDoqIAsICMxNjkKKyAgICAweDhBMDIsIC8vIOiogiwgIzQyMworICAgIDB4OEEwOCwgLy8g6KiILCAjMjI1CisgICAgMHg4QTBBLCAvLyDoqIosICMxNTYKKyAgICAweDhBMEUsIC8vIOiojiwgIzM3MworICAgIDB4OEExOCwgLy8g6KiYLCAjMjIyCisgICAgMHg4QTJELCAvLyDoqK0sICMxNzQKKyAgICAweDhBM0IsIC8vIOiouywgIzM1NgorICAgIDB4OEE1NSwgLy8g6KmVLCAjMjQ2CisgICAgMHg4QTY2LCAvLyDoqaYsICM0NDgKKyAgICAweDhBNzEsIC8vIOipsSwgIzIyOQorICAgIDB4OEE3MiwgLy8g6KmyLCAjNDQ2CisgICAgMHg4QThELCAvLyDoqo0sICM0NjQKKyAgICAweDhBOUUsIC8vIOiqniwgIzM3MQorICAgIDB4OEFBQSwgLy8g6KqqLCAjOTEKKyAgICAweDhBQkYsIC8vIOiqvywgIzUwOQorICAgIDB4OEFDQiwgLy8g6KuLLCAjMTE5CisgICAgMHg4QUQ2LCAvLyDoq5YsICMxMTQKKyAgICAweDhCMUQsIC8vIOisnSwgIzM4OQorICAgIDB4OEI0OSwgLy8g6K2JLCAjNDI5CisgICAgMHg4QjU4LCAvLyDorZgsICM0MTYKKyAgICAweDhCNzAsIC8vIOitsCwgIzQ4NQorICAgIDB4OEI3NywgLy8g6K23LCAjNDc1CisgICAgMHg4QjgwLCAvLyDoroAsICMzODYKKyAgICAweDhCOEEsIC8vIOiuiiwgIzM4OAorICAgIDB4OEI5MywgLy8g6K6TLCAjMzM2CisgICAgMHg4Q0E4LCAvLyDosqgsICMzMTMKKyAgICAweDhDQjcsIC8vIOiytywgIzI2MAorICAgIDB4OENCQiwgLy8g6LK7LCAjMjAzCisgICAgMHg4Q0M3LCAvLyDos4csICM2MgorICAgIDB4OENFMywgLy8g6LOjLCAjMjk0CisgICAgMHg4Q0VBLCAvLyDos6osICM0NTcKKyAgICAweDhDRkMsIC8vIOizvCwgIzE4OQorICAgIDB4OEQ3NywgLy8g6LW3LCAjMjE0CisgICAgMHg4RDg1LCAvLyDotoUsICMyOTYKKyAgICAweDhEREYsIC8vIOi3nywgIzQ4OQorICAgIDB4OERFRiwgLy8g6LevLCAjMTM3CisgICAgMHg4RUFCLCAvLyDouqssICMxOTcKKyAgICAweDhFQ0EsIC8vIOi7iiwgIzc2CisgICAgMHg4RjA5LCAvLyDovIksICMzMDEKKyAgICAweDhGNDksIC8vIOi9iSwgIzI4MgorICAgIDB4OEZEMSwgLy8g6L+RLCAjNDE0CisgICAgMHg5MDAxLCAvLyDpgIEsICMzNjMKKyAgICAweDkwMTksIC8vIOmAmSwgIzQyCisgICAgMHg5MDFBLCAvLyDpgJosICMyMDcKKyAgICAweDkwMUYsIC8vIOmAnywgIzQ5NQorICAgIDB4OTAyMCwgLy8g6YCgLCAjNDU1CisgICAgMHg5MDIzLCAvLyDpgKMsICMyODUKKyAgICAweDkwMzIsIC8vIOmAsiwgIzIzMQorICAgIDB4OTA0QSwgLy8g6YGKLCAjMTMyCisgICAgMHg5MDRCLCAvLyDpgYssICMyMTkKKyAgICAweDkwNEUsIC8vIOmBjiwgIzEwMQorICAgIDB4OTA1MywgLy8g6YGTLCAjMTQ2CisgICAgMHg5MDU0LCAvLyDpgZQsICM0MTcKKyAgICAweDkwNzgsIC8vIOmBuCwgIzE4MgorICAgIDB4OTA4NCwgLy8g6YKELCAjMTU0CisgICAgMHg5MDhBLCAvLyDpgoosICM0ODcKKyAgICAweDkwQTMsIC8vIOmCoywgIzI2OQorICAgIDB4OTBFOCwgLy8g6YOoLCAjNzgKKyAgICAweDkwRkQsIC8vIOmDvSwgIzEwNAorICAgIDB4OTE0RCwgLy8g6YWNLCAjNDIxCisgICAgMHg5MTUyLCAvLyDphZIsICM1MTIKKyAgICAweDkxQUIsIC8vIOmGqywgIzM1OAorICAgIDB4OTFDRCwgLy8g6YeNLCAjMjI0CisgICAgMHg5MUNGLCAvLyDph48sICMzMTkKKyAgICAweDkxRDEsIC8vIOmHkSwgIzExNQorICAgIDB4OTMwNCwgLy8g6YyELCAjMzAyCisgICAgMHg5NTc3LCAvLyDplbcsICMxNzIKKyAgICAweDk1ODAsIC8vIOmWgCwgIzE5MworICAgIDB4OTU4QiwgLy8g6ZaLLCAjNzIKKyAgICAweDk1OTMsIC8vIOmWkywgIzgwCisgICAgMHg5NUIxLCAvLyDplrEsICM0MDUKKyAgICAweDk1REMsIC8vIOmXnCwgIzc0CisgICAgMHg5NjNGLCAvLyDpmL8sICM0NjAKKyAgICAweDk2NTAsIC8vIOmZkCwgIzI2NQorICAgIDB4OTY2MiwgLy8g6ZmiLCAjNDc0CisgICAgMHg5NjY0LCAvLyDpmaQsICM0NzgKKyAgICAweDk2OUIsIC8vIOmamywgIzQ1OQorICAgIDB4OTZDNiwgLy8g6ZuGLCAjMzQ3CisgICAgMHg5NkUyLCAvLyDpm6IsICM0NDIKKyAgICAweDk2RkIsIC8vIOmbuywgIzMzCisgICAgMHg5NzAwLCAvLyDpnIAsICM0NDUKKyAgICAweDk3NUUsIC8vIOmdniwgIzQ1MQorICAgIDB4OTc2MiwgLy8g6Z2iLCAjMTI5CisgICAgMHg5N0YzLCAvLyDpn7MsICMxOTQKKyAgICAweDk4MDEsIC8vIOmggSwgIzgzCisgICAgMHg5ODJELCAvLyDpoK0sICMyMzgKKyAgICAweDk4NEMsIC8vIOmhjCwgIzEyMgorICAgIDB4OTg1RSwgLy8g6aGeLCAjMTYzCisgICAgMHg5OEE4LCAvLyDpoqgsICMyNjYKKyAgICAweDk4REYsIC8vIOmjnywgIzIwOAorICAgIDB4OTkxMCwgLy8g6aSQLCAjNDY5CisgICAgMHg5OTI4LCAvLyDppKgsICM0MjQKKyAgICAweDk5OTYsIC8vIOmmliwgIzE2NgorICAgIDB4OTk5OSwgLy8g6aaZLCAjMjYzCisgICAgMHg5OUFDLCAvLyDppqwsICMzMTcKKyAgICAweDlBNTcsIC8vIOmplywgIzQ5MgorICAgIDB4OUFENCwgLy8g6auULCAjMTAwCisgICAgMHg5QUQ4LCAvLyDpq5gsICM4OAorICAgIDB4OUVCQywgLy8g6bq8LCAjMjQxCisgICAgMHg5RUMzLCAvLyDpu4MsICM0ODAKKyAgICAweDlFRDEsIC8vIOm7kSwgIzQ5MAorICAgIDB4OUVERSwgLy8g6bueLCAjNjkKKyAgICAweDlGOEQsIC8vIOm+jSwgIzUwNQorfTsKKy8vIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzYW1wbGUgY292ZXJlZCBieSB0aGUgYWJvdmUgY2hhcmFjdGVycworc3RhdGljIGNvbnN0IGZsb2F0IGZyZXF1ZW50X3poVFdfY292ZXJhZ2U9MC43MDQ4NDEyMDAwMjY4Nzc7CisKKy8vIFRoZSA1MTIgbW9zdCBmcmVxdWVudGx5IG9jY3VyaW5nIGNoYXJhY3RlcnMgZm9yIHRoZSBqYSBsYW5ndWFnZSBpbiBhIHNhbXBsZSBvZiB0aGUgSW50ZXJuZXQuCisvLyBPcmRlcmVkIGJ5IGNvZGVwb2ludCwgY29tbWVudCBzaG93cyBjaGFyYWN0ZXIgYW5kIHJhbmtpbmcgYnkgZnJlcXVlbmN5Citjb25zdCB1aW50MTZfdCBmcmVxdWVudF9qYVtdID0geworICAgIDB4MzAwNSwgLy8g44CFLCAjMzUyCisgICAgMHgzMDQxLCAvLyDjgYEsICM0ODYKKyAgICAweDMwNDIsIC8vIOOBgiwgIzUwCisgICAgMHgzMDQ0LCAvLyDjgYQsICMyCisgICAgMHgzMDQ2LCAvLyDjgYYsICMzMworICAgIDB4MzA0OCwgLy8g44GILCAjODMKKyAgICAweDMwNEEsIC8vIOOBiiwgIzM3CisgICAgMHgzMDRCLCAvLyDjgYssICMyMQorICAgIDB4MzA0QywgLy8g44GMLCAjMTcKKyAgICAweDMwNEQsIC8vIOOBjSwgIzUxCisgICAgMHgzMDRFLCAvLyDjgY4sICMzMjQKKyAgICAweDMwNEYsIC8vIOOBjywgIzM4CisgICAgMHgzMDUwLCAvLyDjgZAsICMzMzQKKyAgICAweDMwNTEsIC8vIOOBkSwgIzYwCisgICAgMHgzMDUyLCAvLyDjgZIsICMyOTYKKyAgICAweDMwNTMsIC8vIOOBkywgIzM0CisgICAgMHgzMDU0LCAvLyDjgZQsICMxMDAKKyAgICAweDMwNTUsIC8vIOOBlSwgIzMxCisgICAgMHgzMDU2LCAvLyDjgZYsICMzNzgKKyAgICAweDMwNTcsIC8vIOOBlywgIzQKKyAgICAweDMwNTgsIC8vIOOBmCwgIzEyMQorICAgIDB4MzA1OSwgLy8g44GZLCAjMTIKKyAgICAweDMwNUEsIC8vIOOBmiwgIzIxNQorICAgIDB4MzA1QiwgLy8g44GbLCAjODYKKyAgICAweDMwNUQsIC8vIOOBnSwgIzY4CisgICAgMHgzMDVGLCAvLyDjgZ8sICMxMQorICAgIDB4MzA2MCwgLy8g44GgLCAjNDIKKyAgICAweDMwNjEsIC8vIOOBoSwgIzY3CisgICAgMHgzMDYzLCAvLyDjgaMsICMyMworICAgIDB4MzA2NCwgLy8g44GkLCAjNzMKKyAgICAweDMwNjYsIC8vIOOBpiwgIzcKKyAgICAweDMwNjcsIC8vIOOBpywgIzYKKyAgICAweDMwNjgsIC8vIOOBqCwgIzE0CisgICAgMHgzMDY5LCAvLyDjgaksICM3NQorICAgIDB4MzA2QSwgLy8g44GqLCAjOAorICAgIDB4MzA2QiwgLy8g44GrLCAjNQorICAgIDB4MzA2RCwgLy8g44GtLCAjMTIzCisgICAgMHgzMDZFLCAvLyDjga4sICMxCisgICAgMHgzMDZGLCAvLyDjga8sICMxNgorICAgIDB4MzA3MCwgLy8g44GwLCAjMTUwCisgICAgMHgzMDcxLCAvLyDjgbEsICMyNTkKKyAgICAweDMwNzIsIC8vIOOBsiwgIzM2NAorICAgIDB4MzA3MywgLy8g44GzLCAjMjY2CisgICAgMHgzMDc1LCAvLyDjgbUsICM0ODQKKyAgICAweDMwNzYsIC8vIOOBtiwgIzMzMAorICAgIDB4MzA3OCwgLy8g44G4LCAjMTQ2CisgICAgMHgzMDc5LCAvLyDjgbksICMyMDcKKyAgICAweDMwN0IsIC8vIOOBuywgIzI1NAorICAgIDB4MzA3RSwgLy8g44G+LCAjMTgKKyAgICAweDMwN0YsIC8vIOOBvywgIzc0CisgICAgMHgzMDgwLCAvLyDjgoAsICMyODUKKyAgICAweDMwODEsIC8vIOOCgSwgIzc4CisgICAgMHgzMDgyLCAvLyDjgoIsICMzMgorICAgIDB4MzA4MywgLy8g44KDLCAjMTExCisgICAgMHgzMDg0LCAvLyDjgoQsICM4NQorICAgIDB4MzA4NiwgLy8g44KGLCAjMzkyCisgICAgMHgzMDg3LCAvLyDjgocsICMyMjQKKyAgICAweDMwODgsIC8vIOOCiCwgIzYzCisgICAgMHgzMDg5LCAvLyDjgoksICMyOQorICAgIDB4MzA4QSwgLy8g44KKLCAjMjgKKyAgICAweDMwOEIsIC8vIOOCiywgIzkKKyAgICAweDMwOEMsIC8vIOOCjCwgIzM1CisgICAgMHgzMDhELCAvLyDjgo0sICMxMjcKKyAgICAweDMwOEYsIC8vIOOCjywgIzg4CisgICAgMHgzMDkyLCAvLyDjgpIsICMxOQorICAgIDB4MzA5MywgLy8g44KTLCAjMjIKKyAgICAweDMwQTEsIC8vIOOCoSwgIzE5MworICAgIDB4MzBBMiwgLy8g44KiLCAjMjcKKyAgICAweDMwQTMsIC8vIOOCoywgIzcwCisgICAgMHgzMEE0LCAvLyDjgqQsICMxNQorICAgIDB4MzBBNiwgLy8g44KmLCAjODkKKyAgICAweDMwQTcsIC8vIOOCpywgIzEzNAorICAgIDB4MzBBOCwgLy8g44KoLCAjODEKKyAgICAweDMwQTksIC8vIOOCqSwgIzIyNQorICAgIDB4MzBBQSwgLy8g44KqLCAjNzYKKyAgICAweDMwQUIsIC8vIOOCqywgIzUyCisgICAgMHgzMEFDLCAvLyDjgqwsICMxNDcKKyAgICAweDMwQUQsIC8vIOOCrSwgIzY2CisgICAgMHgzMEFFLCAvLyDjgq4sICMyNDYKKyAgICAweDMwQUYsIC8vIOOCrywgIzI1CisgICAgMHgzMEIwLCAvLyDjgrAsICMzOQorICAgIDB4MzBCMSwgLy8g44KxLCAjMTM3CisgICAgMHgzMEIyLCAvLyDjgrIsICMyMDAKKyAgICAweDMwQjMsIC8vIOOCsywgIzQ2CisgICAgMHgzMEI0LCAvLyDjgrQsICMxODMKKyAgICAweDMwQjUsIC8vIOOCtSwgIzY0CisgICAgMHgzMEI2LCAvLyDjgrYsICMyMjEKKyAgICAweDMwQjcsIC8vIOOCtywgIzQ4CisgICAgMHgzMEI4LCAvLyDjgrgsICM1NQorICAgIDB4MzBCOSwgLy8g44K5LCAjMTMKKyAgICAweDMwQkEsIC8vIOOCuiwgIzEwMworICAgIDB4MzBCQiwgLy8g44K7LCAjMTA5CisgICAgMHgzMEJDLCAvLyDjgrwsICM0OTkKKyAgICAweDMwQkQsIC8vIOOCvSwgIzE3NQorICAgIDB4MzBCRiwgLy8g44K/LCAjNDUKKyAgICAweDMwQzAsIC8vIOODgCwgIzEwNAorICAgIDB4MzBDMSwgLy8g44OBLCAjNzEKKyAgICAweDMwQzMsIC8vIOODgywgIzIwCisgICAgMHgzMEM0LCAvLyDjg4QsICMxMTkKKyAgICAweDMwQzYsIC8vIOODhiwgIzU5CisgICAgMHgzMEM3LCAvLyDjg4csICM4MgorICAgIDB4MzBDOCwgLy8g44OILCAjMTAKKyAgICAweDMwQzksIC8vIOODiSwgIzQ0CisgICAgMHgzMENBLCAvLyDjg4osICMxMDIKKyAgICAweDMwQ0IsIC8vIOODiywgIzcyCisgICAgMHgzMENELCAvLyDjg40sICMxMTcKKyAgICAweDMwQ0UsIC8vIOODjiwgIzE5MgorICAgIDB4MzBDRiwgLy8g44OPLCAjMTY0CisgICAgMHgzMEQwLCAvLyDjg5AsICM2MgorICAgIDB4MzBEMSwgLy8g44ORLCAjOTAKKyAgICAweDMwRDIsIC8vIOODkiwgIzM5OAorICAgIDB4MzBEMywgLy8g44OTLCAjNzcKKyAgICAweDMwRDQsIC8vIOODlCwgIzEzNQorICAgIDB4MzBENSwgLy8g44OVLCAjNDcKKyAgICAweDMwRDYsIC8vIOODliwgIzU2CisgICAgMHgzMEQ3LCAvLyDjg5csICM0MworICAgIDB4MzBEOCwgLy8g44OYLCAjMjY4CisgICAgMHgzMEQ5LCAvLyDjg5ksICMxNTcKKyAgICAweDMwREEsIC8vIOODmiwgIzEyNQorICAgIDB4MzBEQiwgLy8g44ObLCAjMTU1CisgICAgMHgzMERDLCAvLyDjg5wsICMxNjgKKyAgICAweDMwREQsIC8vIOODnSwgIzExNAorICAgIDB4MzBERSwgLy8g44OeLCAjNTcKKyAgICAweDMwREYsIC8vIOODnywgIzk3CisgICAgMHgzMEUwLCAvLyDjg6AsICM2OQorICAgIDB4MzBFMSwgLy8g44OhLCAjNTMKKyAgICAweDMwRTIsIC8vIOODoiwgIzE0MgorICAgIDB4MzBFMywgLy8g44OjLCAjOTMKKyAgICAweDMwRTQsIC8vIOODpCwgIzI1OAorICAgIDB4MzBFNSwgLy8g44OlLCAjNzkKKyAgICAweDMwRTYsIC8vIOODpiwgIzQwNQorICAgIDB4MzBFNywgLy8g44OnLCAjOTgKKyAgICAweDMwRTksIC8vIOODqSwgIzI2CisgICAgMHgzMEVBLCAvLyDjg6osICMzMAorICAgIDB4MzBFQiwgLy8g44OrLCAjMjQKKyAgICAweDMwRUMsIC8vIOODrCwgIzQxCisgICAgMHgzMEVELCAvLyDjg60sICM0MAorICAgIDB4MzBFRiwgLy8g44OvLCAjMTQ0CisgICAgMHgzMEYzLCAvLyDjg7MsICMzCisgICAgMHgzMEY0LCAvLyDjg7QsICM0ODMKKyAgICAweDMwRkQsIC8vIOODvSwgIzUwMQorICAgIDB4NEUwMCwgLy8g5LiALCAjODQKKyAgICAweDRFMDcsIC8vIOS4hywgIzMzNworICAgIDB4NEUwOSwgLy8g5LiJLCAjMzIzCisgICAgMHg0RTBBLCAvLyDkuIosICMxMzMKKyAgICAweDRFMEIsIC8vIOS4iywgIzE4MAorICAgIDB4NEUwRCwgLy8g5LiNLCAjMjc3CisgICAgMHg0RTE2LCAvLyDkuJYsICMzODUKKyAgICAweDRFMkQsIC8vIOS4rSwgIzg3CisgICAgMHg0RTNCLCAvLyDkuLssICM0MzIKKyAgICAweDRFODgsIC8vIOS6iCwgIzMyNgorICAgIDB4NEU4QiwgLy8g5LqLLCAjOTUKKyAgICAweDRFOEMsIC8vIOS6jCwgIzM5NAorICAgIDB4NEU5NSwgLy8g5LqVLCAjNDY4CisgICAgMHg0RUE0LCAvLyDkuqQsICM0MTAKKyAgICAweDRFQUMsIC8vIOS6rCwgIzI2MAorICAgIDB4NEVCQSwgLy8g5Lq6LCAjNjEKKyAgICAweDRFQ0EsIC8vIOS7iiwgIzE4NAorICAgIDB4NEVDQiwgLy8g5LuLLCAjMzU4CisgICAgMHg0RUQ1LCAvLyDku5UsICMzOTEKKyAgICAweDRFRDYsIC8vIOS7liwgIzI1NgorICAgIDB4NEVEOCwgLy8g5LuYLCAjMjQzCisgICAgMHg0RUUzLCAvLyDku6MsICMyODAKKyAgICAweDRFRTUsIC8vIOS7pSwgIzIxNgorICAgIDB4NEVGNiwgLy8g5Lu2LCAjMTkwCisgICAgMHg0RjFBLCAvLyDkvJosICMxMDUKKyAgICAweDRGNEQsIC8vIOS9jSwgIzE3NworICAgIDB4NEY0RiwgLy8g5L2PLCAjMzc2CisgICAgMHg0RjUzLCAvLyDkvZMsICMyMjMKKyAgICAweDRGNTUsIC8vIOS9lSwgIzI5NAorICAgIDB4NEY1QywgLy8g5L2cLCAjMTU0CisgICAgMHg0RjdGLCAvLyDkvb8sICMyMzMKKyAgICAweDRGOUIsIC8vIOS+mywgIzUwMworICAgIDB4NEZBMSwgLy8g5L6hLCAjMjE3CisgICAgMHg0RkJGLCAvLyDkvr8sICM1MTEKKyAgICAweDRGREQsIC8vIOS/nSwgIzI3OQorICAgIDB4NEZFMSwgLy8g5L+hLCAjMjcxCisgICAgMHg1MDBCLCAvLyDlgIssICM0MTUKKyAgICAweDUwQ0YsIC8vIOWDjywgIzE3OAorICAgIDB4NTEyQSwgLy8g5YSqLCAjNDAzCisgICAgMHg1MTQzLCAvLyDlhYMsICMzODQKKyAgICAweDUxNDgsIC8vIOWFiCwgIzMxMQorICAgIDB4NTE0OSwgLy8g5YWJLCAjNDg4CisgICAgMHg1MTY1LCAvLyDlhaUsICMxMTUKKyAgICAweDUxNjgsIC8vIOWFqCwgIzE3MworICAgIDB4NTE2QywgLy8g5YWsLCAjMjg3CisgICAgMHg1MTc3LCAvLyDlhbcsICM0NDcKKyAgICAweDUxODUsIC8vIOWGhSwgIzE2OQorICAgIDB4NTE4NiwgLy8g5YaGLCAjMTMxCisgICAgMHg1MTk5LCAvLyDlhpksICMyNzUKKyAgICAweDUxRkEsIC8vIOWHuiwgIzExMAorICAgIDB4NTIwNiwgLy8g5YiGLCAjMTMwCisgICAgMHg1MjA3LCAvLyDliIcsICM0MDEKKyAgICAweDUyMUQsIC8vIOWInSwgIzMxOQorICAgIDB4NTIyNSwgLy8g5YilLCAjMjkwCisgICAgMHg1MjI5LCAvLyDliKksICMyMjYKKyAgICAweDUyMzYsIC8vIOWItiwgIzUwNworICAgIDB4NTI0RCwgLy8g5YmNLCAjMTI0CisgICAgMHg1MjlCLCAvLyDlipssICMyNzIKKyAgICAweDUyQTAsIC8vIOWKoCwgIzI0OQorICAgIDB4NTJENSwgLy8g5YuVLCAjMTIwCisgICAgMHg1MkQ5LCAvLyDli5ksICM0MjEKKyAgICAweDUyREYsIC8vIOWLnywgIzQ3NgorICAgIDB4NTMxNiwgLy8g5YyWLCAjMzA4CisgICAgMHg1MzE3LCAvLyDljJcsICMzNDEKKyAgICAweDUzM0EsIC8vIOWMuiwgIzM0OAorICAgIDB4NTM5RiwgLy8g5Y6fLCAjMzIxCisgICAgMHg1M0MyLCAvLyDlj4IsICM0NTIKKyAgICAweDUzQ0IsIC8vIOWPiywgIzQ1MQorICAgIDB4NTNENiwgLy8g5Y+WLCAjMjM3CisgICAgMHg1M0Q3LCAvLyDlj5csICMzNTQKKyAgICAweDUzRTMsIC8vIOWPoywgIzI4OQorICAgIDB4NTNFNCwgLy8g5Y+kLCAjMzM5CisgICAgMHg1M0VGLCAvLyDlj68sICMyOTgKKyAgICAweDUzRjAsIC8vIOWPsCwgIzQzOQorICAgIDB4NTNGNywgLy8g5Y+3LCAjMzYxCisgICAgMHg1NDA4LCAvLyDlkIgsICMxMTgKKyAgICAweDU0MEMsIC8vIOWQjCwgIzI2MworICAgIDB4NTQwRCwgLy8g5ZCNLCAjNjUKKyAgICAweDU0MTEsIC8vIOWQkSwgIzQzNAorICAgIDB4NTQ0QSwgLy8g5ZGKLCAjMzg2CisgICAgMHg1NDY4LCAvLyDlkagsICMzOTMKKyAgICAweDU0NzMsIC8vIOWRsywgIzI5OQorICAgIDB4NTQ4QywgLy8g5ZKMLCAjMzUwCisgICAgMHg1NEMxLCAvLyDlk4EsICM5NgorICAgIDB4NTRFMSwgLy8g5ZOhLCAjMjkzCisgICAgMHg1NTQ2LCAvLyDllYYsICMxOTgKKyAgICAweDU1NEYsIC8vIOWVjywgIzE1OAorICAgIDB4NTVCNiwgLy8g5Za2LCAjNDM4CisgICAgMHg1NjY4LCAvLyDlmagsICMzNjYKKyAgICAweDU2REUsIC8vIOWbniwgIzE0MworICAgIDB4NTZGMywgLy8g5ZuzLCAjNDQ0CisgICAgMHg1NkZELCAvLyDlm70sICMxNTMKKyAgICAweDU3MTIsIC8vIOWckiwgIzQzNQorICAgIDB4NTcxRiwgLy8g5ZyfLCAjMjM5CisgICAgMHg1NzI4LCAvLyDlnKgsICMzNTEKKyAgICAweDU3MzAsIC8vIOWcsCwgIzE2MworICAgIDB4NTc4QiwgLy8g5Z6LLCAjNDMwCisgICAgMHg1ODMxLCAvLyDloLEsICMxMTIKKyAgICAweDU4MzQsIC8vIOWgtCwgIzEzOQorICAgIDB4NThGMiwgLy8g5aOyLCAjMjMyCisgICAgMHg1OTA5LCAvLyDlpIksICMzMDYKKyAgICAweDU5MTYsIC8vIOWkliwgIzIyMgorICAgIDB4NTkxQSwgLy8g5aSaLCAjMzM2CisgICAgMHg1OTI3LCAvLyDlpKcsICM4MAorICAgIDB4NTkyOSwgLy8g5aSpLCAjMjc4CisgICAgMHg1OTczLCAvLyDlpbMsICMxNjEKKyAgICAweDU5N0QsIC8vIOWlvSwgIzM0OQorICAgIDB4NUE1QSwgLy8g5amaLCAjNDc5CisgICAgMHg1QjUwLCAvLyDlrZAsICMxMTMKKyAgICAweDVCNTcsIC8vIOWtlywgIzQ5MgorICAgIDB4NUI2NiwgLy8g5a2mLCAjMTMyCisgICAgMHg1Qjg5LCAvLyDlroksICMyOTUKKyAgICAweDVCOUEsIC8vIOWumiwgIzE0NQorICAgIDB4NUI5RiwgLy8g5a6fLCAjMjIwCisgICAgMHg1QkE0LCAvLyDlrqQsICM0ODIKKyAgICAweDVCQUUsIC8vIOWuriwgIzQ4NworICAgIDB4NUJCNiwgLy8g5a62LCAjMjExCisgICAgMHg1QkI5LCAvLyDlrrksICMzMzMKKyAgICAweDVCRkUsIC8vIOWvviwgIzI1MgorICAgIDB4NUMwMiwgLy8g5bCCLCAjNDc0CisgICAgMHg1QzBGLCAvLyDlsI8sICMyMTIKKyAgICAweDVDMTEsIC8vIOWwkSwgIzM3NworICAgIDB4NUM0QiwgLy8g5bGLLCAjMjg0CisgICAgMHg1QzcxLCAvLyDlsbEsICMyMDYKKyAgICAweDVDQTEsIC8vIOWyoSwgIzQyOQorICAgIDB4NUNGNiwgLy8g5bO2LCAjMjk3CisgICAgMHg1RERELCAvLyDlt50sICMyNTMKKyAgICAweDVERTUsIC8vIOW3pSwgIzM3NAorICAgIDB4NUUwMiwgLy8g5biCLCAjMTU5CisgICAgMHg1RTJGLCAvLyDluK8sICM0MTYKKyAgICAweDVFMzgsIC8vIOW4uCwgIzQzNworICAgIDB4NUU3MywgLy8g5bmzLCAjMzkwCisgICAgMHg1RTc0LCAvLyDlubQsICM1NAorICAgIDB4NUU4MywgLy8g5bqDLCAjMzY3CisgICAgMHg1RTk3LCAvLyDlupcsICMxNDkKKyAgICAweDVFQTYsIC8vIOW6piwgIzI2OQorICAgIDB4NUVBQiwgLy8g5bqrLCAjMzgwCisgICAgMHg1RjBGLCAvLyDlvI8sICMyNjUKKyAgICAweDVGMTUsIC8vIOW8lSwgIzM0NQorICAgIDB4NUYzNywgLy8g5by3LCAjNDQ2CisgICAgMHg1RjUzLCAvLyDlvZMsICMyNDAKKyAgICAweDVGNjIsIC8vIOW9oiwgIzUwMgorICAgIDB4NUY4QywgLy8g5b6MLCAjMjMwCisgICAgMHg1Rjk3LCAvLyDlvpcsICM0OTAKKyAgICAweDVGQzMsIC8vIOW/gywgIzMwNworICAgIDB4NUZDNSwgLy8g5b+FLCAjNDIyCisgICAgMHg1RkRDLCAvLyDlv5wsICMzNTYKKyAgICAweDYwMUQsIC8vIOaAnSwgIzE4OQorICAgIDB4NjAyNywgLy8g5oCnLCAjMjAxCisgICAgMHg2MDc1LCAvLyDmgbUsICM0MDAKKyAgICAweDYwQzUsIC8vIOaDhSwgIzE0MAorICAgIDB4NjBGMywgLy8g5oOzLCAjNDc3CisgICAgMHg2MTBGLCAvLyDmhI8sICMzMDUKKyAgICAweDYxMUIsIC8vIOaEmywgIzI3MworICAgIDB4NjExRiwgLy8g5oSfLCAjMjU3CisgICAgMHg2MjEwLCAvLyDmiJAsICMyNjIKKyAgICAweDYyMjYsIC8vIOaIpiwgIzM2NQorICAgIDB4NjI0MCwgLy8g5omALCAjMjM2CisgICAgMHg2MjRCLCAvLyDmiYssICMxNjAKKyAgICAweDYyOTUsIC8vIOaKlSwgIzEyOQorICAgIDB4NjMwMSwgLy8g5oyBLCAjMzU1CisgICAgMHg2MzA3LCAvLyDmjIcsICM0MjUKKyAgICAweDYzQTIsIC8vIOaOoiwgIzM2OQorICAgIDB4NjNCMiwgLy8g5o6yLCAjMzk5CisgICAgMHg2NDNBLCAvLyDmkLosICM0NTkKKyAgICAweDY1MkYsIC8vIOaUrywgIzUxMgorICAgIDB4NjUzRSwgLy8g5pS+LCAjNDY5CisgICAgMHg2NTU5LCAvLyDmlZksICMyNzAKKyAgICAweDY1NzAsIC8vIOaVsCwgIzE4MQorICAgIDB4NjU4NywgLy8g5paHLCAjMjAyCisgICAgMHg2NTk5LCAvLyDmlpksICMxMDYKKyAgICAweDY1QjAsIC8vIOaWsCwgIzk5CisgICAgMHg2NUI5LCAvLyDmlrksICMxMjYKKyAgICAweDY1QzUsIC8vIOaXhSwgIzQ0NQorICAgIDB4NjVFNSwgLy8g5pelLCAjMzYKKyAgICAweDY2MEUsIC8vIOaYjiwgIzMwMAorICAgIDB4NjYyMCwgLy8g5pigLCAjNDE4CisgICAgMHg2NjQyLCAvLyDmmYIsICMxMDcKKyAgICAweDY2RjQsIC8vIOabtCwgIzM1OQorICAgIDB4NjZGOCwgLy8g5pu4LCAjMTc0CisgICAgMHg2NzAwLCAvLyDmnIAsICMxNTIKKyAgICAweDY3MDgsIC8vIOaciCwgIzQ5CisgICAgMHg2NzA5LCAvLyDmnIksICMzMDIKKyAgICAweDY3MUYsIC8vIOacnywgIzMzMgorICAgIDB4NjcyOCwgLy8g5pyoLCAjMjAzCisgICAgMHg2NzJDLCAvLyDmnKwsICM5MgorICAgIDB4Njc1MCwgLy8g5p2QLCAjNDg5CisgICAgMHg2NzUxLCAvLyDmnZEsICM0NjYKKyAgICAweDY3NjUsIC8vIOadpSwgIzI2NworICAgIDB4Njc3MSwgLy8g5p2xLCAjMTkxCisgICAgMHg2NzdGLCAvLyDmnb8sICM0MTEKKyAgICAweDY3OUMsIC8vIOaenCwgIzQ0MQorICAgIDB4NjgyMSwgLy8g5qChLCAjMzI3CisgICAgMHg2ODJBLCAvLyDmoKosICM0MTIKKyAgICAweDY4M0MsIC8vIOagvCwgIzIyOAorICAgIDB4NjkxQywgLy8g5qScLCAjMTc5CisgICAgMHg2OTZELCAvLyDmpa0sICMxNjYKKyAgICAweDY5N0QsIC8vIOalvSwgIzE3MgorICAgIDB4NjlEOCwgLy8g5qeYLCAjMjU1CisgICAgMHg2QTVGLCAvLyDmqZ8sICMyMzUKKyAgICAweDZCMjEsIC8vIOasoSwgIzMxOAorICAgIDB4NkI2MiwgLy8g5q2iLCAjNDc1CisgICAgMHg2QjYzLCAvLyDmraMsICMzMTIKKyAgICAweDZDMTcsIC8vIOawlywgIzExNgorICAgIDB4NkMzNCwgLy8g5rC0LCAjMTY1CisgICAgMHg2QzQyLCAvLyDmsYIsICM0NjUKKyAgICAweDZDN0EsIC8vIOaxuiwgIzM3MAorICAgIDB4NkNCQiwgLy8g5rK7LCAjNTA1CisgICAgMHg2Q0MxLCAvLyDms4EsICM0NjIKKyAgICAweDZDRDUsIC8vIOazlSwgIzIyNworICAgIDB4NkNFOCwgLy8g5rOoLCAjMzcyCisgICAgMHg2RDNCLCAvLyDmtLssICMzMDMKKyAgICAweDZENDEsIC8vIOa1gSwgIzQ4MAorICAgIDB4NkQ3NywgLy8g5rW3LCAjMjc0CisgICAgMHg2RTA4LCAvLyDmuIgsICM0MTcKKyAgICAweDZGMTQsIC8vIOa8lCwgIzUwNAorICAgIDB4NzA2QiwgLy8g54GrLCAjMjY0CisgICAgMHg3MEI5LCAvLyDngrksICMzMzEKKyAgICAweDcxMjEsIC8vIOeEoSwgIzU4CisgICAgMHg3MjQ4LCAvLyDniYgsICM0MDkKKyAgICAweDcyNjksIC8vIOeJqSwgIzE3MAorICAgIDB4NzI3OSwgLy8g54m5LCAjMjQyCisgICAgMHg3MkI2LCAvLyDnirYsICM0NTgKKyAgICAweDczRkUsIC8vIOePviwgIzMyMgorICAgIDB4NzQwNiwgLy8g55CGLCAjMTYyCisgICAgMHg3NTFGLCAvLyDnlJ8sICMxMjIKKyAgICAweDc1MjMsIC8vIOeUoywgIzMyMAorICAgIDB4NzUyOCwgLy8g55SoLCAjOTQKKyAgICAweDc1MzAsIC8vIOeUsCwgIzE5NQorICAgIDB4NzUzNywgLy8g55S3LCAjMzczCisgICAgMHg3NTNBLCAvLyDnlLosICMzMTQKKyAgICAweDc1M0IsIC8vIOeUuywgIzkxCisgICAgMHg3NTRDLCAvLyDnlYwsICM0MzYKKyAgICAweDc1NkEsIC8vIOeVqiwgIzI2MQorICAgIDB4NzVDNSwgLy8g55eFLCAjNDI4CisgICAgMHg3NjdBLCAvLyDnmbosICMxOTQKKyAgICAweDc2N0IsIC8vIOeZuywgIzIzMQorICAgIDB4NzY3RCwgLy8g55m9LCAjNDE5CisgICAgMHg3Njg0LCAvLyDnmoQsICMyNTEKKyAgICAweDc2RUUsIC8vIOebriwgIzE5NworICAgIDB4NzZGNCwgLy8g55u0LCAjNDk3CisgICAgMHg3NkY4LCAvLyDnm7gsICMyODYKKyAgICAweDc3MEMsIC8vIOecjCwgIzE5OQorICAgIDB4NzcxRiwgLy8g55yfLCAjMjE5CisgICAgMHg3NzQwLCAvLyDnnYAsICMyODMKKyAgICAweDc3RTUsIC8vIOefpSwgIzE4NQorICAgIDB4NzdGMywgLy8g55+zLCAjNTAwCisgICAgMHg3OEJBLCAvLyDnorosICMzODMKKyAgICAweDc5M0EsIC8vIOekuiwgIzI0MQorICAgIDB4NzkzRSwgLy8g56S+LCAjMTY3CisgICAgMHg3OTVFLCAvLyDnpZ4sICMzMTUKKyAgICAweDc5OEYsIC8vIOemjywgIzQyMworICAgIDB4NzlDMSwgLy8g56eBLCAjMzQ3CisgICAgMHg3OUQxLCAvLyDnp5EsICM0MjAKKyAgICAweDdBMEUsIC8vIOeojiwgIzM2OAorICAgIDB4N0EyRSwgLy8g56iuLCAjNDU1CisgICAgMHg3QTNGLCAvLyDnqL8sICMxNDgKKyAgICAweDdBN0EsIC8vIOepuiwgIzQyNworICAgIDB4N0FDQiwgLy8g56uLLCAjMzA5CisgICAgMHg3QjExLCAvLyDnrJEsICM0NTQKKyAgICAweDdCMkMsIC8vIOesrCwgIzMxNworICAgIDB4N0I0OSwgLy8g562JLCAjNDU3CisgICAgMHg3QjU0LCAvLyDnrZQsICM0MjYKKyAgICAweDdCQTEsIC8vIOeuoSwgIzQ4MQorICAgIDB4N0NGQiwgLy8g57O7LCAjNDA4CisgICAgMHg3RDA0LCAvLyDntIQsICMyNzYKKyAgICAweDdEMjAsIC8vIOe0oCwgIzQwNworICAgIDB4N0QyMiwgLy8g57SiLCAjMjE0CisgICAgMHg3RDMwLCAvLyDntLAsICMzODEKKyAgICAweDdEMzksIC8vIOe0uSwgIzQ3MQorICAgIDB4N0Q0MiwgLy8g57WCLCAjNDU2CisgICAgMHg3RDQ0LCAvLyDntYQsICM0MjQKKyAgICAweDdENEMsIC8vIOe1jCwgIzM2MAorICAgIDB4N0Q1MCwgLy8g57WQLCAjMjkxCisgICAgMHg3RDlBLCAvLyDntposICMzNTcKKyAgICAweDdEQ0YsIC8vIOe3jywgIzQ2NworICAgIDB4N0REQSwgLy8g57eaLCAjMzM4CisgICAgMHg3REU4LCAvLyDnt6gsICM0NTMKKyAgICAweDdGOEUsIC8vIOe+jiwgIzIwNAorICAgIDB4ODAwMywgLy8g6ICDLCAjMzg3CisgICAgMHg4MDA1LCAvLyDogIUsICMxNTEKKyAgICAweDgwNUUsIC8vIOiBniwgIzQ2MworICAgIDB4ODA3NywgLy8g6IG3LCAjMzYzCisgICAgMHg4MEIyLCAvLyDogrIsICM0MzMKKyAgICAweDgwRkQsIC8vIOiDvSwgIzI1MAorICAgIDB4ODE3OSwgLy8g6IW5LCAjMzk2CisgICAgMHg4MUVBLCAvLyDoh6osICMxNTYKKyAgICAweDgyNkYsIC8vIOiJrywgIzMyOQorICAgIDB4ODI3MiwgLy8g6ImyLCAjNDAyCisgICAgMHg4MkIxLCAvLyDoirEsICM0NDAKKyAgICAweDgyQjgsIC8vIOiKuCwgIzQxMworICAgIDB4ODJGMSwgLy8g6IuxLCAjNDg1CisgICAgMHg4NDQ5LCAvLyDokYksICM0NzIKKyAgICAweDg4NEMsIC8vIOihjCwgIzEyOAorICAgIDB4ODg1MywgLy8g6KGTLCAjNDYwCisgICAgMHg4ODY4LCAvLyDooagsICMyMDkKKyAgICAweDg4RkQsIC8vIOijvSwgIzQzMQorICAgIDB4ODk3RiwgLy8g6KW/LCAjNDA2CisgICAgMHg4OTgxLCAvLyDopoEsICMzMTMKKyAgICAweDg5OEIsIC8vIOimiywgIzEwMQorICAgIDB4ODk4RiwgLy8g6KaPLCAjMzc1CisgICAgMHg4OUE3LCAvLyDopqcsICMxNzEKKyAgICAweDg5RTMsIC8vIOinoywgIzM4OAorICAgIDB4OEEwMCwgLy8g6KiALCAjMjEwCisgICAgMHg4QTA4LCAvLyDoqIgsICMzNDMKKyAgICAweDhBMTgsIC8vIOiomCwgIzEzNgorICAgIDB4OEEyRCwgLy8g6KitLCAjMjkyCisgICAgMHg4QTcxLCAvLyDoqbEsICMyMTMKKyAgICAweDhBNzMsIC8vIOipsywgIzM3MQorICAgIDB4OEE4RCwgLy8g6KqNLCAjNDA0CisgICAgMHg4QTlFLCAvLyDoqp4sICMyMzQKKyAgICAweDhBQUMsIC8vIOiqrCwgIzQ5NAorICAgIDB4OEFBRCwgLy8g6KqtLCAjMzAxCisgICAgMHg4QUJGLCAvLyDoqr8sICM0NDMKKyAgICAweDhBQzcsIC8vIOirhywgIzQ0OAorICAgIDB4OEI3NywgLy8g6K23LCAjNTA5CisgICAgMHg4QzM3LCAvLyDosLcsICM1MDYKKyAgICAweDhDQTksIC8vIOiyqSwgIzM2MgorICAgIDB4OENCNywgLy8g6LK3LCAjMzQ2CisgICAgMHg4Q0M3LCAvLyDos4csICM0NzMKKyAgICAweDhDRUEsIC8vIOizqiwgIzI4MQorICAgIDB4OENGQywgLy8g6LO8LCAjNDk1CisgICAgMHg4RUFCLCAvLyDouqssICM0NzAKKyAgICAweDhFQ0EsIC8vIOi7iiwgIzIwNQorICAgIDB4OEVFMiwgLy8g6LuiLCAjMzM1CisgICAgMHg4RjA5LCAvLyDovIksICMzNDIKKyAgICAweDhGQkMsIC8vIOi+vCwgIzIyOQorICAgIDB4OEZEMSwgLy8g6L+RLCAjMzA0CisgICAgMHg4RkQ0LCAvLyDov5QsICM0NjEKKyAgICAweDhGRkQsIC8vIOi/vSwgIzM3OQorICAgIDB4OTAwMSwgLy8g6YCBLCAjMTg2CisgICAgMHg5MDFBLCAvLyDpgJosICMxODIKKyAgICAweDkwMUYsIC8vIOmAnywgIzM0MAorICAgIDB4OTAyMywgLy8g6YCjLCAjMjQ0CisgICAgMHg5MDRCLCAvLyDpgYssICMzODIKKyAgICAweDkwNEUsIC8vIOmBjiwgIzQ5OAorICAgIDB4OTA1MywgLy8g6YGTLCAjMjgyCisgICAgMHg5MDU0LCAvLyDpgZQsICM0NTAKKyAgICAweDkwNTUsIC8vIOmBlSwgIzQxNAorICAgIDB4OTA3OCwgLy8g6YG4LCAjMjg4CisgICAgMHg5MEU4LCAvLyDpg6gsICMyMDgKKyAgICAweDkwRkQsIC8vIOmDvSwgIzM0NAorICAgIDB4OTE0RCwgLy8g6YWNLCAjMzg5CisgICAgMHg5MUNELCAvLyDph40sICM0NzgKKyAgICAweDkxQ0UsIC8vIOmHjiwgIzI0NQorICAgIDB4OTFEMSwgLy8g6YeRLCAjMTM4CisgICAgMHg5MzMyLCAvLyDpjLIsICMyMzgKKyAgICAweDk1NzcsIC8vIOmVtywgIzI0NworICAgIDB4OTU4MCwgLy8g6ZaALCAjNTA4CisgICAgMHg5NThCLCAvLyDplossICMyNDgKKyAgICAweDk1OTMsIC8vIOmWkywgIzE0MQorICAgIDB4OTVBMiwgLy8g6ZaiLCAjMTg4CisgICAgMHg5NjJBLCAvLyDpmKosICM0OTYKKyAgICAweDk2NTAsIC8vIOmZkCwgIzM5NQorICAgIDB4OTY2MiwgLy8g6ZmiLCAjNDQ5CisgICAgMHg5NjY0LCAvLyDpmaQsICM1MTAKKyAgICAweDk2OUIsIC8vIOmamywgIzQ5MworICAgIDB4OTZDNiwgLy8g6ZuGLCAjMTk2CisgICAgMHg5NkQxLCAvLyDpm5EsICM0NDIKKyAgICAweDk2RkIsIC8vIOmbuywgIzE4NworICAgIDB4OTc2MiwgLy8g6Z2iLCAjMzI4CisgICAgMHg5N0YzLCAvLyDpn7MsICMzMjUKKyAgICAweDk4NEMsIC8vIOmhjCwgIzMxMAorICAgIDB4OTg1RSwgLy8g6aGeLCAjNDkxCisgICAgMHg5OEE4LCAvLyDpoqgsICMzNTMKKyAgICAweDk4REYsIC8vIOmjnywgIzIxOAorICAgIDB4OTkyOCwgLy8g6aSoLCAjNDY0CisgICAgMHg5OUM1LCAvLyDpp4UsICMzMTYKKyAgICAweDlBMTMsIC8vIOmokywgIzM5NworICAgIDB4OUFEOCwgLy8g6auYLCAjMTc2CisgICAgMHhGRjU3LCAvLyDvvZcsICMxMDgKK307CisvLyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgc2FtcGxlIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNoYXJhY3RlcnMKK3N0YXRpYyBjb25zdCBmbG9hdCBmcmVxdWVudF9qYV9jb3ZlcmFnZT0wLjg4MDU2OTU4OTEyMDE2MjsKKworLy8gVGhlIDUxMiBtb3N0IGZyZXF1ZW50bHkgb2NjdXJpbmcgY2hhcmFjdGVycyBmb3IgdGhlIGtvIGxhbmd1YWdlIGluIGEgc2FtcGxlIG9mIHRoZSBJbnRlcm5ldC4KKy8vIE9yZGVyZWQgYnkgY29kZXBvaW50LCBjb21tZW50IHNob3dzIGNoYXJhY3RlciBhbmQgcmFua2luZyBieSBmcmVxdWVuY3kKK2NvbnN0IHVpbnQxNl90IGZyZXF1ZW50X2tvW10gPSB7CisgICAgMHgzMTRCLCAvLyDjhYssICMxNDgKKyAgICAweDMxNEUsIC8vIOOFjiwgIzM5MAorICAgIDB4MzE2MCwgLy8g44WgLCAjMzU0CisgICAgMHgzMThELCAvLyDjho0sICM0MzkKKyAgICAweEFDMDAsIC8vIOqwgCwgIzYKKyAgICAweEFDMDEsIC8vIOqwgSwgIzIzMQorICAgIDB4QUMwNCwgLy8g6rCELCAjMTA2CisgICAgMHhBQzA4LCAvLyDqsIgsICMzNjIKKyAgICAweEFDMTAsIC8vIOqwkCwgIzEyMgorICAgIDB4QUMxMSwgLy8g6rCRLCAjNDkzCisgICAgMHhBQzE1LCAvLyDqsJUsICMxNTUKKyAgICAweEFDMTksIC8vIOqwmSwgIzI2NAorICAgIDB4QUMxQywgLy8g6rCcLCAjODcKKyAgICAweEFDMUQsIC8vIOqwnSwgIzE5OAorICAgIDB4QUMyNCwgLy8g6rCkLCAjNDU3CisgICAgMHhBQzcwLCAvLyDqsbAsICM5MQorICAgIDB4QUM3NCwgLy8g6rG0LCAjMTYxCisgICAgMHhBQzc4LCAvLyDqsbgsICMzMzgKKyAgICAweEFDODAsIC8vIOqygCwgIzE4NAorICAgIDB4QUM4MywgLy8g6rKDLCAjMTE2CisgICAgMHhBQzhDLCAvLyDqsowsICMzNgorICAgIDB4QUNBMCwgLy8g6rKgLCAjMjMzCisgICAgMHhBQ0E4LCAvLyDqsqgsICMzNDEKKyAgICAweEFDQTksIC8vIOqyqSwgIzI0NQorICAgIDB4QUNBQywgLy8g6rKsLCAjNDEzCisgICAgMHhBQ0IwLCAvLyDqsrAsICMyMDIKKyAgICAweEFDQkQsIC8vIOqyvSwgIzYyCisgICAgMHhBQ0M0LCAvLyDqs4QsICMxNDIKKyAgICAweEFDRTAsIC8vIOqzoCwgIzEyCisgICAgMHhBQ0UxLCAvLyDqs6EsICM0NDQKKyAgICAweEFDRTgsIC8vIOqzqCwgIzM3OQorICAgIDB4QUNGMywgLy8g6rOzLCAjMzg4CisgICAgMHhBQ0Y1LCAvLyDqs7UsICM1OQorICAgIDB4QUNGQywgLy8g6rO8LCAjNjkKKyAgICAweEFEMDAsIC8vIOq0gCwgIzk1CisgICAgMHhBRDExLCAvLyDqtJEsICMyMzUKKyAgICAweEFENTAsIC8vIOq1kCwgIzEyOAorICAgIDB4QUQ2QywgLy8g6rWsLCAjNTIKKyAgICAweEFENkQsIC8vIOq1rSwgIzg1CisgICAgMHhBRDcwLCAvLyDqtbAsICMyOTMKKyAgICAweEFENzQsIC8vIOq1tCwgIzQ4NworICAgIDB4QUQ4MSwgLy8g6raBLCAjNDQxCisgICAgMHhBRDhDLCAvLyDqtowsICMxOTIKKyAgICAweEFEQzAsIC8vIOq3gCwgIzM4NgorICAgIDB4QUREQywgLy8g6recLCAjMzY3CisgICAgMHhBREY4LCAvLyDqt7gsICMzMAorICAgIDB4QURGOSwgLy8g6re5LCAjNDI0CisgICAgMHhBREZDLCAvLyDqt7wsICMyNDEKKyAgICAweEFFMDAsIC8vIOq4gCwgIzYxCisgICAgMHhBRTA4LCAvLyDquIgsICMxMzgKKyAgICAweEFFMDksIC8vIOq4iSwgIzI2OQorICAgIDB4QUUzMCwgLy8g6riwLCAjMworICAgIDB4QUUzNCwgLy8g6ri0LCAjNDY1CisgICAgMHhBRTM4LCAvLyDquLgsICMyOTcKKyAgICAweEFFNDAsIC8vIOq5gCwgIzIwNQorICAgIDB4QUU0QywgLy8g6rmMLCAjMTcxCisgICAgMHhBRUQ4LCAvLyDqu5gsICMyNzMKKyAgICAweEFGNDMsIC8vIOq9gywgIzQ3NQorICAgIDB4QjA1RCwgLy8g64GdLCAjNTA1CisgICAgMHhCMDdDLCAvLyDrgbwsICM0OTAKKyAgICAweEIwOTgsIC8vIOuCmCwgIzM5CisgICAgMHhCMDlDLCAvLyDrgpwsICMyNzQKKyAgICAweEIwQTAsIC8vIOuCoCwgIzI5MgorICAgIDB4QjBBOCwgLy8g64KoLCAjMTM5CisgICAgMHhCMEI0LCAvLyDrgrQsICM1NgorICAgIDB4QjEwOCwgLy8g64SILCAjMjcyCisgICAgMHhCMTEwLCAvLyDrhJAsICM0NzYKKyAgICAweEIxMTgsIC8vIOuEmCwgIzQ5MgorICAgIDB4QjEyNCwgLy8g64SkLCAjMTAwCisgICAgMHhCMTM3LCAvLyDrhLcsICMzMjkKKyAgICAweEIxNDAsIC8vIOuFgCwgIzI4OAorICAgIDB4QjE0NCwgLy8g64WELCAjMTUxCisgICAgMHhCMTc4LCAvLyDrhbgsICMxNDkKKyAgICAweEIxN0MsIC8vIOuFvCwgIzQ5MQorICAgIDB4QjE4MCwgLy8g64aALCAjNDY0CisgICAgMHhCMThELCAvLyDrho0sICM0NDIKKyAgICAweEIyMDQsIC8vIOuIhCwgIzMxOQorICAgIDB4QjIwOCwgLy8g64iILCAjMzgzCisgICAgMHhCMjc0LCAvLyDribQsICMxNzMKKyAgICAweEIyOTAsIC8vIOuKkCwgIzM2OAorICAgIDB4QjI5NCwgLy8g64qULCAjNQorICAgIDB4QjI5OCwgLy8g64qYLCAjMzIyCisgICAgMHhCMkE1LCAvLyDriqUsICMxOTAKKyAgICAweEIyQzgsIC8vIOuLiCwgIzE2CisgICAgMHhCMkQ4LCAvLyDri5gsICMxNTMKKyAgICAweEIyRTQsIC8vIOuLpCwgIzIKKyAgICAweEIyRTgsIC8vIOuLqCwgIzEzNAorICAgIDB4QjJFQiwgLy8g64urLCAjMTk1CisgICAgMHhCMkVDLCAvLyDri6wsICMyNDMKKyAgICAweEIyRjQsIC8vIOuLtCwgIzI1NAorICAgIDB4QjJGNSwgLy8g64u1LCAjMjg3CisgICAgMHhCMkY5LCAvLyDri7ksICMxNTkKKyAgICAweEIzMDAsIC8vIOuMgCwgIzMzCisgICAgMHhCMzEzLCAvLyDrjJMsICMzMDMKKyAgICAweEIzNTQsIC8vIOuNlCwgIzE0MAorICAgIDB4QjM1OCwgLy8g642YLCAjMjUyCisgICAgMHhCMzY3LCAvLyDrjacsICM0NjMKKyAgICAweEIzNzAsIC8vIOuNsCwgIzEwNAorICAgIDB4QjM3OCwgLy8g6424LCAjNDI5CisgICAgMHhCM0M0LCAvLyDrj4QsICMyNQorICAgIDB4QjNDNSwgLy8g64+FLCAjMzAxCisgICAgMHhCM0NDLCAvLyDrj4wsICMzMDkKKyAgICAweEIzRDksIC8vIOuPmSwgIzU4CisgICAgMHhCNDE4LCAvLyDrkJgsICM4MgorICAgIDB4QjQxQywgLy8g65CcLCAjMTg5CisgICAgMHhCNDIwLCAvLyDrkKAsICM0MDgKKyAgICAweEI0MjksIC8vIOuQqSwgIzMzMgorICAgIDB4QjQ1MCwgLy8g65GQLCAjMTk5CisgICAgMHhCNEE0LCAvLyDrkqQsICM0OTYKKyAgICAweEI0REMsIC8vIOuTnCwgIzQwCisgICAgMHhCNEUwLCAvLyDrk6AsICMyODMKKyAgICAweEI0RTQsIC8vIOuTpCwgIzU0CisgICAgMHhCNEVGLCAvLyDrk68sICM0NzgKKyAgICAweEI0RjEsIC8vIOuTsSwgIzkwCisgICAgMHhCNTE0LCAvLyDrlJQsICMxMzMKKyAgICAweEI1MjksIC8vIOuUqSwgIzQ2MgorICAgIDB4QjUzMCwgLy8g65SwLCAjMzMzCisgICAgMHhCNTRDLCAvLyDrlYwsICMyNDAKKyAgICAweEI2MTAsIC8vIOuYkCwgIzMxMworICAgIDB4Qjc3QywgLy8g6528LCAjNDIKKyAgICAweEI3N0QsIC8vIOudvSwgIzM1NQorICAgIDB4Qjc4MCwgLy8g656ALCAjMjkwCisgICAgMHhCNzhDLCAvLyDrnowsICMyNDYKKyAgICAweEI3OEQsIC8vIOuejSwgIzQyMAorICAgIDB4Qjc5MSwgLy8g656RLCAjMjcwCisgICAgMHhCNzk4LCAvLyDrnpgsICMxNzQKKyAgICAweEI3OTksIC8vIOuemSwgIzM4MQorICAgIDB4Qjc5QywgLy8g656cLCAjMzU3CisgICAgMHhCN0E4LCAvLyDrnqgsICMzNTkKKyAgICAweEI3QTksIC8vIOueqSwgIzQwMgorICAgIDB4QjdDOSwgLy8g65+JLCAjMzQ2CisgICAgMHhCN0VDLCAvLyDrn6wsICMxMzAKKyAgICAweEI3RjAsIC8vIOufsCwgIzMxMgorICAgIDB4QjdGQywgLy8g65+8LCAjMzI3CisgICAgMHhCN0ZELCAvLyDrn70sICM0NDcKKyAgICAweEI4MDcsIC8vIOughywgIzQxMgorICAgIDB4QjgwOCwgLy8g66CILCAjMTE0CisgICAgMHhCODBDLCAvLyDroIwsICMzOTUKKyAgICAweEI4MjQsIC8vIOugpCwgIzE1OAorICAgIDB4QjgyNSwgLy8g66ClLCAjMTk0CisgICAgMHhCODI4LCAvLyDroKgsICMzMjYKKyAgICAweEI4MzksIC8vIOuguSwgIzM4OQorICAgIDB4Qjg1QywgLy8g66GcLCAjNAorICAgIDB4Qjg1RCwgLy8g66GdLCAjODQKKyAgICAweEI4NjAsIC8vIOuhoCwgIzM2NgorICAgIDB4QjhDQywgLy8g66OMLCAjMTU0CisgICAgMHhCOEU4LCAvLyDro6gsICMyMzYKKyAgICAweEI5NTgsIC8vIOulmCwgIzI2NQorICAgIDB4Qjk3NCwgLy8g66W0LCAjMjEyCisgICAgMHhCOTc4LCAvLyDrpbgsICMyNTAKKyAgICAweEI5N0MsIC8vIOulvCwgIzM1CisgICAgMHhCOTg0LCAvLyDrpoQsICMyNzYKKyAgICAweEI5QUMsIC8vIOumrCwgIzE5CisgICAgMHhCOUFELCAvLyDrpq0sICMzOTQKKyAgICAweEI5QjAsIC8vIOumsCwgIzI1OQorICAgIDB4QjlCNCwgLy8g66a0LCAjNDg1CisgICAgMHhCOUJDLCAvLyDrprwsICMzMDUKKyAgICAweEI5QkQsIC8vIOumvSwgIzIxNworICAgIDB4QjlDMSwgLy8g66eBLCAjMzUxCisgICAgMHhCOUM4LCAvLyDrp4gsICM2NworICAgIDB4QjlDOSwgLy8g66eJLCAjMzEwCisgICAgMHhCOUNDLCAvLyDrp4wsICM2NQorICAgIDB4QjlDRSwgLy8g66eOLCAjMjU3CisgICAgMHhCOUQwLCAvLyDrp5AsICMxODgKKyAgICAweEI5REIsIC8vIOunmywgIzM5NworICAgIDB4QjlERCwgLy8g66edLCAjMzcwCisgICAgMHhCOURFLCAvLyDrp54sICMzOTkKKyAgICAweEI5RTQsIC8vIOunpCwgIzEyNQorICAgIDB4QjlFOCwgLy8g66eoLCAjNDIyCisgICAgMHhCQTM4LCAvLyDrqLgsICMzMTEKKyAgICAweEJBMzksIC8vIOuouSwgIzM3NworICAgIDB4QkEzQywgLy8g66i8LCAjNDY5CisgICAgMHhCQTU0LCAvLyDrqZQsICMxNDcKKyAgICAweEJBNzAsIC8vIOupsCwgIzE5MQorICAgIDB4QkE3NCwgLy8g66m0LCAjNzIKKyAgICAweEJBODUsIC8vIOuqhSwgIzEzMQorICAgIDB4QkFBOCwgLy8g66qoLCAjNzMKKyAgICAweEJBQTksIC8vIOuqqSwgIzE1NworICAgIDB4QkFCMCwgLy8g66qwLCAjNDAxCisgICAgMHhCQUI4LCAvLyDrqrgsICM0MzcKKyAgICAweEJBQkIsIC8vIOuquywgIzMzNgorICAgIDB4QkIzNCwgLy8g66y0LCAjODAKKyAgICAweEJCMzgsIC8vIOusuCwgIzU3CisgICAgMHhCQjNDLCAvLyDrrLwsICM5NAorICAgIDB4QkJBNCwgLy8g666kLCAjNDMxCisgICAgMHhCQkY4LCAvLyDrr7gsICM3NgorICAgIDB4QkJGQywgLy8g66+8LCAjMjAwCisgICAgMHhCQzAwLCAvLyDrsIAsICMzMDgKKyAgICAweEJDMEYsIC8vIOuwjywgIzI0OQorICAgIDB4QkMxNCwgLy8g67CULCAjODkKKyAgICAweEJDMTUsIC8vIOuwlSwgIzIyNgorICAgIDB4QkMxOCwgLy8g67CYLCAjMTc1CisgICAgMHhCQzFCLCAvLyDrsJssICMyNDgKKyAgICAweEJDMUMsIC8vIOuwnCwgIzE2NAorICAgIDB4QkMyOSwgLy8g67CpLCAjOTIKKyAgICAweEJDMzAsIC8vIOuwsCwgIzE2MgorICAgIDB4QkMzMSwgLy8g67CxLCAjMjU2CisgICAgMHhCQzg0LCAvLyDrsoQsICMxMTEKKyAgICAweEJDODgsIC8vIOuyiCwgIzE2NworICAgIDB4QkM4QywgLy8g67KMLCAjNDIzCisgICAgMHhCQzk0LCAvLyDrspQsICM0MjcKKyAgICAweEJDOTUsIC8vIOuylSwgIzIwNworICAgIDB4QkNBMCwgLy8g67KgLCAjMjgxCisgICAgMHhCQ0E0LCAvLyDrsqQsICMzNzgKKyAgICAweEJDQTgsIC8vIOuyqCwgIzM4NworICAgIDB4QkNDMCwgLy8g67OALCAjMjUzCisgICAgMHhCQ0M0LCAvLyDrs4QsICMyNjIKKyAgICAweEJDRDEsIC8vIOuzkSwgIzM0MAorICAgIDB4QkNGNCwgLy8g67O0LCAjMjAKKyAgICAweEJDRjUsIC8vIOuztSwgIzIwNAorICAgIDB4QkNGOCwgLy8g67O4LCAjMTgyCisgICAgMHhCQ0ZDLCAvLyDrs7wsICMzODUKKyAgICAweEJEMDksIC8vIOu0iSwgIzQwNQorICAgIDB4QkQ4MCwgLy8g67aALCAjNDYKKyAgICAweEJEODEsIC8vIOu2gSwgIzI2MQorICAgIDB4QkQ4NCwgLy8g67aELCAjMTA1CisgICAgMHhCRDg4LCAvLyDrtogsICMyMjUKKyAgICAweEJERjAsIC8vIOu3sCwgIzM1MAorICAgIDB4QkUwQywgLy8g67iMLCAjMjE0CisgICAgMHhCRTE0LCAvLyDruJQsICM5OQorICAgIDB4QkU0NCwgLy8g67mELCAjNTUKKyAgICAweEJFNEMsIC8vIOu5jCwgIzUxMAorICAgIDB4QkU2MCwgLy8g67mgLCAjMzk4CisgICAgMHhDMEFDLCAvLyDsgqwsICMxNAorICAgIDB4QzBBRCwgLy8g7IKtLCAjMzQyCisgICAgMHhDMEIwLCAvLyDsgrAsICMxMjEKKyAgICAweEMwQjQsIC8vIOyCtCwgIzI3OQorICAgIDB4QzBCQywgLy8g7IK8LCAjMzQ4CisgICAgMHhDMEMxLCAvLyDsg4EsICM0MQorICAgIDB4QzBDOCwgLy8g7IOILCAjMjgyCisgICAgMHhDMEM5LCAvLyDsg4ksICMxODEKKyAgICAweEMwREQsIC8vIOyDnSwgIzEwOQorICAgIDB4QzExQywgLy8g7IScLCAjMjEKKyAgICAweEMxMUQsIC8vIOyEnSwgIzIzNAorICAgIDB4QzEyMCwgLy8g7ISgLCAjMTA3CisgICAgMHhDMTI0LCAvLyDshKQsICMxNzAKKyAgICAweEMxMzEsIC8vIOyEsSwgIzUwCisgICAgMHhDMTM4LCAvLyDshLgsICM2MAorICAgIDB4QzEzOSwgLy8g7IS5LCAjNDU2CisgICAgMHhDMTNDLCAvLyDshLwsICMyNjcKKyAgICAweEMxNTQsIC8vIOyFlCwgIzQ1NQorICAgIDB4QzE1OCwgLy8g7IWYLCAjMjM3CisgICAgMHhDMTVDLCAvLyDshZwsICM0NDgKKyAgICAweEMxNjgsIC8vIOyFqCwgIzQyMQorICAgIDB4QzE4QywgLy8g7IaMLCAjNTEKKyAgICAweEMxOEQsIC8vIOyGjSwgIzIxOQorICAgIDB4QzE5MCwgLy8g7IaQLCAjMzIzCisgICAgMHhDMUExLCAvLyDshqEsICMyMDMKKyAgICAweEMxQzQsIC8vIOyHhCwgIzUwMQorICAgIDB4QzFGQywgLy8g7Ie8LCAjMzY0CisgICAgMHhDMjE4LCAvLyDsiJgsICMyNworICAgIDB4QzIxOSwgLy8g7IiZLCAjNDY3CisgICAgMHhDMjFDLCAvLyDsiJwsICMyNTgKKyAgICAweEMyMjAsIC8vIOyIoCwgIzMwMgorICAgIDB4QzI2QywgLy8g7ImsLCAjNTExCisgICAgMHhDMjg4LCAvLyDsiogsICMzODQKKyAgICAweEMyQTQsIC8vIOyKpCwgIzExCisgICAgMHhDMkFDLCAvLyDsiqwsICM0MzgKKyAgICAweEMyQjQsIC8vIOyKtCwgIzUwNAorICAgIDB4QzJCNSwgLy8g7Iq1LCAjNzcKKyAgICAweEMyQjksIC8vIOyKuSwgIzI5OQorICAgIDB4QzJEQywgLy8g7IucLCAjMTMKKyAgICAweEMyREQsIC8vIOyLnSwgIzEzNworICAgIDB4QzJFMCwgLy8g7IugLCAjNDcKKyAgICAweEMyRTQsIC8vIOyLpCwgIzEzMgorICAgIDB4QzJFQywgLy8g7IusLCAjMTk2CisgICAgMHhDMkVELCAvLyDsi60sICM0ODIKKyAgICAweEMyRjYsIC8vIOyLtiwgIzM1MgorICAgIDB4QzJGOCwgLy8g7Iu4LCAjNDE5CisgICAgMHhDNEYwLCAvLyDsk7AsICMyNzgKKyAgICAweEM1MjgsIC8vIOyUqCwgIzM2MAorICAgIDB4QzU0NCwgLy8g7JWELCAjMjMKKyAgICAweEM1NDUsIC8vIOyVhSwgIzI5NgorICAgIDB4QzU0OCwgLy8g7JWILCAjNzEKKyAgICAweEM1NEEsIC8vIOyViiwgIzIwOQorICAgIDB4QzU0QywgLy8g7JWMLCAjMjIyCisgICAgMHhDNTU0LCAvLyDslZQsICM0NjAKKyAgICAweEM1NTgsIC8vIOyVmCwgIzM0OQorICAgIDB4QzU1OSwgLy8g7JWZLCAjNDczCisgICAgMHhDNTVFLCAvLyDslZ4sICM0MzQKKyAgICAweEM1NjAsIC8vIOyVoCwgIzI3MQorICAgIDB4QzU2MSwgLy8g7JWhLCAjNDE1CisgICAgMHhDNTcxLCAvLyDslbEsICM0NzcKKyAgICAweEM1N0MsIC8vIOyVvCwgIzEyNAorICAgIDB4QzU3RCwgLy8g7JW9LCAjMjI5CisgICAgMHhDNTkxLCAvLyDslpEsICMxNzcKKyAgICAweEM1QjQsIC8vIOyWtCwgIzI0CisgICAgMHhDNUI1LCAvLyDslrUsICM0MDcKKyAgICAweEM1QjgsIC8vIOyWuCwgIzI5NAorICAgIDB4QzVCQywgLy8g7Ja8LCAjMzU2CisgICAgMHhDNUM0LCAvLyDsl4QsICM0MjYKKyAgICAweEM1QzUsIC8vIOyXhSwgIzExOAorICAgIDB4QzVDNiwgLy8g7JeGLCAjMTc4CisgICAgMHhDNUM4LCAvLyDsl4gsICMxNjUKKyAgICAweEM1RDAsIC8vIOyXkCwgIzkKKyAgICAweEM1RDQsIC8vIOyXlCwgIzM3NQorICAgIDB4QzVEOCwgLy8g7JeYLCAjNTA2CisgICAgMHhDNUVDLCAvLyDsl6wsICM2NgorICAgIDB4QzVFRCwgLy8g7JetLCAjMTg2CisgICAgMHhDNUVFLCAvLyDsl64sICM0ODgKKyAgICAweEM1RjAsIC8vIOyXsCwgIzk2CisgICAgMHhDNUY0LCAvLyDsl7QsICMyNjYKKyAgICAweEM1RkMsIC8vIOyXvCwgIzQ0OQorICAgIDB4QzYwMCwgLy8g7JiALCAjMzc0CisgICAgMHhDNjAxLCAvLyDsmIEsICM4MworICAgIDB4QzYwOCwgLy8g7JiILCAjMTY4CisgICAgMHhDNjI0LCAvLyDsmKQsICM3NQorICAgIDB4QzYyOCwgLy8g7JioLCAjMzAwCisgICAgMHhDNjJDLCAvLyDsmKwsICMzMDYKKyAgICAweEM2NDAsIC8vIOyZgCwgIzExOQorICAgIDB4QzY0NCwgLy8g7JmELCAjMzYxCisgICAgMHhDNjU0LCAvLyDsmZQsICM0ODkKKyAgICAweEM2NTUsIC8vIOyZlSwgIzQxOAorICAgIDB4QzY3OCwgLy8g7Jm4LCAjMjE4CisgICAgMHhDNjk0LCAvLyDsmpQsICM0MworICAgIDB4QzY5NSwgLy8g7JqVLCAjNDc5CisgICAgMHhDNkE5LCAvLyDsmqksICM0OAorICAgIDB4QzZCMCwgLy8g7JqwLCAjNjQKKyAgICAweEM2QjEsIC8vIOyasSwgIzUwMworICAgIDB4QzZCNCwgLy8g7Jq0LCAjMTA4CisgICAgMHhDNkI4LCAvLyDsmrgsICMyMjMKKyAgICAweEM2QzAsIC8vIOybgCwgIzMxNworICAgIDB4QzZDMywgLy8g7JuDLCAjNDA0CisgICAgMHhDNkNDLCAvLyDsm4wsICMyODAKKyAgICAweEM2RDAsIC8vIOybkCwgIzQ1CisgICAgMHhDNkQ0LCAvLyDsm5QsICMxNTAKKyAgICAweEM2RTgsIC8vIOybqCwgIzQ0NgorICAgIDB4QzZGOSwgLy8g7Ju5LCAjNTAwCisgICAgMHhDNzA0LCAvLyDsnIQsICM3OAorICAgIDB4QzcyMCwgLy8g7JygLCAjODEKKyAgICAweEM3MjEsIC8vIOycoSwgIzMyMQorICAgIDB4QzcyNCwgLy8g7JykLCAjNDE2CisgICAgMHhDNzNDLCAvLyDsnLwsICM0OQorICAgIDB4Qzc0MCwgLy8g7J2ALCAjMzEKKyAgICAweEM3NDQsIC8vIOydhCwgIzE3CisgICAgMHhDNzRDLCAvLyDsnYwsICMxMTIKKyAgICAweEM3NTEsIC8vIOydkSwgIzQ2MQorICAgIDB4Qzc1OCwgLy8g7J2YLCAjOAorICAgIDB4Qzc3NCwgLy8g7J20LCAjMQorICAgIDB4Qzc3NSwgLy8g7J21LCAjNDAzCisgICAgMHhDNzc4LCAvLyDsnbgsICMxOAorICAgIDB4Qzc3QywgLy8g7J28LCAjMjgKKyAgICAweEM3ODQsIC8vIOyehCwgIzE2MAorICAgIDB4Qzc4NSwgLy8g7J6FLCAjOTMKKyAgICAweEM3ODgsIC8vIOyeiCwgIzQ0CisgICAgMHhDNzkwLCAvLyDsnpAsICMyMgorICAgIDB4Qzc5MSwgLy8g7J6RLCAjODgKKyAgICAweEM3OTgsIC8vIOyemCwgIzM0NworICAgIDB4QzdBMSwgLy8g7J6hLCAjMzcyCisgICAgMHhDN0E1LCAvLyDsnqUsICM1MworICAgIDB4QzdBQywgLy8g7J6sLCAjMTIwCisgICAgMHhDN0MxLCAvLyDsn4EsICM0ODMKKyAgICAweEM4MDAsIC8vIOyggCwgIzk4CisgICAgMHhDODAxLCAvLyDsoIEsICM5NworICAgIDB4QzgwNCwgLy8g7KCELCAjMzQKKyAgICAweEM4MDgsIC8vIOygiCwgIzMyMAorICAgIDB4QzgxMCwgLy8g7KCQLCAjMjAxCisgICAgMHhDODExLCAvLyDsoJEsICMzMzEKKyAgICAweEM4MTUsIC8vIOyglSwgIzI2CisgICAgMHhDODFDLCAvLyDsoJwsICMyOQorICAgIDB4QzgzOCwgLy8g7KC4LCAjNDE0CisgICAgMHhDODcwLCAvLyDsobAsICM4NgorICAgIDB4Qzg3MSwgLy8g7KGxLCAjMzczCisgICAgMHhDODc0LCAvLyDsobQsICM0MzIKKyAgICAweEM4ODAsIC8vIOyigCwgIzQ3MAorICAgIDB4Qzg4NSwgLy8g7KKFLCAjMjA4CisgICAgMHhDODhCLCAvLyDsoossICMyMzkKKyAgICAweEM4RTAsIC8vIOyjoCwgIzQ1MQorICAgIDB4QzhGQywgLy8g7KO8LCAjMzgKKyAgICAweEM4RkQsIC8vIOyjvSwgIzQ3MQorICAgIDB4QzkwMCwgLy8g7KSALCAjMjg2CisgICAgMHhDOTA0LCAvLyDspIQsICMzOTIKKyAgICAweEM5MTEsIC8vIOykkSwgIzEwMworICAgIDB4Qzk4OCwgLy8g7KaILCAjMjU1CisgICAgMHhDOThDLCAvLyDspowsICM1MDcKKyAgICAweEM5OTAsIC8vIOymkCwgIzM3MQorICAgIDB4Qzk5RCwgLy8g7KadLCAjMjYwCisgICAgMHhDOUMwLCAvLyDsp4AsICMxMAorICAgIDB4QzlDMSwgLy8g7KeBLCAjMjE2CisgICAgMHhDOUM0LCAvLyDsp4QsICM3OQorICAgIDB4QzlDOCwgLy8g7KeILCAjMjM4CisgICAgMHhDOUQxLCAvLyDsp5EsICMyMDYKKyAgICAweEM5REMsIC8vIOynnCwgIzQxMQorICAgIDB4QzlGOCwgLy8g7Ke4LCAjNDk0CisgICAgMHhDQUJELCAvLyDsqr0sICM0MzUKKyAgICAweENDMjgsIC8vIOywqCwgIzE0NgorICAgIDB4Q0MyOSwgLy8g7LCpLCAjNDQzCisgICAgMHhDQzJDLCAvLyDssKwsICM0ODEKKyAgICAweENDMzAsIC8vIOywsCwgIzQ0MAorICAgIDB4Q0MzOCwgLy8g7LC4LCAjMzQzCisgICAgMHhDQzNELCAvLyDssL0sICMzMDQKKyAgICAweENDM0UsIC8vIOywviwgIzMzNQorICAgIDB4Q0M0NCwgLy8g7LGELCAjMjg0CisgICAgMHhDQzQ1LCAvLyDssYUsICMyOTgKKyAgICAweENDOTgsIC8vIOyymCwgIzI0MgorICAgIDB4Q0M5QywgLy8g7LKcLCAjMTQzCisgICAgMHhDQ0EwLCAvLyDssqAsICMzODAKKyAgICAweENDQTgsIC8vIOyyqCwgIzQ1MgorICAgIDB4Q0NBQiwgLy8g7LKrLCAjNDg0CisgICAgMHhDQ0FELCAvLyDssq0sICMxOTcKKyAgICAweENDQjQsIC8vIOyytCwgIzEyNgorICAgIDB4Q0NEMCwgLy8g7LOQLCAjNDcyCisgICAgMHhDRDA4LCAvLyDstIgsICMyMjAKKyAgICAweENEMUQsIC8vIOy0nSwgIzQwNgorICAgIDB4Q0Q1QywgLy8g7LWcLCAjMTc5CisgICAgMHhDRDk0LCAvLyDstpQsICMxMzYKKyAgICAweENEOTUsIC8vIOy2lSwgIzMzNworICAgIDB4Q0Q5QywgLy8g7LacLCAjMTY2CisgICAgMHhDREE5LCAvLyDstqksICMzNjkKKyAgICAweENERTgsIC8vIOy3qCwgIzIxMAorICAgIDB4Q0UyMCwgLy8g7LigLCAjMjE1CisgICAgMHhDRTIxLCAvLyDsuKEsICM0NjgKKyAgICAweENFMzUsIC8vIOy4tSwgIzUxMgorICAgIDB4Q0U1OCwgLy8g7LmYLCAjMTAyCisgICAgMHhDRTVDLCAvLyDsuZwsICMzMjUKKyAgICAweENFNjgsIC8vIOy5qCwgIzI2MworICAgIDB4Q0U3NCwgLy8g7Lm0LCAjMTE1CisgICAgMHhDRTdDLCAvLyDsubwsICM0NjYKKyAgICAweENFOTAsIC8vIOy6kCwgIzQ1NAorICAgIDB4Q0VFNCwgLy8g7LukLCAjMjg1CisgICAgMHhDRUU4LCAvLyDsu6gsICMzMjgKKyAgICAweENFRjQsIC8vIOy7tCwgIzQxNworICAgIDB4Q0YwMCwgLy8g7LyALCAjMzM5CisgICAgMHhDRjEzLCAvLyDsvJMsICM1MDkKKyAgICAweENGMUMsIC8vIOy8nCwgIzUwOAorICAgIDB4Q0Y1NCwgLy8g7L2ULCAjMTkzCisgICAgMHhDRjU4LCAvLyDsvZgsICMzOTEKKyAgICAweENGRTAsIC8vIOy/oCwgIzM5MworICAgIDB4RDAzNSwgLy8g7YC1LCAjNDUzCisgICAgMHhEMDZDLCAvLyDtgawsICMxMDEKKyAgICAweEQwNzAsIC8vIO2BsCwgIzQ5NQorICAgIDB4RDA3NCwgLy8g7YG0LCAjMjg5CisgICAgMHhEMEE0LCAvLyDtgqQsICMyMzAKKyAgICAweEQwQzAsIC8vIO2DgCwgIzEyNworICAgIDB4RDBDMSwgLy8g7YOBLCAjMzE0CisgICAgMHhEMEM0LCAvLyDtg4QsICM0NTAKKyAgICAweEQwQzgsIC8vIO2DiCwgIzQzNgorICAgIDB4RDBEQywgLy8g7YOcLCAjMjIxCisgICAgMHhEMERELCAvLyDtg50sICMyNzUKKyAgICAweEQxMzAsIC8vIO2EsCwgIzcwCisgICAgMHhEMTRDLCAvLyDthYwsICMyMTMKKyAgICAweEQxNTAsIC8vIO2FkCwgIzMyNAorICAgIDB4RDE1NCwgLy8g7YWULCAjNDMwCisgICAgMHhEMTVDLCAvLyDthZwsICMzODIKKyAgICAweEQxQTAsIC8vIO2GoCwgIzE0NQorICAgIDB4RDFCNSwgLy8g7Ya1LCAjMTU2CisgICAgMHhEMjJDLCAvLyDtiKwsICMyMjcKKyAgICAweEQyQjgsIC8vIO2KuCwgIzM3CisgICAgMHhEMkI5LCAvLyDtirksICMyNDcKKyAgICAweEQyRjAsIC8vIO2LsCwgIzE4NworICAgIDB4RDMwNSwgLy8g7YyFLCAjNDEwCisgICAgMHhEMzBDLCAvLyDtjIwsICMxNDEKKyAgICAweEQzMTAsIC8vIO2MkCwgIzE2MworICAgIDB4RDMxNCwgLy8g7YyULCAjNDk5CisgICAgMHhEMzI4LCAvLyDtjKgsICMzMDcKKyAgICAweEQzMkMsIC8vIO2MrCwgIzQ1OQorICAgIDB4RDMzOCwgLy8g7Yy4LCAjNDMzCisgICAgMHhEMzdDLCAvLyDtjbwsICMzNDQKKyAgICAweEQzOTgsIC8vIO2OmCwgIzE3MgorICAgIDB4RDNCOCwgLy8g7Y64LCAjMjUxCisgICAgMHhEM0M5LCAvLyDtj4ksICMyOTEKKyAgICAweEQzRUMsIC8vIO2PrCwgIzY4CisgICAgMHhEM0VELCAvLyDtj60sICM0NDUKKyAgICAweEQzRjAsIC8vIO2PsCwgIzMxOAorICAgIDB4RDQ1QywgLy8g7ZGcLCAjMjMyCisgICAgMHhENDgwLCAvLyDtkoAsICM0OTcKKyAgICAweEQ0ODgsIC8vIO2SiCwgIzExMworICAgIDB4RDQ4RCwgLy8g7ZKNLCAjNDI1CisgICAgMHhENTA0LCAvLyDtlIQsICMxMTAKKyAgICAweEQ1MDgsIC8vIO2UiCwgIzQ5OAorICAgIDB4RDUwQywgLy8g7ZSMLCAjMjExCisgICAgMHhENTNDLCAvLyDtlLwsICMxNjkKKyAgICAweEQ1NDQsIC8vIO2VhCwgIzI5NQorICAgIDB4RDU1MSwgLy8g7ZWRLCAjMzc2CisgICAgMHhENTU4LCAvLyDtlZgsICM3CisgICAgMHhENTU5LCAvLyDtlZksICMxMjkKKyAgICAweEQ1NUMsIC8vIO2VnCwgIzE1CisgICAgMHhENTYwLCAvLyDtlaAsICMxNDQKKyAgICAweEQ1NjgsIC8vIO2VqCwgIzE1MgorICAgIDB4RDU2OSwgLy8g7ZWpLCAjMTIzCisgICAgMHhENTZELCAvLyDtla0sICMyNjgKKyAgICAweEQ1NzQsIC8vIO2VtCwgIzMyCisgICAgMHhENTg4LCAvLyDtlogsICMxODAKKyAgICAweEQ1ODksIC8vIO2WiSwgIzEzNQorICAgIDB4RDVBNSwgLy8g7ZalLCAjMzQ1CisgICAgMHhENUM4LCAvLyDtl4gsICMzOTYKKyAgICAweEQ1RDgsIC8vIO2XmCwgIzMxNgorICAgIDB4RDVFNCwgLy8g7ZekLCAjNDc0CisgICAgMHhENjA0LCAvLyDtmIQsICMxODUKKyAgICAweEQ2MTEsIC8vIO2YkSwgIzMxNQorICAgIDB4RDYxNSwgLy8g7ZiVLCAjMjQ0CisgICAgMHhENjFDLCAvLyDtmJwsICM0MjgKKyAgICAweEQ2MzgsIC8vIO2YuCwgIzExNworICAgIDB4RDYzQywgLy8g7Zi8LCAjMzU4CisgICAgMHhENjQ4LCAvLyDtmYgsICMzMzAKKyAgICAweEQ2NEQsIC8vIO2ZjSwgIzM2MworICAgIDB4RDY1NCwgLy8g7ZmULCAjNjMKKyAgICAweEQ2NTUsIC8vIO2ZlSwgIzE4MworICAgIDB4RDY1OCwgLy8g7ZmYLCAjMjI0CisgICAgMHhENjVDLCAvLyDtmZwsICMyNzcKKyAgICAweEQ2NjksIC8vIO2ZqSwgIzM1MworICAgIDB4RDY4QywgLy8g7ZqMLCAjNzQKKyAgICAweEQ2OEQsIC8vIO2ajSwgIzQ1OAorICAgIDB4RDY5RiwgLy8g7ZqfLCAjNDA5CisgICAgMHhENkE4LCAvLyDtmqgsICM0MDAKKyAgICAweEQ2QzQsIC8vIO2bhCwgIzE3NgorICAgIDB4RDZDOCwgLy8g7ZuILCAjNDg2CisgICAgMHhENzM0LCAvLyDtnLQsICMzNjUKKyAgICAweEQ3NTQsIC8vIO2dlCwgIzQ4MAorICAgIDB4RDc2QywgLy8g7Z2sLCAjMzM0CisgICAgMHhENzg4LCAvLyDtnogsICMyMjgKKyAgICAweEQ3OTgsIC8vIO2emCwgIzUwMgorfTsKKy8vIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzYW1wbGUgY292ZXJlZCBieSB0aGUgYWJvdmUgY2hhcmFjdGVycworc3RhdGljIGNvbnN0IGZsb2F0IGZyZXF1ZW50X2tvX2NvdmVyYWdlPTAuOTQ4MTU3MDIxNDY0MTg0OworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDg2ZmY4YmQuLmViODEzYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC01OCw3ICs1OCw3IEBACiAgICAgUkVTVE9SRV9PVVRQVVQsCiAgICAgT1BFTl9JTlBVVCwKICAgICBDTE9TRV9JTlBVVCwKLSAgICBTRVRfU1RSRUFNX09VVFBVVCwKKyAgICBJTlZBTElEQVRFX1NUUkVBTSwKICAgICBTRVRfVk9JQ0VfVk9MVU1FLAogICAgIEdFVF9SRU5ERVJfUE9TSVRJT04sCiAgICAgR0VUX0lOUFVUX0ZSQU1FU19MT1NULApAQCAtODksMTMgKzg5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogICAgIHsKQEAgLTEwNiw5ICsxMDUsMTEgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBwRnJhbWVDb3VudCAhPSBOVUxMID8gKnBGcmFtZUNvdW50IDogMDsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZyYW1lQ291bnQpOwogICAgICAgICB0cmFja19mbGFnc190IGxGbGFncyA9IGZsYWdzICE9IE5VTEwgPyAqZmxhZ3MgOiAodHJhY2tfZmxhZ3NfdCkgVFJBQ0tfREVGQVVMVDsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGxGbGFncyk7CisgICAgICAgIC8vIGhhdmVTaGFyZWRCdWZmZXIKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIodHJ1ZSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNoYXJlZEJ1ZmZlci0+YXNCaW5kZXIoKSk7CkBAIC0xMTcsNyArMTE4LDcgQEAKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdGlkKTsKLSAgICAgICAgaW50IGxTZXNzaW9uSWQgPSAwOworICAgICAgICBpbnQgbFNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEU7CiAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CiAgICAgICAgIH0KQEAgLTEyNyw2ICsxMjgsMTAgQEAKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayBlcnJvcjogJXMiLCBzdHJlcnJvcigtbFN0YXR1cykpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJhbWVDb3VudCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKHBGcmFtZUNvdW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqcEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICAgICAgICAgfQogICAgICAgICAgICAgbEZsYWdzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpZiAoZmxhZ3MgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpmbGFncyA9IGxGbGFnczsKQEAgLTEzNSwxMSArMTQwLDIxIEBACiAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqc2Vzc2lvbklkID0gbFNlc3Npb25JZDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSByZXBseS5yZWFkU3RyaW5nOCgpOwogICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdHJhY2sgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9UcmFjaz4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIHNob3VsZCBoYXZlIHJldHVybmVkIGFuIElBdWRpb1RyYWNrIik7CisgICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIHJldHVybmVkIGFuIElBdWRpb1RyYWNrIGJ1dCB3aXRoIHN0YXR1cyAlZCIsIGxTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB0cmFjay5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRyYWNrOwpAQCAtMTUwLDcgKzE2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKQEAgLTE2MywxMSArMTc4LDEyIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gcEZyYW1lQ291bnQgIT0gTlVMTCA/ICpwRnJhbWVDb3VudCA6IDA7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmcmFtZUNvdW50KTsKICAgICAgICAgdHJhY2tfZmxhZ3NfdCBsRmxhZ3MgPSBmbGFncyAhPSBOVUxMID8gKmZsYWdzIDogKHRyYWNrX2ZsYWdzX3QpIFRSQUNLX0RFRkFVTFQ7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihsRmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHRpZCk7Ci0gICAgICAgIGludCBsU2Vzc2lvbklkID0gMDsKKyAgICAgICAgaW50IGxTZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFOwogICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9CkBAIC0xNzYsNiArMTkyLDEwIEBACiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCBlcnJvcjogJXMiLCBzdHJlcnJvcigtbFN0YXR1cykpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJhbWVDb3VudCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKHBGcmFtZUNvdW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqcEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICAgICAgICAgfQogICAgICAgICAgICAgbEZsYWdzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpZiAoZmxhZ3MgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpmbGFncyA9IGxGbGFnczsKQEAgLTE5OCw3ICsyMTgsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlY29yZDsKQEAgLTM5MSw3ICs0MTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gcERldmljZXMgIT0gTlVMTCA/ICpwRGV2aWNlcyA6IChhdWRpb19kZXZpY2VzX3QpMDsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBwRGV2aWNlcyAhPSBOVUxMID8gKnBEZXZpY2VzIDogQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IHBTYW1wbGluZ1JhdGUgIT0gTlVMTCA/ICpwU2FtcGxpbmdSYXRlIDogMDsKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcEZvcm1hdCAhPSBOVUxMID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBwQ2hhbm5lbE1hc2sgIT0gTlVMTCA/CkBAIC00MDUsNiArNDI1LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGxhdGVuY3kpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGZsYWdzKTsKKyAgICAgICAgLy8gaGFzT2ZmbG9hZEluZm8KICAgICAgICAgaWYgKG9mZmxvYWRJbmZvID09IE5VTEwpIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTQxNSwxNSArNDM2LDI1IEBACiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgcmV0dXJuZWQgb3V0cHV0LCAlZCIsIG91dHB1dCk7CiAgICAgICAgIGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocERldmljZXMgIT0gTlVMTCkgKnBEZXZpY2VzID0gZGV2aWNlczsKKyAgICAgICAgaWYgKHBEZXZpY2VzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpwRGV2aWNlcyA9IGRldmljZXM7CisgICAgICAgIH0KICAgICAgICAgc2FtcGxpbmdSYXRlID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpICpwU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgICAgICBpZiAocFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqcFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICAgICAgfQogICAgICAgICBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSAqcEZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgaWYgKHBGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICAgICAgKnBGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIH0KICAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgKnBDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICBpZiAocENoYW5uZWxNYXNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpwQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgfQogICAgICAgICBsYXRlbmN5ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwTGF0ZW5jeU1zICE9IE5VTEwpICpwTGF0ZW5jeU1zID0gbGF0ZW5jeTsKKyAgICAgICAgaWYgKHBMYXRlbmN5TXMgIT0gTlVMTCkgeworICAgICAgICAgICAgKnBMYXRlbmN5TXMgPSBsYXRlbmN5OworICAgICAgICB9CiAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgfQogCkBAIC00NzIsNyArNTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IHBEZXZpY2VzICE9IE5VTEwgPyAqcERldmljZXMgOiAoYXVkaW9fZGV2aWNlc190KTA7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gcERldmljZXMgIT0gTlVMTCA/ICpwRGV2aWNlcyA6IEFVRElPX0RFVklDRV9OT05FOwogICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBwU2FtcGxpbmdSYXRlICE9IE5VTEwgPyAqcFNhbXBsaW5nUmF0ZSA6IDA7CiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHBGb3JtYXQgIT0gTlVMTCA/ICpwRm9ybWF0IDogQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gcENoYW5uZWxNYXNrICE9IE5VTEwgPwpAQCAtNDg3LDEzICs1MTgsMjEgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgZGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwRGV2aWNlcyAhPSBOVUxMKSAqcERldmljZXMgPSBkZXZpY2VzOworICAgICAgICBpZiAocERldmljZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgKnBEZXZpY2VzID0gZGV2aWNlczsKKyAgICAgICAgfQogICAgICAgICBzYW1wbGluZ1JhdGUgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgKnBTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpwU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgICAgICB9CiAgICAgICAgIGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwRm9ybWF0ICE9IE5VTEwpICpwRm9ybWF0ID0gZm9ybWF0OworICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAqcEZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgfQogICAgICAgICBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBDaGFubmVsTWFzayAhPSBOVUxMKSAqcENoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgeworICAgICAgICAgICAgKnBDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICB9CiAKQEAgLTUwNiwxMyArNTQ1LDEyIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1NUUkVBTV9PVVRQVVQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChJTlZBTElEQVRFX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIApAQCAtNTM1LDExICs1NzMsMTEgQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHVpbnQzMl90IHRtcCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGhhbEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGhhbEZyYW1lcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmhhbEZyYW1lcyA9IHRtcDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRtcCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGRzcEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGRzcEZyYW1lcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IHRtcDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTUxLDggKzU4OSwxMSBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGlvSGFuZGxlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlBVVF9GUkFNRVNfTE9TVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lOUFVUX0ZSQU1FU19MT1NULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIGludCBuZXdBdWRpb1Nlc3Npb25JZCgpCkBAIC01NjAsMjYgKzYwMSwyOCBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTkVXX0FVRElPX1NFU1NJT05fSUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGludCBpZCA9IDA7CisgICAgICAgIGludCBpZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEU7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlkID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikKKyAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIGludCBwaWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBQ1FVSVJFX0FVRElPX1NFU1NJT05fSUQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgaW50IHBpZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fU0VTU0lPTl9JRCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTY1Nyw3ICs3MDAsNyBAQAogCiAgICAgICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gZWZmZWN0OwotICAgICAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjc1LDcgKzcxOCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoaWQpIHsKKyAgICAgICAgICAgIGlmIChpZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmlkID0gdG1wOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG1wID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC02ODUsNyArNzI4LDcgQEAKICAgICAgICAgICAgIGVmZmVjdCA9IGludGVyZmFjZV9jYXN0PElFZmZlY3Q+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXBseS5yZWFkKHBEZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICAgICAgfQogCkBAIC03NjUsNyArODA4LDYgQEAKICAgICAgICAgICAgIHBpZF90IHRpZCA9IChwaWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IGNsaWVudFVpZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBTdHJpbmc4IG5hbWU7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgICAgICAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2s7CiAgICAgICAgICAgICBpZiAoKGhhdmVTaGFyZWRCdWZmZXIgJiYgKGJ1ZmZlciA9PSAwKSkgfHwKQEAgLTc3NSwxMiArODE3LDEzIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRyYWNrID0gY3JlYXRlVHJhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsICZmbGFncywgYnVmZmVyLCBvdXRwdXQsIHRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uSWQsIG5hbWUsIGNsaWVudFVpZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgJmZyYW1lQ291bnQsICZmbGFncywgYnVmZmVyLCBvdXRwdXQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uSWQsIGNsaWVudFVpZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigodHJhY2sgIT0gMCkgIT0gKHN0YXR1cyA9PSBOT19FUlJPUikpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZnJhbWVDb3VudCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXNzaW9uSWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChuYW1lKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIodHJhY2stPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNzk3LDggKzg0MCw5IEBACiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKICAgICAgICAgICAgIHNwPElBdWRpb1JlY29yZD4gcmVjb3JkID0gb3BlblJlY29yZChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgJmZsYWdzLCB0aWQsICZzZXNzaW9uSWQsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCAmZnJhbWVDb3VudCwgJmZsYWdzLCB0aWQsICZzZXNzaW9uSWQsICZzdGF0dXMpOwogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigocmVjb3JkICE9IDApICE9IChzdGF0dXMgPT0gTk9fRVJST1IpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZyYW1lQ291bnQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CkBAIC05NDEsNyArOTg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGF0ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPZmZsb2FkSW5mbyA/ICZvZmZsb2FkSW5mbyA6IE5VTEwpOwotICAgICAgICAgICAgQUxPR1YoIk9QRU5fT1VUUFVUIG91dHB1dCwgJXAiLCBvdXRwdXQpOworICAgICAgICAgICAgQUxPR1YoIk9QRU5fT1VUUFVUIG91dHB1dCwgJWQiLCBvdXRwdXQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2VzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNhbXBsaW5nUmF0ZSk7CkBAIC05OTcsMTEgKzEwNDEsMTAgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNsb3NlSW5wdXQoKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1NUUkVBTV9PVVRQVVQ6IHsKKyAgICAgICAgY2FzZSBJTlZBTElEQVRFX1NUUkVBTTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRTdHJlYW1PdXRwdXQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSwgb3V0cHV0KSk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CkBAIC0xMDI2LDcgKzEwNjksNyBAQAogICAgICAgICBjYXNlIEdFVF9JTlBVVF9GUkFNRVNfTE9TVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0SW5wdXRGcmFtZXNMb3N0KGlvSGFuZGxlKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0SW5wdXRGcmFtZXNMb3N0KGlvSGFuZGxlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTkVXX0FVRElPX1NFU1NJT05fSUQ6IHsKQEAgLTEwMzcsMTMgKzEwODAsMTUgQEAKICAgICAgICAgY2FzZSBBQ1FVSVJFX0FVRElPX1NFU1NJT05fSUQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24pOworICAgICAgICAgICAgaW50IHBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uLCBwaWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fU0VTU0lPTl9JRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgICAgICBpbnQgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUVVFUllfTlVNX0VGRkVDVFM6IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggNGJlM2MwOS4uOWJiNGE0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTEzNyw2ICsxMzcsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90Pihmb3JtYXQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZmxhZ3MpKTsKKyAgICAgICAgLy8gaGFzT2ZmbG9hZEluZm8KICAgICAgICAgaWYgKG9mZmxvYWRJbmZvID09IE5VTEwpIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTQ3NiwxMCArNDc3LDExIEBACiAgICAgICAgIGNhc2UgU1RBUlRfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTQ4NywxMCArNDg5LDExIEBACiAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaW50IHNlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdG9wT3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC02MzMsNyArNjM2LDcgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAodWludDMyX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBpc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCkgc3RyZWFtLCBpblBhc3RNcykgKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBpc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC02NDEsNyArNjQ0LDcgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAodWludDMyX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW0sIGluUGFzdE1zKSApOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoc3RyZWFtLCBpblBhc3RNcykgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAKaW5kZXggNGE3ZGU2NS4uOTg2NmQ3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwCkBAIC01MCw2ICs1MCw5IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjYmxrOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcAppbmRleCAzY2Q5Y2ZkLi5mZmMyMWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCkBAIC02MCw2ICs2MCw5IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjYmxrOwogICAgIH0KQEAgLTEyMiw2ICsxMjUsOSBAQAogICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIgIT0gMCAmJiAoKmJ1ZmZlciktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVyKS5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcAppbmRleCBhMzAzYThmLi5iOTQwMTJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcApAQCAtMTE3LDYgKzExNyw5IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjYmxrOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKaW5kZXggOWRiNWIxYi4uMTBiNDkzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKQEAgLTc1LDcgKzc1LDcgQEAKIH0KIAogdm9pZAotSU1lZGlhRGVhdGhOb3RpZmllcjo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CitJTWVkaWFEZWF0aE5vdGlmaWVyOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKICAgICBBTE9HVygibWVkaWEgc2VydmVyIGRpZWQiKTsKIAogICAgIC8vIE5lZWQgdG8gZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhlbGQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI2ZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJJTWVkaWFIVFRQQ29ubmVjdGlvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBESVNDT05ORUNULAorICAgIFJFQURfQVQsCisgICAgR0VUX1NJWkUsCisgICAgR0VUX01JTUVfVFlQRSwKKyAgICBHRVRfVVJJCit9OworCitzdHJ1Y3QgQnBNZWRpYUhUVFBDb25uZWN0aW9uIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUhUVFBDb25uZWN0aW9uPiB7CisgICAgQnBNZWRpYUhUVFBDb25uZWN0aW9uKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUhUVFBDb25uZWN0aW9uPihpbXBsKSB7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIFN0cmluZzE2IHRtcCh1cmkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYodG1wKTsKKworICAgICAgICB0bXAgPSBTdHJpbmcxNigiIik7CisgICAgICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcxNiBrZXkoaGVhZGVycy0+a2V5QXQoaSkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIFN0cmluZzE2IHZhbChoZWFkZXJzLT52YWx1ZUF0KGkpLnN0cmluZygpKTsKKworICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoa2V5KTsKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzE2KCI6ICIpKTsKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKHZhbCk7CisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZChTdHJpbmcxNigiXHJcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYodG1wKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworCisgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKTsKKyAgICAgICAgbU1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGJpbmRlcik7CisKKyAgICAgICAgcmV0dXJuIG1NZW1vcnkgIT0gTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50NjQob2Zmc2V0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUFEX0FULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgicmVtb3RlIHJlYWRBdCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGxlbiA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLCBtTWVtb3J5LT5wb2ludGVyKCksIGxlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIHZpcnR1YWwgb2ZmNjRfdCBnZXRTaXplKCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NJWkUsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDY0KCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNSU1FVHlwZShTdHJpbmc4ICptaW1lVHlwZSkgeworICAgICAgICAqbWltZVR5cGUgPSBTdHJpbmc4KCIiKTsKKworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01JTUVfVFlQRSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworCisgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgICptaW1lVHlwZSA9IFN0cmluZzgocmVwbHkucmVhZFN0cmluZzE2KCkpOworCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVyaShTdHJpbmc4ICp1cmkpIHsKKyAgICAgICAgKnVyaSA9IFN0cmluZzgoIiIpOworCisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfVVJJLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKnVyaSA9IFN0cmluZzgocmVwbHkucmVhZFN0cmluZzE2KCkpOworCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRSgKKyAgICAgICAgTWVkaWFIVFRQQ29ubmVjdGlvbiwgImFuZHJvaWQubWVkaWEuSU1lZGlhSFRUUENvbm5lY3Rpb24iKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNjA1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSU1lZGlhSFRUUFNlcnZpY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgTUFLRV9IVFRQID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKK307CisKK3N0cnVjdCBCcE1lZGlhSFRUUFNlcnZpY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhSFRUUFNlcnZpY2U+IHsKKyAgICBCcE1lZGlhSFRUUFNlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4gJmltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SU1lZGlhSFRUUFNlcnZpY2U+KGltcGwpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBtYWtlSFRUUENvbm5lY3Rpb24oKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNQUtFX0hUVFAsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUENvbm5lY3Rpb24+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKAorICAgICAgICBNZWRpYUhUVFBTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFIVFRQU2VydmljZSIpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggYmIwNjZhMC4uYzdkOWQ1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC04NCwxMCArODUsMTYgQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaHR0cFNlcnZpY2UgIT0gTlVMTCk7CisgICAgICAgIGlmIChodHRwU2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGh0dHBTZXJ2aWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhzcmNVcmwpOwogCiAgICAgICAgIGlmIChoZWFkZXJzID09IE5VTEwpIHsKQEAgLTE5NSw2ICsyMDIsMTMgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfREFUQV9TT1VSQ0VfVVJMOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBodHRwU2VydmljZSA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNyY1VybCA9IGRhdGEucmVhZENTdHJpbmcoKTsKIAogICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKQEAgLTIwNiw3ICsyMjAsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShzcmNVcmwsIG51bUhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKSk7CisgICAgICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBodHRwU2VydmljZSwgc3JjVXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCkpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCBlNzliY2QyLi5kNzc4ZDA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogCkBAIC03NSwxMSArNzYsMTcgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyKiB1cmwsCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiogaGVhZGVycykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGh0dHBTZXJ2aWNlICE9IE5VTEwpOworICAgICAgICBpZiAoaHR0cFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihodHRwU2VydmljZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodXJsKTsKICAgICAgICAgaWYgKGhlYWRlcnMgPT0gTlVMTCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwpAQCAtMzU1LDYgKzM2MiwxMyBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9VUkw6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBodHRwU2VydmljZSA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CiAgICAgICAgICAgICBpbnQzMl90IG51bUhlYWRlcnMgPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMzYzLDcgKzM3Nyw4IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKICAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZChrZXksIHZhbHVlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2UodXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlLCB1cmwsIG51bUhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX0RBVEFfU09VUkNFX0ZEOiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDNjMjJiNGMuLmQxMTZiMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lEcm0uaD4KICNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgpAQCAtNDgsNyArNDksNiBAQAogICAgIEFERF9CQVRURVJZX0RBVEEsCiAgICAgUFVMTF9CQVRURVJZX0RBVEEsCiAgICAgTElTVEVOX0ZPUl9SRU1PVEVfRElTUExBWSwKLSAgICBVUERBVEVfUFJPWFlfQ09ORklHLAogfTsKIAogY2xhc3MgQnBNZWRpYVBsYXllclNlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFQbGF5ZXJTZXJ2aWNlPgpAQCAtODYsMTIgKzg2LDIxIEBACiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFSZWNvcmRlcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgICAgICBzaXplX3QgKnBTaXplKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGh0dHBTZXJ2aWNlICE9IE5VTEwpOworICAgICAgICBpZiAoaHR0cFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihodHRwU2VydmljZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodXJsKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihoZWFwLT5hc0JpbmRlcigpKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KERFQ09ERV9VUkwsIGRhdGEsICZyZXBseSk7CkBAIC0xODIsMjUgKzE5MSw2IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChMSVNURU5fRk9SX1JFTU9URV9ESVNQTEFZLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVJlbW90ZURpc3BsYXk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChob3N0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGhvc3QpOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnQpOwotICAgICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZXhjbHVzaW9uTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVVBEQVRFX1BST1hZX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKLQotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUGxheWVyU2VydmljZSwgImFuZHJvaWQubWVkaWEuSU1lZGlhUGxheWVyU2VydmljZSIpOwpAQCAtMjIyLDEzICsyMTIsMjUgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBERUNPREVfVVJMOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBodHRwU2VydmljZSA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGludGVyZmFjZV9jYXN0PElNZW1vcnlIZWFwPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlOwogICAgICAgICAgICAgaW50IG51bUNoYW5uZWxzOwogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OwogICAgICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZWNvZGUodXJsLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzLCAmZm9ybWF0LCBoZWFwLCAmc2l6ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgIGRlY29kZShodHRwU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICBoZWFwLAorICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNhbXBsZVJhdGUpOwpAQCAtMzE2LDI0ICszMTgsNiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGRpc3BsYXktPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFVQREFURV9QUk9YWV9DT05GSUc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QgPSBOVUxMOwotICAgICAgICAgICAgaW50MzJfdCBwb3J0ID0gMDsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QgPSBOVUxMOwotCi0gICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSkgewotICAgICAgICAgICAgICAgIGhvc3QgPSBkYXRhLnJlYWRDU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgZXhjbHVzaW9uTGlzdCA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCkpOwotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKaW5kZXggZTkxNGIzNC4uZjBmMTgzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgICAgICBwTGliQ29uZmlnLT5zYW1wbGVSYXRlLAogICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQocExpYkNvbmZpZy0+bnVtQ2hhbm5lbHMpLAotICAgICAgICAgICAgbVRyYWNrQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIChzaXplX3QpIG1UcmFja0J1ZmZlclNpemUsCiAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKIAogICAgIC8vIGNyZWF0ZSByZW5kZXIgYW5kIHBsYXliYWNrIHRocmVhZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCA4MzE5Y2Q3Li4xMDc0ZGE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcApAQCAtODEsOCArODEsMTQgQEAKICAgICB7InRpbWVsYXBzZXF2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FWR0F9LAogfTsKIAorI2lmIExPR19OREVCVUcKKyNkZWZpbmUgVU5VU0VEIF9fdW51c2VkCisjZWxzZQorI2RlZmluZSBVTlVTRUQKKyNlbmRpZgorCiAvKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvQ29kZWMoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyYgY29kZWMpCitNZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0NvZGVjKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMmIGNvZGVjIFVOVVNFRCkKIHsKICAgICBBTE9HVigidmlkZW8gY29kZWM6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjb2RlYy5tQ29kZWMpOwpAQCAtOTMsNyArOTksNyBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvQ29kZWMoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyYgY29kZWMpCitNZWRpYVByb2ZpbGVzOjpsb2dBdWRpb0NvZGVjKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvQ29kZWMmIGNvZGVjIFVOVVNFRCkKIHsKICAgICBBTE9HVigiYXVkaW8gY29kZWM6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjb2RlYy5tQ29kZWMpOwpAQCAtMTAzLDcgKzEwOSw3IEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRW5jb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRW5jb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigidmlkZW8gZW5jb2RlciBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKQEAgLTExNCw3ICsxMjAsNyBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvRW5jb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAmIGNhcCkKK01lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvRW5jb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAmIGNhcCBVTlVTRUQpCiB7CiAgICAgQUxPR1YoImF1ZGlvIGVuY29kZXIgY2FwOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY2FwLm1Db2RlYyk7CkBAIC0xMjQsMjEgKzEzMCwyMSBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvRGVjb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0RlY29kZXJDYXAmIGNhcCkKK01lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvRGVjb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0RlY29kZXJDYXAmIGNhcCBVTlVTRUQpCiB7CiAgICAgQUxPR1YoInZpZGVvIGRlY29kZXIgY2FwOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY2FwLm1Db2RlYyk7CiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRGVjb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRGVjb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigiYXVkaW8gY29kZWMgY2FwOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY2FwLm1Db2RlYyk7CiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FZGl0b3JDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FZGl0b3JDYXAmIGNhcCkKK01lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvRWRpdG9yQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRWRpdG9yQ2FwJiBjYXAgVU5VU0VEKQogewogICAgIEFMT0dWKCJ2aWRlb2VkaXRvciBjYXA6Iik7CiAgICAgQUxPR1YoIm1NYXhJbnB1dEZyYW1lV2lkdGggPSAlZCIsIGNhcC5tTWF4SW5wdXRGcmFtZVdpZHRoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCmluZGV4IDkzYTRhNGMuLjE2NjFmMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcApAQCAtMTQsMjE3ICsxNCw1NyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVNjYW5uZXJDbGllbnQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KIAorI2luY2x1ZGUgIkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaCIKICNpbmNsdWRlICJTdHJpbmdBcnJheS5oIgogCi0jaW5jbHVkZSAiYXV0b2RldGVjdC5oIgotI2luY2x1ZGUgInVuaWNvZGUvdWNudi5oIgotI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE1lZGlhU2Nhbm5lckNsaWVudDo6TWVkaWFTY2FubmVyQ2xpZW50KCkKLSAgICA6ICAgbU5hbWVzKE5VTEwpLAotICAgICAgICBtVmFsdWVzKE5VTEwpLAotICAgICAgICBtTG9jYWxlRW5jb2Rpbmcoa0VuY29kaW5nTm9uZSkKKyAgICA6ICAgbUVuY29kaW5nRGV0ZWN0b3IoTlVMTCkKIHsKIH0KIAogTWVkaWFTY2FubmVyQ2xpZW50Ojp+TWVkaWFTY2FubmVyQ2xpZW50KCkKIHsKLSAgICBkZWxldGUgbU5hbWVzOwotICAgIGRlbGV0ZSBtVmFsdWVzOworICAgIGRlbGV0ZSBtRW5jb2RpbmdEZXRlY3RvcjsKIH0KIAogdm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OnNldExvY2FsZShjb25zdCBjaGFyKiBsb2NhbGUpCiB7Ci0gICAgaWYgKCFsb2NhbGUpIHJldHVybjsKLQotICAgIGlmICghc3RybmNtcChsb2NhbGUsICJqYSIsIDIpKQotICAgICAgICBtTG9jYWxlRW5jb2RpbmcgPSBrRW5jb2RpbmdTaGlmdEpJUzsKLSAgICBlbHNlIGlmICghc3RybmNtcChsb2NhbGUsICJrbyIsIDIpKQotICAgICAgICBtTG9jYWxlRW5jb2RpbmcgPSBrRW5jb2RpbmdFVUNLUjsKLSAgICBlbHNlIGlmICghc3RybmNtcChsb2NhbGUsICJ6aCIsIDIpKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGxvY2FsZSwgInpoX0NOIikpIHsKLSAgICAgICAgICAgIC8vIHNpbXBsaWZpZWQgY2hpbmVzZSBmb3IgbWFpbmxhbmQgQ2hpbmEKLSAgICAgICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ0dCSzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGFzc3VtZSB0cmFkaXRpb25hbCBmb3Igbm9uLW1haW5sYW5kIENoaW5lc2UgbG9jYWxlcyAoVGFpd2FuLCBIb25nIEtvbmcsIFNpbmdhcG9yZSkKLSAgICAgICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ0JpZzU7Ci0gICAgICAgIH0KLSAgICB9CisgICAgbUxvY2FsZSA9IGxvY2FsZTsgLy8gbm90IGN1cnJlbnRseSB1c2VkCiB9CiAKIHZvaWQgTWVkaWFTY2FubmVyQ2xpZW50OjpiZWdpbkZpbGUoKQogewotICAgIG1OYW1lcyA9IG5ldyBTdHJpbmdBcnJheTsKLSAgICBtVmFsdWVzID0gbmV3IFN0cmluZ0FycmF5OworICAgIGRlbGV0ZSBtRW5jb2RpbmdEZXRlY3RvcjsKKyAgICBtRW5jb2RpbmdEZXRlY3RvciA9IG5ldyBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCk7CiB9CiAKIHN0YXR1c190IE1lZGlhU2Nhbm5lckNsaWVudDo6YWRkU3RyaW5nVGFnKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKQogewotICAgIGlmIChtTG9jYWxlRW5jb2RpbmcgIT0ga0VuY29kaW5nTm9uZSkgewotICAgICAgICAvLyBkb24ndCBib3RoZXIgY2FjaGluZyBzdHJpbmdzIHRoYXQgYXJlIGFsbCBBU0NJSS4KLSAgICAgICAgLy8gY2FsbCBoYW5kbGVTdHJpbmdUYWcgZGlyZWN0bHkgaW5zdGVhZC4KLSAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHZhbHVlICh3aGljaCBzaG91bGQgYmUgdXRmOCkgaGFzIGFueSBub24tQVNDSUkgY2hhcmFjdGVycwotICAgICAgICBib29sIG5vbkFzY2lpID0gZmFsc2U7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGNocCA9IHZhbHVlOwotICAgICAgICBjaGFyIGNoOwotICAgICAgICB3aGlsZSAoKGNoID0gKmNocCsrKSkgewotICAgICAgICAgICAgaWYgKGNoICYgMHg4MCkgewotICAgICAgICAgICAgICAgIG5vbkFzY2lpID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChub25Bc2NpaSkgewotICAgICAgICAgICAgLy8gc2F2ZSB0aGUgc3RyaW5ncyBmb3IgbGF0ZXIgc28gdGhleSBjYW4gYmUgdXNlZCBmb3IgbmF0aXZlIGVuY29kaW5nIGRldGVjdGlvbgotICAgICAgICAgICAgbU5hbWVzLT5wdXNoX2JhY2sobmFtZSk7Ci0gICAgICAgICAgICBtVmFsdWVzLT5wdXNoX2JhY2sodmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVsc2UgZmFsbCB0aHJvdWdoCi0gICAgfQotCi0gICAgLy8gYXV0b2RldGVjdGlvbiBpcyBub3QgbmVjZXNzYXJ5LCBzbyBubyBuZWVkIHRvIGNhY2hlIHRoZSB2YWx1ZXMKLSAgICAvLyBwYXNzIGRpcmVjdGx5IHRvIHRoZSBjbGllbnQgaW5zdGVhZAotICAgIHJldHVybiBoYW5kbGVTdHJpbmdUYWcobmFtZSwgdmFsdWUpOwotfQotCi1zdGF0aWMgdWludDMyX3QgcG9zc2libGVFbmNvZGluZ3MoY29uc3QgY2hhciogcykKLXsKLSAgICB1aW50MzJfdCByZXN1bHQgPSBrRW5jb2RpbmdBbGw7Ci0gICAgLy8gaWYgcyBjb250YWlucyBhIG5hdGl2ZSBlbmNvZGluZywgdGhlbiBpdCB3YXMgbWlzdGFrZW5seSBlbmNvZGVkIGluIHV0ZjggYXMgaWYgaXQgd2VyZSBsYXRpbi0xCi0gICAgLy8gc28gd2UgbmVlZCB0byByZXZlcnNlIHRoZSBsYXRpbi0xIC0+IHV0ZjggY29udmVyc2lvbiB0byBnZXQgdGhlIG5hdGl2ZSBjaGFycyBiYWNrCi0gICAgdWludDhfdCBjaDEsIGNoMjsKLSAgICB1aW50OF90KiBjaHAgPSAodWludDhfdCAqKXM7Ci0KLSAgICB3aGlsZSAoKGNoMSA9ICpjaHArKykpIHsKLSAgICAgICAgaWYgKGNoMSAmIDB4ODApIHsKLSAgICAgICAgICAgIGNoMiA9ICpjaHArKzsKLSAgICAgICAgICAgIGNoMSA9ICgoY2gxIDw8IDYpICYgMHhDMCkgfCAoY2gyICYgMHgzRik7Ci0gICAgICAgICAgICAvLyBjaDEgaXMgbm93IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBwb3RlbnRpYWwgbmF0aXZlIGNoYXIKLQotICAgICAgICAgICAgY2gyID0gKmNocCsrOwotICAgICAgICAgICAgaWYgKGNoMiAmIDB4ODApCi0gICAgICAgICAgICAgICAgY2gyID0gKChjaDIgPDwgNikgJiAweEMwKSB8ICgqY2hwKysgJiAweDNGKTsKLSAgICAgICAgICAgIC8vIGNoMiBpcyBub3cgdGhlIHNlY29uZCBieXRlIG9mIHRoZSBwb3RlbnRpYWwgbmF0aXZlIGNoYXIKLSAgICAgICAgICAgIGludCBjaCA9IChpbnQpY2gxIDw8IDggfCAoaW50KWNoMjsKLSAgICAgICAgICAgIHJlc3VsdCAmPSBmaW5kUG9zc2libGVFbmNvZGluZ3MoY2gpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVsc2UgQVNDSUkgY2hhcmFjdGVyLCB3aGljaCBjb3VsZCBiZSBhbnl0aGluZwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgTWVkaWFTY2FubmVyQ2xpZW50Ojpjb252ZXJ0VmFsdWVzKHVpbnQzMl90IGVuY29kaW5nKQotewotICAgIGNvbnN0IGNoYXIqIGVuYyA9IE5VTEw7Ci0gICAgc3dpdGNoIChlbmNvZGluZykgewotICAgICAgICBjYXNlIGtFbmNvZGluZ1NoaWZ0SklTOgotICAgICAgICAgICAgZW5jID0gInNoaWZ0LWppcyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBrRW5jb2RpbmdHQks6Ci0gICAgICAgICAgICBlbmMgPSAiZ2JrIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGtFbmNvZGluZ0JpZzU6Ci0gICAgICAgICAgICBlbmMgPSAiQmlnNSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBrRW5jb2RpbmdFVUNLUjoKLSAgICAgICAgICAgIGVuYyA9ICJFVUMtS1IiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGVuYykgewotICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKLQotICAgICAgICBVQ29udmVydGVyICpjb252ID0gdWNudl9vcGVuKGVuYywgJnN0YXR1cyk7Ci0gICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewotICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBjcmVhdGUgVUNvbnZlcnRlciBmb3IgJXMiLCBlbmMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFVDb252ZXJ0ZXIgKnV0ZjhDb252ID0gdWNudl9vcGVuKCJVVEYtOCIsICZzdGF0dXMpOwotICAgICAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yIFVURi04Iik7Ci0gICAgICAgICAgICB1Y252X2Nsb3NlKGNvbnYpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZm9yIGVhY2ggdmFsdWUgc3RyaW5nLCBjb252ZXJ0IGZyb20gbmF0aXZlIGVuY29kaW5nIHRvIFVURi04Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5hbWVzLT5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgLy8gZmlyc3Qgd2UgbmVlZCB0byB1bnRhbmdsZSB0aGUgdXRmOCBhbmQgY29udmVydCBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBieXRlcwotICAgICAgICAgICAgLy8gc2luY2Ugd2UgYXJlIHJlZHVjaW5nIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywgd2UgY2FuIGRvIHRoaXMgaW4gcGxhY2UKLSAgICAgICAgICAgIHVpbnQ4X3QqIHNyYyA9ICh1aW50OF90ICopbVZhbHVlcy0+Z2V0RW50cnkoaSk7Ci0gICAgICAgICAgICBpbnQgbGVuID0gc3RybGVuKChjaGFyICopc3JjKTsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QgPSBzcmM7Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgdWNoOwotICAgICAgICAgICAgd2hpbGUgKCh1Y2ggPSAqc3JjKyspKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVjaCAmIDB4ODApCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoKHVjaCA8PCA2KSAmIDB4QzApIHwgKCpzcmMrKyAmIDB4M0YpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHVjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpkZXN0ID0gMDsKLQotICAgICAgICAgICAgLy8gbm93IGNvbnZlcnQgZnJvbSBuYXRpdmUgZW5jb2RpbmcgdG8gVVRGLTgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNvdXJjZSA9IG1WYWx1ZXMtPmdldEVudHJ5KGkpOwotICAgICAgICAgICAgaW50IHRhcmdldExlbmd0aCA9IGxlbiAqIDMgKyAxOwotICAgICAgICAgICAgY2hhciogYnVmZmVyID0gbmV3IGNoYXJbdGFyZ2V0TGVuZ3RoXTsKLSAgICAgICAgICAgIC8vIGRvbid0IG5vcm1hbGx5IGNoZWNrIGZvciBOVUxMLCBidXQgaW4gdGhpcyBjYXNlIHRhcmdldExlbmd0aCBtYXkgYmUgbGFyZ2UKLSAgICAgICAgICAgIGlmICghYnVmZmVyKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2hhciogdGFyZ2V0ID0gYnVmZmVyOwotCi0gICAgICAgICAgICB1Y252X2NvbnZlcnRFeCh1dGY4Q29udiwgY29udiwgJnRhcmdldCwgdGFyZ2V0ICsgdGFyZ2V0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAmc291cmNlLCAoY29uc3QgY2hhciAqKWRlc3QsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIFRSVUUsIFRSVUUsICZzdGF0dXMpOwotICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInVjbnZfY29udmVydEV4IGZhaWxlZDogJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgIG1WYWx1ZXMtPnNldEVudHJ5KGksICI/Pz8iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gemVybyB0ZXJtaW5hdGUKLSAgICAgICAgICAgICAgICAqdGFyZ2V0ID0gMDsKLSAgICAgICAgICAgICAgICBtVmFsdWVzLT5zZXRFbnRyeShpLCBidWZmZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgIH0KLQotICAgICAgICB1Y252X2Nsb3NlKGNvbnYpOwotICAgICAgICB1Y252X2Nsb3NlKHV0ZjhDb252KTsKLSAgICB9CisgICAgbUVuY29kaW5nRGV0ZWN0b3ItPmFkZFRhZyhuYW1lLCB2YWx1ZSk7CisgICAgcmV0dXJuIE9LOwogfQogCiB2b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6ZW5kRmlsZSgpCiB7Ci0gICAgaWYgKG1Mb2NhbGVFbmNvZGluZyAhPSBrRW5jb2RpbmdOb25lKSB7Ci0gICAgICAgIGludCBzaXplID0gbU5hbWVzLT5zaXplKCk7Ci0gICAgICAgIHVpbnQzMl90IGVuY29kaW5nID0ga0VuY29kaW5nQWxsOworICAgIG1FbmNvZGluZ0RldGVjdG9yLT5kZXRlY3RBbmRDb252ZXJ0KCk7CiAKLSAgICAgICAgLy8gY29tcHV0ZSBhIGJpdCBtYXNrIGNvbnRhaW5pbmcgYWxsIHBvc3NpYmxlIGVuY29kaW5ncwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OYW1lcy0+c2l6ZSgpOyBpKyspCi0gICAgICAgICAgICBlbmNvZGluZyAmPSBwb3NzaWJsZUVuY29kaW5ncyhtVmFsdWVzLT5nZXRFbnRyeShpKSk7Ci0KLSAgICAgICAgLy8gaWYgdGhlIGxvY2FsZSBlbmNvZGluZyBtYXRjaGVzLCB0aGVuIGFzc3VtZSB3ZSBoYXZlIGEgbmF0aXZlIGVuY29kaW5nLgotICAgICAgICBpZiAoZW5jb2RpbmcgJiBtTG9jYWxlRW5jb2RpbmcpCi0gICAgICAgICAgICBjb252ZXJ0VmFsdWVzKG1Mb2NhbGVFbmNvZGluZyk7Ci0KLSAgICAgICAgLy8gZmluYWxseSwgcHVzaCBhbGwgbmFtZS92YWx1ZSBwYWlycyB0byB0aGUgY2xpZW50Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5hbWVzLT5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFuZGxlU3RyaW5nVGFnKG1OYW1lcy0+Z2V0RW50cnkoaSksIG1WYWx1ZXMtPmdldEVudHJ5KGkpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICBpbnQgc2l6ZSA9IG1FbmNvZGluZ0RldGVjdG9yLT5zaXplKCk7CisgICAgaWYgKHNpemUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKKyAgICAgICAgICAgIG1FbmNvZGluZ0RldGVjdG9yLT5nZXRUYWcoaSwgJm5hbWUsICZ2YWx1ZSk7CisgICAgICAgICAgICBoYW5kbGVTdHJpbmdUYWcobmFtZSwgdmFsdWUpOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIGVsc2UgYWRkU3RyaW5nVGFnKCkgaGFzIGRvbmUgYWxsIHRoZSB3b3JrIHNvIHdlIGhhdmUgbm90aGluZyB0byBkbwotCi0gICAgZGVsZXRlIG1OYW1lczsKLSAgICBkZWxldGUgbVZhbHVlczsKLSAgICBtTmFtZXMgPSBOVUxMOwotICAgIG1WYWx1ZXMgPSBOVUxMOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcCBiL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbC5jcHAKaW5kZXggMjJlOWZhZC4uYTU1ZTA5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2wuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjZGVmaW5lIFVTRV9TSEFSRURfTUVNX0JVRkZFUgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9Tb3VuZFBvb2wuaD4KICNpbmNsdWRlICJTb3VuZFBvb2xUaHJlYWQuaCIKQEAgLTE5OSw3ICsyMDAsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1pbnQgU291bmRQb29sOjpsb2FkKGNvbnN0IGNoYXIqIHBhdGgsIGludCBwcmlvcml0eSkKK2ludCBTb3VuZFBvb2w6OmxvYWQoY29uc3QgY2hhciogcGF0aCwgaW50IHByaW9yaXR5IF9fdW51c2VkKQogewogICAgIEFMT0dWKCJsb2FkOiBwYXRoPSVzLCBwcmlvcml0eT0lZCIsIHBhdGgsIHByaW9yaXR5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwpAQCAtMjA5LDcgKzIxMCw3IEBACiAgICAgcmV0dXJuIHNhbXBsZS0+c2FtcGxlSUQoKTsKIH0KIAotaW50IFNvdW5kUG9vbDo6bG9hZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IHByaW9yaXR5KQoraW50IFNvdW5kUG9vbDo6bG9hZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IHByaW9yaXR5IF9fdW51c2VkKQogewogICAgIEFMT0dWKCJsb2FkOiBmZD0lZCwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkLCBwcmlvcml0eT0lZCIsCiAgICAgICAgICAgICBmZCwgb2Zmc2V0LCBsZW5ndGgsIHByaW9yaXR5KTsKQEAgLTQ5Niw3ICs0OTcsMTQgQEAKIAogICAgIEFMT0dWKCJTdGFydCBkZWNvZGUiKTsKICAgICBpZiAobVVybCkgewotICAgICAgICBzdGF0dXMgPSBNZWRpYVBsYXllcjo6ZGVjb2RlKG1VcmwsICZzYW1wbGVSYXRlLCAmbnVtQ2hhbm5lbHMsICZmb3JtYXQsIG1IZWFwLCAmbVNpemUpOworICAgICAgICBzdGF0dXMgPSBNZWRpYVBsYXllcjo6ZGVjb2RlKAorICAgICAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sCisgICAgICAgICAgICAgICAgbVVybCwKKyAgICAgICAgICAgICAgICAmc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgJmZvcm1hdCwKKyAgICAgICAgICAgICAgICBtSGVhcCwKKyAgICAgICAgICAgICAgICAmbVNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHN0YXR1cyA9IE1lZGlhUGxheWVyOjpkZWNvZGUobUZkLCBtT2Zmc2V0LCBtTGVuZ3RoLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzLCAmZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFwLCAmbVNpemUpOwpAQCAtNTc5LDcgKzU4Nyw3IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSB1aW50MzJfdChmbG9hdChzYW1wbGUtPnNhbXBsZVJhdGUoKSkgKiByYXRlICsgMC41KTsKICAgICAgICAgdWludDMyX3QgdG90YWxGcmFtZXMgPSAoa0RlZmF1bHRCdWZmZXJDb3VudCAqIGFmRnJhbWVDb3VudCAqIHNhbXBsZVJhdGUpIC8gYWZTYW1wbGVSYXRlOwogICAgICAgICB1aW50MzJfdCBidWZmZXJGcmFtZXMgPSAodG90YWxGcmFtZXMgKyAoa0RlZmF1bHRCdWZmZXJDb3VudCAtIDEpKSAvIGtEZWZhdWx0QnVmZmVyQ291bnQ7Ci0gICAgICAgIHVpbnQzMl90IGZyYW1lQ291bnQgPSAwOworICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDA7CiAKICAgICAgICAgaWYgKGxvb3ApIHsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBzYW1wbGUtPnNpemUoKS9udW1DaGFubmVscy8KQEAgLTYwMCwxNiArNjA4LDE1IEBACiAgICAgICAgIC8vIHdyb25nIGF1ZGlvIGF1ZGlvIGJ1ZmZlciBzaXplICAobUF1ZGlvQnVmZmVyU2l6ZSkKICAgICAgICAgdW5zaWduZWQgbG9uZyB0b2dnbGUgPSBtVG9nZ2xlIF4gMTsKICAgICAgICAgdm9pZCAqdXNlckRhdGEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl0aGlzIHwgdG9nZ2xlKTsKLSAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAobnVtQ2hhbm5lbHMgPT0gMikgPwotICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyA6IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG51bUNoYW5uZWxzKTsKIAogICAgICAgICAvLyBkbyBub3QgY3JlYXRlIGEgbmV3IGF1ZGlvIHRyYWNrIGlmIGN1cnJlbnQgdHJhY2sgaXMgY29tcGF0aWJsZSB3aXRoIHNhbXBsZSBwYXJhbWV0ZXJzCiAjaWZkZWYgVVNFX1NIQVJFRF9NRU1fQlVGRkVSCiAgICAgICAgIG5ld1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgc2FtcGxlLT5mb3JtYXQoKSwKLSAgICAgICAgICAgICAgICBjaGFubmVscywgc2FtcGxlLT5nZXRJTWVtb3J5KCksIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsIGNhbGxiYWNrLCB1c2VyRGF0YSk7CisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIHNhbXBsZS0+Z2V0SU1lbW9yeSgpLCBBVURJT19PVVRQVVRfRkxBR19GQVNULCBjYWxsYmFjaywgdXNlckRhdGEpOwogI2Vsc2UKICAgICAgICAgbmV3VHJhY2sgPSBuZXcgQXVkaW9UcmFjayhzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBzYW1wbGUtPmZvcm1hdCgpLAotICAgICAgICAgICAgICAgIGNoYW5uZWxzLCBmcmFtZUNvdW50LCBBVURJT19PVVRQVVRfRkxBR19GQVNULCBjYWxsYmFjaywgdXNlckRhdGEsCisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsIGNhbGxiYWNrLCB1c2VyRGF0YSwKICAgICAgICAgICAgICAgICBidWZmZXJGcmFtZXMpOwogI2VuZGlmCiAgICAgICAgIG9sZFRyYWNrID0gbUF1ZGlvVHJhY2s7CkBAIC03MzAsNyArNzM3LDggQEAKICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBiLT5zaXplOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZW1jcHkocSwgcCwgY291bnQpOwotLy8gICAgICAgICAgICAgIEFMT0dWKCJmaWxsOiBxPSVwLCBwPSVwLCBtUG9zPSV1LCBiLT5zaXplPSV1LCBjb3VudD0lZCIsIHEsIHAsIG1Qb3MsIGItPnNpemUsIGNvdW50KTsKKy8vICAgICAgICAgICAgICBBTE9HVigiZmlsbDogcT0lcCwgcD0lcCwgbVBvcz0ldSwgYi0+c2l6ZT0ldSwgY291bnQ9JWQiLCBxLCBwLCBtUG9zLCBiLT5zaXplLAorLy8gICAgICAgICAgICAgICAgICAgICAgY291bnQpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtUG9zIDwgbUF1ZGlvQnVmZmVyU2l6ZSkgewogICAgICAgICAgICAgICAgIGNvdW50ID0gbUF1ZGlvQnVmZmVyU2l6ZSAtIG1Qb3M7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gYi0+c2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcAppbmRleCBhZGVmM2JlLi42MWI2ZDM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcApAQCAtMTA1Nyw3ICsxMDU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAvLyBub3RpZmljYXRpb25GcmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAvLyBzaGFyZWRCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkQ2FuQ2FsbEphdmEsCi0gICAgICAgICAgICAgICAgICAgICAgMCwgICAgLy8gc2Vzc2lvbklkCisgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSyk7CiAKICAgICBpZiAobXBBdWRpb1RyYWNrLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1YzNiMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImF1dG9kZXRlY3QuaCIKLQotc3RydWN0IENoYXJSYW5nZSB7Ci0gICAgdWludDE2X3QgZmlyc3Q7Ci0gICAgdWludDE2X3QgbGFzdDsKLX07Ci0KLSNkZWZpbmUgQVJSQVlfU0laRSh4KSAgIChzaXplb2YoeCkgLyBzaXplb2YoKngpKQotCi0vLyBnZW5lcmF0ZWQgZnJvbSBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5MzIuVFhUCi1zdGF0aWMgY29uc3QgQ2hhclJhbmdlIGtTaGlmdEpJU1Jhbmdlc1tdID0gewotICAgIHsgMHg4MTQwLCAweDgxN0UgfSwKLSAgICB7IDB4ODE4MCwgMHg4MUFDIH0sCi0gICAgeyAweDgxQjgsIDB4ODFCRiB9LAotICAgIHsgMHg4MUM4LCAweDgxQ0UgfSwKLSAgICB7IDB4ODFEQSwgMHg4MUU4IH0sCi0gICAgeyAweDgxRjAsIDB4ODFGNyB9LAotICAgIHsgMHg4MUZDLCAweDgxRkMgfSwKLSAgICB7IDB4ODI0RiwgMHg4MjU4IH0sCi0gICAgeyAweDgyNjAsIDB4ODI3OSB9LAotICAgIHsgMHg4MjgxLCAweDgyOUEgfSwKLSAgICB7IDB4ODI5RiwgMHg4MkYxIH0sCi0gICAgeyAweDgzNDAsIDB4ODM3RSB9LAotICAgIHsgMHg4MzgwLCAweDgzOTYgfSwKLSAgICB7IDB4ODM5RiwgMHg4M0I2IH0sCi0gICAgeyAweDgzQkYsIDB4ODNENiB9LAotICAgIHsgMHg4NDQwLCAweDg0NjAgfSwKLSAgICB7IDB4ODQ3MCwgMHg4NDdFIH0sCi0gICAgeyAweDg0ODAsIDB4ODQ5MSB9LAotICAgIHsgMHg4NDlGLCAweDg0QkUgfSwKLSAgICB7IDB4ODc0MCwgMHg4NzVEIH0sCi0gICAgeyAweDg3NUYsIDB4ODc3NSB9LAotICAgIHsgMHg4NzdFLCAweDg3N0UgfSwKLSAgICB7IDB4ODc4MCwgMHg4NzlDIH0sCi0gICAgeyAweDg4OUYsIDB4ODhGQyB9LAotICAgIHsgMHg4OTQwLCAweDg5N0UgfSwKLSAgICB7IDB4ODk4MCwgMHg4OUZDIH0sCi0gICAgeyAweDhBNDAsIDB4OEE3RSB9LAotICAgIHsgMHg4QTgwLCAweDhBRkMgfSwKLSAgICB7IDB4OEI0MCwgMHg4QjdFIH0sCi0gICAgeyAweDhCODAsIDB4OEJGQyB9LAotICAgIHsgMHg4QzQwLCAweDhDN0UgfSwKLSAgICB7IDB4OEM4MCwgMHg4Q0ZDIH0sCi0gICAgeyAweDhENDAsIDB4OEQ3RSB9LAotICAgIHsgMHg4RDgwLCAweDhERkMgfSwKLSAgICB7IDB4OEU0MCwgMHg4RTdFIH0sCi0gICAgeyAweDhFODAsIDB4OEVGQyB9LAotICAgIHsgMHg4RjQwLCAweDhGN0UgfSwKLSAgICB7IDB4OEY4MCwgMHg4RkZDIH0sCi0gICAgeyAweDkwNDAsIDB4OTA3RSB9LAotICAgIHsgMHg5MDgwLCAweDkwRkMgfSwKLSAgICB7IDB4OTE0MCwgMHg5MTdFIH0sCi0gICAgeyAweDkxODAsIDB4OTFGQyB9LAotICAgIHsgMHg5MjQwLCAweDkyN0UgfSwKLSAgICB7IDB4OTI4MCwgMHg5MkZDIH0sCi0gICAgeyAweDkzNDAsIDB4OTM3RSB9LAotICAgIHsgMHg5MzgwLCAweDkzRkMgfSwKLSAgICB7IDB4OTQ0MCwgMHg5NDdFIH0sCi0gICAgeyAweDk0ODAsIDB4OTRGQyB9LAotICAgIHsgMHg5NTQwLCAweDk1N0UgfSwKLSAgICB7IDB4OTU4MCwgMHg5NUZDIH0sCi0gICAgeyAweDk2NDAsIDB4OTY3RSB9LAotICAgIHsgMHg5NjgwLCAweDk2RkMgfSwKLSAgICB7IDB4OTc0MCwgMHg5NzdFIH0sCi0gICAgeyAweDk3ODAsIDB4OTdGQyB9LAotICAgIHsgMHg5ODQwLCAweDk4NzIgfSwKLSAgICB7IDB4OTg5RiwgMHg5OEZDIH0sCi0gICAgeyAweDk5NDAsIDB4OTk3RSB9LAotICAgIHsgMHg5OTgwLCAweDk5RkMgfSwKLSAgICB7IDB4OUE0MCwgMHg5QTdFIH0sCi0gICAgeyAweDlBODAsIDB4OUFGQyB9LAotICAgIHsgMHg5QjQwLCAweDlCN0UgfSwKLSAgICB7IDB4OUI4MCwgMHg5QkZDIH0sCi0gICAgeyAweDlDNDAsIDB4OUM3RSB9LAotICAgIHsgMHg5QzgwLCAweDlDRkMgfSwKLSAgICB7IDB4OUQ0MCwgMHg5RDdFIH0sCi0gICAgeyAweDlEODAsIDB4OURGQyB9LAotICAgIHsgMHg5RTQwLCAweDlFN0UgfSwKLSAgICB7IDB4OUU4MCwgMHg5RUZDIH0sCi0gICAgeyAweDlGNDAsIDB4OUY3RSB9LAotICAgIHsgMHg5RjgwLCAweDlGRkMgfSwKLSAgICB7IDB4RTA0MCwgMHhFMDdFIH0sCi0gICAgeyAweEUwODAsIDB4RTBGQyB9LAotICAgIHsgMHhFMTQwLCAweEUxN0UgfSwKLSAgICB7IDB4RTE4MCwgMHhFMUZDIH0sCi0gICAgeyAweEUyNDAsIDB4RTI3RSB9LAotICAgIHsgMHhFMjgwLCAweEUyRkMgfSwKLSAgICB7IDB4RTM0MCwgMHhFMzdFIH0sCi0gICAgeyAweEUzODAsIDB4RTNGQyB9LAotICAgIHsgMHhFNDQwLCAweEU0N0UgfSwKLSAgICB7IDB4RTQ4MCwgMHhFNEZDIH0sCi0gICAgeyAweEU1NDAsIDB4RTU3RSB9LAotICAgIHsgMHhFNTgwLCAweEU1RkMgfSwKLSAgICB7IDB4RTY0MCwgMHhFNjdFIH0sCi0gICAgeyAweEU2ODAsIDB4RTZGQyB9LAotICAgIHsgMHhFNzQwLCAweEU3N0UgfSwKLSAgICB7IDB4RTc4MCwgMHhFN0ZDIH0sCi0gICAgeyAweEU4NDAsIDB4RTg3RSB9LAotICAgIHsgMHhFODgwLCAweEU4RkMgfSwKLSAgICB7IDB4RTk0MCwgMHhFOTdFIH0sCi0gICAgeyAweEU5ODAsIDB4RTlGQyB9LAotICAgIHsgMHhFQTQwLCAweEVBN0UgfSwKLSAgICB7IDB4RUE4MCwgMHhFQUE0IH0sCi0gICAgeyAweEVENDAsIDB4RUQ3RSB9LAotICAgIHsgMHhFRDgwLCAweEVERkMgfSwKLSAgICB7IDB4RUU0MCwgMHhFRTdFIH0sCi0gICAgeyAweEVFODAsIDB4RUVFQyB9LAotICAgIHsgMHhFRUVGLCAweEVFRkMgfSwKLSAgICB7IDB4RkE0MCwgMHhGQTdFIH0sCi0gICAgeyAweEZBODAsIDB4RkFGQyB9LAotICAgIHsgMHhGQjQwLCAweEZCN0UgfSwKLSAgICB7IDB4RkI4MCwgMHhGQkZDIH0sCi0gICAgeyAweEZDNDAsIDB4RkM0QiB9LAotfTsKLQotLy8gZ2VuZXJhdGVkIGZyb20gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQOTM2LlRYVAotc3RhdGljIGNvbnN0IENoYXJSYW5nZSBrR0JLUmFuZ2VzW10gPSB7Ci0gICAgeyAweDgxNDAsIDB4ODE3RSB9LAotICAgIHsgMHg4MTgwLCAweDgxRkUgfSwKLSAgICB7IDB4ODI0MCwgMHg4MjdFIH0sCi0gICAgeyAweDgyODAsIDB4ODJGRSB9LAotICAgIHsgMHg4MzQwLCAweDgzN0UgfSwKLSAgICB7IDB4ODM4MCwgMHg4M0ZFIH0sCi0gICAgeyAweDg0NDAsIDB4ODQ3RSB9LAotICAgIHsgMHg4NDgwLCAweDg0RkUgfSwKLSAgICB7IDB4ODU0MCwgMHg4NTdFIH0sCi0gICAgeyAweDg1ODAsIDB4ODVGRSB9LAotICAgIHsgMHg4NjQwLCAweDg2N0UgfSwKLSAgICB7IDB4ODY4MCwgMHg4NkZFIH0sCi0gICAgeyAweDg3NDAsIDB4ODc3RSB9LAotICAgIHsgMHg4NzgwLCAweDg3RkUgfSwKLSAgICB7IDB4ODg0MCwgMHg4ODdFIH0sCi0gICAgeyAweDg4ODAsIDB4ODhGRSB9LAotICAgIHsgMHg4OTQwLCAweDg5N0UgfSwKLSAgICB7IDB4ODk4MCwgMHg4OUZFIH0sCi0gICAgeyAweDhBNDAsIDB4OEE3RSB9LAotICAgIHsgMHg4QTgwLCAweDhBRkUgfSwKLSAgICB7IDB4OEI0MCwgMHg4QjdFIH0sCi0gICAgeyAweDhCODAsIDB4OEJGRSB9LAotICAgIHsgMHg4QzQwLCAweDhDN0UgfSwKLSAgICB7IDB4OEM4MCwgMHg4Q0ZFIH0sCi0gICAgeyAweDhENDAsIDB4OEQ3RSB9LAotICAgIHsgMHg4RDgwLCAweDhERkUgfSwKLSAgICB7IDB4OEU0MCwgMHg4RTdFIH0sCi0gICAgeyAweDhFODAsIDB4OEVGRSB9LAotICAgIHsgMHg4RjQwLCAweDhGN0UgfSwKLSAgICB7IDB4OEY4MCwgMHg4RkZFIH0sCi0gICAgeyAweDkwNDAsIDB4OTA3RSB9LAotICAgIHsgMHg5MDgwLCAweDkwRkUgfSwKLSAgICB7IDB4OTE0MCwgMHg5MTdFIH0sCi0gICAgeyAweDkxODAsIDB4OTFGRSB9LAotICAgIHsgMHg5MjQwLCAweDkyN0UgfSwKLSAgICB7IDB4OTI4MCwgMHg5MkZFIH0sCi0gICAgeyAweDkzNDAsIDB4OTM3RSB9LAotICAgIHsgMHg5MzgwLCAweDkzRkUgfSwKLSAgICB7IDB4OTQ0MCwgMHg5NDdFIH0sCi0gICAgeyAweDk0ODAsIDB4OTRGRSB9LAotICAgIHsgMHg5NTQwLCAweDk1N0UgfSwKLSAgICB7IDB4OTU4MCwgMHg5NUZFIH0sCi0gICAgeyAweDk2NDAsIDB4OTY3RSB9LAotICAgIHsgMHg5NjgwLCAweDk2RkUgfSwKLSAgICB7IDB4OTc0MCwgMHg5NzdFIH0sCi0gICAgeyAweDk3ODAsIDB4OTdGRSB9LAotICAgIHsgMHg5ODQwLCAweDk4N0UgfSwKLSAgICB7IDB4OTg4MCwgMHg5OEZFIH0sCi0gICAgeyAweDk5NDAsIDB4OTk3RSB9LAotICAgIHsgMHg5OTgwLCAweDk5RkUgfSwKLSAgICB7IDB4OUE0MCwgMHg5QTdFIH0sCi0gICAgeyAweDlBODAsIDB4OUFGRSB9LAotICAgIHsgMHg5QjQwLCAweDlCN0UgfSwKLSAgICB7IDB4OUI4MCwgMHg5QkZFIH0sCi0gICAgeyAweDlDNDAsIDB4OUM3RSB9LAotICAgIHsgMHg5QzgwLCAweDlDRkUgfSwKLSAgICB7IDB4OUQ0MCwgMHg5RDdFIH0sCi0gICAgeyAweDlEODAsIDB4OURGRSB9LAotICAgIHsgMHg5RTQwLCAweDlFN0UgfSwKLSAgICB7IDB4OUU4MCwgMHg5RUZFIH0sCi0gICAgeyAweDlGNDAsIDB4OUY3RSB9LAotICAgIHsgMHg5RjgwLCAweDlGRkUgfSwKLSAgICB7IDB4QTA0MCwgMHhBMDdFIH0sCi0gICAgeyAweEEwODAsIDB4QTBGRSB9LAotICAgIHsgMHhBMUExLCAweEExRkUgfSwKLSAgICB7IDB4QTJBMSwgMHhBMkFBIH0sCi0gICAgeyAweEEyQjEsIDB4QTJFMiB9LAotICAgIHsgMHhBMkU1LCAweEEyRUUgfSwKLSAgICB7IDB4QTJGMSwgMHhBMkZDIH0sCi0gICAgeyAweEEzQTEsIDB4QTNGRSB9LAotICAgIHsgMHhBNEExLCAweEE0RjMgfSwKLSAgICB7IDB4QTVBMSwgMHhBNUY2IH0sCi0gICAgeyAweEE2QTEsIDB4QTZCOCB9LAotICAgIHsgMHhBNkMxLCAweEE2RDggfSwKLSAgICB7IDB4QTZFMCwgMHhBNkVCIH0sCi0gICAgeyAweEE2RUUsIDB4QTZGMiB9LAotICAgIHsgMHhBNkY0LCAweEE2RjUgfSwKLSAgICB7IDB4QTdBMSwgMHhBN0MxIH0sCi0gICAgeyAweEE3RDEsIDB4QTdGMSB9LAotICAgIHsgMHhBODQwLCAweEE4N0UgfSwKLSAgICB7IDB4QTg4MCwgMHhBODk1IH0sCi0gICAgeyAweEE4QTEsIDB4QThCQiB9LAotICAgIHsgMHhBOEJELCAweEE4QkUgfSwKLSAgICB7IDB4QThDMCwgMHhBOEMwIH0sCi0gICAgeyAweEE4QzUsIDB4QThFOSB9LAotICAgIHsgMHhBOTQwLCAweEE5NTcgfSwKLSAgICB7IDB4QTk1OSwgMHhBOTVBIH0sCi0gICAgeyAweEE5NUMsIDB4QTk1QyB9LAotICAgIHsgMHhBOTYwLCAweEE5N0UgfSwKLSAgICB7IDB4QTk4MCwgMHhBOTg4IH0sCi0gICAgeyAweEE5OTYsIDB4QTk5NiB9LAotICAgIHsgMHhBOUE0LCAweEE5RUYgfSwKLSAgICB7IDB4QUE0MCwgMHhBQTdFIH0sCi0gICAgeyAweEFBODAsIDB4QUFBMCB9LAotICAgIHsgMHhBQjQwLCAweEFCN0UgfSwKLSAgICB7IDB4QUI4MCwgMHhBQkEwIH0sCi0gICAgeyAweEFDNDAsIDB4QUM3RSB9LAotICAgIHsgMHhBQzgwLCAweEFDQTAgfSwKLSAgICB7IDB4QUQ0MCwgMHhBRDdFIH0sCi0gICAgeyAweEFEODAsIDB4QURBMCB9LAotICAgIHsgMHhBRTQwLCAweEFFN0UgfSwKLSAgICB7IDB4QUU4MCwgMHhBRUEwIH0sCi0gICAgeyAweEFGNDAsIDB4QUY3RSB9LAotICAgIHsgMHhBRjgwLCAweEFGQTAgfSwKLSAgICB7IDB4QjA0MCwgMHhCMDdFIH0sCi0gICAgeyAweEIwODAsIDB4QjBGRSB9LAotICAgIHsgMHhCMTQwLCAweEIxN0UgfSwKLSAgICB7IDB4QjE4MCwgMHhCMUZFIH0sCi0gICAgeyAweEIyNDAsIDB4QjI3RSB9LAotICAgIHsgMHhCMjgwLCAweEIyRkUgfSwKLSAgICB7IDB4QjM0MCwgMHhCMzdFIH0sCi0gICAgeyAweEIzODAsIDB4QjNGRSB9LAotICAgIHsgMHhCNDQwLCAweEI0N0UgfSwKLSAgICB7IDB4QjQ4MCwgMHhCNEZFIH0sCi0gICAgeyAweEI1NDAsIDB4QjU3RSB9LAotICAgIHsgMHhCNTgwLCAweEI1RkUgfSwKLSAgICB7IDB4QjY0MCwgMHhCNjdFIH0sCi0gICAgeyAweEI2ODAsIDB4QjZGRSB9LAotICAgIHsgMHhCNzQwLCAweEI3N0UgfSwKLSAgICB7IDB4Qjc4MCwgMHhCN0ZFIH0sCi0gICAgeyAweEI4NDAsIDB4Qjg3RSB9LAotICAgIHsgMHhCODgwLCAweEI4RkUgfSwKLSAgICB7IDB4Qjk0MCwgMHhCOTdFIH0sCi0gICAgeyAweEI5ODAsIDB4QjlGRSB9LAotICAgIHsgMHhCQTQwLCAweEJBN0UgfSwKLSAgICB7IDB4QkE4MCwgMHhCQUZFIH0sCi0gICAgeyAweEJCNDAsIDB4QkI3RSB9LAotICAgIHsgMHhCQjgwLCAweEJCRkUgfSwKLSAgICB7IDB4QkM0MCwgMHhCQzdFIH0sCi0gICAgeyAweEJDODAsIDB4QkNGRSB9LAotICAgIHsgMHhCRDQwLCAweEJEN0UgfSwKLSAgICB7IDB4QkQ4MCwgMHhCREZFIH0sCi0gICAgeyAweEJFNDAsIDB4QkU3RSB9LAotICAgIHsgMHhCRTgwLCAweEJFRkUgfSwKLSAgICB7IDB4QkY0MCwgMHhCRjdFIH0sCi0gICAgeyAweEJGODAsIDB4QkZGRSB9LAotICAgIHsgMHhDMDQwLCAweEMwN0UgfSwKLSAgICB7IDB4QzA4MCwgMHhDMEZFIH0sCi0gICAgeyAweEMxNDAsIDB4QzE3RSB9LAotICAgIHsgMHhDMTgwLCAweEMxRkUgfSwKLSAgICB7IDB4QzI0MCwgMHhDMjdFIH0sCi0gICAgeyAweEMyODAsIDB4QzJGRSB9LAotICAgIHsgMHhDMzQwLCAweEMzN0UgfSwKLSAgICB7IDB4QzM4MCwgMHhDM0ZFIH0sCi0gICAgeyAweEM0NDAsIDB4QzQ3RSB9LAotICAgIHsgMHhDNDgwLCAweEM0RkUgfSwKLSAgICB7IDB4QzU0MCwgMHhDNTdFIH0sCi0gICAgeyAweEM1ODAsIDB4QzVGRSB9LAotICAgIHsgMHhDNjQwLCAweEM2N0UgfSwKLSAgICB7IDB4QzY4MCwgMHhDNkZFIH0sCi0gICAgeyAweEM3NDAsIDB4Qzc3RSB9LAotICAgIHsgMHhDNzgwLCAweEM3RkUgfSwKLSAgICB7IDB4Qzg0MCwgMHhDODdFIH0sCi0gICAgeyAweEM4ODAsIDB4QzhGRSB9LAotICAgIHsgMHhDOTQwLCAweEM5N0UgfSwKLSAgICB7IDB4Qzk4MCwgMHhDOUZFIH0sCi0gICAgeyAweENBNDAsIDB4Q0E3RSB9LAotICAgIHsgMHhDQTgwLCAweENBRkUgfSwKLSAgICB7IDB4Q0I0MCwgMHhDQjdFIH0sCi0gICAgeyAweENCODAsIDB4Q0JGRSB9LAotICAgIHsgMHhDQzQwLCAweENDN0UgfSwKLSAgICB7IDB4Q0M4MCwgMHhDQ0ZFIH0sCi0gICAgeyAweENENDAsIDB4Q0Q3RSB9LAotICAgIHsgMHhDRDgwLCAweENERkUgfSwKLSAgICB7IDB4Q0U0MCwgMHhDRTdFIH0sCi0gICAgeyAweENFODAsIDB4Q0VGRSB9LAotICAgIHsgMHhDRjQwLCAweENGN0UgfSwKLSAgICB7IDB4Q0Y4MCwgMHhDRkZFIH0sCi0gICAgeyAweEQwNDAsIDB4RDA3RSB9LAotICAgIHsgMHhEMDgwLCAweEQwRkUgfSwKLSAgICB7IDB4RDE0MCwgMHhEMTdFIH0sCi0gICAgeyAweEQxODAsIDB4RDFGRSB9LAotICAgIHsgMHhEMjQwLCAweEQyN0UgfSwKLSAgICB7IDB4RDI4MCwgMHhEMkZFIH0sCi0gICAgeyAweEQzNDAsIDB4RDM3RSB9LAotICAgIHsgMHhEMzgwLCAweEQzRkUgfSwKLSAgICB7IDB4RDQ0MCwgMHhENDdFIH0sCi0gICAgeyAweEQ0ODAsIDB4RDRGRSB9LAotICAgIHsgMHhENTQwLCAweEQ1N0UgfSwKLSAgICB7IDB4RDU4MCwgMHhENUZFIH0sCi0gICAgeyAweEQ2NDAsIDB4RDY3RSB9LAotICAgIHsgMHhENjgwLCAweEQ2RkUgfSwKLSAgICB7IDB4RDc0MCwgMHhENzdFIH0sCi0gICAgeyAweEQ3ODAsIDB4RDdGOSB9LAotICAgIHsgMHhEODQwLCAweEQ4N0UgfSwKLSAgICB7IDB4RDg4MCwgMHhEOEZFIH0sCi0gICAgeyAweEQ5NDAsIDB4RDk3RSB9LAotICAgIHsgMHhEOTgwLCAweEQ5RkUgfSwKLSAgICB7IDB4REE0MCwgMHhEQTdFIH0sCi0gICAgeyAweERBODAsIDB4REFGRSB9LAotICAgIHsgMHhEQjQwLCAweERCN0UgfSwKLSAgICB7IDB4REI4MCwgMHhEQkZFIH0sCi0gICAgeyAweERDNDAsIDB4REM3RSB9LAotICAgIHsgMHhEQzgwLCAweERDRkUgfSwKLSAgICB7IDB4REQ0MCwgMHhERDdFIH0sCi0gICAgeyAweEREODAsIDB4RERGRSB9LAotICAgIHsgMHhERTQwLCAweERFN0UgfSwKLSAgICB7IDB4REU4MCwgMHhERUZFIH0sCi0gICAgeyAweERGNDAsIDB4REY3RSB9LAotICAgIHsgMHhERjgwLCAweERGRkUgfSwKLSAgICB7IDB4RTA0MCwgMHhFMDdFIH0sCi0gICAgeyAweEUwODAsIDB4RTBGRSB9LAotICAgIHsgMHhFMTQwLCAweEUxN0UgfSwKLSAgICB7IDB4RTE4MCwgMHhFMUZFIH0sCi0gICAgeyAweEUyNDAsIDB4RTI3RSB9LAotICAgIHsgMHhFMjgwLCAweEUyRkUgfSwKLSAgICB7IDB4RTM0MCwgMHhFMzdFIH0sCi0gICAgeyAweEUzODAsIDB4RTNGRSB9LAotICAgIHsgMHhFNDQwLCAweEU0N0UgfSwKLSAgICB7IDB4RTQ4MCwgMHhFNEZFIH0sCi0gICAgeyAweEU1NDAsIDB4RTU3RSB9LAotICAgIHsgMHhFNTgwLCAweEU1RkUgfSwKLSAgICB7IDB4RTY0MCwgMHhFNjdFIH0sCi0gICAgeyAweEU2ODAsIDB4RTZGRSB9LAotICAgIHsgMHhFNzQwLCAweEU3N0UgfSwKLSAgICB7IDB4RTc4MCwgMHhFN0ZFIH0sCi0gICAgeyAweEU4NDAsIDB4RTg3RSB9LAotICAgIHsgMHhFODgwLCAweEU4RkUgfSwKLSAgICB7IDB4RTk0MCwgMHhFOTdFIH0sCi0gICAgeyAweEU5ODAsIDB4RTlGRSB9LAotICAgIHsgMHhFQTQwLCAweEVBN0UgfSwKLSAgICB7IDB4RUE4MCwgMHhFQUZFIH0sCi0gICAgeyAweEVCNDAsIDB4RUI3RSB9LAotICAgIHsgMHhFQjgwLCAweEVCRkUgfSwKLSAgICB7IDB4RUM0MCwgMHhFQzdFIH0sCi0gICAgeyAweEVDODAsIDB4RUNGRSB9LAotICAgIHsgMHhFRDQwLCAweEVEN0UgfSwKLSAgICB7IDB4RUQ4MCwgMHhFREZFIH0sCi0gICAgeyAweEVFNDAsIDB4RUU3RSB9LAotICAgIHsgMHhFRTgwLCAweEVFRkUgfSwKLSAgICB7IDB4RUY0MCwgMHhFRjdFIH0sCi0gICAgeyAweEVGODAsIDB4RUZGRSB9LAotICAgIHsgMHhGMDQwLCAweEYwN0UgfSwKLSAgICB7IDB4RjA4MCwgMHhGMEZFIH0sCi0gICAgeyAweEYxNDAsIDB4RjE3RSB9LAotICAgIHsgMHhGMTgwLCAweEYxRkUgfSwKLSAgICB7IDB4RjI0MCwgMHhGMjdFIH0sCi0gICAgeyAweEYyODAsIDB4RjJGRSB9LAotICAgIHsgMHhGMzQwLCAweEYzN0UgfSwKLSAgICB7IDB4RjM4MCwgMHhGM0ZFIH0sCi0gICAgeyAweEY0NDAsIDB4RjQ3RSB9LAotICAgIHsgMHhGNDgwLCAweEY0RkUgfSwKLSAgICB7IDB4RjU0MCwgMHhGNTdFIH0sCi0gICAgeyAweEY1ODAsIDB4RjVGRSB9LAotICAgIHsgMHhGNjQwLCAweEY2N0UgfSwKLSAgICB7IDB4RjY4MCwgMHhGNkZFIH0sCi0gICAgeyAweEY3NDAsIDB4Rjc3RSB9LAotICAgIHsgMHhGNzgwLCAweEY3RkUgfSwKLSAgICB7IDB4Rjg0MCwgMHhGODdFIH0sCi0gICAgeyAweEY4ODAsIDB4RjhBMCB9LAotICAgIHsgMHhGOTQwLCAweEY5N0UgfSwKLSAgICB7IDB4Rjk4MCwgMHhGOUEwIH0sCi0gICAgeyAweEZBNDAsIDB4RkE3RSB9LAotICAgIHsgMHhGQTgwLCAweEZBQTAgfSwKLSAgICB7IDB4RkI0MCwgMHhGQjdFIH0sCi0gICAgeyAweEZCODAsIDB4RkJBMCB9LAotICAgIHsgMHhGQzQwLCAweEZDN0UgfSwKLSAgICB7IDB4RkM4MCwgMHhGQ0EwIH0sCi0gICAgeyAweEZENDAsIDB4RkQ3RSB9LAotICAgIHsgMHhGRDgwLCAweEZEQTAgfSwKLSAgICB7IDB4RkU0MCwgMHhGRTRGIH0sCi19OwotCi0vLyBnZW5lcmF0ZWQgZnJvbSBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5NDkuVFhUCi1zdGF0aWMgY29uc3QgQ2hhclJhbmdlIGtFVUNLUlJhbmdlc1tdID0gewotICAgIHsgMHg4MTQxLCAweDgxNUEgfSwKLSAgICB7IDB4ODE2MSwgMHg4MTdBIH0sCi0gICAgeyAweDgxODEsIDB4ODFGRSB9LAotICAgIHsgMHg4MjQxLCAweDgyNUEgfSwKLSAgICB7IDB4ODI2MSwgMHg4MjdBIH0sCi0gICAgeyAweDgyODEsIDB4ODJGRSB9LAotICAgIHsgMHg4MzQxLCAweDgzNUEgfSwKLSAgICB7IDB4ODM2MSwgMHg4MzdBIH0sCi0gICAgeyAweDgzODEsIDB4ODNGRSB9LAotICAgIHsgMHg4NDQxLCAweDg0NUEgfSwKLSAgICB7IDB4ODQ2MSwgMHg4NDdBIH0sCi0gICAgeyAweDg0ODEsIDB4ODRGRSB9LAotICAgIHsgMHg4NTQxLCAweDg1NUEgfSwKLSAgICB7IDB4ODU2MSwgMHg4NTdBIH0sCi0gICAgeyAweDg1ODEsIDB4ODVGRSB9LAotICAgIHsgMHg4NjQxLCAweDg2NUEgfSwKLSAgICB7IDB4ODY2MSwgMHg4NjdBIH0sCi0gICAgeyAweDg2ODEsIDB4ODZGRSB9LAotICAgIHsgMHg4NzQxLCAweDg3NUEgfSwKLSAgICB7IDB4ODc2MSwgMHg4NzdBIH0sCi0gICAgeyAweDg3ODEsIDB4ODdGRSB9LAotICAgIHsgMHg4ODQxLCAweDg4NUEgfSwKLSAgICB7IDB4ODg2MSwgMHg4ODdBIH0sCi0gICAgeyAweDg4ODEsIDB4ODhGRSB9LAotICAgIHsgMHg4OTQxLCAweDg5NUEgfSwKLSAgICB7IDB4ODk2MSwgMHg4OTdBIH0sCi0gICAgeyAweDg5ODEsIDB4ODlGRSB9LAotICAgIHsgMHg4QTQxLCAweDhBNUEgfSwKLSAgICB7IDB4OEE2MSwgMHg4QTdBIH0sCi0gICAgeyAweDhBODEsIDB4OEFGRSB9LAotICAgIHsgMHg4QjQxLCAweDhCNUEgfSwKLSAgICB7IDB4OEI2MSwgMHg4QjdBIH0sCi0gICAgeyAweDhCODEsIDB4OEJGRSB9LAotICAgIHsgMHg4QzQxLCAweDhDNUEgfSwKLSAgICB7IDB4OEM2MSwgMHg4QzdBIH0sCi0gICAgeyAweDhDODEsIDB4OENGRSB9LAotICAgIHsgMHg4RDQxLCAweDhENUEgfSwKLSAgICB7IDB4OEQ2MSwgMHg4RDdBIH0sCi0gICAgeyAweDhEODEsIDB4OERGRSB9LAotICAgIHsgMHg4RTQxLCAweDhFNUEgfSwKLSAgICB7IDB4OEU2MSwgMHg4RTdBIH0sCi0gICAgeyAweDhFODEsIDB4OEVGRSB9LAotICAgIHsgMHg4RjQxLCAweDhGNUEgfSwKLSAgICB7IDB4OEY2MSwgMHg4RjdBIH0sCi0gICAgeyAweDhGODEsIDB4OEZGRSB9LAotICAgIHsgMHg5MDQxLCAweDkwNUEgfSwKLSAgICB7IDB4OTA2MSwgMHg5MDdBIH0sCi0gICAgeyAweDkwODEsIDB4OTBGRSB9LAotICAgIHsgMHg5MTQxLCAweDkxNUEgfSwKLSAgICB7IDB4OTE2MSwgMHg5MTdBIH0sCi0gICAgeyAweDkxODEsIDB4OTFGRSB9LAotICAgIHsgMHg5MjQxLCAweDkyNUEgfSwKLSAgICB7IDB4OTI2MSwgMHg5MjdBIH0sCi0gICAgeyAweDkyODEsIDB4OTJGRSB9LAotICAgIHsgMHg5MzQxLCAweDkzNUEgfSwKLSAgICB7IDB4OTM2MSwgMHg5MzdBIH0sCi0gICAgeyAweDkzODEsIDB4OTNGRSB9LAotICAgIHsgMHg5NDQxLCAweDk0NUEgfSwKLSAgICB7IDB4OTQ2MSwgMHg5NDdBIH0sCi0gICAgeyAweDk0ODEsIDB4OTRGRSB9LAotICAgIHsgMHg5NTQxLCAweDk1NUEgfSwKLSAgICB7IDB4OTU2MSwgMHg5NTdBIH0sCi0gICAgeyAweDk1ODEsIDB4OTVGRSB9LAotICAgIHsgMHg5NjQxLCAweDk2NUEgfSwKLSAgICB7IDB4OTY2MSwgMHg5NjdBIH0sCi0gICAgeyAweDk2ODEsIDB4OTZGRSB9LAotICAgIHsgMHg5NzQxLCAweDk3NUEgfSwKLSAgICB7IDB4OTc2MSwgMHg5NzdBIH0sCi0gICAgeyAweDk3ODEsIDB4OTdGRSB9LAotICAgIHsgMHg5ODQxLCAweDk4NUEgfSwKLSAgICB7IDB4OTg2MSwgMHg5ODdBIH0sCi0gICAgeyAweDk4ODEsIDB4OThGRSB9LAotICAgIHsgMHg5OTQxLCAweDk5NUEgfSwKLSAgICB7IDB4OTk2MSwgMHg5OTdBIH0sCi0gICAgeyAweDk5ODEsIDB4OTlGRSB9LAotICAgIHsgMHg5QTQxLCAweDlBNUEgfSwKLSAgICB7IDB4OUE2MSwgMHg5QTdBIH0sCi0gICAgeyAweDlBODEsIDB4OUFGRSB9LAotICAgIHsgMHg5QjQxLCAweDlCNUEgfSwKLSAgICB7IDB4OUI2MSwgMHg5QjdBIH0sCi0gICAgeyAweDlCODEsIDB4OUJGRSB9LAotICAgIHsgMHg5QzQxLCAweDlDNUEgfSwKLSAgICB7IDB4OUM2MSwgMHg5QzdBIH0sCi0gICAgeyAweDlDODEsIDB4OUNGRSB9LAotICAgIHsgMHg5RDQxLCAweDlENUEgfSwKLSAgICB7IDB4OUQ2MSwgMHg5RDdBIH0sCi0gICAgeyAweDlEODEsIDB4OURGRSB9LAotICAgIHsgMHg5RTQxLCAweDlFNUEgfSwKLSAgICB7IDB4OUU2MSwgMHg5RTdBIH0sCi0gICAgeyAweDlFODEsIDB4OUVGRSB9LAotICAgIHsgMHg5RjQxLCAweDlGNUEgfSwKLSAgICB7IDB4OUY2MSwgMHg5RjdBIH0sCi0gICAgeyAweDlGODEsIDB4OUZGRSB9LAotICAgIHsgMHhBMDQxLCAweEEwNUEgfSwKLSAgICB7IDB4QTA2MSwgMHhBMDdBIH0sCi0gICAgeyAweEEwODEsIDB4QTBGRSB9LAotICAgIHsgMHhBMTQxLCAweEExNUEgfSwKLSAgICB7IDB4QTE2MSwgMHhBMTdBIH0sCi0gICAgeyAweEExODEsIDB4QTFGRSB9LAotICAgIHsgMHhBMjQxLCAweEEyNUEgfSwKLSAgICB7IDB4QTI2MSwgMHhBMjdBIH0sCi0gICAgeyAweEEyODEsIDB4QTJFNyB9LAotICAgIHsgMHhBMzQxLCAweEEzNUEgfSwKLSAgICB7IDB4QTM2MSwgMHhBMzdBIH0sCi0gICAgeyAweEEzODEsIDB4QTNGRSB9LAotICAgIHsgMHhBNDQxLCAweEE0NUEgfSwKLSAgICB7IDB4QTQ2MSwgMHhBNDdBIH0sCi0gICAgeyAweEE0ODEsIDB4QTRGRSB9LAotICAgIHsgMHhBNTQxLCAweEE1NUEgfSwKLSAgICB7IDB4QTU2MSwgMHhBNTdBIH0sCi0gICAgeyAweEE1ODEsIDB4QTVBQSB9LAotICAgIHsgMHhBNUIwLCAweEE1QjkgfSwKLSAgICB7IDB4QTVDMSwgMHhBNUQ4IH0sCi0gICAgeyAweEE1RTEsIDB4QTVGOCB9LAotICAgIHsgMHhBNjQxLCAweEE2NUEgfSwKLSAgICB7IDB4QTY2MSwgMHhBNjdBIH0sCi0gICAgeyAweEE2ODEsIDB4QTZFNCB9LAotICAgIHsgMHhBNzQxLCAweEE3NUEgfSwKLSAgICB7IDB4QTc2MSwgMHhBNzdBIH0sCi0gICAgeyAweEE3ODEsIDB4QTdFRiB9LAotICAgIHsgMHhBODQxLCAweEE4NUEgfSwKLSAgICB7IDB4QTg2MSwgMHhBODdBIH0sCi0gICAgeyAweEE4ODEsIDB4QThBNCB9LAotICAgIHsgMHhBOEE2LCAweEE4QTYgfSwKLSAgICB7IDB4QThBOCwgMHhBOEFGIH0sCi0gICAgeyAweEE4QjEsIDB4QThGRSB9LAotICAgIHsgMHhBOTQxLCAweEE5NUEgfSwKLSAgICB7IDB4QTk2MSwgMHhBOTdBIH0sCi0gICAgeyAweEE5ODEsIDB4QTlGRSB9LAotICAgIHsgMHhBQTQxLCAweEFBNUEgfSwKLSAgICB7IDB4QUE2MSwgMHhBQTdBIH0sCi0gICAgeyAweEFBODEsIDB4QUFGMyB9LAotICAgIHsgMHhBQjQxLCAweEFCNUEgfSwKLSAgICB7IDB4QUI2MSwgMHhBQjdBIH0sCi0gICAgeyAweEFCODEsIDB4QUJGNiB9LAotICAgIHsgMHhBQzQxLCAweEFDNUEgfSwKLSAgICB7IDB4QUM2MSwgMHhBQzdBIH0sCi0gICAgeyAweEFDODEsIDB4QUNDMSB9LAotICAgIHsgMHhBQ0QxLCAweEFDRjEgfSwKLSAgICB7IDB4QUQ0MSwgMHhBRDVBIH0sCi0gICAgeyAweEFENjEsIDB4QUQ3QSB9LAotICAgIHsgMHhBRDgxLCAweEFEQTAgfSwKLSAgICB7IDB4QUU0MSwgMHhBRTVBIH0sCi0gICAgeyAweEFFNjEsIDB4QUU3QSB9LAotICAgIHsgMHhBRTgxLCAweEFFQTAgfSwKLSAgICB7IDB4QUY0MSwgMHhBRjVBIH0sCi0gICAgeyAweEFGNjEsIDB4QUY3QSB9LAotICAgIHsgMHhBRjgxLCAweEFGQTAgfSwKLSAgICB7IDB4QjA0MSwgMHhCMDVBIH0sCi0gICAgeyAweEIwNjEsIDB4QjA3QSB9LAotICAgIHsgMHhCMDgxLCAweEIwRkUgfSwKLSAgICB7IDB4QjE0MSwgMHhCMTVBIH0sCi0gICAgeyAweEIxNjEsIDB4QjE3QSB9LAotICAgIHsgMHhCMTgxLCAweEIxRkUgfSwKLSAgICB7IDB4QjI0MSwgMHhCMjVBIH0sCi0gICAgeyAweEIyNjEsIDB4QjI3QSB9LAotICAgIHsgMHhCMjgxLCAweEIyRkUgfSwKLSAgICB7IDB4QjM0MSwgMHhCMzVBIH0sCi0gICAgeyAweEIzNjEsIDB4QjM3QSB9LAotICAgIHsgMHhCMzgxLCAweEIzRkUgfSwKLSAgICB7IDB4QjQ0MSwgMHhCNDVBIH0sCi0gICAgeyAweEI0NjEsIDB4QjQ3QSB9LAotICAgIHsgMHhCNDgxLCAweEI0RkUgfSwKLSAgICB7IDB4QjU0MSwgMHhCNTVBIH0sCi0gICAgeyAweEI1NjEsIDB4QjU3QSB9LAotICAgIHsgMHhCNTgxLCAweEI1RkUgfSwKLSAgICB7IDB4QjY0MSwgMHhCNjVBIH0sCi0gICAgeyAweEI2NjEsIDB4QjY3QSB9LAotICAgIHsgMHhCNjgxLCAweEI2RkUgfSwKLSAgICB7IDB4Qjc0MSwgMHhCNzVBIH0sCi0gICAgeyAweEI3NjEsIDB4Qjc3QSB9LAotICAgIHsgMHhCNzgxLCAweEI3RkUgfSwKLSAgICB7IDB4Qjg0MSwgMHhCODVBIH0sCi0gICAgeyAweEI4NjEsIDB4Qjg3QSB9LAotICAgIHsgMHhCODgxLCAweEI4RkUgfSwKLSAgICB7IDB4Qjk0MSwgMHhCOTVBIH0sCi0gICAgeyAweEI5NjEsIDB4Qjk3QSB9LAotICAgIHsgMHhCOTgxLCAweEI5RkUgfSwKLSAgICB7IDB4QkE0MSwgMHhCQTVBIH0sCi0gICAgeyAweEJBNjEsIDB4QkE3QSB9LAotICAgIHsgMHhCQTgxLCAweEJBRkUgfSwKLSAgICB7IDB4QkI0MSwgMHhCQjVBIH0sCi0gICAgeyAweEJCNjEsIDB4QkI3QSB9LAotICAgIHsgMHhCQjgxLCAweEJCRkUgfSwKLSAgICB7IDB4QkM0MSwgMHhCQzVBIH0sCi0gICAgeyAweEJDNjEsIDB4QkM3QSB9LAotICAgIHsgMHhCQzgxLCAweEJDRkUgfSwKLSAgICB7IDB4QkQ0MSwgMHhCRDVBIH0sCi0gICAgeyAweEJENjEsIDB4QkQ3QSB9LAotICAgIHsgMHhCRDgxLCAweEJERkUgfSwKLSAgICB7IDB4QkU0MSwgMHhCRTVBIH0sCi0gICAgeyAweEJFNjEsIDB4QkU3QSB9LAotICAgIHsgMHhCRTgxLCAweEJFRkUgfSwKLSAgICB7IDB4QkY0MSwgMHhCRjVBIH0sCi0gICAgeyAweEJGNjEsIDB4QkY3QSB9LAotICAgIHsgMHhCRjgxLCAweEJGRkUgfSwKLSAgICB7IDB4QzA0MSwgMHhDMDVBIH0sCi0gICAgeyAweEMwNjEsIDB4QzA3QSB9LAotICAgIHsgMHhDMDgxLCAweEMwRkUgfSwKLSAgICB7IDB4QzE0MSwgMHhDMTVBIH0sCi0gICAgeyAweEMxNjEsIDB4QzE3QSB9LAotICAgIHsgMHhDMTgxLCAweEMxRkUgfSwKLSAgICB7IDB4QzI0MSwgMHhDMjVBIH0sCi0gICAgeyAweEMyNjEsIDB4QzI3QSB9LAotICAgIHsgMHhDMjgxLCAweEMyRkUgfSwKLSAgICB7IDB4QzM0MSwgMHhDMzVBIH0sCi0gICAgeyAweEMzNjEsIDB4QzM3QSB9LAotICAgIHsgMHhDMzgxLCAweEMzRkUgfSwKLSAgICB7IDB4QzQ0MSwgMHhDNDVBIH0sCi0gICAgeyAweEM0NjEsIDB4QzQ3QSB9LAotICAgIHsgMHhDNDgxLCAweEM0RkUgfSwKLSAgICB7IDB4QzU0MSwgMHhDNTVBIH0sCi0gICAgeyAweEM1NjEsIDB4QzU3QSB9LAotICAgIHsgMHhDNTgxLCAweEM1RkUgfSwKLSAgICB7IDB4QzY0MSwgMHhDNjUyIH0sCi0gICAgeyAweEM2QTEsIDB4QzZGRSB9LAotICAgIHsgMHhDN0ExLCAweEM3RkUgfSwKLSAgICB7IDB4QzhBMSwgMHhDOEZFIH0sCi0gICAgeyAweENBQTEsIDB4Q0FGRSB9LAotICAgIHsgMHhDQkExLCAweENCRkUgfSwKLSAgICB7IDB4Q0NBMSwgMHhDQ0ZFIH0sCi0gICAgeyAweENEQTEsIDB4Q0RGRSB9LAotICAgIHsgMHhDRUExLCAweENFRkUgfSwKLSAgICB7IDB4Q0ZBMSwgMHhDRkZFIH0sCi0gICAgeyAweEQwQTEsIDB4RDBGRSB9LAotICAgIHsgMHhEMUExLCAweEQxRkUgfSwKLSAgICB7IDB4RDJBMSwgMHhEMkZFIH0sCi0gICAgeyAweEQzQTEsIDB4RDNGRSB9LAotICAgIHsgMHhENEExLCAweEQ0RkUgfSwKLSAgICB7IDB4RDVBMSwgMHhENUZFIH0sCi0gICAgeyAweEQ2QTEsIDB4RDZGRSB9LAotICAgIHsgMHhEN0ExLCAweEQ3RkUgfSwKLSAgICB7IDB4RDhBMSwgMHhEOEZFIH0sCi0gICAgeyAweEQ5QTEsIDB4RDlGRSB9LAotICAgIHsgMHhEQUExLCAweERBRkUgfSwKLSAgICB7IDB4REJBMSwgMHhEQkZFIH0sCi0gICAgeyAweERDQTEsIDB4RENGRSB9LAotICAgIHsgMHhEREExLCAweERERkUgfSwKLSAgICB7IDB4REVBMSwgMHhERUZFIH0sCi0gICAgeyAweERGQTEsIDB4REZGRSB9LAotICAgIHsgMHhFMEExLCAweEUwRkUgfSwKLSAgICB7IDB4RTFBMSwgMHhFMUZFIH0sCi0gICAgeyAweEUyQTEsIDB4RTJGRSB9LAotICAgIHsgMHhFM0ExLCAweEUzRkUgfSwKLSAgICB7IDB4RTRBMSwgMHhFNEZFIH0sCi0gICAgeyAweEU1QTEsIDB4RTVGRSB9LAotICAgIHsgMHhFNkExLCAweEU2RkUgfSwKLSAgICB7IDB4RTdBMSwgMHhFN0ZFIH0sCi0gICAgeyAweEU4QTEsIDB4RThGRSB9LAotICAgIHsgMHhFOUExLCAweEU5RkUgfSwKLSAgICB7IDB4RUFBMSwgMHhFQUZFIH0sCi0gICAgeyAweEVCQTEsIDB4RUJGRSB9LAotICAgIHsgMHhFQ0ExLCAweEVDRkUgfSwKLSAgICB7IDB4RURBMSwgMHhFREZFIH0sCi0gICAgeyAweEVFQTEsIDB4RUVGRSB9LAotICAgIHsgMHhFRkExLCAweEVGRkUgfSwKLSAgICB7IDB4RjBBMSwgMHhGMEZFIH0sCi0gICAgeyAweEYxQTEsIDB4RjFGRSB9LAotICAgIHsgMHhGMkExLCAweEYyRkUgfSwKLSAgICB7IDB4RjNBMSwgMHhGM0ZFIH0sCi0gICAgeyAweEY0QTEsIDB4RjRGRSB9LAotICAgIHsgMHhGNUExLCAweEY1RkUgfSwKLSAgICB7IDB4RjZBMSwgMHhGNkZFIH0sCi0gICAgeyAweEY3QTEsIDB4RjdGRSB9LAotICAgIHsgMHhGOEExLCAweEY4RkUgfSwKLSAgICB7IDB4RjlBMSwgMHhGOUZFIH0sCi0gICAgeyAweEZBQTEsIDB4RkFGRSB9LAotICAgIHsgMHhGQkExLCAweEZCRkUgfSwKLSAgICB7IDB4RkNBMSwgMHhGQ0ZFIH0sCi0gICAgeyAweEZEQTEsIDB4RkRGRSB9LAotfTsKLQotLy8gZ2VuZXJhdGVkIGZyb20gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQOTUwLlRYVAotc3RhdGljIGNvbnN0IENoYXJSYW5nZSBrQmlnNVJhbmdlc1tdID0gewotICAgIHsgMHhBMTQwLCAweEExN0UgfSwKLSAgICB7IDB4QTFBMSwgMHhBMUZFIH0sCi0gICAgeyAweEEyNDAsIDB4QTI3RSB9LAotICAgIHsgMHhBMkExLCAweEEyRkUgfSwKLSAgICB7IDB4QTM0MCwgMHhBMzdFIH0sCi0gICAgeyAweEEzQTEsIDB4QTNCRiB9LAotICAgIHsgMHhBM0UxLCAweEEzRTEgfSwKLSAgICB7IDB4QTQ0MCwgMHhBNDdFIH0sCi0gICAgeyAweEE0QTEsIDB4QTRGRSB9LAotICAgIHsgMHhBNTQwLCAweEE1N0UgfSwKLSAgICB7IDB4QTVBMSwgMHhBNUZFIH0sCi0gICAgeyAweEE2NDAsIDB4QTY3RSB9LAotICAgIHsgMHhBNkExLCAweEE2RkUgfSwKLSAgICB7IDB4QTc0MCwgMHhBNzdFIH0sCi0gICAgeyAweEE3QTEsIDB4QTdGRSB9LAotICAgIHsgMHhBODQwLCAweEE4N0UgfSwKLSAgICB7IDB4QThBMSwgMHhBOEZFIH0sCi0gICAgeyAweEE5NDAsIDB4QTk3RSB9LAotICAgIHsgMHhBOUExLCAweEE5RkUgfSwKLSAgICB7IDB4QUE0MCwgMHhBQTdFIH0sCi0gICAgeyAweEFBQTEsIDB4QUFGRSB9LAotICAgIHsgMHhBQjQwLCAweEFCN0UgfSwKLSAgICB7IDB4QUJBMSwgMHhBQkZFIH0sCi0gICAgeyAweEFDNDAsIDB4QUM3RSB9LAotICAgIHsgMHhBQ0ExLCAweEFDRkUgfSwKLSAgICB7IDB4QUQ0MCwgMHhBRDdFIH0sCi0gICAgeyAweEFEQTEsIDB4QURGRSB9LAotICAgIHsgMHhBRTQwLCAweEFFN0UgfSwKLSAgICB7IDB4QUVBMSwgMHhBRUZFIH0sCi0gICAgeyAweEFGNDAsIDB4QUY3RSB9LAotICAgIHsgMHhBRkExLCAweEFGRkUgfSwKLSAgICB7IDB4QjA0MCwgMHhCMDdFIH0sCi0gICAgeyAweEIwQTEsIDB4QjBGRSB9LAotICAgIHsgMHhCMTQwLCAweEIxN0UgfSwKLSAgICB7IDB4QjFBMSwgMHhCMUZFIH0sCi0gICAgeyAweEIyNDAsIDB4QjI3RSB9LAotICAgIHsgMHhCMkExLCAweEIyRkUgfSwKLSAgICB7IDB4QjM0MCwgMHhCMzdFIH0sCi0gICAgeyAweEIzQTEsIDB4QjNGRSB9LAotICAgIHsgMHhCNDQwLCAweEI0N0UgfSwKLSAgICB7IDB4QjRBMSwgMHhCNEZFIH0sCi0gICAgeyAweEI1NDAsIDB4QjU3RSB9LAotICAgIHsgMHhCNUExLCAweEI1RkUgfSwKLSAgICB7IDB4QjY0MCwgMHhCNjdFIH0sCi0gICAgeyAweEI2QTEsIDB4QjZGRSB9LAotICAgIHsgMHhCNzQwLCAweEI3N0UgfSwKLSAgICB7IDB4QjdBMSwgMHhCN0ZFIH0sCi0gICAgeyAweEI4NDAsIDB4Qjg3RSB9LAotICAgIHsgMHhCOEExLCAweEI4RkUgfSwKLSAgICB7IDB4Qjk0MCwgMHhCOTdFIH0sCi0gICAgeyAweEI5QTEsIDB4QjlGRSB9LAotICAgIHsgMHhCQTQwLCAweEJBN0UgfSwKLSAgICB7IDB4QkFBMSwgMHhCQUZFIH0sCi0gICAgeyAweEJCNDAsIDB4QkI3RSB9LAotICAgIHsgMHhCQkExLCAweEJCRkUgfSwKLSAgICB7IDB4QkM0MCwgMHhCQzdFIH0sCi0gICAgeyAweEJDQTEsIDB4QkNGRSB9LAotICAgIHsgMHhCRDQwLCAweEJEN0UgfSwKLSAgICB7IDB4QkRBMSwgMHhCREZFIH0sCi0gICAgeyAweEJFNDAsIDB4QkU3RSB9LAotICAgIHsgMHhCRUExLCAweEJFRkUgfSwKLSAgICB7IDB4QkY0MCwgMHhCRjdFIH0sCi0gICAgeyAweEJGQTEsIDB4QkZGRSB9LAotICAgIHsgMHhDMDQwLCAweEMwN0UgfSwKLSAgICB7IDB4QzBBMSwgMHhDMEZFIH0sCi0gICAgeyAweEMxNDAsIDB4QzE3RSB9LAotICAgIHsgMHhDMUExLCAweEMxRkUgfSwKLSAgICB7IDB4QzI0MCwgMHhDMjdFIH0sCi0gICAgeyAweEMyQTEsIDB4QzJGRSB9LAotICAgIHsgMHhDMzQwLCAweEMzN0UgfSwKLSAgICB7IDB4QzNBMSwgMHhDM0ZFIH0sCi0gICAgeyAweEM0NDAsIDB4QzQ3RSB9LAotICAgIHsgMHhDNEExLCAweEM0RkUgfSwKLSAgICB7IDB4QzU0MCwgMHhDNTdFIH0sCi0gICAgeyAweEM1QTEsIDB4QzVGRSB9LAotICAgIHsgMHhDNjQwLCAweEM2N0UgfSwKLSAgICB7IDB4Qzk0MCwgMHhDOTdFIH0sCi0gICAgeyAweEM5QTEsIDB4QzlGRSB9LAotICAgIHsgMHhDQTQwLCAweENBN0UgfSwKLSAgICB7IDB4Q0FBMSwgMHhDQUZFIH0sCi0gICAgeyAweENCNDAsIDB4Q0I3RSB9LAotICAgIHsgMHhDQkExLCAweENCRkUgfSwKLSAgICB7IDB4Q0M0MCwgMHhDQzdFIH0sCi0gICAgeyAweENDQTEsIDB4Q0NGRSB9LAotICAgIHsgMHhDRDQwLCAweENEN0UgfSwKLSAgICB7IDB4Q0RBMSwgMHhDREZFIH0sCi0gICAgeyAweENFNDAsIDB4Q0U3RSB9LAotICAgIHsgMHhDRUExLCAweENFRkUgfSwKLSAgICB7IDB4Q0Y0MCwgMHhDRjdFIH0sCi0gICAgeyAweENGQTEsIDB4Q0ZGRSB9LAotICAgIHsgMHhEMDQwLCAweEQwN0UgfSwKLSAgICB7IDB4RDBBMSwgMHhEMEZFIH0sCi0gICAgeyAweEQxNDAsIDB4RDE3RSB9LAotICAgIHsgMHhEMUExLCAweEQxRkUgfSwKLSAgICB7IDB4RDI0MCwgMHhEMjdFIH0sCi0gICAgeyAweEQyQTEsIDB4RDJGRSB9LAotICAgIHsgMHhEMzQwLCAweEQzN0UgfSwKLSAgICB7IDB4RDNBMSwgMHhEM0ZFIH0sCi0gICAgeyAweEQ0NDAsIDB4RDQ3RSB9LAotICAgIHsgMHhENEExLCAweEQ0RkUgfSwKLSAgICB7IDB4RDU0MCwgMHhENTdFIH0sCi0gICAgeyAweEQ1QTEsIDB4RDVGRSB9LAotICAgIHsgMHhENjQwLCAweEQ2N0UgfSwKLSAgICB7IDB4RDZBMSwgMHhENkZFIH0sCi0gICAgeyAweEQ3NDAsIDB4RDc3RSB9LAotICAgIHsgMHhEN0ExLCAweEQ3RkUgfSwKLSAgICB7IDB4RDg0MCwgMHhEODdFIH0sCi0gICAgeyAweEQ4QTEsIDB4RDhGRSB9LAotICAgIHsgMHhEOTQwLCAweEQ5N0UgfSwKLSAgICB7IDB4RDlBMSwgMHhEOUZFIH0sCi0gICAgeyAweERBNDAsIDB4REE3RSB9LAotICAgIHsgMHhEQUExLCAweERBRkUgfSwKLSAgICB7IDB4REI0MCwgMHhEQjdFIH0sCi0gICAgeyAweERCQTEsIDB4REJGRSB9LAotICAgIHsgMHhEQzQwLCAweERDN0UgfSwKLSAgICB7IDB4RENBMSwgMHhEQ0ZFIH0sCi0gICAgeyAweERENDAsIDB4REQ3RSB9LAotICAgIHsgMHhEREExLCAweERERkUgfSwKLSAgICB7IDB4REU0MCwgMHhERTdFIH0sCi0gICAgeyAweERFQTEsIDB4REVGRSB9LAotICAgIHsgMHhERjQwLCAweERGN0UgfSwKLSAgICB7IDB4REZBMSwgMHhERkZFIH0sCi0gICAgeyAweEUwNDAsIDB4RTA3RSB9LAotICAgIHsgMHhFMEExLCAweEUwRkUgfSwKLSAgICB7IDB4RTE0MCwgMHhFMTdFIH0sCi0gICAgeyAweEUxQTEsIDB4RTFGRSB9LAotICAgIHsgMHhFMjQwLCAweEUyN0UgfSwKLSAgICB7IDB4RTJBMSwgMHhFMkZFIH0sCi0gICAgeyAweEUzNDAsIDB4RTM3RSB9LAotICAgIHsgMHhFM0ExLCAweEUzRkUgfSwKLSAgICB7IDB4RTQ0MCwgMHhFNDdFIH0sCi0gICAgeyAweEU0QTEsIDB4RTRGRSB9LAotICAgIHsgMHhFNTQwLCAweEU1N0UgfSwKLSAgICB7IDB4RTVBMSwgMHhFNUZFIH0sCi0gICAgeyAweEU2NDAsIDB4RTY3RSB9LAotICAgIHsgMHhFNkExLCAweEU2RkUgfSwKLSAgICB7IDB4RTc0MCwgMHhFNzdFIH0sCi0gICAgeyAweEU3QTEsIDB4RTdGRSB9LAotICAgIHsgMHhFODQwLCAweEU4N0UgfSwKLSAgICB7IDB4RThBMSwgMHhFOEZFIH0sCi0gICAgeyAweEU5NDAsIDB4RTk3RSB9LAotICAgIHsgMHhFOUExLCAweEU5RkUgfSwKLSAgICB7IDB4RUE0MCwgMHhFQTdFIH0sCi0gICAgeyAweEVBQTEsIDB4RUFGRSB9LAotICAgIHsgMHhFQjQwLCAweEVCN0UgfSwKLSAgICB7IDB4RUJBMSwgMHhFQkZFIH0sCi0gICAgeyAweEVDNDAsIDB4RUM3RSB9LAotICAgIHsgMHhFQ0ExLCAweEVDRkUgfSwKLSAgICB7IDB4RUQ0MCwgMHhFRDdFIH0sCi0gICAgeyAweEVEQTEsIDB4RURGRSB9LAotICAgIHsgMHhFRTQwLCAweEVFN0UgfSwKLSAgICB7IDB4RUVBMSwgMHhFRUZFIH0sCi0gICAgeyAweEVGNDAsIDB4RUY3RSB9LAotICAgIHsgMHhFRkExLCAweEVGRkUgfSwKLSAgICB7IDB4RjA0MCwgMHhGMDdFIH0sCi0gICAgeyAweEYwQTEsIDB4RjBGRSB9LAotICAgIHsgMHhGMTQwLCAweEYxN0UgfSwKLSAgICB7IDB4RjFBMSwgMHhGMUZFIH0sCi0gICAgeyAweEYyNDAsIDB4RjI3RSB9LAotICAgIHsgMHhGMkExLCAweEYyRkUgfSwKLSAgICB7IDB4RjM0MCwgMHhGMzdFIH0sCi0gICAgeyAweEYzQTEsIDB4RjNGRSB9LAotICAgIHsgMHhGNDQwLCAweEY0N0UgfSwKLSAgICB7IDB4RjRBMSwgMHhGNEZFIH0sCi0gICAgeyAweEY1NDAsIDB4RjU3RSB9LAotICAgIHsgMHhGNUExLCAweEY1RkUgfSwKLSAgICB7IDB4RjY0MCwgMHhGNjdFIH0sCi0gICAgeyAweEY2QTEsIDB4RjZGRSB9LAotICAgIHsgMHhGNzQwLCAweEY3N0UgfSwKLSAgICB7IDB4RjdBMSwgMHhGN0ZFIH0sCi0gICAgeyAweEY4NDAsIDB4Rjg3RSB9LAotICAgIHsgMHhGOEExLCAweEY4RkUgfSwKLSAgICB7IDB4Rjk0MCwgMHhGOTdFIH0sCi0gICAgeyAweEY5QTEsIDB4RjlGRSB9LAotfTsKLQotc3RhdGljIGJvb2wgY2hhck1hdGNoZXNFbmNvZGluZyhpbnQgY2gsIGNvbnN0IENoYXJSYW5nZSogZW5jb2RpbmdSYW5nZXMsIGludCByYW5nZUNvdW50KSB7Ci0gICAgLy8gVXNlIGJpbmFyeSBzZWFyY2ggdG8gc2VlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgY29udGFpbmVkIGluIHRoZSBlbmNvZGluZwotICAgIGludCBsb3cgPSAwOwotICAgIGludCBoaWdoID0gcmFuZ2VDb3VudDsKLQotICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7Ci0gICAgICAgIGludCBpID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgICAgY29uc3QgQ2hhclJhbmdlKiByYW5nZSA9ICZlbmNvZGluZ1Jhbmdlc1tpXTsKLSAgICAgICAgaWYgKGNoID49IHJhbmdlLT5maXJzdCAmJiBjaCA8PSByYW5nZS0+bGFzdCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoY2ggPiByYW5nZS0+bGFzdCkKLSAgICAgICAgICAgIGxvdyA9IGkgKyAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBoaWdoID0gaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWV4dGVybiB1aW50MzJfdCBmaW5kUG9zc2libGVFbmNvZGluZ3MoaW50IGNoKQotewotICAgIC8vIEFTQ0lJIG1hdGNoZXMgZXZlcnl0aGluZwotICAgIGlmIChjaCA8IDI1NikgcmV0dXJuIGtFbmNvZGluZ0FsbDsKLQotICAgIGludCByZXN1bHQgPSBrRW5jb2RpbmdOb25lOwotCi0gICAgaWYgKGNoYXJNYXRjaGVzRW5jb2RpbmcoY2gsIGtTaGlmdEpJU1JhbmdlcywgQVJSQVlfU0laRShrU2hpZnRKSVNSYW5nZXMpKSkKLSAgICAgICAgcmVzdWx0IHw9IGtFbmNvZGluZ1NoaWZ0SklTOwotICAgIGlmIChjaGFyTWF0Y2hlc0VuY29kaW5nKGNoLCBrR0JLUmFuZ2VzLCBBUlJBWV9TSVpFKGtHQktSYW5nZXMpKSkKLSAgICAgICAgcmVzdWx0IHw9IGtFbmNvZGluZ0dCSzsKLSAgICBpZiAoY2hhck1hdGNoZXNFbmNvZGluZyhjaCwga0JpZzVSYW5nZXMsIEFSUkFZX1NJWkUoa0JpZzVSYW5nZXMpKSkKLSAgICAgICAgcmVzdWx0IHw9IGtFbmNvZGluZ0JpZzU7Ci0gICAgaWYgKGNoYXJNYXRjaGVzRW5jb2RpbmcoY2gsIGtFVUNLUlJhbmdlcywgQVJSQVlfU0laRShrRVVDS1JSYW5nZXMpKSkKLSAgICAgICAgcmVzdWx0IHw9IGtFbmNvZGluZ0VVQ0tSOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuaCBiL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3NWRiMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBVVRPREVURUNUX0gKLSNkZWZpbmUgQVVUT0RFVEVDVF9ICi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0vLyBmbGFncyB1c2VkIGZvciBuYXRpdmUgZW5jb2RpbmcgZGV0ZWN0aW9uCi1lbnVtIHsKLSAgICBrRW5jb2RpbmdOb25lICAgICAgICAgICAgICAgPSAwLAotICAgIGtFbmNvZGluZ1NoaWZ0SklTICAgICAgICAgICA9ICgxIDw8IDApLAotICAgIGtFbmNvZGluZ0dCSyAgICAgICAgICAgICAgICA9ICgxIDw8IDEpLAotICAgIGtFbmNvZGluZ0JpZzUgICAgICAgICAgICAgICA9ICgxIDw8IDIpLAotICAgIGtFbmNvZGluZ0VVQ0tSICAgICAgICAgICAgICA9ICgxIDw8IDMpLAotCi0gICAga0VuY29kaW5nQWxsICAgICAgICAgICAgICAgID0gKGtFbmNvZGluZ1NoaWZ0SklTIHwga0VuY29kaW5nR0JLIHwga0VuY29kaW5nQmlnNSB8IGtFbmNvZGluZ0VVQ0tSKSwKLX07Ci0KLQotLy8gcmV0dXJucyBhIGJpdGZpZWxkIGNvbnRhaW5pbmcgdGhlIHBvc3NpYmxlIG5hdGl2ZSBlbmNvZGluZ3MgZm9yIHRoZSBnaXZlbiBjaGFyYWN0ZXIKLWV4dGVybiB1aW50MzJfdCBmaW5kUG9zc2libGVFbmNvZGluZ3MoaW50IGNoKTsKLQotI2VuZGlmIC8vIEFVVE9ERVRFQ1RfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcAppbmRleCAxMTBiOTRjLi4xZDZiYjZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KQEAgLTkzLDcgKzk0LDkgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMDYsNyArMTA5LDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogICAgIEFMT0dWKCJkYXRhIHNvdXJjZSAoJXMpIiwgc3JjVXJsKTsKLSAgICByZXR1cm4gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShzcmNVcmwsIGhlYWRlcnMpOworICAgIHJldHVybiBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCBzcmNVcmwsIGhlYWRlcnMpOwogfQogCiBzdGF0dXNfdCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQpAQCAtMTU3LDcgKzE2MCw3IEBACiAgICAgcmV0dXJuIG1SZXRyaWV2ZXItPmV4dHJhY3RBbGJ1bUFydCgpOwogfQogCi12b2lkIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzU2VydmljZUxvY2spOwogICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OnNTZXJ2aWNlLmNsZWFyKCk7CiAgICAgQUxPR1coIk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgc2VydmVyIGRpZWQhIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggN2E2ZjMxZC4uMGJlMDFhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtNTgsNyArNTgsNyBAQAogICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKICAgICBtTG9ja1RocmVhZElkID0gMDsKICAgICBtQXVkaW9TZXNzaW9uSWQgPSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9TZXNzaW9uSWQoKTsKLSAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCk7CisgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICBtU2VuZExldmVsID0gMDsKICAgICBtUmV0cmFuc21pdEVuZHBvaW50VmFsaWQgPSBmYWxzZTsKIH0KQEAgLTY2LDcgKzY2LDcgQEAKIE1lZGlhUGxheWVyOjp+TWVkaWFQbGF5ZXIoKQogewogICAgIEFMT0dWKCJkZXN0cnVjdG9yIik7Ci0gICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQpOworICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CiAgICAgZGlzY29ubmVjdCgpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKIH0KQEAgLTEzNiw2ICsxMzYsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmwpOwpAQCAtMTQ1LDcgKzE0Niw3IEBACiAgICAgICAgIGlmIChzZXJ2aWNlICE9IDApIHsKICAgICAgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZSh0aGlzLCBtQXVkaW9TZXNzaW9uSWQpKTsKICAgICAgICAgICAgIGlmICgoTk9fRVJST1IgIT0gZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQocGxheWVyKSkgfHwKLSAgICAgICAgICAgICAgICAoTk9fRVJST1IgIT0gcGxheWVyLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycykpKSB7CisgICAgICAgICAgICAgICAgKE5PX0VSUk9SICE9IHBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKSkpIHsKICAgICAgICAgICAgICAgICBwbGF5ZXIuY2xlYXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVyciA9IGF0dGFjaE5ld1BsYXllcihwbGF5ZXIpOwpAQCAtNTMwLDYgKzUzMSwxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKQoreworICAgIEFMT0dWKCJnZXRBdWRpb1N0cmVhbVR5cGUiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICp0eXBlID0gbVN0cmVhbVR5cGU7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0TG9vcGluZyhpbnQgbG9vcCkKIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXI6OnNldExvb3BpbmciKTsKQEAgLTU3NSw4ICs1ODQsOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoc2Vzc2lvbklkICE9IG1BdWRpb1Nlc3Npb25JZCkgewotICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKHNlc3Npb25JZCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQsIC0xKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC03NzYsMTUgKzc4NSwyMCBAQAogICAgIH0KIH0KIAotLypzdGF0aWMqLyBzdGF0dXNfdCBNZWRpYVBsYXllcjo6ZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpCisvKnN0YXRpYyovIHN0YXR1c190IE1lZGlhUGxheWVyOjpkZWNvZGUoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgc2l6ZV90ICpwU2l6ZSkKIHsKICAgICBBTE9HVigiZGVjb2RlKCVzKSIsIHVybCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSBzZXJ2aWNlLT5kZWNvZGUodXJsLCBwU2FtcGxlUmF0ZSwgcE51bUNoYW5uZWxzLCBwRm9ybWF0LCBoZWFwLCBwU2l6ZSk7CisgICAgICAgIHN0YXR1cyA9IHNlcnZpY2UtPmRlY29kZShodHRwU2VydmljZSwgdXJsLCBwU2FtcGxlUmF0ZSwgcE51bUNoYW5uZWxzLCBwRm9ybWF0LCBoZWFwLCBwU2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2NhdGUgbWVkaWEgc2VydmljZSIpOwogICAgICAgICBzdGF0dXMgPSBERUFEX09CSkVDVDsKQEAgLTgzMiwxNSArODQ2LDQgQEAKICAgICByZXR1cm4gbVBsYXllci0+c2V0TmV4dFBsYXllcihuZXh0ID09IE5VTEwgPyBOVUxMIDogbmV4dC0+bVBsYXllcik7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyOjp1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UgPSBnZXRNZWRpYVBsYXllclNlcnZpY2UoKTsKLQotICAgIGlmIChzZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UtPnVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotICAgIH0KLQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggODVjOTQ2NC4uY2FmMmRmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTQ1LDcgKzQ1LDYgQEAKICAgICBsaWJzdGFnZWZyaWdodF9ydHNwICAgICAgICAgXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICAgIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuY3BwCmluZGV4IGMyYWMxYTMuLmFmZTM5MzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvSERDUC5jcHAKQEAgLTEwNywxMSArMTA3LDcgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCi0gICAgLy8gVE8tRE86Ci0gICAgLy8gT25seSBzdXBwb3J0IEhEQ1BfQ0FQU19FTkNSWVBUIChieXRlLWFycmF5IHRvIGJ5dGUtYXJyYXkpIGZvciBub3cuCi0gICAgLy8gdXNlIG1IRENQTW9kdWxlLT5nZXRDYXBzKCkgd2hlbiB0aGUgSERDUCBsaWJyYXJpZXMgZ2V0IHVwZGF0ZWQuCi0gICAgLy9yZXR1cm4gbUhEQ1BNb2R1bGUtPmdldENhcHMoKTsKLSAgICByZXR1cm4gSERDUE1vZHVsZTo6SERDUF9DQVBTX0VOQ1JZUFQ7CisgICAgcmV0dXJuIG1IRENQTW9kdWxlLT5nZXRDYXBzKCk7CiB9CiAKIHN0YXR1c190IEhEQ1A6OmVuY3J5cHQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCmluZGV4IDkwYWVkMzkuLjc0ZTUwMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCkBAIC02Nyw2ICs2NywxMiBAQAogICAgICAgICByZXR1cm4gTlVfUExBWUVSOwogICAgIH0KIAorICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIEVYUEVSSU1FTlRBTCBkZXZlbG9wZXIgc2V0dGluZ3MgcHJvcGVydHkKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJwZXJzaXN0LnN5cy5tZWRpYS51c2UtbnVwbGF5ZXIiLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgICAgICYmICFzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpKSB7CisgICAgICAgIHJldHVybiBOVV9QTEFZRVI7CisgICAgfQorCiAgICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBhMzkyYjc2Li43NzhlYjlhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgpAQCAtMzA2LDExICszMDcsNiBAQAogICAgIHJldHVybiBuZXcgUmVtb3RlRGlzcGxheShjbGllbnQsIGlmYWNlLnN0cmluZygpKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjp1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgcmV0dXJuIEhUVFBCYXNlOjpVcGRhdGVQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKQEAgLTU5MCw3ICs1ODYsOCBAQAogICAgIH0KIAogICAgIGlmICghcC0+aGFyZHdhcmVPdXRwdXQoKSkgewotICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksCisgICAgICAgICAgICAgICAgbVBpZCk7CiAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocC5nZXQoKSktPnNldEF1ZGlvU2luayhtQXVkaW9PdXRwdXQpOwogICAgIH0KIApAQCAtNjIyLDcgKzYxOSw5IEBACiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVybCk7CiAgICAgaWYgKHVybCA9PSBOVUxMKQpAQCAtNjU3LDcgKzY1Niw3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQogCi0gICAgICAgIHNldERhdGFTb3VyY2VfcG9zdChwLCBwLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycykpOworICAgICAgICBzZXREYXRhU291cmNlX3Bvc3QocCwgcC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKSk7CiAgICAgICAgIHJldHVybiBtU3RhdHVzOwogICAgIH0KIH0KQEAgLTExNzYsOSArMTE3NSwxNCBAQAogfQogI2VuZGlmCiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpkZWNvZGUoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgc2l6ZV90ICpwU2l6ZSkKIHsKICAgICBBTE9HVigiZGVjb2RlKCVzKSIsIHVybCk7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwbGF5ZXI7CkBAIC0xMjA2LDcgKzEyMTAsNyBAQAogICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocGxheWVyLmdldCgpKS0+c2V0QXVkaW9TaW5rKGNhY2hlKTsKIAogICAgIC8vIHNldCBkYXRhIHNvdXJjZQotICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UodXJsKSAhPSBOT19FUlJPUikgZ290byBFeGl0OworICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCkgIT0gTk9fRVJST1IpIGdvdG8gRXhpdDsKIAogICAgIEFMT0dWKCJwcmVwYXJlIik7CiAgICAgcGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKQEAgLTEyOTYsMTMgKzEzMDAsMTQgQEAKIAogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TaW5rIgotTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6QXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCwgaW50IHVpZCkKK01lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkF1ZGlvT3V0cHV0KGludCBzZXNzaW9uSWQsIGludCB1aWQsIGludCBwaWQpCiAgICAgOiBtQ2FsbGJhY2soTlVMTCksCiAgICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCksCiAgICAgICBtQ2FsbGJhY2tEYXRhKE5VTEwpLAogICAgICAgbUJ5dGVzV3JpdHRlbigwKSwKICAgICAgIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwKICAgICAgIG1VaWQodWlkKSwKKyAgICAgIG1QaWQocGlkKSwKICAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CiAgICAgQUxPR1YoIkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7CiAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CkBAIC0xNDUwLDcgKzE0NTUsNyBAQAogICAgICAgICAgICAgICAgIGZvcm1hdCwgYnVmZmVyQ291bnQsIG1TZXNzaW9uSWQsIGZsYWdzKTsKICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICB1aW50MzJfdCBmcmFtZUNvdW50OworICAgIHNpemVfdCBmcmFtZUNvdW50OwogCiAgICAgLy8gb2ZmbG9hZGluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBjYWxsYmFjayBtb2RlIGZvciBub3cuCiAgICAgLy8gb2ZmbG9hZEluZm8gbXVzdCBiZSBwcmVzZW50IGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQKQEAgLTE1NTEsNyArMTU1Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLLAogICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mbywKLSAgICAgICAgICAgICAgICAgICAgbVVpZCk7CisgICAgICAgICAgICAgICAgICAgIG1VaWQsCisgICAgICAgICAgICAgICAgICAgIG1QaWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKQEAgLTE1NjYsNyArMTU3Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIG9mZmxvYWQgaW5mbwotICAgICAgICAgICAgICAgICAgICBtVWlkKTsKKyAgICAgICAgICAgICAgICAgICAgbVVpZCwKKyAgICAgICAgICAgICAgICAgICAgbVBpZCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgewpAQCAtMTY3Miw3ICsxNjc5LDcgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQogewotICAgIExPR19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CiAKICAgICAvL0FMT0dWKCJ3cml0ZSglcCwgJXUpIiwgYnVmZmVyLCBzaXplKTsKICAgICBpZiAobVRyYWNrICE9IDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCA5YzA4NGUxLi40NDhmMjdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgIGNsYXNzIENhbGxiYWNrRGF0YTsKIAogICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0KGludCBzZXNzaW9uSWQsIGludCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkLCBpbnQgdWlkLCBpbnQgcGlkKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CiAKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gMDsgfQpAQCAtMTQwLDYgKzE0MCw3IEBACiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CiAgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7CkBAIC0yMTEsMTIgKzIxMiwxMiBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBmbHVzaCgpIHt9CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHBhdXNlKCkge30KICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgY2xvc2UoKSB7fQotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7fQorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlIF9fdW51c2VkKSB7fQogICAgICAgICAgICAgICAgIC8vIHN0cmVhbSB0eXBlIGlzIG5vdCB1c2VkIGZvciBBdWRpb0NhY2hlCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBBVURJT19TVFJFQU1fREVGQVVMVDsgfQogCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkge30KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlUGVybWlsbGUpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0IF9fdW51c2VkLCBmbG9hdCByaWdodCBfX3VudXNlZCkge30KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlUGVybWlsbGUgX191bnVzZWQpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9CiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQpAQCAtMjU2LDkgKzI1NywxNSBAQAogCiAgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+ICAgIGNyZWF0ZShjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBhdWRpb1Nlc3Npb25JZCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgICAgICBzaXplX3QgKnBTaXplKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCkBAIC0yNzIsOSArMjc5LDYgQEAKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGlmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlbW92ZUNsaWVudCh3cDxDbGllbnQ+IGNsaWVudCk7CiAKICAgICAvLyBGb3IgYmF0dGVyeSB1c2FnZSB0cmFja2luZyBwdXJwb3NlCkBAIC0zNTYsNiArMzYwLDcgQEAKICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiAgICAgY3JlYXRlUGxheWVyKHBsYXllcl90eXBlIHBsYXllclR5cGUpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAppbmRleCAzNDg5NTdmLi5jNjFjZjg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KQEAgLTEwNiw3ICsxMDcsOSBAQAogfQogCiBzdGF0dXNfdCBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmwpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKQEAgLTEyNyw3ICsxMzAsNyBAQAogICAgIEFMT0dWKCJwbGF5ZXIgdHlwZSA9ICVkIiwgcGxheWVyVHlwZSk7CiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2U+IHAgPSBjcmVhdGVSZXRyaWV2ZXIocGxheWVyVHlwZSk7CiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcC0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpOworICAgIHN0YXR1c190IHJldCA9IHAtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgbVJldHJpZXZlciA9IHA7CiAgICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKaW5kZXggZjA4ZjkzMy4uOWQzZmJlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKQEAgLTMwLDYgKzMwLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFQbGF5ZXJTZXJ2aWNlOwogY2xhc3MgTWVtb3J5RGVhbGVyOwogCkBAIC00Myw3ICs0NCw5IEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKaW5kZXggMGE2YWE5MC4uZGVlZGRkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCkBAIC0xMTQsNyArMTE0LDkgQEAKIH0KIAogc3RhdHVzX3QgTWlkaUZpbGU6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICopIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKikgewogICAgIEFMT0dWKCJNaWRpRmlsZTo6c2V0RGF0YVNvdXJjZSB1cmw9JXMiLCBwYXRoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCmluZGV4IDI0ZDU5YjQuLjEyODAyYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCkBAIC0zMiw3ICszMiw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDQ2NTIwOWYuLmYzY2Y2ZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSAiTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgiCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oPgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgc3RhdHVzX3QgRVJST1JfTk9UX09QRU4gPSAtMTsKQEAgLTM2LDcgKzM4LDkgQEAKIH0KIAogc3RhdHVzX3QgTWlkaU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlOiAlcyIsIHVybD8gdXJsOiAiTlVMTCBwb2ludGVyIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtNDQsNyArNDgsNyBAQAogICAgIGlmIChtTWlkaVBsYXllciA9PSAwKSB7CiAgICAgICAgIG1NaWRpUGxheWVyID0gbmV3IE1pZGlGaWxlKCk7CiAgICAgfQotICAgIHJldHVybiBtTWlkaVBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpOworICAgIHJldHVybiBtTWlkaVBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKIH0KIAogc3RhdHVzX3QgTWlkaU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDRjZWU0MmQuLmI4MjE0ZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTMyLDcgKzMyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfk1pZGlNZXRhZGF0YVJldHJpZXZlcigpIHt9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCmluZGV4IDQyYjc3NjYuLmIzN2FlZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcApAQCAtNTQsOCArNTQsMTAgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpOworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiB9CiAKIC8vIFdhcm5pbmc6IFRoZSBmaWxlZGVzY3JpcHRvciBwYXNzZWQgaW50byB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgdmFsaWQgdW50aWwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKaW5kZXggNjAwOTQ1ZS4uZTZjMzBmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKQEAgLTM0LDcgKzM0LDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVJRCh1aWRfdCB1aWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IDRkYTc0ZTEuLjViN2EyMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTI1LDggKzI1LDEwIEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQUNXcml0ZXIuaD4KQEAgLTM2LDEzICszOCwxMiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmEuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTcyLDggKzczLDcgQEAKICAgICAgIG1BdWRpb1NvdXJjZShBVURJT19TT1VSQ0VfQ05UKSwKICAgICAgIG1WaWRlb1NvdXJjZShWSURFT19TT1VSQ0VfTElTVF9FTkQpLAogICAgICAgbUNhcHR1cmVUaW1lTGFwc2UoZmFsc2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVN1cmZhY2VNZWRpYVNvdXJjZShOVUxMKSB7CisgICAgICBtU3RhcnRlZChmYWxzZSkgewogCiAgICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7CiAgICAgcmVzZXQoKTsKQEAgLTgyLDEwICs4MiwxOSBAQAogU3RhZ2VmcmlnaHRSZWNvcmRlcjo6flN0YWdlZnJpZ2h0UmVjb3JkZXIoKSB7CiAgICAgQUxPR1YoIkRlc3RydWN0b3IiKTsKICAgICBzdG9wKCk7CisKKyAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmluaXQoKSB7CiAgICAgQUxPR1YoImluaXQiKTsKKworICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtTG9vcGVyLT5zZXROYW1lKCJyZWNvcmRlcl9sb29wZXIiKTsKKyAgICBtTG9vcGVyLT5zdGFydCgpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC05NCw3ICsxMDMsNyBAQAogLy8gd2hpbGUgZW5jb2RpbmcgR0wgRnJhbWVzCiBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBTdGFnZWZyaWdodFJlY29yZGVyOjpxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpIGNvbnN0IHsKICAgICBBTE9HVigiR2V0IFN1cmZhY2VNZWRpYVNvdXJjZSIpOwotICAgIHJldHVybiBtU3VyZmFjZU1lZGlhU291cmNlLT5nZXRCdWZmZXJRdWV1ZSgpOworICAgIHJldHVybiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRBdWRpb1NvdXJjZShhdWRpb19zb3VyY2VfdCBhcykgewpAQCAtMjM0LDcgKzI0Myw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqIC8qIHBhdGggKi8pIHsKICAgICBBTE9HRSgic2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKikgbXVzdCBub3QgYmUgY2FsbGVkIik7CiAgICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCB0aGlzIGF0IGFsbCwgYXMgdGhlIG1lZGlhX3NlcnZlciBwcm9jZXNzCiAgICAgLy8gbm8gbG9uZ2VyIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgZmlsZXMuCkBAIC02ODEsMTAgKzY5MCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUxhcHNlRW5hYmxlKHRpbWVMYXBzZUVuYWJsZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1iZXR3ZWVuLXRpbWUtbGFwc2UtZnJhbWUtY2FwdHVyZSIpIHsKLSAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zOwotICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpKSB7CisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKSkgewogICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoCi0gICAgICAgICAgICAgICAgICAgIDEwMDBMTCAqIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpOworICAgICAgICAgICAgICAgICAgICB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJzZXRQYXJhbWV0ZXI6IGZhaWxlZCB0byBmaW5kIGtleSAlcyIsIGtleS5zdHJpbmcoKSk7CkBAIC03MzksMTkgKzc0OCwxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cHJlcGFyZSgpIHsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0KCkgewotICAgIENIRUNLX0dFKG1PdXRwdXRGZCwgMCk7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwcmVwYXJlSW50ZXJuYWwoKSB7CisgICAgQUxPR1YoInByZXBhcmUiKTsKKyAgICBpZiAobU91dHB1dEZkIDwgMCkgeworICAgICAgICBBTE9HRSgiT3V0cHV0IGZpbGUgZGVzY3JpcHRvciBpcyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAKICAgICAvLyBHZXQgVUlEIGhlcmUgZm9yIHBlcm1pc3Npb24gY2hlY2tpbmcKICAgICBtQ2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZpbGUgd3JpdGVyIGlzIG5vdCBhdmFpYWxibGUiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7CiAKQEAgLTc1OSwyNSArNzY0LDI1IEBACiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9ERUZBVUxUOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFR180OgotICAgICAgICAgICAgc3RhdHVzID0gc3RhcnRNUEVHNFJlY29yZGluZygpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBNUEVHNFJlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FNUl9OQjoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FNUl9XQjoKLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0QU1SUmVjb3JkaW5nKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cEFNUlJlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRElGOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFM6Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGFydEFBQ1JlY29yZGluZygpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBBQUNSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQOgotICAgICAgICAgICAgc3RhdHVzID0gc3RhcnRSVFBSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwUlRQUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFRzJUUzoKLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0TVBFRzJUU1JlY29yZGluZygpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtNzg2LDYgKzc5MSw3MiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cHJlcGFyZSgpIHsKKyAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9TVVJGQUNFKSB7CisgICAgICAgIHJldHVybiBwcmVwYXJlSW50ZXJuYWwoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydCgpIHsKKyAgICBBTE9HVigic3RhcnQiKTsKKyAgICBpZiAobU91dHB1dEZkIDwgMCkgeworICAgICAgICBBTE9HRSgiT3V0cHV0IGZpbGUgZGVzY3JpcHRvciBpcyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKKworICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gVklERU9fU09VUkNFX1NVUkZBQ0UpIHsKKyAgICAgICAgc3RhdHVzID0gcHJlcGFyZUludGVybmFsKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVdyaXRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGaWxlIHdyaXRlciBpcyBub3QgYXZhaWFsYmxlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHN3aXRjaCAobU91dHB1dEZvcm1hdCkgeworICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUdfNDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgICAgICAgICBzZXR1cE1QRUc0TWV0YURhdGEoJm1ldGEpOworICAgICAgICAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfTkI6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfV0I6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRjoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfUlRQX0FWUDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUcyVFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQ6ICVkIiwgbU91dHB1dEZvcm1hdCk7CisgICAgICAgICAgICBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKKyAgICAgICAgbVdyaXRlciA9IE5VTEw7CisgICAgfQorCiAgICAgaWYgKChzdGF0dXMgPT0gT0spICYmICghbVN0YXJ0ZWQpKSB7CiAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKIApAQCAtODE3LDU4ICs4ODgsNTQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IGVuY01ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIHN3aXRjaCAobUF1ZGlvRW5jb2RlcikgewogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX05COgogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfREVGQVVMVDoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FNUl9XQjoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0gICAgICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5QUFDUHJvZmlsZSwgT01YX0FVRElPX0FBQ09iamVjdExDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgT01YX0FVRElPX0FBQ09iamVjdExDKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfSEVfQUFDOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLSAgICAgICAgICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlBQUNQcm9maWxlLCBPTVhfQVVESU9fQUFDT2JqZWN0SEUpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBPTVhfQVVESU9fQUFDT2JqZWN0SEUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BQUNfRUxEOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLSAgICAgICAgICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlBQUNQcm9maWxlLCBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgT01YX0FVRElPX0FBQ09iamVjdEVMRCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIlVua25vd24gYXVkaW8gZW5jb2RlcjogJWQiLCBtQXVkaW9FbmNvZGVyKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBlbmNNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7CiAKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKICAgICBDSEVDSyhhdWRpb1NvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICBrS2V5TWF4SW5wdXRTaXplLCAmbWF4SW5wdXRTaXplKSk7CiAKLSAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhJbnB1dFNpemUpOwotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1BdWRpb0NoYW5uZWxzKTsKLSAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBtQXVkaW9CaXRSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsIG1heElucHV0U2l6ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIG1BdWRpb0NoYW5uZWxzKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIG1TYW1wbGVSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlIiwgbUF1ZGlvQml0UmF0ZSk7CiAgICAgaWYgKG1BdWRpb1RpbWVTY2FsZSA+IDApIHsKLSAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbUF1ZGlvVGltZVNjYWxlKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigidGltZS1zY2FsZSIsIG1BdWRpb1RpbWVTY2FsZSk7CiAgICAgfQogCi0gICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOwogICAgIHNwPE1lZGlhU291cmNlPiBhdWRpb0VuY29kZXIgPQotICAgICAgICBPTVhDb2RlYzo6Q3JlYXRlKGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jTWV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGF1ZGlvU291cmNlKTsKKyAgICAgICAgICAgIE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShtTG9vcGVyLCBmb3JtYXQsIGF1ZGlvU291cmNlKTsKICAgICBtQXVkaW9Tb3VyY2VOb2RlID0gYXVkaW9Tb3VyY2U7CiAKICAgICByZXR1cm4gYXVkaW9FbmNvZGVyOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydEFBQ1JlY29yZGluZygpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQUFDUmVjb3JkaW5nKCkgewogICAgIC8vIEZJWE1FOgogICAgIC8vIEFkZCBzdXBwb3J0IGZvciBPVVRQVVRfRk9STUFUX0FBQ19BRElGCiAgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUyk7CkBAIC04NzksMTYgKzk0NiwxMCBAQAogICAgIENIRUNLKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKTsKIAogICAgIG1Xcml0ZXIgPSBuZXcgQUFDV3JpdGVyKG1PdXRwdXRGZCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRSYXdBdWRpb1JlY29yZGluZygpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgbVdyaXRlci5jbGVhcigpOwotICAgICAgICBtV3JpdGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0QU1SUmVjb3JkaW5nKCkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBBTVJSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0sobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9OQiB8fAogICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfV0IpOwogCkBAIC05MDgsMTUgKzk2OSwxMCBAQAogICAgIH0KIAogICAgIG1Xcml0ZXIgPSBuZXcgQU1SV3JpdGVyKG1PdXRwdXRGZCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRSYXdBdWRpb1JlY29yZGluZygpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgbVdyaXRlci5jbGVhcigpOwotICAgICAgICBtV3JpdGVyID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBSYXdBdWRpb1JlY29yZGluZygpIHsKICAgICBpZiAobUF1ZGlvU291cmNlID49IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgQUxPR0UoIkludmFsaWQgYXVkaW8gc291cmNlOiAlZCIsIG1BdWRpb1NvdXJjZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC05NDIsMTIgKzk5OCwxMSBAQAogICAgICAgICBtV3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CiAgICAgfQogICAgIG1Xcml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7Ci0gICAgbVdyaXRlci0+c3RhcnQoKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRSVFBSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFJUUFJlY29yZGluZygpIHsKICAgICBDSEVDS19FUShtT3V0cHV0Rm9ybWF0LCBPVVRQVVRfRk9STUFUX1JUUF9BVlApOwogCiAgICAgaWYgKChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVApAQCAtOTc0LDcgKzEwMjksNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmc291cmNlKTsKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsICZzb3VyY2UpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CkBAIC05ODQsMTAgKzEwMzksMTAgQEAKICAgICBtV3JpdGVyLT5hZGRTb3VyY2Uoc291cmNlKTsKICAgICBtV3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOwogCi0gICAgcmV0dXJuIG1Xcml0ZXItPnN0YXJ0KCk7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydE1QRUcyVFNSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTKTsKIAogICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzJUU1dyaXRlcihtT3V0cHV0RmQpOwpAQCAtMTAxOCw3ICsxMDczLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyOwotICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgbVZpZGVvQml0UmF0ZSwgJmVuY29kZXIpOworICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgJmVuY29kZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC0xMDM3LDcgKzEwOTIsNyBAQAogCiAgICAgbVdyaXRlciA9IHdyaXRlcjsKIAotICAgIHJldHVybiBtV3JpdGVyLT5zdGFydCgpOworICAgIHJldHVybiBPSzsKIH0KIAogdm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpjbGlwVmlkZW9GcmFtZVJhdGUoKSB7CkBAIC0xMjc4LDQ5ICsxMzMzLDE0IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgICptZWRpYVNvdXJjZSA9IGNhbWVyYVNvdXJjZTsKLSAgICB9IGVsc2UgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIpIHsKLSAgICAgICAgLy8gSWYgdXNpbmcgR1JBbGxvYyBidWZmZXJzLCBzZXR1cCBzdXJmYWNlbWVkaWFzb3VyY2UuCi0gICAgICAgIC8vIExhdGVyIGEgaGFuZGxlIHRvIHRoYXQgd2lsbCBiZSBwYXNzZWQKLSAgICAgICAgLy8gdG8gdGhlIGNsaWVudCBzaWRlIHdoZW4gcXVlcmllZAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cFN1cmZhY2VNZWRpYVNvdXJjZSgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICptZWRpYVNvdXJjZSA9IG1TdXJmYWNlTWVkaWFTb3VyY2U7CisgICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX1NVUkZBQ0UpIHsKKyAgICAgICAgKm1lZGlhU291cmNlID0gTlVMTDsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotLy8gc2V0dXBTdXJmYWNlTWVkaWFTb3VyY2UgY3JlYXRlcyBhIHNvdXJjZSB3aXRoIHRoZSBnaXZlbgotLy8gd2lkdGggYW5kIGhlaWdodCBhbmQgZnJhbWVyYXRlLgotLy8gVE9ETzogVGhpcyBjb3VsZCBnbyBpbiBhIHN0YXRpYyBmdW5jdGlvbiBpbnNpZGUgU3VyZmFjZU1lZGlhU291cmNlCi0vLyBzaW1pbGFyIHRvIHRoYXQgaW4gQ2FtZXJhU291cmNlCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFN1cmZhY2VNZWRpYVNvdXJjZSgpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBtU3VyZmFjZU1lZGlhU291cmNlID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICBpZiAobVN1cmZhY2VNZWRpYVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGlmIChtRnJhbWVSYXRlID09IC0xKSB7Ci0gICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0gMDsKLSAgICAgICAgQ0hFQ0sgKG1TdXJmYWNlTWVkaWFTb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleUZyYW1lUmF0ZSwgJmZyYW1lUmF0ZSkpOwotICAgICAgICBBTE9HSSgiRnJhbWUgcmF0ZSBpcyBub3QgZXhwbGljaXRseSBzZXQuIFVzZSB0aGUgY3VycmVudCBmcmFtZSAiCi0gICAgICAgICAgICAgInJhdGUgKCVkIGZwcykiLCBmcmFtZVJhdGUpOwotICAgICAgICBtRnJhbWVSYXRlID0gZnJhbWVSYXRlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IG1TdXJmYWNlTWVkaWFTb3VyY2UtPnNldEZyYW1lUmF0ZShtRnJhbWVSYXRlKTsKLSAgICB9Ci0gICAgQ0hFQ0sobUZyYW1lUmF0ZSAhPSAtMSk7Ci0KLSAgICBtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzID0KLSAgICAgICAgbVN1cmZhY2VNZWRpYVNvdXJjZS0+aXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBDYW1lcmFTb3VyY2UoCiAgICAgICAgIHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSkgewogICAgIHN0YXR1c190IGVyciA9IE9LOwpAQCAtMTM4NCwyNSArMTQwNCwyMiBAQAogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFZpZGVvRW5jb2RlcigKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYVNvdXJjZSwKLSAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKSB7CiAgICAgc291cmNlLT5jbGVhcigpOwogCi0gICAgc3A8TWV0YURhdGE+IGVuY19tZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgdmlkZW9CaXRSYXRlKTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgbUZyYW1lUmF0ZSk7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOwogCiAgICAgc3dpdGNoIChtVmlkZW9FbmNvZGVyKSB7CiAgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjYzOgotICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfTVBFR180X1NQOgotICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjY0OgotICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTE0MTAsNTkgKzE0MjcsODAgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY2FtZXJhU291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICBpZiAoY2FtZXJhU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBjYW1lcmFTb3VyY2UtPmdldEZvcm1hdCgpOwogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNsaWNlSGVpZ2h0LCBjb2xvckZvcm1hdDsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U3RyaWRlLCAmc3RyaWRlKSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTbGljZUhlaWdodCwgJnNsaWNlSGVpZ2h0KSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KSk7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzbGljZUhlaWdodCwgY29sb3JGb3JtYXQ7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJnN0cmlkZSkpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNsaWNlSGVpZ2h0LCAmc2xpY2VIZWlnaHQpKTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KSk7CiAKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsIG1JRnJhbWVzSW50ZXJ2YWxTZWMpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U3RyaWRlLCBzdHJpZGUpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsIHNsaWNlSGVpZ2h0KTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzdHJpZGUiLCBzdHJpZGUpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzbGljZS1oZWlnaHQiLCBzbGljZUhlaWdodCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIGNvbG9yRm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIG1WaWRlb1dpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic3RyaWRlIiwgbVZpZGVvV2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzbGljZS1oZWlnaHQiLCBtVmlkZW9XaWR0aCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKTsKKworICAgICAgICAvLyBzZXQgdXAgdGltZSBsYXBzZS9zbG93IG1vdGlvbiBmb3Igc3VyZmFjZSBzb3VyY2UKKyAgICAgICAgaWYgKG1DYXB0dXJlVGltZUxhcHNlKSB7CisgICAgICAgICAgICBpZiAobVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIHZhbHVlOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KCJ0aW1lLWxhcHNlIiwKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZSIsIG1WaWRlb0JpdFJhdGUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoImZyYW1lLXJhdGUiLCBtRnJhbWVSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgbUlGcmFtZXNJbnRlcnZhbFNlYyk7CisKICAgICBpZiAobVZpZGVvVGltZVNjYWxlID4gMCkgewotICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbVZpZGVvVGltZVNjYWxlKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigidGltZS1zY2FsZSIsIG1WaWRlb1RpbWVTY2FsZSk7CiAgICAgfQogICAgIGlmIChtVmlkZW9FbmNvZGVyUHJvZmlsZSAhPSAtMSkgewotICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvUHJvZmlsZSwgbVZpZGVvRW5jb2RlclByb2ZpbGUpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgbVZpZGVvRW5jb2RlclByb2ZpbGUpOwogICAgIH0KICAgICBpZiAobVZpZGVvRW5jb2RlckxldmVsICE9IC0xKSB7Ci0gICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwgbVZpZGVvRW5jb2RlckxldmVsKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigibGV2ZWwiLCBtVmlkZW9FbmNvZGVyTGV2ZWwpOwogICAgIH0KIAotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgKHN0YXR1c190KU9LKTsKLQotICAgIHVpbnQzMl90IGVuY29kZXJfZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKICAgICBpZiAobUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycykgewotICAgICAgICBlbmNvZGVyX2ZsYWdzIHw9IE9NWENvZGVjOjprU3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzOworICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjU291cmNlOjpGTEFHX1VTRV9NRVRBREFUQV9JTlBVVDsKICAgICB9CiAKLSAgICAvLyBEbyBub3Qgd2FpdCBmb3IgYWxsIHRoZSBpbnB1dCBidWZmZXJzIHRvIGJlY29tZSBhdmFpbGFibGUuCi0gICAgLy8gVGhpcyBnaXZlIHRpbWVsYXBzZSB2aWRlbyByZWNvcmRpbmcgZmFzdGVyIHJlc3BvbnNlIGluCi0gICAgLy8gcmVjZWl2aW5nIG91dHB1dCBmcm9tIHZpZGVvIGVuY29kZXIgY29tcG9uZW50LgotICAgIGlmIChtQ2FwdHVyZVRpbWVMYXBzZSkgewotICAgICAgICBlbmNvZGVyX2ZsYWdzIHw9IE9NWENvZGVjOjprT25seVN1Ym1pdE9uZUlucHV0QnVmZmVyQXRPbmVUaW1lOworICAgIGlmIChjYW1lcmFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjU291cmNlOjpGTEFHX1VTRV9TVVJGQUNFX0lOUFVUOwogICAgIH0KIAotICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jX21ldGEsCi0gICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSwKLSAgICAgICAgICAgIE5VTEwsIGVuY29kZXJfZmxhZ3MpOworICAgIHNwPE1lZGlhQ29kZWNTb3VyY2U+IGVuY29kZXIgPQorICAgICAgICAgICAgTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKG1Mb29wZXIsIGZvcm1hdCwgY2FtZXJhU291cmNlLCBmbGFncyk7CiAgICAgaWYgKGVuY29kZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgZW5jb2RlciIpOwogICAgICAgICAvLyBXaGVuIHRoZSBlbmNvZGVyIGZhaWxzIHRvIGJlIGNyZWF0ZWQsIHdlIG5lZWQKICAgICAgICAgLy8gcmVsZWFzZSB0aGUgY2FtZXJhIHNvdXJjZSBkdWUgdG8gdGhlIGNhbWVyYSdzIGxvY2sKICAgICAgICAgLy8gYW5kIHVubG9jayBtZWNoYW5pc20uCi0gICAgICAgIGNhbWVyYVNvdXJjZS0+c3RvcCgpOworICAgICAgICBpZiAoY2FtZXJhU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNhbWVyYVNvdXJjZS0+c3RvcCgpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIGlmIChjYW1lcmFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gZW5jb2Rlci0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgfQorCiAgICAgKnNvdXJjZSA9IGVuY29kZXI7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xNDk2LDE2ICsxNTM0LDEyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0UmVjb3JkaW5nKAotICAgICAgICBpbnQgb3V0cHV0RmQsCi0gICAgICAgIGludDMyX3QgdmlkZW9XaWR0aCwgaW50MzJfdCB2aWRlb0hlaWdodCwKLSAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCi0gICAgICAgIGludDMyX3QgKnRvdGFsQml0UmF0ZSwKLSAgICAgICAgc3A8TWVkaWFXcml0ZXI+ICptZWRpYVdyaXRlcikgewotICAgIG1lZGlhV3JpdGVyLT5jbGVhcigpOwotICAgICp0b3RhbEJpdFJhdGUgPSAwOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNFJlY29yZGluZygpIHsKKyAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgbVRvdGFsQml0UmF0ZSA9IDA7CisKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKG91dHB1dEZkKTsKKyAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKG1PdXRwdXRGZCk7CiAKICAgICBpZiAobVZpZGVvU291cmNlIDwgVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CiAKQEAgLTE1MTYsMTMgKzE1NTAsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyOwotICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgdmlkZW9CaXRSYXRlLCAmZW5jb2Rlcik7CisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCAmZW5jb2Rlcik7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAogICAgICAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKLSAgICAgICAgKnRvdGFsQml0UmF0ZSArPSB2aWRlb0JpdFJhdGU7CisgICAgICAgIG1Ub3RhbEJpdFJhdGUgKz0gbVZpZGVvQml0UmF0ZTsKICAgICB9CiAKICAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCkBAIC0xNTMxLDcgKzE1NjUsNyBAQAogICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSkgewogICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwotICAgICAgICAqdG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7CisgICAgICAgIG1Ub3RhbEJpdFJhdGUgKz0gbUF1ZGlvQml0UmF0ZTsKICAgICB9CiAKICAgICBpZiAobUludGVybGVhdmVEdXJhdGlvblVzID4gMCkgewpAQCAtMTU0OSwyMiArMTU4MywyOCBAQAogICAgICAgICB3cml0ZXItPnNldE1heEZpbGVTaXplKG1NYXhGaWxlU2l6ZUJ5dGVzKTsKICAgICB9CiAKLSAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRTdGFydFRpbWVPZmZzZXRNcyhtQ2FtZXJhSWQpOworICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0RFRkFVTFQKKyAgICAgICAgICAgIHx8IG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfQ0FNRVJBKSB7CisgICAgICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFN0YXJ0VGltZU9mZnNldE1zKG1DYW1lcmFJZCk7CisgICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX1NVUkZBQ0UpIHsKKyAgICAgICAgLy8gc3VyZmFjZSBzb3VyY2UgZG9lc24ndCBuZWVkIGxhcmdlIGluaXRpYWwgZGVsYXkKKyAgICAgICAgbVN0YXJ0VGltZU9mZnNldE1zID0gMjAwOworICAgIH0KICAgICBpZiAobVN0YXJ0VGltZU9mZnNldE1zID4gMCkgewogICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgogICAgICAgICAgICAgc2V0U3RhcnRUaW1lT2Zmc2V0TXMobVN0YXJ0VGltZU9mZnNldE1zKTsKICAgICB9CiAKICAgICB3cml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7Ci0gICAgKm1lZGlhV3JpdGVyID0gd3JpdGVyOworICAgIG1Xcml0ZXIgPSB3cml0ZXI7CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRNZXRhRGF0YShpbnQ2NF90IHN0YXJ0VGltZVVzLCBpbnQzMl90IHRvdGFsQml0UmF0ZSwKLSAgICAgICAgc3A8TWV0YURhdGE+ICptZXRhKSB7Cit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRNZXRhRGF0YShzcDxNZXRhRGF0YT4gKm1ldGEpIHsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKICAgICAoKm1ldGEpLT5zZXRJbnQ2NChrS2V5VGltZSwgc3RhcnRUaW1lVXMpOwogICAgICgqbWV0YSktPnNldEludDMyKGtLZXlGaWxlVHlwZSwgbU91dHB1dEZvcm1hdCk7Ci0gICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIHRvdGFsQml0UmF0ZSk7CisgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIG1Ub3RhbEJpdFJhdGUpOwogICAgICgqbWV0YSktPnNldEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsIG1Vc2U2NEJpdEZpbGVPZmZzZXQpOwogICAgIGlmIChtTW92aWVUaW1lU2NhbGUgPiAwKSB7CiAgICAgICAgICgqbWV0YSktPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1Nb3ZpZVRpbWVTY2FsZSk7CkBAIC0xNTc3LDI3ICsxNjE3LDYgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0TVBFRzRSZWNvcmRpbmcoKSB7Ci0gICAgaW50MzJfdCB0b3RhbEJpdFJhdGU7Ci0gICAgc3RhdHVzX3QgZXJyID0gc2V0dXBNUEVHNFJlY29yZGluZygKLSAgICAgICAgICAgIG1PdXRwdXRGZCwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKLSAgICAgICAgICAgIG1WaWRlb0JpdFJhdGUsICZ0b3RhbEJpdFJhdGUsICZtV3JpdGVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc2V0dXBNUEVHNE1ldGFEYXRhKHN0YXJ0VGltZVVzLCB0b3RhbEJpdFJhdGUsICZtZXRhKTsKLQotICAgIGVyciA9IG1Xcml0ZXItPnN0YXJ0KG1ldGEuZ2V0KCkpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnBhdXNlKCkgewogICAgIEFMT0dWKCJwYXVzZSIpOwogICAgIGlmIChtV3JpdGVyID09IE5VTEwpIHsKQEAgLTE2MzcsNiArMTY1Niw4IEBACiAgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKICAgICB9CiAKKyAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNsZWFyKCk7CisKICAgICBpZiAobU91dHB1dEZkID49IDApIHsKICAgICAgICAgOjpjbG9zZShtT3V0cHV0RmQpOwogICAgICAgICBtT3V0cHV0RmQgPSAtMTsKQEAgLTE2NTYsNyArMTY3Nyw2IEBACiAgICAgICAgIGFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7CiAgICAgfQogCi0KICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0xNzA4LDYgKzE3MjgsNyBAQAogICAgIG1Sb3RhdGlvbkRlZ3JlZXMgPSAwOwogICAgIG1MYXRpdHVkZXgxMDAwMCA9IC0zNjAwMDAwOwogICAgIG1Mb25naXR1ZGV4MTAwMDAgPSAtMzYwMDAwMDsKKyAgICBtVG90YWxCaXRSYXRlID0gMDsKIAogICAgIG1PdXRwdXRGZCA9IC0xOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCAzMWYwOWUwLi4zNzdkMTY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTM3LDYgKzM3LDcgQEAKIGNsYXNzIE1lZGlhUHJvZmlsZXM7CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogY2xhc3MgU3VyZmFjZU1lZGlhU291cmNlOworY2xhc3MgQUxvb3BlcjsKIAogc3RydWN0IFN0YWdlZnJpZ2h0UmVjb3JkZXIgOiBwdWJsaWMgTWVkaWFSZWNvcmRlckJhc2UgewogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIoKTsKQEAgLTEwNiw2ICsxMDcsNyBAQAogICAgIGludDMyX3QgbUxhdGl0dWRleDEwMDAwOwogICAgIGludDMyX3QgbUxvbmdpdHVkZXgxMDAwMDsKICAgICBpbnQzMl90IG1TdGFydFRpbWVPZmZzZXRNczsKKyAgICBpbnQzMl90IG1Ub3RhbEJpdFJhdGU7CiAKICAgICBib29sIG1DYXB0dXJlVGltZUxhcHNlOwogICAgIGludDY0X3QgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXM7CkBAIC0xMjIsMjIgKzEyNCwxNyBAQAogICAgIC8vIEFuIDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwb2ludGVyCiAgICAgLy8gd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgc2lkZSB1c2luZyB3aGljaCB0aGUKICAgICAvLyBmcmFtZSBidWZmZXJzIHdpbGwgYmUgcXVldWVkIGFuZCBkZXF1ZXVlZAotICAgIHNwPFN1cmZhY2VNZWRpYVNvdXJjZT4gbVN1cmZhY2VNZWRpYVNvdXJjZTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAKLSAgICBzdGF0dXNfdCBzZXR1cE1QRUc0UmVjb3JkaW5nKAotICAgICAgICBpbnQgb3V0cHV0RmQsCi0gICAgICAgIGludDMyX3QgdmlkZW9XaWR0aCwgaW50MzJfdCB2aWRlb0hlaWdodCwKLSAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCi0gICAgICAgIGludDMyX3QgKnRvdGFsQml0UmF0ZSwKLSAgICAgICAgc3A8TWVkaWFXcml0ZXI+ICptZWRpYVdyaXRlcik7Ci0gICAgdm9pZCBzZXR1cE1QRUc0TWV0YURhdGEoaW50NjRfdCBzdGFydFRpbWVVcywgaW50MzJfdCB0b3RhbEJpdFJhdGUsCi0gICAgICAgIHNwPE1ldGFEYXRhPiAqbWV0YSk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRNUEVHNFJlY29yZGluZygpOwotICAgIHN0YXR1c190IHN0YXJ0QU1SUmVjb3JkaW5nKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRBQUNSZWNvcmRpbmcoKTsKLSAgICBzdGF0dXNfdCBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRSVFBSZWNvcmRpbmcoKTsKLSAgICBzdGF0dXNfdCBzdGFydE1QRUcyVFNSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlSW50ZXJuYWwoKTsKKyAgICBzdGF0dXNfdCBzZXR1cE1QRUc0UmVjb3JkaW5nKCk7CisgICAgdm9pZCBzZXR1cE1QRUc0TWV0YURhdGEoc3A8TWV0YURhdGE+ICptZXRhKTsKKyAgICBzdGF0dXNfdCBzZXR1cEFNUlJlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwQUFDUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwUlRQUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUF1ZGlvU291cmNlKCk7CiAgICAgc3RhdHVzX3QgY2hlY2tWaWRlb0VuY29kZXJDYXBhYmlsaXRpZXMoCiAgICAgICAgICAgICBib29sICpzdXBwb3J0c0NhbWVyYVNvdXJjZU1ldGFEYXRhTW9kZSk7CkBAIC0xNDcsMTQgKzE0NCw4IEBACiAgICAgLy8gZGVwZW5kaW5nIG9uIHRoZSB2aWRlb3NvdXJjZSB0eXBlCiAgICAgc3RhdHVzX3Qgc2V0dXBNZWRpYVNvdXJjZShzcDxNZWRpYVNvdXJjZT4gKm1lZGlhU291cmNlKTsKICAgICBzdGF0dXNfdCBzZXR1cENhbWVyYVNvdXJjZShzcDxDYW1lcmFTb3VyY2U+ICpjYW1lcmFTb3VyY2UpOwotICAgIC8vIHNldHVwIHRoZSBzdXJmYWNlbWVkaWFzb3VyY2UgZm9yIHRoZSBlbmNvZGVyCi0gICAgc3RhdHVzX3Qgc2V0dXBTdXJmYWNlTWVkaWFTb3VyY2UoKTsKLQogICAgIHN0YXR1c190IHNldHVwQXVkaW9FbmNvZGVyKGNvbnN0IHNwPE1lZGlhV3JpdGVyPiYgd3JpdGVyKTsKLSAgICBzdGF0dXNfdCBzZXR1cFZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsCi0gICAgICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKLSAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKKyAgICBzdGF0dXNfdCBzZXR1cFZpZGVvRW5jb2RlcihzcDxNZWRpYVNvdXJjZT4gY2FtZXJhU291cmNlLCBzcDxNZWRpYVNvdXJjZT4gKnNvdXJjZSk7CiAKICAgICAvLyBFbmNvZGluZyBwYXJhbWV0ZXIgaGFuZGxpbmcgdXRpbGl0aWVzCiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGNvbnN0IFN0cmluZzggJmtleSwgY29uc3QgU3RyaW5nOCAmdmFsdWUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5jcHAKaW5kZXggNWQ5NzI4YS4uNTc5NTc3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuY3BwCkBAIC0xMTMsNyArMTEzLDkgQEAKIC8vIENyZWF0ZSB0aGUgdGVzdCBwbGF5ZXIuCiAvLyBDYWxsIHNldERhdGFTb3VyY2Ugb24gdGhlIHRlc3QgcGxheWVyIHdpdGggdGhlIHVybCBpbiBwYXJhbS4KIHN0YXR1c190IFRlc3RQbGF5ZXJTdHViOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBpZiAoIWlzVGVzdFVybCh1cmwpIHx8IE5VTEwgIT0gbUhhbmRsZSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMTYyLDcgKzE2NCw3IEBACiAgICAgfQogCiAgICAgbVBsYXllciA9ICgqbU5ld1BsYXllcikoKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZShtQ29udGVudFVybCwgaGVhZGVycyk7CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIG1Db250ZW50VXJsLCBoZWFkZXJzKTsKIH0KIAogLy8gSW50ZXJuYWwgY2xlYW51cC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmgKaW5kZXggYTM4MDJlYi4uNTViZjJjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmgKQEAgLTY2LDcgKzY2LDkgQEAKIAogICAgIC8vIEBwYXJhbSB1cmwgU2hvdWxkIGJlIGEgdGVzdCB1cmwuIFNlZSBjbGFzcyBjb21tZW50LgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIC8vIFRlc3QgcGxheWVyIGZvciBhIGZpbGUgZGVzY3JpcHRvciBzb3VyY2UgaXMgbm90IHN1cHBvcnRlZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50LCBpbnQ2NF90LCBpbnQ2NF90KSAgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tawppbmRleCBmOTQ2YzFjLi5mOTdiYTU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tawpAQCAtMTEsNyArMTEsNiBAQAogICAgICAgICBOdVBsYXllclN0cmVhbUxpc3RlbmVyLmNwcCAgICAgIFwKICAgICAgICAgUlRTUFNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFN0cmVhbWluZ1NvdXJjZS5jcHAgICAgICAgICAgICAgXAotICAgICAgICBtcDQvTVA0U291cmNlLmNwcCAgICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKaW5kZXggYjA0ZTdhNi4uMDZhYWMzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcApAQCAtMzMsMTcgKzMzLDE2IEBACiAKIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpHZW5lcmljU291cmNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgYm9vbCB1aWRWYWxpZCwKLSAgICAgICAgdWlkX3QgdWlkKQorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKICAgICA6IFNvdXJjZShub3RpZnkpLAogICAgICAgbUR1cmF0aW9uVXMoMGxsKSwKICAgICAgIG1BdWRpb0lzVm9yYmlzKGZhbHNlKSB7CiAgICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKIAogICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVybCwgaGVhZGVycyk7CisgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiAgICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKIAogICAgIGluaXRGcm9tRGF0YVNvdXJjZShkYXRhU291cmNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCmluZGV4IDJkYTY4MGMuLjIwZDU5N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaApAQCAtMzMsMTAgKzMzLDkgQEAKIHN0cnVjdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKICAgICBHZW5lcmljU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBib29sIHVpZFZhbGlkID0gZmFsc2UsCi0gICAgICAgICAgICB1aWRfdCB1aWQgPSAwKTsKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIEdlbmVyaWNTb3VyY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCmluZGV4IDUxMGRjYzkuLmNiZWRmNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIkxpdmVEYXRhU291cmNlLmgiCiAjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0zNCwxMyArMzUsMTIgQEAKIAogTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpIVFRQTGl2ZVNvdXJjZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCkKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiAgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCiAgICAgICBtVVJMKHVybCksCi0gICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAotICAgICAgbVVJRCh1aWQpLAogICAgICAgbUZsYWdzKDApLAogICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKICAgICAgIG1PZmZzZXQoMCksCkBAIC03OSw4ICs3OSw3IEBACiAgICAgbUxpdmVTZXNzaW9uID0gbmV3IExpdmVTZXNzaW9uKAogICAgICAgICAgICAgbm90aWZ5LAogICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSA/IExpdmVTZXNzaW9uOjprRmxhZ0luY29nbml0byA6IDAsCi0gICAgICAgICAgICBtVUlEVmFsaWQsCi0gICAgICAgICAgICBtVUlEKTsKKyAgICAgICAgICAgIG1IVFRQU2VydmljZSk7CiAKICAgICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKaW5kZXggYmNjM2Y4Yi4uNGQ3MjUxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKQEAgLTI4LDEwICsyOCw5IEBACiBzdHJ1Y3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlIDogcHVibGljIE51UGxheWVyOjpTb3VyY2UgewogICAgIEhUVFBMaXZlU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBib29sIHVpZFZhbGlkID0gZmFsc2UsCi0gICAgICAgICAgICB1aWRfdCB1aWQgPSAwKTsKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKQEAgLTYxLDEwICs2MCw5IEBACiAgICAgICAgIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsCiAgICAgfTsKIAorICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAgICAgQVN0cmluZyBtVVJMOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1FeHRyYUhlYWRlcnM7Ci0gICAgYm9vbCBtVUlEVmFsaWQ7Ci0gICAgdWlkX3QgbVVJRDsKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwogICAgIG9mZjY0X3QgbU9mZnNldDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCmluZGV4IDI1ZDU1YTMuLmQ4ZDkzOWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcApAQCAtMjgsMTggKzI4LDEzIEBACiAjaW5jbHVkZSAiUlRTUFNvdXJjZS5oIgogI2luY2x1ZGUgIlN0cmVhbWluZ1NvdXJjZS5oIgogI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UuaCIKLSNpbmNsdWRlICJtcDQvTVA0U291cmNlLmgiCiAKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIAotI2luY2x1ZGUgIlNvZnR3YXJlUmVuZGVyZXIuaCIKLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC0xNDgsNyArMTQzLDYgQEAKICAgICA6IG1VSURWYWxpZChmYWxzZSksCiAgICAgICBtU291cmNlRmxhZ3MoMCksCiAgICAgICBtVmlkZW9Jc0FWQyhmYWxzZSksCi0gICAgICBtTmVlZHNTd1JlbmRlcmVyKGZhbHNlKSwKICAgICAgIG1BdWRpb0VPUyhmYWxzZSksCiAgICAgICBtVmlkZW9FT1MoZmFsc2UpLAogICAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyhmYWxzZSksCkBAIC0xODMsMTQgKzE3Nyw3IEBACiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCBpZCgpKTsKIAotICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LnVzZS1tcDRzb3VyY2UiLCBwcm9wLCBOVUxMKQotICAgICAgICAgICAgJiYgKCFzdHJjbXAocHJvcCwgIjEiKSB8fCAhc3RyY2FzZWNtcChwcm9wLCAidHJ1ZSIpKSkgewotICAgICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IE1QNFNvdXJjZShub3RpZnksIHNvdXJjZSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBuZXcgU3RyZWFtaW5nU291cmNlKG5vdGlmeSwgc291cmNlKSk7Ci0gICAgfQotCisgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBTdHJlYW1pbmdTb3VyY2Uobm90aWZ5LCBzb3VyY2UpKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtMjEyLDcgKzE5OSw5IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnNldERhdGFTb3VyY2VBc3luYygKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIGlkKCkpOwogICAgIHNpemVfdCBsZW4gPSBzdHJsZW4odXJsKTsKIApAQCAtMjIwLDE2ICsyMDksMTggQEAKIAogICAgIHNwPFNvdXJjZT4gc291cmNlOwogICAgIGlmIChJc0hUVFBMaXZlVVJMKHVybCkpIHsKLSAgICAgICAgc291cmNlID0gbmV3IEhUVFBMaXZlU291cmNlKG5vdGlmeSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICBzb3VyY2UgPSBuZXcgSFRUUExpdmVTb3VyY2Uobm90aWZ5LCBodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh1cmwsICJydHNwOi8vIiwgNykpIHsKLSAgICAgICAgc291cmNlID0gbmV3IFJUU1BTb3VyY2Uobm90aWZ5LCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCk7CisgICAgICAgIHNvdXJjZSA9IG5ldyBSVFNQU291cmNlKAorICAgICAgICAgICAgICAgIG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlEKTsKICAgICB9IGVsc2UgaWYgKCghc3RybmNhc2VjbXAodXJsLCAiaHR0cDovLyIsIDcpCiAgICAgICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKHVybCwgImh0dHBzOi8vIiwgOCkpCiAgICAgICAgICAgICAgICAgICAgICYmICgobGVuID49IDQgJiYgIXN0cmNhc2VjbXAoIi5zZHAiLCAmdXJsW2xlbiAtIDRdKSkKICAgICAgICAgICAgICAgICAgICAgfHwgc3Ryc3RyKHVybCwgIi5zZHA/IikpKSB7Ci0gICAgICAgIHNvdXJjZSA9IG5ldyBSVFNQU291cmNlKG5vdGlmeSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQsIHRydWUpOworICAgICAgICBzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZSgKKyAgICAgICAgICAgICAgICBub3RpZnksIGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCwgdHJ1ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc291cmNlID0gbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCk7CisgICAgICAgIHNvdXJjZSA9IG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiAgICAgfQogCiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CkBAIC00NDcsNyArNDM4LDYgQEAKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFN0YXJ0Iik7CiAKICAgICAgICAgICAgIG1WaWRlb0lzQVZDID0gZmFsc2U7Ci0gICAgICAgICAgICBtTmVlZHNTd1JlbmRlcmVyID0gZmFsc2U7CiAgICAgICAgICAgICBtQXVkaW9FT1MgPSBmYWxzZTsKICAgICAgICAgICAgIG1WaWRlb0VPUyA9IGZhbHNlOwogICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdBdWRpb1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKQEAgLTUzOCwyNCArNTI4LDIxIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGJvb2wgYXVkaW8gPSBtc2ctPndoYXQoKSA9PSBrV2hhdEF1ZGlvTm90aWZ5OwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gY29kZWNSZXF1ZXN0OwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiY29kZWMtcmVxdWVzdCIsICZjb2RlY1JlcXVlc3QpKTsKLQogICAgICAgICAgICAgaW50MzJfdCB3aGF0OwotICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwogCi0gICAgICAgICAgICBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RmlsbFRoaXNCdWZmZXIpIHsKKyAgICAgICAgICAgIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0RmlsbFRoaXNCdWZmZXIpIHsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZWVkRGVjb2RlcklucHV0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLCBjb2RlY1JlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8sIG1zZyk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgewogICAgICAgICAgICAgICAgICAgICBpZiAobVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwbGwpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRFT1MpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdEVPUykgewogICAgICAgICAgICAgICAgIGludDMyX3QgZXJyOwotICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ290ICVzIGRlY29kZXIgRU9TIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CkBAIC01NjYsNyArNTUzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKGF1ZGlvLCBlcnIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCkgeworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICBib29sIG5lZWRTaHV0ZG93bjsKIAogICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewpAQCAtNTk1LDE0ICs1ODIsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCkgeworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCkgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworCiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpKTsKIAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7CiAKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvIG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlZCBIeiwgJWQgY2hhbm5lbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKQEAgLTYyNiw3ICs2MTYsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJmNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmY2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUjsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC02NDcsMTEgKzYzNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAvLyB2aWRlbwogCiAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOwogCiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kUmVjdCgKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kUmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpOwogCkBAIC02ODQsMjIgKzY3NCw4IEBACiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfU0VUX1ZJREVPX1NJWkUsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1OZWVkc1N3UmVuZGVyZXIgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldFJlY3Qoa0tleUNyb3BSZWN0LCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnNldFNvZnRSZW5kZXJlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvZnR3YXJlUmVuZGVyZXIobU5hdGl2ZVdpbmRvdy0+Z2V0TmF0aXZlV2luZG93KCksIG1ldGEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNodXRkb3duIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewogICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CkBAIC03MTQsMjIgKzY5MCwxNSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRFcnJvcikgeworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0RXJyb3IpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiUmVjZWl2ZWQgZXJyb3IgZnJvbSAlcyBkZWNvZGVyLCBhYm9ydGluZyBwbGF5YmFjay4iLAogICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAKICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKGF1ZGlvLCBVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RHJhaW5UaGlzQnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgcmVuZGVyQnVmZmVyKGF1ZGlvLCBjb2RlY1JlcXVlc3QpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kU3RyaW5nKCJjb21wb25lbnROYW1lIiwgJm5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgbU5lZWRzU3dSZW5kZXJlciA9IG5hbWUuc3RhcnRzV2l0aCgiT01YLmdvb2dsZS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgIT0gQUNvZGVjOjprV2hhdENvbXBvbmVudENvbmZpZ3VyZWQKLSAgICAgICAgICAgICAgICAgICAgJiYgd2hhdCAhPSBBQ29kZWM6OmtXaGF0QnVmZmVyc0FsbG9jYXRlZCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJVbmhhbmRsZWQgY29kZWMgbm90aWZpY2F0aW9uICVkICclYyVjJWMlYycuIiwKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdERyYWluVGhpc0J1ZmZlcikgeworICAgICAgICAgICAgICAgIHJlbmRlckJ1ZmZlcihhdWRpbywgbXNnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlVuaGFuZGxlZCBkZWNvZGVyIG5vdGlmaWNhdGlvbiAlZCAnJWMlYyVjJWMnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwKICAgICAgICAgICAgICAgICAgICAgICB3aGF0ID4+IDI0LAogICAgICAgICAgICAgICAgICAgICAgICh3aGF0ID4+IDE2KSAmIDB4ZmYsCkBAIC05MzAsOCArODk5LDcgQEAKIAogICAgICpkZWNvZGVyID0gYXVkaW8gPyBuZXcgRGVjb2Rlcihub3RpZnkpIDoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlY29kZXIobm90aWZ5LCBtTmF0aXZlV2luZG93KTsKLSAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKCpkZWNvZGVyKTsKLQorICAgICgqZGVjb2RlciktPmluaXQoKTsKICAgICAoKmRlY29kZXIpLT5jb25maWd1cmUoZm9ybWF0KTsKIAogICAgIHJldHVybiBPSzsKQEAgLTE1MzEsNyArMTQ5OSw3IEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKK3ZvaWQgTnVQbGF5ZXI6OlNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSB7CiAgICAgVFJFU1BBU1MoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAppbmRleCA1OTBlMWYyLi5mMWQzZDU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaApAQCAtMjQsNyArMjQsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBBQ29kZWM7CiBzdHJ1Y3QgTWV0YURhdGE7CiBzdHJ1Y3QgTnVQbGF5ZXJEcml2ZXI7CiAKQEAgLTM4LDcgKzM3LDkgQEAKICAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKIAogICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCkBAIC0xMTYsNyArMTE3LDYgQEAKICAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKICAgICBzcDxEZWNvZGVyPiBtVmlkZW9EZWNvZGVyOwogICAgIGJvb2wgbVZpZGVvSXNBVkM7Ci0gICAgYm9vbCBtTmVlZHNTd1JlbmRlcmVyOwogICAgIHNwPERlY29kZXI+IG1BdWRpb0RlY29kZXI7CiAgICAgc3A8UmVuZGVyZXI+IG1SZW5kZXJlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCAyNDIzZmQ1Li40NjljOWNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtMTcsMTQgKzE3LDE3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk51UGxheWVyRGVjb2RlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSAiTnVQbGF5ZXJEZWNvZGVyLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzIsNzAgKzM1LDQwNCBAQAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgY29uc3Qgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gJm5hdGl2ZVdpbmRvdykKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSB7CisgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCisgICAgICBtQnVmZmVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1Db21wb25lbnROYW1lKCJkZWNvZGVyIikgeworICAgIC8vIEV2ZXJ5IGRlY29kZXIgaGFzIGl0cyBvd24gbG9vcGVyIGJlY2F1c2UgTWVkaWFDb2RlYyBvcGVyYXRpb25zCisgICAgLy8gYXJlIGJsb2NraW5nLCBidXQgTnVQbGF5ZXIgbmVlZHMgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCisgICAgbURlY29kZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtRGVjb2Rlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJEZWNvZGVyIik7CisgICAgbURlY29kZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisKKyAgICBtQ29kZWNMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ29kZWNMb29wZXItPnNldE5hbWUoIk51UGxheWVyRGVjb2Rlci1NQyIpOworICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKIH0KIAogTnVQbGF5ZXI6OkRlY29kZXI6On5EZWNvZGVyKCkgewogfQogCi12b2lkIE51UGxheWVyOjpEZWNvZGVyOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CiAgICAgQ0hFQ0sobUNvZGVjID09IE5VTEwpOwogCisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKwogICAgIEFTdHJpbmcgbWltZTsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeU1zZyA9Ci0gICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCBpZCgpKTsKLQotICAgIG1DU0RJbmRleCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7OyArK2kpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkOwotICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEJ1ZmZlcihTdHJpbmdQcmludGYoImNzZC0lZCIsIGkpLmNfc3RyKCksICZjc2QpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG1DU0QucHVzaChjc2QpOworICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBOVUxMOworICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgc3VyZmFjZSA9IG1OYXRpdmVXaW5kb3ctPmdldFN1cmZhY2VUZXh0dXJlQ2xpZW50KCk7CiAgICAgfQogCisgICAgbUNvbXBvbmVudE5hbWUgPSBtaW1lOworICAgIG1Db21wb25lbnROYW1lLmFwcGVuZCgiIGRlY29kZXIiKTsKKyAgICBBTE9HVigiWyVzXSBvbkNvbmZpZ3VyZSAoc3VyZmFjZT0lcCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBzdXJmYWNlLmdldCgpKTsKKworICAgIG1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZShtQ29kZWNMb29wZXIsIG1pbWUuY19zdHIoKSwgZmFsc2UgLyogZW5jb2RlciAqLyk7CisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlICVzIGRlY29kZXIiLCBtaW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Db2RlYy0+Z2V0TmFtZSgmbUNvbXBvbmVudE5hbWUpOworCiAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgibmF0aXZlLXdpbmRvdyIsIG1OYXRpdmVXaW5kb3cpOworICAgICAgICAvLyBkaXNjb25uZWN0IGZyb20gc3VyZmFjZSBhcyBNZWRpYUNvZGVjIHdpbGwgcmVjb25uZWN0CisgICAgICAgIENIRUNLX0VRKChpbnQpTk9fRVJST1IsCisgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSkpOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgIGZvcm1hdCwgc3VyZmFjZSwgTlVMTCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgJXMgZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBpbiBjb25maWd1cmVkIHN0YXRlCisgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtQ29kZWMtPmdldE91dHB1dEZvcm1hdCgmbU91dHB1dEZvcm1hdCkpOworICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmbUlucHV0Rm9ybWF0KSk7CisKKyAgICBlcnIgPSBtQ29kZWMtPnN0YXJ0KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0ICVzIGRlY29kZXIgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gQ3VycmVudCB2aWRlbyBkZWNvZGVycyBkbyBub3QgcmV0dXJuIGZyb20gT01YX0ZpbGxUaGlzQnVmZmVyCi0gICAgLy8gcXVpY2tseSwgdmlvbGF0aW5nIHRoZSBPcGVuTUFYIHNwZWNzLCB1bnRpbCB0aGF0IGlzIHJlbWVkaWVkCi0gICAgLy8gd2UgbmVlZCB0byBpbnZlc3QgaW4gYW4gZXh0cmEgbG9vcGVyIHRvIGZyZWUgdGhlIG1haW4gZXZlbnQKLSAgICAvLyBxdWV1ZS4KLSAgICBib29sIG5lZWREZWRpY2F0ZWRMb29wZXIgPSAhc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAidmlkZW8vIiwgNik7CisgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBhZnRlciBzdGFydAorICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRJbnB1dEJ1ZmZlcnMoJm1JbnB1dEJ1ZmZlcnMpKTsKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmbU91dHB1dEJ1ZmZlcnMpKTsKKyAgICBBTE9HVigiWyVzXSBnb3QgJXp1IGlucHV0IGFuZCAlenUgb3V0cHV0IGJ1ZmZlcnMiLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpLAorICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKIAotICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgbUNvZGVjID0gbmV3IEFDb2RlYzsKKyAgICByZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKTsKK30KIAotICAgIGlmIChuZWVkRGVkaWNhdGVkTG9vcGVyICYmIG1Db2RlY0xvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlY0xvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtQ29kZWNMb29wZXItPnNldE5hbWUoIk51UGxheWVyRGVjb2RlciIpOwotICAgICAgICBtQ29kZWNMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Cit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpyZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKSB7CisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCBpZCgpKTsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworICAgICAgICBtQ29kZWMtPnJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihyZXBseSk7CisgICAgfQorfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyOjppc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgIHJldHVybiBnZW5lcmF0aW9uICE9IG1CdWZmZXJHZW5lcmF0aW9uOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjppbml0KCkgeworICAgIG1EZWNvZGVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWd1cmUsIGlkKCkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6aGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpCit7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVycm9yKTsKKyAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyOjpoYW5kbGVBbklucHV0QnVmZmVyKCkgeworICAgIHNpemVfdCBidWZmZXJJeCA9IC0xOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZidWZmZXJJeCk7CisgICAgQUxPR1YoIlslc10gZGVxdWV1ZWQgaW5wdXQ6ICVkIiwKKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyA9PSBPSyA/IChpbnQpYnVmZmVySXggOiByZXMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgaWYgKHJlcyAhPSAtRUFHQUlOKSB7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAobmVlZERlZGljYXRlZExvb3BlciA/IG1Db2RlY0xvb3BlciA6IGxvb3BlcigpKS0+cmVnaXN0ZXJIYW5kbGVyKG1Db2RlYyk7CisgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKIAotICAgIG1Db2RlYy0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShub3RpZnlNc2cpOwotICAgIG1Db2RlYy0+aW5pdGlhdGVTZXR1cChmb3JtYXQpOworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdElucHV0QnVmZmVyRmlsbGVkLCBpZCgpKTsKKyAgICByZXBseS0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgYnVmZmVySXgpOworICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGaWxsVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIG1JbnB1dEJ1ZmZlcnNbYnVmZmVySXhdKTsKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGFuZHJvaWQ6Ok51UGxheWVyOjpEZWNvZGVyOjpvbklucHV0QnVmZmVyRmlsbGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc2l6ZV90IGJ1ZmZlckl4OworICAgIENIRUNLKG1zZy0+ZmluZFNpemUoImJ1ZmZlci1peCIsICZidWZmZXJJeCkpOworICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgc3A8QUJ1ZmZlcj4gY29kZWNCdWZmZXIgPSBtSW5wdXRCdWZmZXJzW2J1ZmZlckl4XTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBib29sIGhhc0J1ZmZlciA9IG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcik7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIC8qIGluY2x1ZGVzICFoYXNCdWZmZXIgKi8pIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1FcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJnN0cmVhbUVycikgfHwgIWhhc0J1ZmZlcik7CisKKyAgICAgICAgaWYgKHN0cmVhbUVyciA9PSBPSykgeworICAgICAgICAgICAgLyogYnVmZmVycyBhcmUgcmV0dXJuZWQgdG8gaG9sZCBvbiB0byAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXR0ZW1wdCB0byBxdWV1ZSBFT1MKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgIGJ1ZmZlckl4LAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUyk7CisgICAgICAgIGlmIChzdHJlYW1FcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSAmJiBlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHN0cmVhbUVyciA9IGVycjsKKyAgICAgICAgICAgIC8vIGVyciB3aWxsIG5vdCBiZSBFUlJPUl9FTkRfT0ZfU1RSRUFNCisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyZWFtRXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHN0cmVhbUVycik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IDA7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgICAgIGludDMyX3QgZW9zOworICAgICAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IENPREVDQ09ORklHIG9yIFNZTkNGUkFNRSBmb3IgZGVjb2RlcgorICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zKSB7CisgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb3B5IGludG8gY29kZWMgYnVmZmVyCisgICAgICAgIGlmIChidWZmZXIgIT0gY29kZWNCdWZmZXIpIHsKKyAgICAgICAgICAgIENIRUNLX0xFKGJ1ZmZlci0+c2l6ZSgpLCBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVldWUgaW5wdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyOjpoYW5kbGVBbk91dHB1dEJ1ZmZlcigpIHsKKyAgICBzaXplX3QgYnVmZmVySXggPSAtMTsKKyAgICBzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIGludDY0X3QgdGltZVVzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICZidWZmZXJJeCwgJm9mZnNldCwgJnNpemUsICZ0aW1lVXMsICZmbGFncyk7CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWVkIG91dHB1dDogJWQiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWVkIG91dHB1dDogJWQgKHRpbWU9JWxsZCBmbGFncz0lIiBQUkl1MzIgIikiLAorICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChpbnQpYnVmZmVySXgsIHRpbWVVcywgZmxhZ3MpOworICAgIH0KKworICAgIGlmIChyZXMgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKSB7CisgICAgICAgIHJlcyA9IG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmbU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBvdXRwdXQgYnVmZmVycyBmb3IgJXMgYWZ0ZXIgSU5GTyBldmVudCAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIE51UGxheWVyIGlnbm9yZXMgdGhpcworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgcmVzID0gbUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJmZvcm1hdCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IG91dHB1dCBmb3JtYXQgZm9yICVzIGFmdGVyIElORk8gZXZlbnQgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVzID09IElORk9fRElTQ09OVElOVUlUWSkgeworICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIGlmIChyZXMgIT0gLUVBR0FJTikgeworICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbU91dHB1dEJ1ZmZlcnNbYnVmZmVySXhdOworICAgIGJ1ZmZlci0+c2V0UmFuZ2Uob2Zmc2V0LCBzaXplKTsKKyAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CisgICAgfQorICAgIC8vIHdlIGRvIG5vdCBleHBlY3QgQ09ERUNDT05GSUcgb3IgU1lOQ0ZSQU1FIGZvciBkZWNvZGVyCisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJCdWZmZXIsIGlkKCkpOworICAgIHJlcGx5LT5zZXRTaXplKCJidWZmZXItaXgiLCBidWZmZXJJeCk7CisgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdERyYWluVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIGFmdGVyIHJlbmRlcmluZyBpcyBjb21wbGV0ZSwKKyAgICAvLyBidXQgUmVuZGVyZXIgbmVlZHMgaXQgbm93CisgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgIEFMT0dWKCJxdWV1ZWluZyBlb3MgWyVzXSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVPUyk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uUmVuZGVyQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGludDMyX3QgcmVuZGVyOworICAgIHNpemVfdCBidWZmZXJJeDsKKyAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJidWZmZXItaXgiLCAmYnVmZmVySXgpKTsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlcikgeworICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2UoYnVmZmVySXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihidWZmZXJJeCk7CisgICAgfQorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWxlYXNlIG91dHB1dCBidWZmZXIgZm9yICVzIChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25GbHVzaCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5mbHVzaCgpOworICAgICAgICArK21CdWZmZXJHZW5lcmF0aW9uOworICAgIH0KKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmbHVzaCAlcyAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvblNodXRkb3duKCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbUNvZGVjID0gTlVMTDsKKyAgICAgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyByZWNvbm5lY3QgdG8gc3VyZmFjZSBhcyBNZWRpYUNvZGVjIGRpc2Nvbm5lY3RlZCBmcm9tIGl0CisgICAgICAgICAgICBDSEVDS19FUSgoaW50KU5PX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3ctPmdldE5hdGl2ZVdpbmRvdygpLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbXBvbmVudE5hbWUgPSAiZGVjb2RlciI7CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2UgJXMgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFNodXRkb3duQ29tcGxldGVkKTsKKyAgICBub3RpZnktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBBTE9HVigiWyVzXSBvbk1lc3NhZ2U6ICVzIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgb25Db25maWd1cmUoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdENvZGVjTm90aWZ5OgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdoYXQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGhhbmRsZUFuSW5wdXRCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEZpbGxUaGlzQnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgb25GaWxsVGhpc0J1ZmZlcihtc2cpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJjb2RlYy1yZXF1ZXN0IiwgbXNnKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaGFuZGxlQW5PdXRwdXRCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVxdWVzdENvZGVjTm90aWZpY2F0aW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRJbnB1dEJ1ZmZlckZpbGxlZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIG9uSW5wdXRCdWZmZXJGaWxsZWQobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlbmRlckJ1ZmZlcjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIG9uUmVuZGVyQnVmZmVyKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgb25GbHVzaCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2h1dGRvd24oKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTEwNSw0NyArNDQyLDE2IEBACiAgICAgfQogfQogCi12b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbkZpbGxUaGlzQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlcGx5OwotICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7Ci0KLSNpZiAwCi0gICAgc3A8QUJ1ZmZlcj4gb3V0QnVmZmVyOwotICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJm91dEJ1ZmZlcikpOwotI2Vsc2UKLSAgICBzcDxBQnVmZmVyPiBvdXRCdWZmZXI7Ci0jZW5kaWYKLQotICAgIGlmIChtQ1NESW5kZXggPCBtQ1NELnNpemUoKSkgewotICAgICAgICBvdXRCdWZmZXIgPSBtQ1NELmVkaXRJdGVtQXQobUNTREluZGV4KyspOwotICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwotCi0gICAgICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIG91dEJ1ZmZlcik7Ci0gICAgICAgIHJlcGx5LT5wb3N0KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJjb2RlYy1yZXF1ZXN0IiwgbXNnKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6c2lnbmFsRmx1c2goKSB7Ci0gICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlYy0+c2lnbmFsRmx1c2goKTsKLSAgICB9CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCBpZCgpKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6c2lnbmFsUmVzdW1lKCkgewotICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwotICAgIH0KKyAgICAvLyBub3RoaW5nIHRvIGRvCiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmluaXRpYXRlU2h1dGRvd24oKSB7Ci0gICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlYy0+aW5pdGlhdGVTaHV0ZG93bigpOwotICAgIH0KKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpKS0+cG9zdCgpOwogfQogCiBib29sIE51UGxheWVyOjpEZWNvZGVyOjpzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0IHsKQEAgLTE2MywxNCArNDY5LDE2IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKiBrZXlzW10gPSB7ICJjaGFubmVsLWNvdW50IiwgInNhbXBsZS1yYXRlIiwgImlzLWFkdHMiIH07CiAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc2l6ZW9mKGtleXMpIC8gc2l6ZW9mKGtleXNbMF0pOyBpKyspIHsKICAgICAgICAgICAgIGludDMyX3Qgb2xkVmFsLCBuZXdWYWw7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQtPmZpbmRJbnQzMihrZXlzW2ldLCAmb2xkVmFsKSB8fCAhdGFyZ2V0Rm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm5ld1ZhbCkKLSAgICAgICAgICAgICAgICAgICAgfHwgb2xkVmFsICE9IG5ld1ZhbCkgeworICAgICAgICAgICAgaWYgKCFtT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm9sZFZhbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIXRhcmdldEZvcm1hdC0+ZmluZEludDMyKGtleXNbaV0sICZuZXdWYWwpIHx8CisgICAgICAgICAgICAgICAgICAgIG9sZFZhbCAhPSBuZXdWYWwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBzcDxBQnVmZmVyPiBvbGRCdWYsIG5ld0J1ZjsKLSAgICAgICAgaWYgKG1Gb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0wIiwgJm9sZEJ1ZikgJiYgdGFyZ2V0Rm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZuZXdCdWYpKSB7CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZvbGRCdWYpICYmCisgICAgICAgICAgICAgICAgdGFyZ2V0Rm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZuZXdCdWYpKSB7CiAgICAgICAgICAgICBpZiAob2xkQnVmLT5zaXplKCkgIT0gbmV3QnVmLT5zaXplKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xODEsNyArNDg5LDcgQEAKIH0KIAogYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6c3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRhcmdldEZvcm1hdCkgY29uc3QgewotICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTE5MCw3ICs0OTgsNyBAQAogICAgIH0KIAogICAgIEFTdHJpbmcgb2xkTWltZSwgbmV3TWltZTsKLSAgICBpZiAoIW1Gb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmb2xkTWltZSkKKyAgICBpZiAoIW1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmb2xkTWltZSkKICAgICAgICAgICAgIHx8ICF0YXJnZXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbmV3TWltZSkKICAgICAgICAgICAgIHx8ICEob2xkTWltZSA9PSBuZXdNaW1lKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMDEsNyArNTA5LDEwIEBACiAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgIHNlYW1sZXNzID0gc3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKHRhcmdldEZvcm1hdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VhbWxlc3MgPSBtQ29kZWMgIT0gTlVMTCAmJiBtQ29kZWMtPmlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2soKTsKKyAgICAgICAgaW50MzJfdCBpc0FkYXB0aXZlOworICAgICAgICBzZWFtbGVzcyA9IChtQ29kZWMgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIG1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsICZpc0FkYXB0aXZlKSAmJgorICAgICAgICAgICAgICAgIGlzQWRhcHRpdmUpOwogICAgIH0KIAogICAgIEFMT0dWKCIlcyBzZWFtbGVzcyBzdXBwb3J0IGZvciAlcyIsIHNlYW1sZXNzID8gInllcyIgOiAibm8iLCBvbGRNaW1lLmNfc3RyKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCmluZGV4IDc4ZWE3NGEuLjk0MjQzZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKQEAgLTI1LDEyICsyNSwxNCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBNZWRpYUNvZGVjOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkRlY29kZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIERlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICBjb25zdCBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbmF0aXZlV2luZG93ID0gTlVMTCk7CiAKICAgICB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdm9pZCBpbml0KCk7CiAKICAgICB2b2lkIHNpZ25hbEZsdXNoKCk7CiAgICAgdm9pZCBzaWduYWxSZXN1bWUoKTsKQEAgLTM4LDcgKzQwLDE4IEBACiAKICAgICBib29sIHN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0bykgY29uc3Q7CiAKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRGaWxsVGhpc0J1ZmZlciAgICAgID0gJ2ZsVEInLAorICAgICAgICBrV2hhdERyYWluVGhpc0J1ZmZlciAgICAgPSAnZHJUQicsCisgICAgICAgIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCA9ICdmbXRDJywKKyAgICAgICAga1doYXRGbHVzaENvbXBsZXRlZCAgICAgID0gJ2Zsc0MnLAorICAgICAgICBrV2hhdFNodXRkb3duQ29tcGxldGVkICAgPSAnc2hEQycsCisgICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICA9ICdlb3MgJywKKyAgICAgICAga1doYXRFcnJvciAgICAgICAgICAgICAgID0gJ2VyciAnLAorICAgIH07CisKIHByb3RlY3RlZDoKKwogICAgIHZpcnR1YWwgfkRlY29kZXIoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC00NiwyMSArNTksNDAgQEAKIHByaXZhdGU6CiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0Q29kZWNOb3RpZnkgICAgICAgID0gJ2NkY04nLAorICAgICAgICBrV2hhdENvbmZpZ3VyZSAgICAgICAgICA9ICdjb25mJywKKyAgICAgICAga1doYXRJbnB1dEJ1ZmZlckZpbGxlZCAgPSAnaW5wRicsCisgICAgICAgIGtXaGF0UmVuZGVyQnVmZmVyICAgICAgID0gJ3JuZHInLAorICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICA9ICdmbHVzJywKKyAgICAgICAga1doYXRTaHV0ZG93biAgICAgICAgICAgPSAnc2h1RCcsCiAgICAgfTsKIAogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IG1OYXRpdmVXaW5kb3c7CiAKLSAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKLSAgICBzcDxBQ29kZWM+IG1Db2RlYzsKKyAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OworICAgIHNwPE1lZGlhQ29kZWM+IG1Db2RlYzsKICAgICBzcDxBTG9vcGVyPiBtQ29kZWNMb29wZXI7CisgICAgc3A8QUxvb3Blcj4gbURlY29kZXJMb29wZXI7CiAKLSAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEOwotICAgIHNpemVfdCBtQ1NESW5kZXg7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUlucHV0QnVmZmVyczsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtT3V0cHV0QnVmZmVyczsKIAotICAgIHNwPEFNZXNzYWdlPiBtYWtlRm9ybWF0KGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSk7CisgICAgdm9pZCBoYW5kbGVFcnJvcihpbnQzMl90IGVycik7CisgICAgYm9vbCBoYW5kbGVBbklucHV0QnVmZmVyKCk7CisgICAgYm9vbCBoYW5kbGVBbk91dHB1dEJ1ZmZlcigpOwogCi0gICAgdm9pZCBvbkZpbGxUaGlzQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpOworICAgIGJvb2wgaXNTdGFsZVJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZvaWQgb25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZvaWQgb25GbHVzaCgpOworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckZpbGxlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblJlbmRlckJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblNodXRkb3duKCk7CisKKyAgICBpbnQzMl90IG1CdWZmZXJHZW5lcmF0aW9uOworICAgIEFTdHJpbmcgbUNvbXBvbmVudE5hbWU7CiAKICAgICBib29sIHN1cHBvcnRzU2VhbWxlc3NBdWRpb0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRhcmdldEZvcm1hdCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IGI5NjUxYTEuLmU0ODUwZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtNzEsNyArNzEsOSBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfSURMRSkgewpAQCAtODAsNyArODIsNyBAQAogCiAgICAgbVN0YXRlID0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORzsKIAotICAgIG1QbGF5ZXItPnNldERhdGFTb3VyY2VBc3luYyh1cmwsIGhlYWRlcnMpOworICAgIG1QbGF5ZXItPnNldERhdGFTb3VyY2VBc3luYyhodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKIAogICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORykgewogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaAppbmRleCA5OWY3MmE2Li4wMTQ4ZmIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaApAQCAtMzEsNyArMzEsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VUlEKHVpZF90IHVpZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggYmY1MjcxZS4uYTA3MGMxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtMjAsOCArMjAsNiBAQAogCiAjaW5jbHVkZSAiTnVQbGF5ZXJSZW5kZXJlci5oIgogCi0jaW5jbHVkZSAiU29mdHdhcmVSZW5kZXJlci5oIgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0zNiw3ICszNCw2IEBACiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICB1aW50MzJfdCBmbGFncykKICAgICA6IG1BdWRpb1Npbmsoc2luayksCi0gICAgICBtU29mdFJlbmRlcmVyKE5VTEwpLAogICAgICAgbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgIG1OdW1GcmFtZXNXcml0dGVuKDApLApAQCAtNjAsMTIgKzU3LDYgQEAKIH0KIAogTnVQbGF5ZXI6OlJlbmRlcmVyOjp+UmVuZGVyZXIoKSB7Ci0gICAgZGVsZXRlIG1Tb2Z0UmVuZGVyZXI7Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRTb2Z0UmVuZGVyZXIoU29mdHdhcmVSZW5kZXJlciAqc29mdFJlbmRlcmVyKSB7Ci0gICAgZGVsZXRlIG1Tb2Z0UmVuZGVyZXI7Ci0gICAgbVNvZnRSZW5kZXJlciA9IHNvZnRSZW5kZXJlcjsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnF1ZXVlQnVmZmVyKApAQCAtNDI1LDkgKzQxNiw2IEBACiAgICAgICAgIEFMT0dWKCJyZW5kZXJpbmcgdmlkZW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAogICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSA/IHJlYWxUaW1lVXMgOgogICAgICAgICAgICAgICAgIChyZWFsVGltZVVzICsgbUFuY2hvclRpbWVNZWRpYVVzIC0gbUFuY2hvclRpbWVSZWFsVXMpKSAvIDFFNik7Ci0gICAgICAgIGlmIChtU29mdFJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXItPnJlbmRlcihlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpLCBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpLCBOVUxMKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnNldEludDMyKCJyZW5kZXIiLCAhdG9vTGF0ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAppbmRleCA5MTI0ZTAzLi45NGEwNWVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKQEAgLTIzLDcgKzIzLDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1jbGFzcyBTb2Z0d2FyZVJlbmRlcmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlJlbmRlcmVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKQEAgLTU3LDggKzU2LDYgQEAKICAgICAgICAga1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0ID0gJ21kcmQnLAogICAgIH07CiAKLSAgICB2b2lkIHNldFNvZnRSZW5kZXJlcihTb2Z0d2FyZVJlbmRlcmVyICpzb2Z0UmVuZGVyZXIpOwotCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+UmVuZGVyZXIoKTsKIApAQCAtODYsNyArODMsNiBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXM7CiAKICAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKLSAgICBTb2Z0d2FyZVJlbmRlcmVyICptU29mdFJlbmRlcmVyOwogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogICAgIHVpbnQzMl90IG1GbGFnczsKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCmluZGV4IDE4Y2Y2ZDEuLjk0ODAwYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJNeUhhbmRsZXIuaCIKICNpbmNsdWRlICJTRFBMb2FkZXIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIApAQCAtMzMsMTIgKzM0LDE0IEBACiAKIE51UGxheWVyOjpSVFNQU291cmNlOjpSVFNQU291cmNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKICAgICAgICAgYm9vbCB1aWRWYWxpZCwKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBib29sIGlzU0RQKQogICAgIDogU291cmNlKG5vdGlmeSksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAogICAgICAgbVVSTCh1cmwpLAogICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKICAgICAgIG1VSUQodWlkKSwKQEAgLTkyLDcgKzk1LDcgQEAKICAgICBpZiAobUlzU0RQKSB7CiAgICAgICAgIG1TRFBMb2FkZXIgPSBuZXcgU0RQTG9hZGVyKG5vdGlmeSwKICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pID8gU0RQTG9hZGVyOjprRmxhZ0luY29nbml0byA6IDAsCi0gICAgICAgICAgICAgICAgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UpOwogCiAgICAgICAgIG1TRFBMb2FkZXItPmxvYWQoCiAgICAgICAgICAgICAgICAgbVVSTC5jX3N0cigpLCBtRXh0cmFIZWFkZXJzLmlzRW1wdHkoKSA/IE5VTEwgOiAmbUV4dHJhSGVhZGVycyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaAppbmRleCA4Y2YzNGEwLi4zNzE4YmY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKQEAgLTM0LDYgKzM0LDcgQEAKIHN0cnVjdCBOdVBsYXllcjo6UlRTUFNvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKICAgICBSVFNQU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCiAgICAgICAgICAgICBib29sIHVpZFZhbGlkID0gZmFsc2UsCkBAIC04OCw2ICs4OSw3IEBACiAgICAgICAgIGJvb2wgbU5QVE1hcHBpbmdWYWxpZDsKICAgICB9OwogCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBBU3RyaW5nIG1VUkw7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKICAgICBib29sIG1VSURWYWxpZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhZTRkZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvbXA0L01QNFNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNUDRTb3VyY2UuaCIKLQotI2luY2x1ZGUgIkZyYWdtZW50ZWRNUDRQYXJzZXIuaCIKLSNpbmNsdWRlICIuLi9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU3RyZWFtU291cmNlIDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlNvdXJjZSB7Ci0gICAgU3RyZWFtU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpCi0gICAgICAgIDogbUxpc3RlbmVyKG5ldyBOdVBsYXllcjo6TnVQbGF5ZXJTdHJlYW1MaXN0ZW5lcihzb3VyY2UsIDApKSwKLSAgICAgICAgICBtUG9zaXRpb24oMCkgewotICAgICAgICBtTGlzdGVuZXItPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IG1Qb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIC1FUElQRTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChvZmZzZXQgPiBtUG9zaXRpb24pIHsKLSAgICAgICAgICAgIGNoYXIgYnVmZmVyWzEwMjRdOwotICAgICAgICAgICAgb2ZmNjRfdCBza2lwQnl0ZXMgPSBvZmZzZXQgLSBtUG9zaXRpb247Ci0gICAgICAgICAgICBpZiAoc2tpcEJ5dGVzID4gc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICBza2lwQnl0ZXMgPSBzaXplb2YoYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOwotICAgICAgICAgICAgc3NpemVfdCBuOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIG4gPSBtTGlzdGVuZXItPnJlYWQoYnVmZmVyLCBza2lwQnl0ZXMsICZleHRyYSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobiA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkICVsZCBieXRlcyBhdCBvZmZzZXQgJWxsZCIsIG4sIG1Qb3NpdGlvbik7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9zaXRpb24gKz0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYTsKLSAgICAgICAgc2l6ZV90IHRvdGFsID0gMDsKLSAgICAgICAgd2hpbGUgKHRvdGFsIDwgc2l6ZSkgewotICAgICAgICAgICAgc3NpemVfdCBuID0gbUxpc3RlbmVyLT5yZWFkKAotICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWRhdGEgKyB0b3RhbCwgc2l6ZSAtIHRvdGFsLCAmZXh0cmEpOwotCi0gICAgICAgICAgICBpZiAobiA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBtUG9zaXRpb24gKz0gdG90YWw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRvdGFsICs9IG47Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigicmVhZCAlbGQgYnl0ZXMgYXQgb2Zmc2V0ICVsbGQiLCB0b3RhbCwgbVBvc2l0aW9uKTsKLQotICAgICAgICBtUG9zaXRpb24gKz0gdG90YWw7Ci0KLSAgICAgICAgcmV0dXJuIHRvdGFsOwotICAgIH0KLQotICAgIGJvb2wgaXNTZWVrYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzcDxOdVBsYXllcjo6TnVQbGF5ZXJTdHJlYW1MaXN0ZW5lcj4gbUxpc3RlbmVyOwotICAgIG9mZjY0X3QgbVBvc2l0aW9uOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RyZWFtU291cmNlKTsKLX07Ci0KLU1QNFNvdXJjZTo6TVA0U291cmNlKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IFNvdXJjZShub3RpZnkpLAotICAgICAgbVNvdXJjZShzb3VyY2UpLAotICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCi0gICAgICBtUGFyc2VyKG5ldyBGcmFnbWVudGVkTVA0UGFyc2VyKSwKLSAgICAgIG1FT1MoZmFsc2UpIHsKLSAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVBhcnNlcik7Ci19Ci0KLU1QNFNvdXJjZTo6fk1QNFNvdXJjZSgpIHsKLX0KLQotdm9pZCBNUDRTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKLSAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKDAsIDApOwotICAgIG5vdGlmeUZsYWdzQ2hhbmdlZCgwKTsKLSAgICBub3RpZnlQcmVwYXJlZCgpOwotfQotCi12b2lkIE1QNFNvdXJjZTo6c3RhcnQoKSB7Ci0gICAgbUxvb3Blci0+c3RhcnQoZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovKTsKLSAgICBtUGFyc2VyLT5zdGFydChuZXcgU3RyZWFtU291cmNlKG1Tb3VyY2UpKTsKLX0KLQotc3RhdHVzX3QgTVA0U291cmNlOjpmZWVkTW9yZVRTRGF0YSgpIHsKLSAgICByZXR1cm4gbUVPUyA/IEVSUk9SX0VORF9PRl9TVFJFQU0gOiAoc3RhdHVzX3QpT0s7Ci19Ci0KLXNwPEFNZXNzYWdlPiBNUDRTb3VyY2U6OmdldEZvcm1hdChib29sIGF1ZGlvKSB7Ci0gICAgcmV0dXJuIG1QYXJzZXItPmdldEZvcm1hdChhdWRpbyk7Ci19Ci0KLXN0YXR1c190IE1QNFNvdXJjZTo6ZGVxdWV1ZUFjY2Vzc1VuaXQoCi0gICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7Ci0gICAgcmV0dXJuIG1QYXJzZXItPmRlcXVldWVBY2Nlc3NVbml0KGF1ZGlvLCBhY2Nlc3NVbml0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvbXA0L01QNFNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmVmNjIyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNUDRfU09VUkNFX0gKLSNkZWZpbmUgTVA0X1NPVVJDRV9ICi0KLSNpbmNsdWRlICJOdVBsYXllclNvdXJjZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBGcmFnbWVudGVkTVA0UGFyc2VyOwotCi1zdHJ1Y3QgTVA0U291cmNlIDogcHVibGljIE51UGxheWVyOjpTb3VyY2UgewotICAgIE1QNFNvdXJjZShjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7Ci0gICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoYm9vbCBhdWRpbyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KAotICAgICAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TVA0U291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8SVN0cmVhbVNvdXJjZT4gbVNvdXJjZTsKLSAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPEZyYWdtZW50ZWRNUDRQYXJzZXI+IG1QYXJzZXI7Ci0gICAgYm9vbCBtRU9TOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVA0U291cmNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBNUDRfU09VUkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQubWsgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLm1rCmluZGV4IDY5Yzc1YjguLjk3MDdjNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5tawpAQCAtMzEsOSArMzEsOCBAQAogICAgIGxpYmNvbW1vbl90aW1lX2NsaWVudCBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJ1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJtZWRpYQotIyBUaGlzIGRlcGVuZGVuY3kgb24gbGlibWVkaWEgaXMgZm9yIFNpbmdsZVN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy4KLSMgQ29uc2lkZXIgYSBzZXBhcmF0ZSBhIGxpYnJhcnkgZm9yIFNpbmdsZVN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy4KKyAgICBsaWJsb2cKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJpbnN0YW50c3NxCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5jcHAKaW5kZXggNzRhNmZkYi4uNTUxZjUxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5jcHAKQEAgLTI0LDExICsyNCwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlOjpBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KSA6CiAgICAgTkJBSU9fU291cmNlKGZvcm1hdCksIG1Qcm92aWRlcihwcm92aWRlciksIG1Db25zdW1lZCgwKQogewogICAgIEFMT0dfQVNTRVJUKHByb3ZpZGVyICE9IE5VTEwpOwotICAgIEFMT0dfQVNTRVJUKGZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCk7CisgICAgQUxPR19BU1NFUlQoRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSk7CiB9CiAKIEF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2U6On5BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlKCkKQEAgLTY4LDcgKzY4LDcgQEAKICAgICB9CiAgICAgLy8gY291bnQgY291bGQgYmUgemVybywgZWl0aGVyIGJlY2F1c2UgY291bnQgd2FzIHplcm8gb24gZW50cnkgb3IKICAgICAvLyBhdmFpbGFibGUgaXMgemVybywgYnV0IGJvdGggYXJlIHVubGlrZWx5IHNvIGRvbid0IGNoZWNrIGZvciB0aGF0Ci0gICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgbUJ1ZmZlci5yYXcgKyAobUNvbnN1bWVkIDw8IG1CaXRTaGlmdCksIGNvdW50IDw8IG1CaXRTaGlmdCk7CisgICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgbUJ1ZmZlci5yYXcgKyAobUNvbnN1bWVkICogbUZyYW1lU2l6ZSksIGNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgaWYgKENDX1VOTElLRUxZKChtQ29uc3VtZWQgKz0gY291bnQpID49IG1CdWZmZXIuZnJhbWVDb3VudCkpIHsKICAgICAgICAgbVByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKICAgICAgICAgbUJ1ZmZlci5yYXcgPSBOVUxMOwpAQCAtMTIwLDcgKzEyMCw3IEBACiAgICAgICAgICAgICBjb3VudCA9IGF2YWlsYWJsZTsKICAgICAgICAgfQogICAgICAgICBpZiAoQ0NfTElLRUxZKGNvdW50ID4gMCkpIHsKLSAgICAgICAgICAgIGNoYXIqIHJlYWRUZ3QgPSAoY2hhciAqKSBtQnVmZmVyLnJhdyArIChtQ29uc3VtZWQgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgIGNoYXIqIHJlYWRUZ3QgPSAoY2hhciAqKSBtQnVmZmVyLnJhdyArIChtQ29uc3VtZWQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIHNzaXplX3QgcmV0ID0gdmlhKHVzZXIsIHJlYWRUZ3QsIGNvdW50LCByZWFkUFRTKTsKICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShyZXQgPD0gMCkpIHsKICAgICAgICAgICAgICAgICBpZiAoQ0NfTElLRUxZKGFjY3VtdWxhdG9yID4gMCkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuY3BwIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAKaW5kZXggMDUyNzNmNi4uODBiZjYxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAKQEAgLTQwLDE2ICs0MCwxNCBAQAogc3NpemVfdCBBdWRpb1N0cmVhbUluU291cmNlOjpuZWdvdGlhdGUoY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1tdLCBzaXplX3QgbnVtT2ZmZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkFJT19Gb3JtYXQgY291bnRlck9mZmVyc1tdLCBzaXplX3QmIG51bUNvdW50ZXJPZmZlcnMpCiB7Ci0gICAgaWYgKG1Gb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpIHsKKyAgICBpZiAoIUZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKSB7CiAgICAgICAgIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgPSBtU3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtU3RyZWFtLT5jb21tb24pOwogICAgICAgICBhdWRpb19mb3JtYXRfdCBzdHJlYW1Gb3JtYXQgPSBtU3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbVN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgaWYgKHN0cmVhbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9Ci0gICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCkgbVN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbVN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsIHBvcGNvdW50KGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtQml0U2hpZnQgPSBGb3JtYXRfZnJhbWVCaXRTaGlmdChtRm9ybWF0KTsKLSAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbVN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCkgbVN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbVN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwgcG9wY291bnQoY2hhbm5lbE1hc2spLCBzdHJlYW1Gb3JtYXQpOworICAgICAgICBtRnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShtRm9ybWF0KTsKICAgICB9CiAgICAgcmV0dXJuIE5CQUlPX1NvdXJjZTo6bmVnb3RpYXRlKG9mZmVycywgbnVtT2ZmZXJzLCBjb3VudGVyT2ZmZXJzLCBudW1Db3VudGVyT2ZmZXJzKTsKIH0KQEAgLTY3LDEyICs2NSwxMiBAQAogCiBzc2l6ZV90IEF1ZGlvU3RyZWFtSW5Tb3VyY2U6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpCiB7Ci0gICAgaWYgKENDX1VOTElLRUxZKG1Gb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpKSB7CisgICAgaWYgKENDX1VOTElLRUxZKCFGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSkpIHsKICAgICAgICAgcmV0dXJuIE5FR09USUFURTsKICAgICB9Ci0gICAgc3NpemVfdCBieXRlc1JlYWQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgIGlmIChieXRlc1JlYWQgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBmcmFtZXNSZWFkID0gYnl0ZXNSZWFkID4+IG1CaXRTaGlmdDsKKyAgICAgICAgc2l6ZV90IGZyYW1lc1JlYWQgPSBieXRlc1JlYWQgLyBtRnJhbWVTaXplOwogICAgICAgICBtRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogICAgICAgICByZXR1cm4gZnJhbWVzUmVhZDsKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKaW5kZXggZTQzNDFkNy4uYzI4ZDM0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCkBAIC0zNywxNiArMzcsMTQgQEAKIHNzaXplX3QgQXVkaW9TdHJlYW1PdXRTaW5rOjpuZWdvdGlhdGUoY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1tdLCBzaXplX3QgbnVtT2ZmZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkFJT19Gb3JtYXQgY291bnRlck9mZmVyc1tdLCBzaXplX3QmIG51bUNvdW50ZXJPZmZlcnMpCiB7Ci0gICAgaWYgKG1Gb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpIHsKKyAgICBpZiAoIUZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKSB7CiAgICAgICAgIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgPSBtU3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtU3RyZWFtLT5jb21tb24pOwogICAgICAgICBhdWRpb19mb3JtYXRfdCBzdHJlYW1Gb3JtYXQgPSBtU3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbVN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgaWYgKHN0cmVhbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9Ci0gICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCkgbVN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbVN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsIHBvcGNvdW50KGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtQml0U2hpZnQgPSBGb3JtYXRfZnJhbWVCaXRTaGlmdChtRm9ybWF0KTsKLSAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbVN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCkgbVN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbVN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwgcG9wY291bnQoY2hhbm5lbE1hc2spLCBzdHJlYW1Gb3JtYXQpOworICAgICAgICBtRnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShtRm9ybWF0KTsKICAgICB9CiAgICAgcmV0dXJuIE5CQUlPX1Npbms6Om5lZ290aWF0ZShvZmZlcnMsIG51bU9mZmVycywgY291bnRlck9mZmVycywgbnVtQ291bnRlck9mZmVycyk7CiB9CkBAIC01NiwxMCArNTQsMTAgQEAKICAgICBpZiAoIW1OZWdvdGlhdGVkKSB7CiAgICAgICAgIHJldHVybiBORUdPVElBVEU7CiAgICAgfQotICAgIEFMT0dfQVNTRVJUKG1Gb3JtYXQgIT0gRm9ybWF0X0ludmFsaWQpOwotICAgIHNzaXplX3QgcmV0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBjb3VudCA8PCBtQml0U2hpZnQpOworICAgIEFMT0dfQVNTRVJUKEZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKTsKKyAgICBzc2l6ZV90IHJldCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgY291bnQgKiBtRnJhbWVTaXplKTsKICAgICBpZiAocmV0ID4gMCkgewotICAgICAgICByZXQgPj49IG1CaXRTaGlmdDsKKyAgICAgICAgcmV0IC89IG1GcmFtZVNpemU7CiAgICAgICAgIG1GcmFtZXNXcml0dGVuICs9IHJldDsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBGSVhNRSB2ZXJpZnkgSEFMIGltcGxlbWVudGF0aW9ucyBhcmUgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IGVycm9yIGNvZGVzIGUuZy4gV09VTERfQkxPQ0sKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcCBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcAppbmRleCAzYzYxYjYwLi40YWRmMDE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZS5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGUuY3BwCkBAIC0zMCw3ICszMCwyNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLU1vbm9QaXBlOjpNb25vUGlwZShzaXplX3QgcmVxRnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0LCBib29sIHdyaXRlQ2FuQmxvY2spIDoKK3N0YXRpYyB1aW50NjRfdCBjYWNoZU47IC8vIG91dHB1dCBvZiBDQ0hlbHBlcjo6Z2V0TG9jYWxGcmVxKCkKK3N0YXRpYyBib29sIGNhY2hlVmFsaWQ7IC8vIHdoZXRoZXIgY2FjaGVOIGlzIHZhbGlkCitzdGF0aWMgcHRocmVhZF9vbmNlX3QgY2FjaGVPbmNlQ29udHJvbCA9IFBUSFJFQURfT05DRV9JTklUOworCitzdGF0aWMgdm9pZCBjYWNoZU9uY2VJbml0KCkKK3sKKyAgICBDQ0hlbHBlciB0bXBIZWxwZXI7CisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmIChPSyAhPSAocmVzID0gdG1wSGVscGVyLmdldExvY2FsRnJlcSgmY2FjaGVOKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmZXRjaCBsb2NhbCB0aW1lIGZyZXF1ZW5jeSB3aGVuIGNvbnN0cnVjdGluZyBhIgorICAgICAgICAgICAgICAiIE1vbm9QaXBlIChyZXMgPSAlZCkuICBnZXROZXh0V3JpdGVUaW1lc3RhbXAgY2FsbHMgd2lsbCBiZSIKKyAgICAgICAgICAgICAgIiBub24tZnVuY3Rpb25hbCIsIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FjaGVWYWxpZCA9IHRydWU7Cit9CisKK01vbm9QaXBlOjpNb25vUGlwZShzaXplX3QgcmVxRnJhbWVzLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCwgYm9vbCB3cml0ZUNhbkJsb2NrKSA6CiAgICAgICAgIE5CQUlPX1NpbmsoZm9ybWF0KSwKICAgICAgICAgbVVwZGF0ZVNlcSgwKSwKICAgICAgICAgbVJlcUZyYW1lcyhyZXFGcmFtZXMpLApAQCAtNDcsOCArNjQsNiBAQAogICAgICAgICBtVGltZXN0YW1wTXV0YXRvcigmbVRpbWVzdGFtcFNoYXJlZCksCiAgICAgICAgIG1UaW1lc3RhbXBPYnNlcnZlcigmbVRpbWVzdGFtcFNoYXJlZCkKIHsKLSAgICBDQ0hlbHBlciB0bXBIZWxwZXI7Ci0gICAgc3RhdHVzX3QgcmVzOwogICAgIHVpbnQ2NF90IE4sIEQ7CiAKICAgICBtTmV4dFJkUFRTID0gQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFM7CkBAIC01OSwxMiArNzQsMTMgQEAKICAgICBtU2FtcGxlc1RvTG9jYWxUaW1lLmFfdG9fYl9kZW5vbSA9IDA7CiAKICAgICBEID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKLSAgICBpZiAoT0sgIT0gKHJlcyA9IHRtcEhlbHBlci5nZXRMb2NhbEZyZXEoJk4pKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZldGNoIGxvY2FsIHRpbWUgZnJlcXVlbmN5IHdoZW4gY29uc3RydWN0aW5nIGEiCi0gICAgICAgICAgICAgICIgTW9ub1BpcGUgKHJlcyA9ICVkKS4gIGdldE5leHRXcml0ZVRpbWVzdGFtcCBjYWxscyB3aWxsIGJlIgotICAgICAgICAgICAgICAiIG5vbi1mdW5jdGlvbmFsIiwgcmVzKTsKKworICAgICh2b2lkKSBwdGhyZWFkX29uY2UoJmNhY2hlT25jZUNvbnRyb2wsIGNhY2hlT25jZUluaXQpOworICAgIGlmICghY2FjaGVWYWxpZCkgeworICAgICAgICAvLyBsb2cgaGFzIGFscmVhZHkgYmVlbiBkb25lCiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgTiA9IGNhY2hlTjsKIAogICAgIExpbmVhclRyYW5zZm9ybTo6cmVkdWNlKCZOLCAmRCk7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtTaWduZWRIaUJpdHNNYXNrICAgPSB+KDB4N0ZGRkZGRkZ1bGwpOwpAQCAtMTE1LDExICsxMzEsMTEgQEAKICAgICAgICAgICAgIHBhcnQxID0gd3JpdHRlbjsKICAgICAgICAgfQogICAgICAgICBpZiAoQ0NfTElLRUxZKHBhcnQxID4gMCkpIHsKLSAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBtQnVmZmVyICsgKHJlYXIgPDwgbUJpdFNoaWZ0KSwgYnVmZmVyLCBwYXJ0MSA8PCBtQml0U2hpZnQpOworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIG1CdWZmZXIgKyAocmVhciAqIG1GcmFtZVNpemUpLCBidWZmZXIsIHBhcnQxICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkocmVhciArIHBhcnQxID09IG1NYXhGcmFtZXMpKSB7CiAgICAgICAgICAgICAgICAgc2l6ZV90IHBhcnQyID0gd3JpdHRlbiAtIHBhcnQxOwogICAgICAgICAgICAgICAgIGlmIChDQ19MSUtFTFkocGFydDIgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkobUJ1ZmZlciwgKGNoYXIgKikgYnVmZmVyICsgKHBhcnQxIDw8IG1CaXRTaGlmdCksIHBhcnQyIDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShtQnVmZmVyLCAoY2hhciAqKSBidWZmZXIgKyAocGFydDEgKiBtRnJhbWVTaXplKSwgcGFydDIgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKHdyaXR0ZW4gKyBtUmVhciwgJm1SZWFyKTsKQEAgLTEyOSw3ICsxNDUsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY291bnQgLT0gd3JpdHRlbjsKLSAgICAgICAgYnVmZmVyID0gKGNoYXIgKikgYnVmZmVyICsgKHdyaXR0ZW4gPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgYnVmZmVyID0gKGNoYXIgKikgYnVmZmVyICsgKHdyaXR0ZW4gKiBtRnJhbWVTaXplKTsKICAgICAgICAgLy8gU2ltdWxhdGUgYmxvY2tpbmcgSS9PIGJ5IHNsZWVwaW5nIGF0IGRpZmZlcmVudCByYXRlcywgZGVwZW5kaW5nIG9uIGEgdGhyb3R0bGUuCiAgICAgICAgIC8vIFRoZSB0aHJvdHRsZSB0cmllcyB0byBrZWVwIHRoZSBtZWFuIHBpcGUgZGVwdGggbmVhciB0aGUgc2V0cG9pbnQsIHdpdGggYSBzbGlnaHQgaml0dGVyLgogICAgICAgICB1aW50MzJfdCBuczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcCBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcAppbmRleCA4NTEzNDFhLi5kZTgyMjI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGVSZWFkZXIuY3BwCkBAIC03MywxMSArNzMsMTEgQEAKICAgICAgICAgcGFydDEgPSByZWQ7CiAgICAgfQogICAgIGlmIChDQ19MSUtFTFkocGFydDEgPiAwKSkgewotICAgICAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS0+bUJ1ZmZlciArIChmcm9udCA8PCBtQml0U2hpZnQpLCBwYXJ0MSA8PCBtQml0U2hpZnQpOworICAgICAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS0+bUJ1ZmZlciArIChmcm9udCAqIG1GcmFtZVNpemUpLCBwYXJ0MSAqIG1GcmFtZVNpemUpOwogICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoZnJvbnQgKyBwYXJ0MSA9PSBtUGlwZS0+bU1heEZyYW1lcykpIHsKICAgICAgICAgICAgIHNpemVfdCBwYXJ0MiA9IHJlZCAtIHBhcnQxOwogICAgICAgICAgICAgaWYgKENDX0xJS0VMWShwYXJ0MiA+IDApKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGJ1ZmZlciArIChwYXJ0MSA8PCBtQml0U2hpZnQpLCBtUGlwZS0+bUJ1ZmZlciwgcGFydDIgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgYnVmZmVyICsgKHBhcnQxICogbUZyYW1lU2l6ZSksIG1QaXBlLT5tQnVmZmVyLCBwYXJ0MiAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1QaXBlLT51cGRhdGVGcm9udEFuZE5SUFRTKHJlZCArIG1QaXBlLT5tRnJvbnQsIG5leHRSZWFkUFRTKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CQUlPLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CQUlPLmNwcAppbmRleCBlMGQyYzIxLi5mZjMyODRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkFJTy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJBSU8uY3BwCkBAIC0yMiwxMTkgKzIyLDQyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc2l6ZV90IEZvcm1hdF9mcmFtZVNpemUoTkJBSU9fRm9ybWF0IGZvcm1hdCkKK3NpemVfdCBGb3JtYXRfZnJhbWVTaXplKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KQogewotICAgIHJldHVybiBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkgKiBzaXplb2Yoc2hvcnQpOworICAgIHJldHVybiBmb3JtYXQubUZyYW1lU2l6ZTsKIH0KIAotc2l6ZV90IEZvcm1hdF9mcmFtZUJpdFNoaWZ0KE5CQUlPX0Zvcm1hdCBmb3JtYXQpCitjb25zdCBOQkFJT19Gb3JtYXQgRm9ybWF0X0ludmFsaWQgPSB7IDAsIDAsIEFVRElPX0ZPUk1BVF9JTlZBTElELCAwIH07CisKK3Vuc2lnbmVkIEZvcm1hdF9zYW1wbGVSYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KQogewotICAgIC8vIHNpemVvZihzaG9ydCkgPT0gMiwgc28gZnJhbWUgc2l6ZSA9PSAxIDw8IGNoYW5uZWxzCi0gICAgcmV0dXJuIEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICBpZiAoIUZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBmb3JtYXQubVNhbXBsZVJhdGU7CiB9CiAKLWVudW0gewotICAgIEZvcm1hdF9TUl84MDAwLAotICAgIEZvcm1hdF9TUl8xMTAyNSwKLSAgICBGb3JtYXRfU1JfMTYwMDAsCi0gICAgRm9ybWF0X1NSXzIyMDUwLAotICAgIEZvcm1hdF9TUl8yNDAwMCwKLSAgICBGb3JtYXRfU1JfMzIwMDAsCi0gICAgRm9ybWF0X1NSXzQ0MTAwLAotICAgIEZvcm1hdF9TUl80ODAwMCwKLSAgICBGb3JtYXRfU1JfTWFzayA9IDcKLX07Ci0KLWVudW0gewotICAgIEZvcm1hdF9DXzEgPSAweDA4LAotICAgIEZvcm1hdF9DXzIgPSAweDEwLAotICAgIEZvcm1hdF9DX01hc2sgPSAweDE4Ci19OwotCi11bnNpZ25lZCBGb3JtYXRfc2FtcGxlUmF0ZShOQkFJT19Gb3JtYXQgZm9ybWF0KQordW5zaWduZWQgRm9ybWF0X2NoYW5uZWxDb3VudChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkKIHsKLSAgICBpZiAoZm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBzd2l0Y2ggKGZvcm1hdCAmIEZvcm1hdF9TUl9NYXNrKSB7Ci0gICAgY2FzZSBGb3JtYXRfU1JfODAwMDoKLSAgICAgICAgcmV0dXJuIDgwMDA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMTEwMjU6Ci0gICAgICAgIHJldHVybiAxMTAyNTsKLSAgICBjYXNlIEZvcm1hdF9TUl8xNjAwMDoKLSAgICAgICAgcmV0dXJuIDE2MDAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzIyMDUwOgotICAgICAgICByZXR1cm4gMjIwNTA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMjQwMDA6Ci0gICAgICAgIHJldHVybiAyNDAwMDsKLSAgICBjYXNlIEZvcm1hdF9TUl8zMjAwMDoKLSAgICAgICAgcmV0dXJuIDMyMDAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzQ0MTAwOgotICAgICAgICByZXR1cm4gNDQxMDA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfNDgwMDA6Ci0gICAgICAgIHJldHVybiA0ODAwMDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIGZvcm1hdC5tQ2hhbm5lbENvdW50OwogfQogCi11bnNpZ25lZCBGb3JtYXRfY2hhbm5lbENvdW50KE5CQUlPX0Zvcm1hdCBmb3JtYXQpCitOQkFJT19Gb3JtYXQgRm9ybWF0X2Zyb21fU1JfQyh1bnNpZ25lZCBzYW1wbGVSYXRlLCB1bnNpZ25lZCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKLSAgICBpZiAoZm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzd2l0Y2ggKGZvcm1hdCAmIEZvcm1hdF9DX01hc2spIHsKLSAgICBjYXNlIEZvcm1hdF9DXzE6Ci0gICAgICAgIHJldHVybiAxOwotICAgIGNhc2UgRm9ybWF0X0NfMjoKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1OQkFJT19Gb3JtYXQgRm9ybWF0X2Zyb21fU1JfQyh1bnNpZ25lZCBzYW1wbGVSYXRlLCB1bnNpZ25lZCBjaGFubmVsQ291bnQpCi17Ci0gICAgTkJBSU9fRm9ybWF0IGZvcm1hdDsKLSAgICBzd2l0Y2ggKHNhbXBsZVJhdGUpIHsKLSAgICBjYXNlIDgwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl84MDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDExMDI1OgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMTEwMjU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl8xNjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzIyMDUwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI0MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMjQwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl8zMjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzQ0MTAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfNDgwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCB8fCBjaGFubmVsQ291bnQgPT0gMCB8fCAhYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKICAgICAgICAgcmV0dXJuIEZvcm1hdF9JbnZhbGlkOwogICAgIH0KLSAgICBzd2l0Y2ggKGNoYW5uZWxDb3VudCkgewotICAgIGNhc2UgMToKLSAgICAgICAgZm9ybWF0IHw9IEZvcm1hdF9DXzE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgZm9ybWF0IHw9IEZvcm1hdF9DXzI7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBGb3JtYXRfSW52YWxpZDsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1hdDsKKyAgICBOQkFJT19Gb3JtYXQgcmV0OworICAgIHJldC5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgcmV0Lm1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgcmV0Lm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgcmV0Lm1GcmFtZVNpemUgPSBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgPworICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpIDogc2l6ZW9mKHVpbnQ4X3QpOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8vIFRoaXMgaXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uOyBpdCBpcyBleHBlY3RlZCB0aGF0IHN1YmNsYXNzZXMgd2lsbCBvcHRpbWl6ZSB0aGlzLgpAQCAtMjE2LDkgKzEzOSw5IEBACiB7CiAgICAgQUxPR1YoIm5lZ290aWF0ZSBvZmZlcnM9JXAgbnVtT2ZmZXJzPSV1IGNvdW50ZXJzT2ZmZXJzPSVwIG51bUNvdW50ZXJPZmZlcnM9JXUiLAogICAgICAgICAgICAgb2ZmZXJzLCBudW1PZmZlcnMsIGNvdW50ZXJPZmZlcnMsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgIGlmIChtRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtT2ZmZXJzOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChvZmZlcnNbaV0gPT0gbUZvcm1hdCkgeworICAgICAgICAgICAgaWYgKEZvcm1hdF9pc0VxdWFsKG9mZmVyc1tpXSwgbUZvcm1hdCkpIHsKICAgICAgICAgICAgICAgICBtTmVnb3RpYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICB9CkBAIC0yMzMsNCArMTU2LDE3IEBACiAgICAgcmV0dXJuIChzc2l6ZV90KSBORUdPVElBVEU7CiB9CiAKK2Jvb2wgRm9ybWF0X2lzVmFsaWQoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpCit7CisgICAgcmV0dXJuIGZvcm1hdC5tU2FtcGxlUmF0ZSAhPSAwICYmIGZvcm1hdC5tQ2hhbm5lbENvdW50ICE9IDAgJiYKKyAgICAgICAgICAgIGZvcm1hdC5tRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEICYmIGZvcm1hdC5tRnJhbWVTaXplICE9IDA7Cit9CisKK2Jvb2wgRm9ybWF0X2lzRXF1YWwoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQxLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdDIpCit7CisgICAgcmV0dXJuIGZvcm1hdDEubVNhbXBsZVJhdGUgPT0gZm9ybWF0Mi5tU2FtcGxlUmF0ZSAmJgorICAgICAgICAgICAgZm9ybWF0MS5tQ2hhbm5lbENvdW50ID09IGZvcm1hdDIubUNoYW5uZWxDb3VudCAmJiBmb3JtYXQxLm1Gb3JtYXQgPT0gZm9ybWF0Mi5tRm9ybWF0ICYmCisgICAgICAgICAgICBmb3JtYXQxLm1GcmFtZVNpemUgPT0gZm9ybWF0Mi5tRnJhbWVTaXplOworfQorCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAppbmRleCA4ZGZiNGYwLi40ZDlhMWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCkBAIC0zNDEsOCArMzQxLDggQEAKICAgICBtRmQgPSBmZDsKICAgICBtSW5kZW50ID0gaW5kZW50OwogICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OwotICAgIGlmIChpID4gMCkgewotICAgICAgICBsb3N0ICs9IGk7CisgICAgbG9zdCArPSBpOworICAgIGlmIChsb3N0ID4gMCkgewogICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogbG9zdCAlenUgYnl0ZXMgd29ydGggb2YgZXZlbnRzIiwgbG9zdCk7CiAgICAgICAgIC8vIFRPRE8gdGltZXN0YW1wIGVtcHR5IGhlcmUsIG9ubHkgb3RoZXIgY2hvaWNlIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCB0aW1lc3RhbXAgZXZlbnQgaW4gdGhlCiAgICAgICAgIC8vICAgICAgbG9nIHRvIHB1c2ggaXQgb3V0LiAgQ29uc2lkZXIga2VlcGluZyB0aGUgdGltZXN0YW1wL2JvZHkgYmV0d2VlbiBjYWxscyB0byByZWFkQXQoKS4KQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCiBib29sIE5CTG9nOjpSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKIHsKLSAgICByZXR1cm4gaU1lbW9yeS5nZXQoKSA9PSBtSU1lbW9yeS5nZXQoKTsKKyAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7CiB9CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAgYi9tZWRpYS9saWJuYmFpby9QaXBlLmNwcAppbmRleCAxYzIxZjljLi4yOGEwMzRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9QaXBlLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9QaXBlLmNwcApAQCAtMjUsNyArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLVBpcGU6OlBpcGUoc2l6ZV90IG1heEZyYW1lcywgTkJBSU9fRm9ybWF0IGZvcm1hdCkgOgorUGlwZTo6UGlwZShzaXplX3QgbWF4RnJhbWVzLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkgOgogICAgICAgICBOQkFJT19TaW5rKGZvcm1hdCksCiAgICAgICAgIG1NYXhGcmFtZXMocm91bmR1cChtYXhGcmFtZXMpKSwKICAgICAgICAgbUJ1ZmZlcihtYWxsb2MobU1heEZyYW1lcyAqIEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KSkpLApAQCAtNTIsMTMgKzUyLDEzIEBACiAgICAgaWYgKENDX0xJS0VMWSh3cml0dGVuID4gY291bnQpKSB7CiAgICAgICAgIHdyaXR0ZW4gPSBjb3VudDsKICAgICB9Ci0gICAgbWVtY3B5KChjaGFyICopIG1CdWZmZXIgKyAocmVhciA8PCBtQml0U2hpZnQpLCBidWZmZXIsIHdyaXR0ZW4gPDwgbUJpdFNoaWZ0KTsKKyAgICBtZW1jcHkoKGNoYXIgKikgbUJ1ZmZlciArIChyZWFyICogbUZyYW1lU2l6ZSksIGJ1ZmZlciwgd3JpdHRlbiAqIG1GcmFtZVNpemUpOwogICAgIGlmIChDQ19VTkxJS0VMWShyZWFyICsgd3JpdHRlbiA9PSBtTWF4RnJhbWVzKSkgewogICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoKGNvdW50IC09IHdyaXR0ZW4pID4gcmVhcikpIHsKICAgICAgICAgICAgIGNvdW50ID0gcmVhcjsKICAgICAgICAgfQogICAgICAgICBpZiAoQ0NfTElLRUxZKGNvdW50ID4gMCkpIHsKLSAgICAgICAgICAgIG1lbWNweShtQnVmZmVyLCAoY2hhciAqKSBidWZmZXIgKyAod3JpdHRlbiA8PCBtQml0U2hpZnQpLCBjb3VudCA8PCBtQml0U2hpZnQpOworICAgICAgICAgICAgbWVtY3B5KG1CdWZmZXIsIChjaGFyICopIGJ1ZmZlciArICh3cml0dGVuICogbUZyYW1lU2l6ZSksIGNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICB3cml0dGVuICs9IGNvdW50OwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAgYi9tZWRpYS9saWJuYmFpby9QaXBlUmVhZGVyLmNwcAppbmRleCBkNzg2Yjg0Li5jOGU0OTUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9QaXBlUmVhZGVyLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9QaXBlUmVhZGVyLmNwcApAQCAtNTksNyArNTksNyBAQAogICAgIHJldHVybiBhdmFpbDsKIH0KIAotc3NpemVfdCBQaXBlUmVhZGVyOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMpCitzc2l6ZV90IFBpcGVSZWFkZXI6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQsIGludDY0X3QgcmVhZFBUUyBfX3VudXNlZCkKIHsKICAgICBzc2l6ZV90IGF2YWlsID0gYXZhaWxhYmxlVG9SZWFkKCk7CiAgICAgaWYgKENDX1VOTElLRUxZKGF2YWlsIDw9IDApKSB7CkBAIC03NiwxNCArNzYsMTQgQEAKICAgICAgICAgcmVkID0gY291bnQ7CiAgICAgfQogICAgIC8vIEluIHBhcnRpY3VsYXIsIGFuIG92ZXJydW4gZHVyaW5nIHRoZSBtZW1jcHkgd2lsbCByZXN1bHQgaW4gcmVhZGluZyBjb3JydXB0IGRhdGEKLSAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS5tQnVmZmVyICsgKGZyb250IDw8IG1CaXRTaGlmdCksIHJlZCA8PCBtQml0U2hpZnQpOworICAgIG1lbWNweShidWZmZXIsIChjaGFyICopIG1QaXBlLm1CdWZmZXIgKyAoZnJvbnQgKiBtRnJhbWVTaXplKSwgcmVkICogbUZyYW1lU2l6ZSk7CiAgICAgLy8gV2UgY291bGQgcmUtcmVhZCB0aGUgcmVhciBwb2ludGVyIGhlcmUgdG8gZGV0ZWN0IHRoZSBjb3JydXB0aW9uLCBidXQgd2h5IGJvdGhlcj8KICAgICBpZiAoQ0NfVU5MSUtFTFkoZnJvbnQgKyByZWQgPT0gbVBpcGUubU1heEZyYW1lcykpIHsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKChjb3VudCAtPSByZWQpID4gZnJvbnQpKSB7CiAgICAgICAgICAgICBjb3VudCA9IGZyb250OwogICAgICAgICB9CiAgICAgICAgIGlmIChDQ19MSUtFTFkoY291bnQgPiAwKSkgewotICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGJ1ZmZlciArIChyZWQgPDwgbUJpdFNoaWZ0KSwgbVBpcGUubUJ1ZmZlciwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBidWZmZXIgKyAocmVkICogbUZyYW1lU2l6ZSksIG1QaXBlLm1CdWZmZXIsIGNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICByZWQgKz0gY291bnQ7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcCBiL21lZGlhL2xpYm5iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuY3BwCmluZGV4IDA2MmZhMGYuLmUyMWVmNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuY3BwCkBAIC0yNCw3ICsyNCw3IEBACiAKIFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXI6OlNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIoY29uc3Qgc3A8TkJBSU9fU291cmNlPiYgc291cmNlKSA6CiAgICAgbVNvdXJjZShzb3VyY2UpLAotICAgIC8vIG1GcmFtZUJpdFNoaWZ0Rm9ybWF0IGJlbG93CisgICAgLy8gbUZyYW1lU2l6ZSBiZWxvdwogICAgIG1BbGxvY2F0ZWQoTlVMTCksIG1TaXplKDApLCBtT2Zmc2V0KDApLCBtUmVtYWluaW5nKDApLCBtR2V0Q291bnQoMCksIG1GcmFtZXNSZWxlYXNlZCgwKQogewogICAgIEFMT0dfQVNTRVJUKHNvdXJjZSAhPSAwKTsKQEAgLTM3LDcgKzM3LDcgQEAKICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKICAgICBpbmRleCA9IHNvdXJjZS0+bmVnb3RpYXRlKGNvdW50ZXJPZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwogICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgIG1GcmFtZUJpdFNoaWZ0ID0gRm9ybWF0X2ZyYW1lQml0U2hpZnQoc291cmNlLT5mb3JtYXQoKSk7CisgICAgbUZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUoc291cmNlLT5mb3JtYXQoKSk7CiB9CiAKIFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXI6On5Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyKCkKQEAgLTU0LDE0ICs1NCwxNCBAQAogICAgICAgICBpZiAobVJlbWFpbmluZyA8IGJ1ZmZlci0+ZnJhbWVDb3VudCkgewogICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gbVJlbWFpbmluZzsKICAgICAgICAgfQotICAgICAgICBidWZmZXItPnJhdyA9IChjaGFyICopIG1BbGxvY2F0ZWQgKyAobU9mZnNldCA8PCBtRnJhbWVCaXRTaGlmdCk7CisgICAgICAgIGJ1ZmZlci0+cmF3ID0gKGNoYXIgKikgbUFsbG9jYXRlZCArIChtT2Zmc2V0ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgIG1HZXRDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KICAgICAvLyBkbyB3ZSBuZWVkIHRvIHJlYWxsb2NhdGU/CiAgICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1TaXplKSB7CiAgICAgICAgIGZyZWUobUFsbG9jYXRlZCk7Ci0gICAgICAgIG1BbGxvY2F0ZWQgPSBtYWxsb2MoYnVmZmVyLT5mcmFtZUNvdW50IDw8IG1GcmFtZUJpdFNoaWZ0KTsKKyAgICAgICAgbUFsbG9jYXRlZCA9IG1hbGxvYyhidWZmZXItPmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgbVNpemUgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgfQogICAgIC8vIHJlYWQgZnJvbSBzb3VyY2UKQEAgLTg0LDcgKzg0LDcgQEAKIHZvaWQgU291cmNlQXVkaW9CdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcihCdWZmZXIgKmJ1ZmZlcikKIHsKICAgICBBTE9HX0FTU0VSVCgoYnVmZmVyICE9IE5VTEwpICYmCi0gICAgICAgICAgICAoYnVmZmVyLT5yYXcgPT0gKGNoYXIgKikgbUFsbG9jYXRlZCArIChtT2Zmc2V0IDw8IG1GcmFtZUJpdFNoaWZ0KSkgJiYKKyAgICAgICAgICAgIChidWZmZXItPnJhdyA9PSAoY2hhciAqKSBtQWxsb2NhdGVkICsgKG1PZmZzZXQgKiBtRnJhbWVTaXplKSkgJiYKICAgICAgICAgICAgIChidWZmZXItPmZyYW1lQ291bnQgPD0gbUdldENvdW50KSAmJgogICAgICAgICAgICAgKG1HZXRDb3VudCA8PSBtUmVtYWluaW5nKSAmJgogICAgICAgICAgICAgKG1PZmZzZXQgKyBtUmVtYWluaW5nIDw9IG1TaXplKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA5ZTFjNjJhLi5mMTE3OTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogCiAjaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgogI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgogCkBAIC0zNjUsNyArMzY2LDcgQEAKICAgICAgIG1Jc0VuY29kZXIoZmFsc2UpLAogICAgICAgbVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0KGZhbHNlKSwKICAgICAgIG1TaHV0ZG93bkluUHJvZ3Jlc3MoZmFsc2UpLAotICAgICAgbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2soZmFsc2UpLAorICAgICAgbUV4cGxpY2l0U2h1dGRvd24oZmFsc2UpLAogICAgICAgbUVuY29kZXJEZWxheSgwKSwKICAgICAgIG1FbmNvZGVyUGFkZGluZygwKSwKICAgICAgIG1DaGFubmVsTWFza1ByZXNlbnQoZmFsc2UpLApAQCAtMzc0LDcgKzM3NSwxMCBAQAogICAgICAgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMoZmFsc2UpLAogICAgICAgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0KDApLAogICAgICAgbVJlcGVhdEZyYW1lRGVsYXlVcygtMWxsKSwKLSAgICAgIG1NYXhQdHNHYXBVcygtMWwpIHsKKyAgICAgIG1NYXhQdHNHYXBVcygtMWxsKSwKKyAgICAgIG1UaW1lUGVyQ2FwdHVyZVVzKC0xbGwpLAorICAgICAgbVRpbWVQZXJGcmFtZVVzKC0xbGwpLAorICAgICAgbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZChmYWxzZSkgewogICAgIG1VbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgVW5pbml0aWFsaXplZFN0YXRlKHRoaXMpOwogICAgIG1Mb2FkZWRTdGF0ZSA9IG5ldyBMb2FkZWRTdGF0ZSh0aGlzKTsKICAgICBtTG9hZGVkVG9JZGxlU3RhdGUgPSBuZXcgTG9hZGVkVG9JZGxlU3RhdGUodGhpcyk7CkBAIC02NDAsMTggKzY0NCwzNCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIC8vIFhYWDogSXMgdGhpcyB0aGUgcmlnaHQgbG9naWMgdG8gdXNlPyAgSXQncyBub3QgY2xlYXIgdG8gbWUgd2hhdCB0aGUgT01YCi0gICAgLy8gYnVmZmVyIGNvdW50cyByZWZlciB0byAtIGhvdyBkbyB0aGV5IGFjY291bnQgZm9yIHRoZSByZW5kZXJlciBob2xkaW5nIG9uCi0gICAgLy8gdG8gYnVmZmVycz8KLSAgICBpZiAoZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA8IGRlZi5uQnVmZmVyQ291bnRNaW4gKyAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpIHsKLSAgICAgICAgT01YX1UzMiBuZXdCdWZmZXJDb3VudCA9IGRlZi5uQnVmZmVyQ291bnRNaW4gKyAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnM7CisgICAgLy8gRklYTUU6IGFzc3VtZSB0aGF0IHN1cmZhY2UgaXMgY29udHJvbGxlZCBieSBhcHAgKG5hdGl2ZSB3aW5kb3cKKyAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgZm9yIHRoZSBjYXNlIHdoZW4gc3VyZmFjZSBpcyBub3QgY29udHJvbGxlZCBieSBhcHApCisgICAgLy8gRklYTUUyOiBUaGlzIG1lYW5zIHRoYXQgbWluVW5kZXFldWV1ZEJ1ZnMgY2FuIGJlIDEgbGFyZ2VyIHRoYW4gcmVwb3J0ZWQKKyAgICAvLyBGb3Igbm93LCB0cnkgdG8gYWxsb2NhdGUgMSBtb3JlIGJ1ZmZlciwgYnV0IGRvbid0IGZhaWwgaWYgdW5zdWNjZXNzZnVsCisKKyAgICAvLyBVc2UgY29uc2VydmF0aXZlIGFsbG9jYXRpb24gd2hpbGUgYWxzbyB0cnlpbmcgdG8gcmVkdWNlIHN0YXJ2YXRpb24KKyAgICAvLworICAgIC8vIDEuIGFsbG9jYXRlIGF0IGxlYXN0IG5CdWZmZXJDb3VudE1pbiArIG1pblVuZGVxdWV1ZWRCdWZmZXJzIC0gdGhhdCBpcyB0aGUKKyAgICAvLyAgICBtaW5pbXVtIG5lZWRlZCBmb3IgdGhlIGNvbnN1bWVyIHRvIGJlIGFibGUgdG8gd29yaworICAgIC8vIDIuIHRyeSB0byBhbGxvY2F0ZSB0d28gKDIpIGFkZGl0aW9uYWwgYnVmZmVycyB0byByZWR1Y2Ugc3RhcnZhdGlvbiBmcm9tCisgICAgLy8gICAgdGhlIGNvbnN1bWVyCisgICAgLy8gICAgcGx1cyBhbiBleHRyYSBidWZmZXIgdG8gYWNjb3VudCBmb3IgaW5jb3JyZWN0IG1pblVuZGVxdWV1ZWRCdWZzCisgICAgZm9yIChPTVhfVTMyIGV4dHJhQnVmZmVycyA9IDIgKyAxOyAvKiBjb25kaXRpb24gaW5zaWRlIGxvb3AgKi87IGV4dHJhQnVmZmVycy0tKSB7CisgICAgICAgIE9NWF9VMzIgbmV3QnVmZmVyQ291bnQgPQorICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiArICptaW5VbmRlcXVldWVkQnVmZmVycyArIGV4dHJhQnVmZmVyczsKICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IG5ld0J1ZmZlckNvdW50OwogICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKIAotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiWyVzXSBzZXR0aW5nIG5CdWZmZXJDb3VudEFjdHVhbCB0byAlbHUgZmFpbGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG5ld0J1ZmZlckNvdW50LCBlcnIpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgKz0gZXh0cmFCdWZmZXJzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVygiWyVzXSBzZXR0aW5nIG5CdWZmZXJDb3VudEFjdHVhbCB0byAlbHUgZmFpbGVkOiAlZCIsCisgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbmV3QnVmZmVyQ291bnQsIGVycik7CisgICAgICAgIC8qIGV4aXQgY29uZGl0aW9uICovCisgICAgICAgIGlmIChleHRyYUJ1ZmZlcnMgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KQEAgLTY3Niw2ICs2OTYsNyBAQAogICAgICAgICAgICAgJmJ1ZmZlckNvdW50LCAmYnVmZmVyU2l6ZSwgJm1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKICAgICBpZiAoZXJyICE9IDApCiAgICAgICAgIHJldHVybiBlcnI7CisgICAgbU51bVVuZGVxdWV1ZWRCdWZmZXJzID0gbWluVW5kZXF1ZXVlZEJ1ZmZlcnM7CiAKICAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICVsdSBidWZmZXJzIGZyb20gYSBuYXRpdmUgd2luZG93IG9mIHNpemUgJWx1IG9uICIKICAgICAgICAgICJvdXRwdXQgcG9ydCIsCkBAIC03NDEsNiArNzYyLDcgQEAKICAgICAgICAgICAgICZidWZmZXJDb3VudCwgJmJ1ZmZlclNpemUsICZtaW5VbmRlcXVldWVkQnVmZmVycyk7CiAgICAgaWYgKGVyciAhPSAwKQogICAgICAgICByZXR1cm4gZXJyOworICAgIG1OdW1VbmRlcXVldWVkQnVmZmVycyA9IG1pblVuZGVxdWV1ZWRCdWZmZXJzOwogCiAgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAlbHUgbWV0YSBidWZmZXJzIG9uIG91dHB1dCBwb3J0IiwKICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlckNvdW50KTsKQEAgLTk2MSw2ICs5ODMsOCBAQAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIiwgImF1ZGlvX2VuY29kZXIuYWFjIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLnZvcmJpcyIsICJhdWRpb19lbmNvZGVyLnZvcmJpcyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIub3B1cyIsICJhdWRpb19lbmNvZGVyLm9wdXMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciLCAiYXVkaW9fZW5jb2Rlci5nNzExbWxhdyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsCkBAIC0xMDM2LDYgKzEwNjAsOSBAQAogICAgICAgICBlbmNvZGVyID0gZmFsc2U7CiAgICAgfQogCisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworCiAgICAgbUlzRW5jb2RlciA9IGVuY29kZXI7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBzZXRDb21wb25lbnRSb2xlKGVuY29kZXIgLyogaXNFbmNvZGVyICovLCBtaW1lKTsKQEAgLTExMTgsNyArMTE0NSwxNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgibWF4LXB0cy1nYXAtdG8tZW5jb2RlciIsICZtTWF4UHRzR2FwVXMpKSB7Ci0gICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAtMWw7CisgICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAtMWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgidGltZS1sYXBzZSIsICZtVGltZVBlckNhcHR1cmVVcykpIHsKKyAgICAgICAgICAgIG1UaW1lUGVyQ2FwdHVyZVVzID0gLTFsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiLAorICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJm1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQpKSB7CisgICAgICAgICAgICBtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExMjcsNyArMTE2NCw5IEBACiAgICAgaW50MzJfdCBoYXZlTmF0aXZlV2luZG93ID0gbXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikgJiYKICAgICAgICAgICAgIG9iaiAhPSBOVUxMOwogICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzID0gZmFsc2U7Ci0gICAgbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2sgPSBmYWxzZTsKKyAgICBpZiAodmlkZW8gJiYgIWVuY29kZXIpIHsKKyAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIGZhbHNlKTsKKyAgICB9CiAgICAgaWYgKCFlbmNvZGVyICYmIHZpZGVvICYmIGhhdmVOYXRpdmVXaW5kb3cpIHsKICAgICAgICAgZXJyID0gbU9NWC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xMTcyLDE0ICsxMjExLDE5IEBACiAgICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLAogICAgICAgICAgICAgICAgICAgICAgICAgIlslc10gcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2sgZmFpbGVkIHcvIGVyciAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwotICAgICAgICAgICAgICAgIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrID0gKGVyciA9PSBPSyk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigibWF4LXdpZHRoIiwgbWF4V2lkdGgpOworICAgICAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoIm1heC1oZWlnaHQiLCBtYXhIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoImFkYXB0aXZlLXBsYXliYWNrIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gYWxsb3cgZmFpbHVyZQogICAgICAgICAgICAgZXJyID0gT0s7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIHN1Y2NlZWRlZCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgPSB0cnVlOwotICAgICAgICAgICAgbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2sgPSB0cnVlOworICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIHRydWUpOwogICAgICAgICB9CiAKICAgICAgICAgaW50MzJfdCBwdXNoOwpAQCAtMTMxOSw2ICsxMzYzLDExIEBACiAgICAgICAgIGVyciA9IHNldE1pbkJ1ZmZlclNpemUoa1BvcnRJbmRleElucHV0LCA4MTkyKTsgIC8vIFhYWAogICAgIH0KIAorICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleElucHV0LCBpbnB1dEZvcm1hdCksIChzdGF0dXNfdClPSyk7CisgICAgQ0hFQ0tfRVEoZ2V0UG9ydEZvcm1hdChrUG9ydEluZGV4T3V0cHV0LCBvdXRwdXRGb3JtYXQpLCAoc3RhdHVzX3QpT0spOworICAgIG1JbnB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgIG1PdXRwdXRGb3JtYXQgPSBvdXRwdXRGb3JtYXQ7CisKICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0xOTA5LDYgKzE5NTgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgICAgIGZyYW1lUmF0ZSA9IChmbG9hdCl0bXA7CisgICAgICAgIG1UaW1lUGVyRnJhbWVVcyA9IChpbnQ2NF90KSAoMTAwMDAwMC4wZiAvIGZyYW1lUmF0ZSk7CiAgICAgfQogCiAgICAgdmlkZW9fZGVmLT54RnJhbWVyYXRlID0gKE9NWF9VMzIpKGZyYW1lUmF0ZSAqIDY1NTM2LjBmKTsKQEAgLTIzMjEsMTIgKzIzNzEsODEgQEAKIAogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBiaXRyYXRlOworICAgIGludDMyX3QgaUZyYW1lSW50ZXJ2YWwgPSAwOworICAgIHNpemVfdCB0c0xheWVycyA9IDA7CisgICAgT01YX1ZJREVPX0FORFJPSURfVlBYVEVNUE9SQUxMQVlFUlBBVFRFUk5UWVBFIHBhdHRlcm4gPQorICAgICAgICBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lOworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrVnA4TGF5ZXJSYXRlQWxsb2N0aW9uCisgICAgICAgIFtPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSU10KKyAgICAgICAgW09NWF9WSURFT19BTkRST0lEX01BWFZQOFRFTVBPUkFMTEFZRVJTXSA9IHsKKyAgICAgICAgezEwMCwgMTAwLCAxMDB9LCAgLy8gMSBsYXllcgorICAgICAgICB7IDYwLCAxMDAsIDEwMH0sICAvLyAyIGxheWVycyB7NjAlLCA0MCV9CisgICAgICAgIHsgNDAsICA2MCwgMTAwfSwgIC8vIDMgbGF5ZXJzIHs0MCUsIDIwJSwgNDAlfQorICAgIH07CiAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQorICAgIG1zZy0+ZmluZEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKTsKIAogICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUgPSBnZXRCaXRyYXRlTW9kZShtc2cpOwogCisgICAgZmxvYXQgZnJhbWVSYXRlOworICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgeworICAgICAgICBpbnQzMl90IHRtcDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZ0bXApKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICB9CisKKyAgICBBU3RyaW5nIHRzU2NoZW1hOworICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoInRzLXNjaGVtYSIsICZ0c1NjaGVtYSkpIHsKKyAgICAgICAgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjEtbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAxOworICAgICAgICB9IGVsc2UgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjItbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAyOworICAgICAgICB9IGVsc2UgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjMtbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIHRzLXNjaGVtYSBbJXNdIiwgdHNTY2hlbWEuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSB2cDh0eXBlOworICAgIEluaXRPTVhQYXJhbXMoJnZwOHR5cGUpOworICAgIHZwOHR5cGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICZ2cDh0eXBlLCBzaXplb2YodnA4dHlwZSkpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBpZiAoaUZyYW1lSW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICB2cDh0eXBlLm5LZXlGcmFtZUludGVydmFsID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgdnA4dHlwZS5lVGVtcG9yYWxQYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgdnA4dHlwZS5uVGVtcG9yYWxMYXllckNvdW50ID0gdHNMYXllcnM7CisgICAgICAgIGlmICh0c0xheWVycyA+IDApIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlM7IGkrKykgeworICAgICAgICAgICAgICAgIHZwOHR5cGUublRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0gPQorICAgICAgICAgICAgICAgICAgICBrVnA4TGF5ZXJSYXRlQWxsb2N0aW9uW3RzTGF5ZXJzIC0gMV1baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpdHJhdGVNb2RlID09IE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50KSB7CisgICAgICAgICAgICB2cDh0eXBlLm5NaW5RdWFudGl6ZXIgPSAyOworICAgICAgICAgICAgdnA4dHlwZS5uTWF4UXVhbnRpemVyID0gNjM7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICAgICAmdnA4dHlwZSwgc2l6ZW9mKHZwOHR5cGUpKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIkV4dGVuZGVkIFZQOCBwYXJhbWV0ZXJzIHNldCBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKIH0KIApAQCAtMjQ4MiwxOSArMjYwMSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQgbWluVW5kZXF1ZXVlZEJ1ZnMgPSAwOwotICAgIHN0YXR1c190IGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KAotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLAotICAgICAgICAgICAgJm1pblVuZGVxdWV1ZWRCdWZzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIlslc10gTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTIHF1ZXJ5IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotCi0gICAgICAgIG1pblVuZGVxdWV1ZWRCdWZzID0gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoY291bnRCdWZmZXJzT3duZWRCeU5hdGl2ZVdpbmRvdygpID4gKHNpemVfdCltaW5VbmRlcXVldWVkQnVmcworICAgIHdoaWxlIChjb3VudEJ1ZmZlcnNPd25lZEJ5TmF0aXZlV2luZG93KCkgPiBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnMKICAgICAgICAgICAgICYmIGRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgewogICAgICAgICAvLyB0aGVzZSBidWZmZXJzIHdpbGwgYmUgc3VibWl0dGVkIGFzIHJlZ3VsYXIgYnVmZmVyczsgYWNjb3VudCBmb3IgdGhpcwogICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgJiYgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID4gMCkgewpAQCAtMjU0MCw3OSArMjY0Nyw3OCBAQAogICAgIH0KIH0KIAotdm9pZCBBQ29kZWM6OnNlbmRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgewotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKTsKLQorc3RhdHVzX3QgQUNvZGVjOjpnZXRQb3J0Rm9ybWF0KE9NWF9VMzIgcG9ydEluZGV4LCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgeworICAgIC8vIFRPRE86IGNhdGNoIGVycm9ycyBhbiByZXR1cm4gdGhlbSBpbnN0ZWFkIG9mIHVzaW5nIENIRUNLCiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CiAgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKLSAgICBkZWYublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgZGVmLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKSwKICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOwogCi0gICAgQ0hFQ0tfRVEoKGludClkZWYuZURpciwgKGludClPTVhfRGlyT3V0cHV0KTsKKyAgICBDSEVDS19FUSgoaW50KWRlZi5lRGlyLAorICAgICAgICAgICAgKGludCkocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgPyBPTVhfRGlyT3V0cHV0IDogT01YX0RpcklucHV0KSk7CiAKICAgICBzd2l0Y2ggKGRlZi5lRG9tYWluKSB7CiAgICAgICAgIGNhc2UgT01YX1BvcnREb21haW5WaWRlbzoKICAgICAgICAgewogICAgICAgICAgICAgT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRSAqdmlkZW9EZWYgPSAmZGVmLmZvcm1hdC52aWRlbzsKKyAgICAgICAgICAgIHN3aXRjaCAoKGludCl2aWRlb0RlZi0+ZUNvbXByZXNzaW9uRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nVW51c2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUlzRW5jb2RlciBeIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCkpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CiAKLSAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKLSAgICAgICAgICAgIGlmICghbUlzRW5jb2RlcikgewotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoR2V0TWltZVR5cGVGb3JWaWRlb0NvZGluZygKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic3RyaWRlIiwgdmlkZW9EZWYtPm5TdHJpZGUpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzbGljZS1oZWlnaHQiLCB2aWRlb0RlZi0+blNsaWNlSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgdmlkZW9EZWYtPmVDb2xvckZvcm1hdCk7CisKKyAgICAgICAgICAgICAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSByZWN0OworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZyZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVjdC5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobU9NWC0+Z2V0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsIHNpemVvZihyZWN0KSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubldpZHRoID0gdmlkZW9EZWYtPm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uSGVpZ2h0ID0gdmlkZW9EZWYtPm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkxlZnQsIDApOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5Ub3AsIDApOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5XaWR0aCwgMHUpOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5IZWlnaHQsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uTGVmdCArIHJlY3QubldpZHRoIC0gMSwgdmlkZW9EZWYtPm5GcmFtZVdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0IC0gMSwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRSZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEpOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUlzRW5jb2RlciBeIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0KSk7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEdldE1pbWVUeXBlRm9yVmlkZW9Db2RpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0RlZi0+ZUNvbXByZXNzaW9uRm9ybWF0LCAmbWltZSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aWR0aCIsIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCk7CiAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJoZWlnaHQiLCB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0KTsKLQotICAgICAgICAgICAgaWYgKCFtSXNFbmNvZGVyKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic3RyaWRlIiwgdmlkZW9EZWYtPm5TdHJpZGUpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIHZpZGVvRGVmLT5uU2xpY2VIZWlnaHQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIHZpZGVvRGVmLT5lQ29sb3JGb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSByZWN0OwotICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnJlY3QpOwotICAgICAgICAgICAgICAgIHJlY3QublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAobU9NWC0+Z2V0Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0LCBzaXplb2YocmVjdCkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgPSAwOwotICAgICAgICAgICAgICAgICAgICByZWN0Lm5XaWR0aCA9IHZpZGVvRGVmLT5uRnJhbWVXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcmVjdC5uSGVpZ2h0ID0gdmlkZW9EZWYtPm5GcmFtZUhlaWdodDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5MZWZ0LCAwKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5Ub3AsIDApOwotICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubldpZHRoLCAwdSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uSGVpZ2h0LCAwdSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uTGVmdCArIHJlY3QubldpZHRoIC0gMSwgdmlkZW9EZWYtPm5GcmFtZVdpZHRoKTsKLSAgICAgICAgICAgICAgICBDSEVDS19MRShyZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQgLSAxLCB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0UmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0IC0gMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LT5zZXRSZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yNjI1LDcgKzI3MzEsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFIHBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLApAQCAtMjY0NSwyMCArMjc1MSw2IEBACiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxpbmdSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmNvZGVyRGVsYXkgKyBtRW5jb2RlclBhZGRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBwYXJhbXMubkNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJldmJ1ZnNpemUgPSBtU2tpcEN1dEJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2YnVmc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZXBsYWNpbmcgU2tpcEN1dEJ1ZmZlciBob2xkaW5nICVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmJ1ZnNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbmNvZGVyRGVsYXkgKiBmcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbmNvZGVyUGFkZGluZyAqIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxNYXNrUHJlc2VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1tYXNrIiwgbUNoYW5uZWxNYXNrKTsKQEAgLTI2NzAsNyArMjc2Miw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgcGFyYW1zOwogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsCkBAIC0yNjg3LDcgKzI3NzksNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgcGFyYW1zOwogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BbXIsCkBAIC0yNzEzLDcgKzI4MDUsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0ZMQUNUWVBFIHBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvRmxhYywKQEAgLTI3MjYsMTEgKzI4MTgsNDUgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nTVAzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX01QM1RZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvTXAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ1ZPUkJJUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFIHBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1ZvcmJpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRBQzM6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQzNUWVBFIHBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKQEAgLTI3NDUsNiArMjg3MSw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVOS05PV04gQVVESU8gQ09ESU5HOiAlZFxuIiwgYXVkaW9EZWYtPmVFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTI3NTQsNiArMjg4MSw0MyBAQAogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQUNvZGVjOjpzZW5kRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisKKyAgICBDSEVDS19FUShnZXRQb3J0Rm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIG5vdGlmeSksIChzdGF0dXNfdClPSyk7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0sobm90aWZ5LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgIGludDMyX3QgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyAmJgorICAgICAgICBtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYKKyAgICAgICAgbm90aWZ5LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgIC8vIG5vdGlmeSByZW5kZXJlciBvZiB0aGUgY3JvcCBjaGFuZ2UKKyAgICAgICAgLy8gTk9URTogbmF0aXZlIHdpbmRvdyB1c2VzIGV4dGVuZGVkIHJpZ2h0LWJvdHRvbSBjb29yZGluYXRlCisgICAgICAgIHJlcGx5LT5zZXRSZWN0KCJjcm9wIiwgbGVmdCwgdG9wLCByaWdodCArIDEsIGJvdHRvbSArIDEpOworICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcgJiYKKyAgICAgICAgICAgICAgIChtRW5jb2RlckRlbGF5IHx8IG1FbmNvZGVyUGFkZGluZykpIHsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgIENIRUNLKG5vdGlmeS0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJmNoYW5uZWxDb3VudCkpOworICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgc2l6ZV90IHByZXZidWZzaXplID0gbVNraXBDdXRCdWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChwcmV2YnVmc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJWQgIgorICAgICAgICAgICAgICAgICAgICAgICJieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJldmJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUVuY29kZXJEZWxheSAqIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICBtRW5jb2RlclBhZGRpbmcgKiBmcmFtZVNpemUpOworICAgIH0KKwogICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgbVNlbnRGb3JtYXQgPSB0cnVlOwpAQCAtMjk2MCw3ICszMTI0LDggQEAKICAgICAgIG1Db2RlYyhjb2RlYykgewogfQogCi1BQ29kZWM6OkJhc2VTdGF0ZTo6UG9ydE1vZGUgQUNvZGVjOjpCYXNlU3RhdGU6OmdldFBvcnRNb2RlKE9NWF9VMzIgcG9ydEluZGV4KSB7CitBQ29kZWM6OkJhc2VTdGF0ZTo6UG9ydE1vZGUgQUNvZGVjOjpCYXNlU3RhdGU6OmdldFBvcnRNb2RlKAorICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIHJldHVybiBLRUVQX0JVRkZFUlM7CiB9CiAKQEAgLTMwMDksNiArMzE3NCwxNCBAQAogICAgIGludDMyX3QgdHlwZTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKSk7CiAKKyAgICAvLyB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhpcyBpcyBhbiBvdXRzdGFuZGluZyBtZXNzYWdlIGZvciBhCisgICAgLy8gY29kZWMgdGhhdCB3ZSBoYXZlIGFscmVhZHkgZGVzdHJveWVkCisgICAgaWYgKG1Db2RlYy0+bU5vZGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HSSgiaWdub3JpbmcgbWVzc2FnZSBhcyBhbHJlYWR5IGZyZWVkIGNvbXBvbmVudDogJXMiLAorICAgICAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgSU9NWDo6bm9kZV9pZCBub2RlSUQ7CiAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigibm9kZSIsICZub2RlSUQpKTsKICAgICBDSEVDS19FUShub2RlSUQsIG1Db2RlYy0+bU5vZGUpOwpAQCAtMzM2OSw4ICszNTQyLDggQEAKICAgICAgICAgc2l6ZV90IHJhbmdlT2Zmc2V0LCBzaXplX3QgcmFuZ2VMZW5ndGgsCiAgICAgICAgIE9NWF9VMzIgZmxhZ3MsCiAgICAgICAgIGludDY0X3QgdGltZVVzLAotICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGUsCi0gICAgICAgIHZvaWQgKmRhdGFQdHIpIHsKKyAgICAgICAgdm9pZCAqIC8qIHBsYXRmb3JtUHJpdmF0ZSAqLywKKyAgICAgICAgdm9pZCAqIC8qIGRhdGFQdHIgKi8pIHsKICAgICBBTE9HVigiWyVzXSBvbk9NWEZpbGxCdWZmZXJEb25lICVwIHRpbWUgJWxsZCB1cywgZmxhZ3MgPSAweCUwOGx4IiwKICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVySUQsIHRpbWVVcywgZmxhZ3MpOwogCkBAIC0zNDIyLDcgKzM1OTUsNyBAQAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0KICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkLCBtQ29kZWMtPmlkKCkpOwogCi0gICAgICAgICAgICBpZiAoIW1Db2RlYy0+bVNlbnRGb3JtYXQpIHsKKyAgICAgICAgICAgIGlmICghbUNvZGVjLT5tU2VudEZvcm1hdCAmJiByYW5nZUxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICBtQ29kZWMtPnNlbmRGb3JtYXRDaGFuZ2UocmVwbHkpOwogICAgICAgICAgICAgfQogCkBAIC0zNjIwLDcgKzM3OTMsOCBAQAogICAgICAgICAgICAgaW50MzJfdCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsICZrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSk7Ci0gICAgICAgICAgICBDSEVDSygha2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CisgICAgICAgICAgICBBTE9HV19JRihrZWVwQ29tcG9uZW50QWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBrZWVwIGNvbXBvbmVudCBhbGxvY2F0ZWQgb24gc2h1dGRvd24gaW4gVW5pbml0aWFsaXplZCBzdGF0ZSIpOwogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOwpAQCAtMzc4Miw3ICszOTU2LDggQEAKICAgICBtQ29kZWMtPm1EZXF1ZXVlQ291bnRlciA9IDA7CiAgICAgbUNvZGVjLT5tTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQgPSAwOwogICAgIG1Db2RlYy0+bVJlcGVhdEZyYW1lRGVsYXlVcyA9IC0xbGw7Ci0gICAgbUNvZGVjLT5tSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjayA9IGZhbHNlOworICAgIG1Db2RlYy0+bUlucHV0Rm9ybWF0LmNsZWFyKCk7CisgICAgbUNvZGVjLT5tT3V0cHV0Rm9ybWF0LmNsZWFyKCk7CiAKICAgICBpZiAobUNvZGVjLT5tU2h1dGRvd25JblByb2dyZXNzKSB7CiAgICAgICAgIGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IG1Db2RlYy0+bUtlZXBDb21wb25lbnRBbGxvY2F0ZWQ7CkBAIC0zNzkyLDYgKzM5NjcsNyBAQAogCiAgICAgICAgIG9uU2h1dGRvd24oa2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CiAgICAgfQorICAgIG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24gPSBmYWxzZTsKIH0KIAogdm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvblNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgewpAQCAtMzgwMSw5ICszOTc3LDEyIEBACiAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tVW5pbml0aWFsaXplZFN0YXRlKTsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKLSAgICBub3RpZnktPnBvc3QoKTsKKyAgICBpZiAobUNvZGVjLT5tRXhwbGljaXRTaHV0ZG93bikgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICBtQ29kZWMtPm1FeHBsaWNpdFNodXRkb3duID0gZmFsc2U7CisgICAgfQogfQogCiBib29sIEFDb2RlYzo6TG9hZGVkU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC0zODM3LDYgKzQwMTYsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsICZrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSk7CiAKKyAgICAgICAgICAgIG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24gPSB0cnVlOwogICAgICAgICAgICAgb25TaHV0ZG93bihrZWVwQ29tcG9uZW50QWxsb2NhdGVkKTsKIAogICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CkBAIC0zODk2LDYgKzQwNzYsOCBAQAogICAgIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7CiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiaW5wdXQtZm9ybWF0IiwgbUNvZGVjLT5tSW5wdXRGb3JtYXQpOworICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoIm91dHB1dC1mb3JtYXQiLCBtQ29kZWMtPm1PdXRwdXRGb3JtYXQpOwogICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICB9CiAKQEAgLTM5MDMsNyArNDA4NSw3IEBACiB9CiAKIHZvaWQgQUNvZGVjOjpMb2FkZWRTdGF0ZTo6b25DcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmIC8qIG1zZyAqLykgewogICAgIEFMT0dWKCJvbkNyZWF0ZUlucHV0U3VyZmFjZSIpOwogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7CkBAIC0zOTMxLDcgKzQxMTMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1NYXhQdHNHYXBVcyA+IDBsKSB7CisgICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1NYXhQdHNHYXBVcyA+IDBsbCkgewogICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAogICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LApAQCAtMzk0MSw2ICs0MTIzLDQxIEBACiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIlslc10gVW5hYmxlIHRvIGNvbmZpZ3VyZSBtYXggdGltZXN0YW1wIGdhcCAoZXJyICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tVGltZVBlckNhcHR1cmVVcyA+IDBsbAorICAgICAgICAgICAgJiYgbUNvZGVjLT5tVGltZVBlckZyYW1lVXMgPiAwbGwpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lTGFwc2VbMl07CisgICAgICAgIHRpbWVMYXBzZVswXSA9IG1Db2RlYy0+bVRpbWVQZXJGcmFtZVVzOworICAgICAgICB0aW1lTGFwc2VbMV0gPSBtQ29kZWMtPm1UaW1lUGVyQ2FwdHVyZVVzOworICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAorICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCisgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFLAorICAgICAgICAgICAgICAgICZ0aW1lTGFwc2VbMF0sCisgICAgICAgICAgICAgICAgc2l6ZW9mKHRpbWVMYXBzZSkpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJbJXNdIFVuYWJsZSB0byBjb25maWd1cmUgdGltZSBsYXBzZSAoZXJyICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSB7CisgICAgICAgIGJvb2wgc3VzcGVuZCA9IHRydWU7CisgICAgICAgIGVyciA9IG1Db2RlYy0+bU9NWC0+c2V0SW50ZXJuYWxPcHRpb24oCisgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwKKyAgICAgICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsCisgICAgICAgICAgICAgICAgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NVU1BFTkQsCisgICAgICAgICAgICAgICAgJnN1c3BlbmQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN1c3BlbmQpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiWyVzXSBVbmFibGUgdG8gY29uZmlndXJlIG9wdGlvbiB0byBzdXNwZW5kIChlcnIgJWQpIiwKICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgIGVycik7CiAgICAgICAgIH0KQEAgLTQwMDMsNiArNDIyMCw3IEBACiAKIGJvb2wgQUNvZGVjOjpMb2FkZWRUb0lkbGVTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgogICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CiAgICAgICAgIHsKICAgICAgICAgICAgIG1Db2RlYy0+ZGVmZXJNZXNzYWdlKG1zZyk7CkBAIC00MDY5LDYgKzQyODcsNyBAQAogCiBib29sIEFDb2RlYzo6SWRsZVRvRXhlY3V0aW5nU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKICAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgogICAgICAgICB7CiAgICAgICAgICAgICBtQ29kZWMtPmRlZmVyTWVzc2FnZShtc2cpOwpAQCAtNDEyOSw3ICs0MzQ4LDcgQEAKIH0KIAogQUNvZGVjOjpCYXNlU3RhdGU6OlBvcnRNb2RlIEFDb2RlYzo6RXhlY3V0aW5nU3RhdGU6OmdldFBvcnRNb2RlKAotICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCkgeworICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIHJldHVybiBSRVNVQk1JVF9CVUZGRVJTOwogfQogCkBAIC00MjE3LDYgKzQ0MzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCAma2VlcENvbXBvbmVudEFsbG9jYXRlZCkpOwogCiAgICAgICAgICAgICBtQ29kZWMtPm1TaHV0ZG93bkluUHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgICAgbUNvZGVjLT5tRXhwbGljaXRTaHV0ZG93biA9IHRydWU7CiAgICAgICAgICAgICBtQ29kZWMtPm1LZWVwQ29tcG9uZW50QWxsb2NhdGVkID0ga2VlcENvbXBvbmVudEFsbG9jYXRlZDsKIAogICAgICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOwpAQCAtNDMzOCw2ICs0NTU4LDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVczsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoInNraXAtZnJhbWVzLWJlZm9yZSIsICZza2lwRnJhbWVzQmVmb3JlVXMpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICBtT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgICAgICAgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAmc2tpcEZyYW1lc0JlZm9yZVVzLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNraXBGcmFtZXNCZWZvcmVVcykpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHBhcmFtZXRlciAnc2tpcC1mcmFtZXMtYmVmb3JlJyAoZXJyICVkKSIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50MzJfdCBkcm9wSW5wdXRGcmFtZXM7CiAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsICZkcm9wSW5wdXRGcmFtZXMpKSB7CiAgICAgICAgIGJvb2wgc3VzcGVuZCA9IGRyb3BJbnB1dEZyYW1lcyAhPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggNmEyYTY5Ni4uNzE0YjVlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC0xNSw2ICsxNSw3IEBACiAgICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgICAgICAgICBcCiAgICAgICAgIERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERhdGFVUklTb3VyY2UuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIERSTUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMCw4ICszMSwxMCBAQAogICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUNvZGVjLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUNvZGVjTGlzdC5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBNZWRpYUNvZGVjU291cmNlLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYURlZnMuY3BwICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBodHRwL01lZGlhSFRUUC5jcHAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYU11eGVyLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZXRhRGF0YS5jcHAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTUsOCArNTgsNiBAQAogICAgICAgICBXVk1FeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBYSU5HU2Vla2VyLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBhdmNfdXRpbHMuY3BwICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBtcDQvRnJhZ21lbnRlZE1QNFBhcnNlci5jcHAgICAgICAgXAotICAgICAgICBtcDQvVHJhY2tGcmFnbWVudC5jcHAgICAgICAgICAgICAgXAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dCBcCkBAIC04MCw2ICs4MSw3IEBACiAgICAgICAgIGxpYmljdXVjIFwKICAgICAgICAgbGlibG9nIFwKICAgICAgICAgbGlibWVkaWEgXAorICAgICAgICBsaWJvcHVzIFwKICAgICAgICAgbGlic29uaXZveCBcCiAgICAgICAgIGxpYnNzbCBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X29teCBcCkBAIC05NSw2ICs5Nyw3IEBACiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hYWNlbmMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9tYXRyb3NrYSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3dlYm0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF90aW1lZHRleHQgXAogICAgICAgICBsaWJ2cHggXAogICAgICAgICBsaWJ3ZWJtIFwKQEAgLTEwMywxMyArMTA2LDYgQEAKICAgICAgICAgbGliRkxBQyBcCiAgICAgICAgIGxpYm1lZGlhX2hlbHBlcgogCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgICAgICBjaHJvbWl1bV9odHRwX3N0dWIuY3BwCi1MT0NBTF9DUFBGTEFHUyArPSAtRENIUk9NSVVNX0FWQUlMQUJMRT0xCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlic3RscG9ydAotaW5jbHVkZSBleHRlcm5hbC9zdGxwb3J0L2xpYnN0bHBvcnQubWsKLQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNfY29tbW9uIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCA4NjIzMTAwLi4yNjY5ODQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0yMjEsNyArMjIxLDggQEAKIAogICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgbVNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBhdWRpb01hc2ssCi0gICAgICAgICAgICAgICAgMCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJkF1ZGlvQ2FsbGJhY2ssIHRoaXMsIDApOworICAgICAgICAgICAgICAgIDAgLypmcmFtZUNvdW50Ki8sIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZBdWRpb0NhbGxiYWNrLCB0aGlzLAorICAgICAgICAgICAgICAgIDAgLypub3RpZmljYXRpb25GcmFtZXMqLyk7CiAKICAgICAgICAgaWYgKChlcnIgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCkpICE9IE9LKSB7CiAgICAgICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCmluZGV4IGU2OGE3MTAuLmQwZTBlOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKQEAgLTY1LDcgKzY1LDcgQEAKICAgICBpZiAoc3RhdHVzID09IE9LKSB7CiAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBBdWRpb1JlY29yZCBjYWxsYmFjayBuZXZlciByZXR1cm5zIG1vcmUgdGhhbiB0aGUgbWF4aW11bQogICAgICAgICAvLyBidWZmZXIgc2l6ZQotICAgICAgICBpbnQgZnJhbWVDb3VudCA9IGtNYXhCdWZmZXJTaXplIC8gc2l6ZW9mKGludDE2X3QpIC8gY2hhbm5lbENvdW50OworICAgICAgICB1aW50MzJfdCBmcmFtZUNvdW50ID0ga01heEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCkgLyBjaGFubmVsQ291bnQ7CiAKICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIEF1ZGlvUmVjb3JkIHRvdGFsIGJ1ZmZlciBzaXplIGlzIGxhcmdlIGVub3VnaAogICAgICAgICBzaXplX3QgYnVmQ291bnQgPSAyOwpAQCAtNzYsMTAgKzc2LDEwIEBACiAgICAgICAgIG1SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCiAgICAgICAgICAgICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KSwKLSAgICAgICAgICAgICAgICAgICAgYnVmQ291bnQgKiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoYnVmQ291bnQgKiBmcmFtZUNvdW50KSwKICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmRDYWxsYmFja0Z1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovKTsKICAgICAgICAgbUluaXRDaGVjayA9IG1SZWNvcmQtPmluaXRDaGVjaygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBzdGF0dXM7CkBAIC0yNzgsNyArMjc4LDcgQEAKIAogICAgIC8vIERyb3AgcmV0cmlldmVkIGFuZCBwcmV2aW91c2x5IGxvc3QgYXVkaW8gZGF0YS4KICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDAgJiYgdGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7Ci0gICAgICAgIG1SZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpOworICAgICAgICAodm9pZCkgbVJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCk7CiAgICAgICAgIEFMT0dWKCJEcm9wIGF1ZGlvIGRhdGEgYXQgJWxsZC8lbGxkIHVzIiwgdGltZVVzLCBtU3RhcnRUaW1lVXMpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAppbmRleCAwZGQ4NjdjLi42ZTUwMDNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcApAQCAtMzUsNiArMzUsOCBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTQ1LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CkBAIC0yNzcsMTUgKzI4MCwyMCBAQAogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBzZXREYXRhU291cmNlX2wodXJpLCBoZWFkZXJzKTsKKyAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGh0dHBTZXJ2aWNlLCB1cmksIGhlYWRlcnMpOwogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXREYXRhU291cmNlX2woCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIHJlc2V0X2woKTsKIAorICAgIG1IVFRQU2VydmljZSA9IGh0dHBTZXJ2aWNlOwogICAgIG1VcmkgPSB1cmk7CiAKICAgICBpZiAoaGVhZGVycykgewpAQCAtMzAyLDcgKzMxMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HSSgic2V0RGF0YVNvdXJjZV9sKFVSTCBzdXBwcmVzc2VkKSIpOworICAgIEFMT0dJKCJzZXREYXRhU291cmNlX2woJXMpIiwgdXJpRGVidWdTdHJpbmcobVVyaSwgbUZsYWdzICYgSU5DT0dOSVRPKS5jX3N0cigpKTsKIAogICAgIC8vIFRoZSBhY3R1YWwgd29yayB3aWxsIGJlIGRvbmUgZHVyaW5nIHByZXBhcmF0aW9uIGluIHRoZSBjYWxsIHRvCiAgICAgLy8gOjpmaW5pc2hTZXREYXRhU291cmNlX2wgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIGNhbGxpbmcgdGhyZWFkIGluCkBAIC01ODIsNiArNTkwLDcgQEAKICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgIG1TZWVrVGltZVVzID0gMDsKIAorICAgIG1IVFRQU2VydmljZS5jbGVhcigpOwogICAgIG1Vcmkuc2V0VG8oIiIpOwogICAgIG1VcmlIZWFkZXJzLmNsZWFyKCk7CiAKQEAgLTcwOSwxMSArNzE4LDkgQEAKICAgICAgICAgICAgICAgICBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlOwotICAgICAgICAgICAgaWYgKGdldEJpdHJhdGUoJmJpdHJhdGUpKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNhY2hlZFNpemUgPSBtQ2FjaGVkU291cmNlLT5jYWNoZWRTaXplKCk7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gY2FjaGVkU2l6ZSAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7Ci0KKyAgICAgICAgICAgIGJvb2wgZW9zMjsKKyAgICAgICAgICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChnZXRDYWNoZWREdXJhdGlvbl9sKCZjYWNoZWREdXJhdGlvblVzLCAmZW9zMikgJiYgbUR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIChkb3VibGUpY2FjaGVkRHVyYXRpb25VcyAvIG1EdXJhdGlvblVzOwogICAgICAgICAgICAgICAgIGlmIChwZXJjZW50YWdlID4gMTAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CkBAIC03MjEsNyArNzI4LDcgQEAKIAogICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfQlVGRkVSSU5HX1VQREFURSwgcGVyY2VudGFnZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGJpdHJhdGUgb2YgdGhlIHN0cmVhbSwgdXNlIGFic29sdXRlIHNpemUKKyAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBiaXRyYXRlL2R1cmF0aW9uIG9mIHRoZSBzdHJlYW0sIHVzZSBhYnNvbHV0ZSBzaXplCiAgICAgICAgICAgICAgICAgLy8gbGltaXRzIHRvIG1haW50YWluIHRoZSBjYWNoZS4KIAogICAgICAgICAgICAgICAgIGlmICgobUZsYWdzICYgUExBWUlORykgJiYgIWVvcwpAQCAtMTQ4Myw3ICsxNDkwLDcgQEAKICAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7CiAKICAgICBpZiAobVRleHREcml2ZXIgPT0gTlVMTCkgewotICAgICAgICBtVGV4dERyaXZlciA9IG5ldyBUaW1lZFRleHREcml2ZXIobUxpc3RlbmVyKTsKKyAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lciwgbUhUVFBTZXJ2aWNlKTsKICAgICB9CiAKICAgICBtVGV4dERyaXZlci0+YWRkSW5CYW5kVGV4dFNvdXJjZSh0cmFja0luZGV4LCBzb3VyY2UpOwpAQCAtMjE5MywxNSArMjIwMCwxNCBAQAogICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCBtVXJpLnN0cmluZygpLCA3KQogICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIG1Vcmkuc3RyaW5nKCksIDgpCiAgICAgICAgICAgICB8fCBpc1dpZGV2aW5lU3RyZWFtaW5nKSB7Ci0gICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZSA9IEhUVFBCYXNlOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgKG1GbGFncyAmIElOQ09HTklUTykKLSAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KLSAgICAgICAgICAgICAgICAgICAgOiAwKTsKLQotICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPnNldFVJRChtVUlEKTsKKyAgICAgICAgaWYgKG1IVFRQU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBwbGF5IG1lZGlhIGZyb20gaHR0cCBVUkkgd2l0aG91dCBIVFRQIHNlcnZpY2UuIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gbUhUVFBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKKyAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlID0gbmV3IE1lZGlhSFRUUChjb25uKTsKKwogICAgICAgICBTdHJpbmc4IGNhY2hlQ29uZmlnOwogICAgICAgICBib29sIGRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcms7CiAgICAgICAgIE51Q2FjaGVkU291cmNlMjo6UmVtb3ZlQ2FjaGVTcGVjaWZpY0hlYWRlcnMoCkBAIC0yMjA5LDYgKzIyMTUsMTAgQEAKIAogICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbm5lY3RpbmdEYXRhU291cmNlLT5jb25uZWN0KG1VcmksICZtVXJpSGVhZGVycyk7CisgICAgICAgIC8vIGZvcmNlIGNvbm5lY3Rpb24gYXQgdGhpcyBwb2ludCwgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGdldE1JTUVUeXBlIGFuZCB0aGUKKyAgICAgICAgLy8gY2FjaGluZyBkYXRhc291cmNlIGNvbnN0cnVjdGVkIGJlbG93LCB3aGljaCBjb3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgcmVxdWVzdHMgdG8gdGhlCisgICAgICAgIC8vIHNlcnZlciwgYW5kL29yIGZhaWxlZCBjb25uZWN0aW9ucy4KKyAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+Z2V0TUlNRVR5cGUoKTsKICAgICAgICAgbUxvY2subG9jaygpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTIyMzksOCArMjI0OSw2IEBACiAKICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLmNsZWFyKCk7CiAKLSAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IGRhdGFTb3VyY2UtPmdldE1JTUVUeXBlKCk7Ci0KICAgICAgICAgaWYgKHN0cm5jYXNlY21wKGNvbnRlbnRUeXBlLnN0cmluZygpLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBkb2luZyB0aGlzIGZvciBzdHJlYW1zIHRoYXQgYXBwZWFyIHRvIGJlIGF1ZGlvLW9ubHkKICAgICAgICAgICAgIC8vIHN0cmVhbXMgdG8gZW5zdXJlIHRoYXQgZXZlbiBsb3cgYmFuZHdpZHRoIHN0cmVhbXMgc3RhcnQKQEAgLTIzMTcsNyArMjMyNSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtVXJpLnN0cmluZygpLCAmbVVyaUhlYWRlcnMpOworICAgICAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIG1Vcmkuc3RyaW5nKCksICZtVXJpSGVhZGVycyk7CiAgICAgfQogCiAgICAgaWYgKGRhdGFTb3VyY2UgPT0gTlVMTCkgewpAQCAtMjc1OSw3ICsyNzY4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgICAgIGlmIChtVGV4dERyaXZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lciwgbUhUVFBTZXJ2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFN0cmluZyB2YWx1ZXMgd3JpdHRlbiBpbiBQYXJjZWwgYXJlIFVURi0xNiB2YWx1ZXMuCiAgICAgICAgICAgICBTdHJpbmc4IHVyaShyZXF1ZXN0LnJlYWRTdHJpbmcxNigpKTsKQEAgLTI3NzEsNyArMjc4MCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgICAgICBpZiAobVRleHREcml2ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIsIG1IVFRQU2VydmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgZmQgICAgICAgICA9IHJlcXVlc3QucmVhZEZpbGVEZXNjcmlwdG9yKCk7CiAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IHJlcXVlc3QucmVhZEludDY0KCk7CkBAIC0yODEyLDcgKzI4MjEsNyBAQAogCiAgICAgZnByaW50ZihvdXQsICIgQXdlc29tZVBsYXllclxuIik7CiAgICAgaWYgKG1TdGF0cy5tRmQgPCAwKSB7Ci0gICAgICAgIGZwcmludGYob3V0LCAiICBVUkkoc3VwcHJlc3NlZCkiKTsKKyAgICAgICAgZnByaW50ZihvdXQsICIgIFVSSSglcykiLCB1cmlEZWJ1Z1N0cmluZyhtVXJpLCBtRmxhZ3MgJiBJTkNPR05JVE8pLmNfc3RyKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZwcmludGYob3V0LCAiICBmZCglZCkiLCBtU3RhdHMubUZkKTsKICAgICB9CkBAIC0yOTAxLDYgKzI5MTAsOCBAQAogICAgIC8vIGdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBzdGFydCByZWNyZWF0ZWQgc3RyZWFtIGZyb20gaGVyZQogICAgIGdldFBvc2l0aW9uKCZtQXVkaW9UZWFyRG93blBvc2l0aW9uKTsKIAorICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBzYXZlZEhUVFBTZXJ2aWNlID0gbUhUVFBTZXJ2aWNlOworCiAgICAgLy8gUmVzZXQgYW5kIHJlY3JlYXRlCiAgICAgcmVzZXRfbCgpOwogCkBAIC0yOTEwLDcgKzI5MjEsNyBAQAogICAgICAgICBtRmlsZVNvdXJjZSA9IGZpbGVTb3VyY2U7CiAgICAgICAgIGVyciA9IHNldERhdGFTb3VyY2VfbChmaWxlU291cmNlKTsKICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBzZXREYXRhU291cmNlX2wodXJpLCAmdXJpSGVhZGVycyk7CisgICAgICAgIGVyciA9IHNldERhdGFTb3VyY2VfbChzYXZlZEhUVFBTZXJ2aWNlLCB1cmksICZ1cmlIZWFkZXJzKTsKICAgICB9CiAKICAgICBtRmxhZ3MgfD0gUFJFUEFSSU5HOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggNWI0MWYzMC4uYjMxZTllOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC0zMSw2ICszMSwxMiBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IENBTUVSQV9TT1VSQ0VfVElNRU9VVF9OUyA9IDMwMDAwMDAwMDBMTDsKQEAgLTYzLDYgKzY5LDkgQEAKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6bm90aWZ5KGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpIHsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UobXNnVHlwZSk7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKGV4dDEpOworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShleHQyKTsKICAgICBBTE9HVigibm90aWZ5KCVkLCAlZCwgJWQpIiwgbXNnVHlwZSwgZXh0MSwgZXh0Mik7CiB9CiAKQEAgLTU3NywxNCArNTg2LDE1IEBACiAgICAgfQogfQogCi12b2lkIENhbWVyYVNvdXJjZTo6c3RhcnRDYW1lcmFSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkgewogICAgIEFMT0dWKCJzdGFydENhbWVyYVJlY29yZGluZyIpOwogICAgIC8vIFJlc2V0IHRoZSBpZGVudGl0eSB0byB0aGUgY3VycmVudCB0aHJlYWQgYmVjYXVzZSBtZWRpYSBzZXJ2ZXIgb3ducyB0aGUKICAgICAvLyBjYW1lcmEgYW5kIHJlY29yZGluZyBpcyBzdGFydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbnMuIFRoZSBhcHBsaWNhdGlvbnMKICAgICAvLyB3aWxsIGNvbm5lY3QgdG8gdGhlIGNhbWVyYSBpbiBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OnN0YXJ0UmVjb3JkaW5nLgogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIHN0YXR1c190IGVycjsKICAgICBpZiAobU51bUlucHV0QnVmZmVycyA+IDApIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNhbWVyYS0+c2VuZENvbW1hbmQoCisgICAgICAgIGVyciA9IG1DYW1lcmEtPnNlbmRDb21tYW5kKAogICAgICAgICAgICAgQ0FNRVJBX0NNRF9TRVRfVklERU9fQlVGRkVSX0NPVU5ULCBtTnVtSW5wdXRCdWZmZXJzLCAwKTsKIAogICAgICAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBmb3IgQ2FtZXJhSEFMMSBjbGllbnRzOyB0aHVzIHRoZSBmYWlsdXJlIGlzCkBAIC01OTUsMTcgKzYwNSwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZXJyID0gT0s7CiAgICAgaWYgKG1DYW1lcmFGbGFncyAmIEZMQUdTX0hPVF9DQU1FUkEpIHsKICAgICAgICAgbUNhbWVyYS0+dW5sb2NrKCk7CiAgICAgICAgIG1DYW1lcmEuY2xlYXIoKTsKLSAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLAotICAgICAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LT5zdGFydFJlY29yZGluZyhuZXcgUHJveHlMaXN0ZW5lcih0aGlzKSkpOworICAgICAgICBpZiAoKGVyciA9IG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+c3RhcnRSZWNvcmRpbmcoCisgICAgICAgICAgICAgICAgbmV3IFByb3h5TGlzdGVuZXIodGhpcykpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCByZWNvcmRpbmcsIHJlY2VpdmVkIGVycm9yOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihuZXcgQ2FtZXJhU291cmNlTGlzdGVuZXIodGhpcykpOwogICAgICAgICBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpOwotICAgICAgICBDSEVDSyhtQ2FtZXJhLT5yZWNvcmRpbmdFbmFibGVkKCkpOworICAgICAgICBpZiAoIW1DYW1lcmEtPnJlY29yZGluZ0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgcmVjb3JkaW5nIik7CisgICAgICAgIH0KICAgICB9CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgewpAQCAtNjM3LDEwICs2NTUsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gc3RhcnRDYW1lcmFSZWNvcmRpbmcoKSkgPT0gT0spIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIH0KIAotICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIGVycjsKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2U6OnN0b3BDYW1lcmFSZWNvcmRpbmcoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcAppbmRleCA1OTFkYWFjLi4xNWJhOTY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKQEAgLTg1LDcgKzg1LDggQEAKICAgICBtVmlkZW9XaWR0aCA9IHZpZGVvU2l6ZS53aWR0aDsKICAgICBtVmlkZW9IZWlnaHQgPSB2aWRlb1NpemUuaGVpZ2h0OwogCi0gICAgaWYgKCF0cnlTZXR0aW5nVmlkZW9TaXplKHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCkpIHsKKyAgICBpZiAoT0sgPT0gbUluaXRDaGVjayAmJiAhdHJ5U2V0dGluZ1ZpZGVvU2l6ZSh2aWRlb1NpemUud2lkdGgsIHZpZGVvU2l6ZS5oZWlnaHQpKSB7CisgICAgICAgIHJlbGVhc2VDYW1lcmEoKTsKICAgICAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCmluZGV4IDk3OTg3ZTIuLjZlMGYzN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCkBAIC0xNiwxMCArMTYsNiBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9BTVJFeHRyYWN0b3IuaCIKIAotI2lmIENIUk9NSVVNX0FWQUlMQUJMRQotI2luY2x1ZGUgImluY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmgiCi0jZW5kaWYKLQogI2luY2x1ZGUgImluY2x1ZGUvQUFDRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL0ZMQUNFeHRyYWN0b3IuaCIKQEAgLTM1LDEwICszMSwxNCBAQAogCiAjaW5jbHVkZSAibWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgpAQCAtMTgwLDcgKzE4MCw5IEBACiAKIC8vIHN0YXRpYwogc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgYm9vbCBpc1dpZGV2aW5lID0gIXN0cm5jYXNlY21wKCJ3aWRldmluZTovLyIsIHVyaSwgMTEpOwogCiAgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlOwpAQCAtMTg5LDcgKzE5MSw3IEBACiAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpCiAgICAgICAgICAgICB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJpLCA4KQogICAgICAgICAgICAgfHwgaXNXaWRldmluZSkgewotICAgICAgICBzcDxIVFRQQmFzZT4gaHR0cFNvdXJjZSA9IEhUVFBCYXNlOjpDcmVhdGUoKTsKKyAgICAgICAgc3A8SFRUUEJhc2U+IGh0dHBTb3VyY2UgPSBuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSk7CiAKICAgICAgICAgU3RyaW5nOCB0bXA7CiAgICAgICAgIGlmIChpc1dpZGV2aW5lKSB7CkBAIC0yMjAsMTEgKzIyMiw4IEBACiAgICAgICAgICAgICAvLyBpbiB0aGUgd2lkZXZpbmU6Ly8gY2FzZS4KICAgICAgICAgICAgIHNvdXJjZSA9IGh0dHBTb3VyY2U7CiAgICAgICAgIH0KLQotIyBpZiBDSFJPTUlVTV9BVkFJTEFCTEUKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiZGF0YToiLCB1cmksIDUpKSB7Ci0gICAgICAgIHNvdXJjZSA9IGNyZWF0ZURhdGFVcmlTb3VyY2UodXJpKTsKLSNlbmRpZgorICAgICAgICBzb3VyY2UgPSBEYXRhVVJJU291cmNlOjpDcmVhdGUodXJpKTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBBc3N1bWUgaXQncyBhIGZpbGVuYW1lLgogICAgICAgICBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzdiYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5jcHAKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3NwPERhdGFVUklTb3VyY2U+IERhdGFVUklTb3VyY2U6OkNyZWF0ZShjb25zdCBjaGFyICp1cmkpIHsKKyAgICBpZiAoc3RybmNhc2VjbXAoImRhdGE6IiwgdXJpLCA1KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjaGFyICpjb21tYVBvcyA9IHN0cnJjaHIodXJpLCAnLCcpOworCisgICAgaWYgKGNvbW1hUG9zID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworCisgICAgQVN0cmluZyB0bXAoJnVyaVs1XSwgY29tbWFQb3MgLSAmdXJpWzVdKTsKKworICAgIGlmICh0bXAuZW5kc1dpdGgoIjtiYXNlNjQiKSkgeworICAgICAgICBBU3RyaW5nIGVuY29kZWQoY29tbWFQb3MgKyAxKTsKKworICAgICAgICAvLyBTdHJpcCBDUiBhbmQgTEYuLi4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IGVuY29kZWQuc2l6ZSgpOyBpLS0gPiAwOykgeworICAgICAgICAgICAgaWYgKGVuY29kZWQuY19zdHIoKVtpXSA9PSAnXHInIHx8IGVuY29kZWQuY19zdHIoKVtpXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgZW5jb2RlZC5lcmFzZShpLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlciA9IGRlY29kZUJhc2U2NChlbmNvZGVkKTsKKworICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgY29udGVudCBmb3VuZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyNpZiAwCisgICAgICAgIHNpemVfdCBkYXRhTGVuID0gc3RybGVuKHVyaSkgLSB0bXAuc2l6ZSgpIC0gNjsKKyAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoZGF0YUxlbik7CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgY29tbWFQb3MgKyAxLCBkYXRhTGVuKTsKKworICAgICAgICAvLyB1bmVzY2FwZQorI2Vsc2UKKyAgICAgICAgLy8gTWVkaWFQbGF5ZXIgZG9lc24ndCBjYXJlIGZvciB0aGlzIHJpZ2h0IG5vdyBhcyB3ZSBkb24ndAorICAgICAgICAvLyBwbGF5IGFueSB0ZXh0LWJhc2VkIG1lZGlhLgorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IGNoYXJzZXQgb3IgbWltZSB0eXBlLgorCisgICAgcmV0dXJuIG5ldyBEYXRhVVJJU291cmNlKGJ1ZmZlcik7Cit9CisKK0RhdGFVUklTb3VyY2U6OkRhdGFVUklTb3VyY2UoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICA6IG1CdWZmZXIoYnVmZmVyKSB7Cit9CisKK0RhdGFVUklTb3VyY2U6On5EYXRhVVJJU291cmNlKCkgeworfQorCitzdGF0dXNfdCBEYXRhVVJJU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IERhdGFVUklTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAob2Zmc2V0ID49IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplX3QgY29weSA9IG1CdWZmZXItPnNpemUoKSAtIG9mZnNldDsKKyAgICBpZiAoY29weSA+IHNpemUpIHsKKyAgICAgICAgY29weSA9IHNpemU7CisgICAgfQorCisgICAgbWVtY3B5KGRhdGEsIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgY29weSk7CisKKyAgICByZXR1cm4gY29weTsKK30KKworc3RhdHVzX3QgRGF0YVVSSVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgKnNpemUgPSBtQnVmZmVyLT5zaXplKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAppbmRleCA1ZmE0YjZmLi5jYTY4YzNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCkBAIC0yMCwxMCArMjAsNiBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogCi0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0jaW5jbHVkZSAiaW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaCIKLSNlbmRpZgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KIApAQCAtNDAsMzQgKzM2LDcgQEAKICAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMoMCksCiAgICAgICBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMoMCksCiAgICAgICBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHMoMCksCi0gICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyg1MDAwKSwKLSAgICAgIG1VSURWYWxpZChmYWxzZSksCi0gICAgICBtVUlEKDApIHsKLX0KLQotLy8gc3RhdGljCi1zcDxIVFRQQmFzZT4gSFRUUEJhc2U6OkNyZWF0ZSh1aW50MzJfdCBmbGFncykgewotI2lmIENIUk9NSVVNX0FWQUlMQUJMRQotICAgICAgICBIVFRQQmFzZSAqZGF0YVNvdXJjZSA9IGNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UoZmxhZ3MpOwotICAgICAgICBpZiAoZGF0YVNvdXJjZSkgewotICAgICAgICAgICByZXR1cm4gZGF0YVNvdXJjZTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgewotICAgICAgICBUUkVTUEFTUygpOwotCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBIVFRQQmFzZTo6VXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotI2lmIENIUk9NSVVNX0FWQUlMQUJMRQotICAgIHJldHVybiBVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci0jZWxzZQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSNlbmRpZgorICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMoNTAwMCkgewogfQogCiB2b2lkIEhUVFBCYXNlOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudCgKQEAgLTEzNSwyMSArMTA0LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgSFRUUEJhc2U6OnNldFVJRCh1aWRfdCB1aWQpIHsKLSAgICBtVUlEVmFsaWQgPSB0cnVlOwotICAgIG1VSUQgPSB1aWQ7Ci19Ci0KLWJvb2wgSFRUUEJhc2U6OmdldFVJRCh1aWRfdCAqdWlkKSBjb25zdCB7Ci0gICAgaWYgKCFtVUlEVmFsaWQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp1aWQgPSBtVUlEOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIC8vIHN0YXRpYwogdm9pZCBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZykgewogICAgIGludCByZXMgPSBxdGFndWlkX3RhZ1NvY2tldChzb2NrZmQsIGtUYWcsIHVpZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKaW5kZXggMzYyY2Q2Yi4uMmEzZmEwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtNDg4LDEyICs0ODgsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHVpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOwotICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ3MnLCAnaScsICdkJywgJ3gnKSkgewotICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHNpZHggYm94IHRvbwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgeworICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgewogICAgICAgICAgICAgLy8gc3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2VnbWVudAogICAgICAgICAgICAgbU1vb2ZPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKSkgeworICAgICAgICAgICAgLy8ga2VlcCBwYXJzaW5nIHVudGlsIHdlIGdldCB0byB0aGUgZGF0YQorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtOTEzLDYgKzkxMyw4IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnbCcsICdzJywgJ3QnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICAvLyBTZWUgMTQ0OTYtMTIgOC42LjYKICAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbjsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgMSkgPCAxKSB7CkBAIC05NzUsMTIgKzk3NywxMyBAQAogICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmdzYW1wbGVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3InLCAnbScsICdhJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgdWludDMyX3Qgb3JpZ2luYWxfZm91cmNjOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZvcmlnaW5hbF9mb3VyY2MsIDQpIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKQEAgLTk5NCwxMiArOTk3LDEzIEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygndCcsICdlJywgJ24nLCAnYycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMzIpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQpAQCAtMTA0NCwyMyArMTA0OCwyNSBAQAogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgZGVmYXVsdElWU2l6ZSk7CiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlDcnlwdG9LZXksICd0ZW5jJywgZGVmYXVsdEtleUlkLCAxNik7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2snLCAnaCcsICdkJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrSGVhZGVyKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAncycsICdzJywgJ2gnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBQc3NoSW5mbyBwc3NoOwogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDQsICZwc3NoLnV1aWQsIDE2KSA8IDE2KSB7CkBAIC0xMDg2LDEyICsxMDkyLDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUHNzaC5wdXNoX2JhY2socHNzaCk7CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xMTcyLDcgKzExNzksNiBAQAogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZygKICAgICAgICAgICAgICAgICAgICAga0tleU1lZGlhTGFuZ3VhZ2UsIGxhbmdfY29kZSk7CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTEzMzksMTEgKzEzNDUsMTIgQEAKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0Q2h1bmtPZmZzZXRQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTM1MywxMSArMTM2MCwxMiBAQAogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRTYW1wbGVUb0NodW5rUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CiAKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTEzNjgsNiArMTM3Niw4IEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVNpemVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KQEAgLTE0MDgsNyArMTQxOCw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAogICAgICAgICAgICAgLy8gTk9URTogc2V0dGluZyBhbm90aGVyIHBpZWNlIG9mIG1ldGFkYXRhIGludmFsaWRhdGVzIGFueSBwb2ludGVycyAoc3VjaCBhcyB0aGUKICAgICAgICAgICAgIC8vIG1pbWV0eXBlKSBwcmV2aW91c2x5IG9idGFpbmVkLCBzbyBkb24ndCBjYWNoZSB0aGVtLgpAQCAtMTQzMiw2ICsxNDQxLDggQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3QnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFRpbWVUb1NhbXBsZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwpAQCAtMTQ0MCwxMiArMTQ1MSwxMyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAndCcsICd0JywgJ3MnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRDb21wb3NpdGlvblRpbWVUb1NhbXBsZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwpAQCAtMTQ1NCwxMiArMTQ2NiwxMyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ3MnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRTeW5jU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDY4LDEzICsxNDgxLDE0IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBAeHl6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdceEE5JywgJ3gnLCAneScsICd6Jyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgLy8gQmVzdCBjYXNlIHRoZSB0b3RhbCBkYXRhIGxlbmd0aCBpbnNpZGUgIkB4eXoiIGJveAogICAgICAgICAgICAgLy8gd291bGQgYmUgOCwgZm9yIGluc3RhbmNlICJAeHl6IiArICJceDAwXHgwNFx4MTVceGM3IiArICIwKzAvIiwKICAgICAgICAgICAgIC8vIHdoZXJlICJceDAwXHgwNCIgaXMgdGhlIHRleHQgc3RyaW5nIGxlbmd0aCB3aXRoIHZhbHVlID0gNCwKQEAgLTE1MDMsMTIgKzE1MTcsMTMgQEAKIAogICAgICAgICAgICAgYnVmZmVyW2xvY2F0aW9uX2xlbmd0aF0gPSAnXDAnOwogICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TG9jYXRpb24sIGJ1ZmZlcik7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ3MnLCAnZCcsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQpAQCAtMTU0NiwxMiArMTU2MSwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnQycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KApAQCAtMTU2MiwxMiArMTU3OCwxMiBAQAogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YSgKICAgICAgICAgICAgICAgICAgICAga0tleUFWQ0MsIGtUeXBlQVZDQywgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnMicsICc2JywgJzMnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIGQyNjMgY29udGFpbnMgYSBmaXhlZCA3IGJ5dGVzIHBhcnQ6CiAgICAgICAgICAgICAgKiAgIHZlbmRvciAtIDQgYnl0ZXMKQEAgLTE1OTMsNyArMTYwOSw2IEBACiAKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpOwogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNjAxLDExICsxNjE2LDEzIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzRdOwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgNCkgPCA0KSB7CisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIApAQCAtMTYzOSw2ICsxNjU2LDggQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ24nLCAnYScsICdtJywgJ2UnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnYScsICd0JywgJ2EnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID09IDYgJiYgdW5kZXJNZXRhRGF0YVBhdGgobVBhdGgpKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VJVHVuZXNNZXRhRGF0YShkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKIApAQCAtMTY0NywxMiArMTY2NiwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnbScsICd2JywgJ2gnLCAnZCcpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAyNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xNjgwLDcgKzE3MDAsNiBAQAogCiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlEYXRlLCBzLnN0cmluZygpKTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTcwMSw2ICsxNzIwLDggQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdkJywgJ2wnLCAncicpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcjsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKyA4LCAmYnVmZmVyLCA0KSA8IDQpIHsKQEAgLTE3MTUsNyArMTczNiw2IEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE3NDAsNiArMTc2MCw4IEBACiAgICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwogICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKKyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHJlYWQgcG9pbnRlciBzbyB3ZSBkb24ndCBlbmQgdXAgcmVhZGluZyB0aGlzIGFnYWluCisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIApAQCAtMTc1NCw2ICsxNzc2LDggQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChtRmlsZU1ldGFEYXRhICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiY2h1bmtfZGF0YV9zaXplID0gJWxsZCBhbmQgZGF0YV9vZmZzZXQgPSAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOwpAQCAtMTc2OCw3ICsxNzkyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTc3OSwyNSArMTgwMiwyNyBAQAogICAgICAgICBjYXNlIEZPVVJDQygnYScsICdsJywgJ2InLCAnbScpOgogICAgICAgICBjYXNlIEZPVVJDQygneScsICdyJywgJ3InLCAnYycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlM0dQUE1ldGFEYXRhKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUsIGRlcHRoKTsKIAogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ0knLCAnRCcsICczJywgJzInKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNikgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHBhcnNlSUQzdjJNZXRhRGF0YShkYXRhX29mZnNldCArIDYpOwogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xOTIxLDkgKzE5NDYsMTAgQEAKICAgICAgICAgICAgIEFMT0dXKCJzdWItc2lkeCBib3hlcyBub3Qgc3VwcG9ydGVkIHlldCIpOwogICAgICAgICB9CiAgICAgICAgIGJvb2wgc2FwID0gZDMgJiAweDgwMDAwMDAwOwotICAgICAgICBib29sIHNhcHR5cGUgPSBkMyA+PiAyODsKLSAgICAgICAgaWYgKCFzYXAgfHwgc2FwdHlwZSA+IDIpIHsKLSAgICAgICAgICAgIEFMT0dXKCJub3QgYSBzdHJlYW0gYWNjZXNzIHBvaW50LCBvciB1bnN1cHBvcnRlZCB0eXBlIik7CisgICAgICAgIHVpbnQzMl90IHNhcHR5cGUgPSAoZDMgPj4gMjgpICYgNzsKKyAgICAgICAgaWYgKCFzYXAgfHwgKHNhcHR5cGUgIT0gMSAmJiBzYXB0eXBlICE9IDIpKSB7CisgICAgICAgICAgICAvLyB0eXBlIDEgYW5kIDIgYXJlIHN5bmMgc2FtcGxlcworICAgICAgICAgICAgQUxPR1coIm5vdCBhIHN0cmVhbSBhY2Nlc3MgcG9pbnQsIG9yIHVuc3VwcG9ydGVkIHR5cGU6ICUwOHgiLCBkMyk7CiAgICAgICAgIH0KICAgICAgICAgdG90YWxfZHVyYXRpb24gKz0gZDI7CiAgICAgICAgIG9mZnNldCArPSAxMjsKQEAgLTI0NDIsNiArMjQ2OCw1OCBAQAogICAgIHJldHVybiBPSzsKIH0KIAordHlwZWRlZiBlbnVtIHsKKyAgICAvL0FPVF9OT05FICAgICAgICAgICAgID0gLTEsCisgICAgLy9BT1RfTlVMTF9PQkpFQ1QgICAgICA9IDAsCisgICAgLy9BT1RfQUFDX01BSU4gICAgICAgICA9IDEsIC8qKjwgTWFpbiBwcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBBT1RfQUFDX0xDICAgICAgICAgICA9IDIsICAgLyoqPCBMb3cgQ29tcGxleGl0eSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0FBQ19TU1IgICAgICAgICAgPSAzLAorICAgIC8vQU9UX0FBQ19MVFAgICAgICAgICAgPSA0LAorICAgIEFPVF9TQlIgICAgICAgICAgICAgID0gNSwKKyAgICAvL0FPVF9BQUNfU0NBTCAgICAgICAgID0gNiwKKyAgICAvL0FPVF9UV0lOX1ZRICAgICAgICAgID0gNywKKyAgICAvL0FPVF9DRUxQICAgICAgICAgICAgID0gOCwKKyAgICAvL0FPVF9IVlhDICAgICAgICAgICAgID0gOSwKKyAgICAvL0FPVF9SU1ZEXzEwICAgICAgICAgID0gMTAsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzExICAgICAgICAgID0gMTEsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9UVFNJICAgICAgICAgICAgID0gMTIsIC8qKjwgVFRTSSBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9NQUlOX1NZTlRIICAgICAgID0gMTMsIC8qKjwgTWFpbiBTeW50aGV0aWMgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9XQVZfVEFCX1NZTlRIICAgID0gMTQsIC8qKjwgV2F2ZXRhYmxlIFN5bnRoZXNpcyBvYmplY3QgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9HRU5fTUlESSAgICAgICAgID0gMTUsIC8qKjwgR2VuZXJhbCBNSURJIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9BTEdfU1lOVEhfQVVEX0ZYID0gMTYsIC8qKjwgQWxnb3JpdGhtaWMgU3ludGhlc2lzIGFuZCBBdWRpbyBGWCBvYmplY3QgKi8KKyAgICBBT1RfRVJfQUFDX0xDICAgICAgICA9IDE3LCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTG93IENvbXBsZXhpdHkgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzE4ICAgICAgICAgID0gMTgsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9BQUNfTFRQICAgICAgID0gMTksIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTFRQIG9iamVjdCAgICAgICAgKi8KKyAgICBBT1RfRVJfQUFDX1NDQUwgICAgICA9IDIwLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgU2NhbGFibGUgb2JqZWN0ICAgKi8KKyAgICAvL0FPVF9FUl9UV0lOX1ZRICAgICAgID0gMjEsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBUd2luVlEgb2JqZWN0ICAgICAgICAgKi8KKyAgICBBT1RfRVJfQlNBQyAgICAgICAgICA9IDIyLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBCU0FDIG9iamVjdCAgICAgICAgICAgKi8KKyAgICBBT1RfRVJfQUFDX0xEICAgICAgICA9IDIzLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTG93RGVsYXkgb2JqZWN0ICAgKi8KKyAgICAvL0FPVF9FUl9DRUxQICAgICAgICAgID0gMjQsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBDRUxQIG9iamVjdCAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9IVlhDICAgICAgICAgID0gMjUsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBIVlhDIG9iamVjdCAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9ISUxOICAgICAgICAgID0gMjYsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBISUxOIG9iamVjdCAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9QQVJBICAgICAgICAgID0gMjcsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBQYXJhbWV0cmljIG9iamVjdCAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzI4ICAgICAgICAgID0gMjgsIC8qKjwgbWlnaHQgYmVjb21lIFNTQyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBBT1RfUFMgICAgICAgICAgICAgICA9IDI5LCAgIC8qKjwgUFMsIFBhcmFtZXRyaWMgU3RlcmVvIChpbmNsdWRlcyBTQlIpICAgICAgKi8KKyAgICAvL0FPVF9NUEVHUyAgICAgICAgICAgID0gMzAsIC8qKjwgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIEFPVF9FU0NBUEUgICAgICAgICAgID0gMzEsICAgLyoqPCBTaWduYWwgQU9UIHVzZXMgbW9yZSB0aGFuIDUgYml0cyAgICAgICAgICAqLworCisgICAgLy9BT1RfTVAzT05NUDRfTDEgICAgICA9IDMyLCAvKio8IE1QRUctTGF5ZXIxIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfTVAzT05NUDRfTDIgICAgICA9IDMzLCAvKio8IE1QRUctTGF5ZXIyIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfTVAzT05NUDRfTDMgICAgICA9IDM0LCAvKio8IE1QRUctTGF5ZXIzIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfUlNWRF8zNSAgICAgICAgICA9IDM1LCAvKio8IG1pZ2h0IGJlY29tZSBEU1QgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfUlNWRF8zNiAgICAgICAgICA9IDM2LCAvKio8IG1pZ2h0IGJlY29tZSBBTFMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfQUFDX1NMUyAgICAgICAgICA9IDM3LCAvKio8IEFBQyArIFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfU0xTICAgICAgICAgICAgICA9IDM4LCAvKio8IFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfQUFDX0VMRCAgICAgICA9IDM5LCAvKio8IEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAvL0FPVF9VU0FDICAgICAgICAgICAgID0gNDIsIC8qKjwgVVNBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9TQU9DICAgICAgICAgICAgID0gNDMsIC8qKjwgU0FPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9MRF9NUEVHUyAgICAgICAgID0gNDQsIC8qKjwgTG93IERlbGF5IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8vQU9UX1JTVkQ1MCAgICAgICAgICAgPSA1MCwgIC8qKjwgSW50ZXJpbSBBT1QgZm9yIFJzdmQ1MCAgICAgICAgICAgICAgICAgICAqLworfSBBVURJT19PQkpFQ1RfVFlQRTsKKwogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnVwZGF0ZUF1ZGlvVHJhY2tJbmZvRnJvbUVTRFNfTVBFRzRBdWRpbygKICAgICAgICAgY29uc3Qgdm9pZCAqZXNkc19kYXRhLCBzaXplX3QgZXNkc19zaXplKSB7CiAgICAgRVNEUyBlc2RzKGVzZHNfZGF0YSwgZXNkc19zaXplKTsKQEAgLTI1MjQsNyArMjYwMiw3IEBACiAgICAgICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2ZyZXFJbmRleF07CiAgICAgfQogCi0gICAgaWYgKG9iamVjdFR5cGUgPT0gNSB8fCBvYmplY3RUeXBlID09IDI5KSB7IC8vIFNCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMworICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMwogICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGU7CiAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTUpIHsKQEAgLTI1NDIsNiArMjYyMCwxMTEgQEAKICAgICAgICAgLy8gICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7CiAgICAgfQogCisgICAgc3dpdGNoIChudW1DaGFubmVscykgeworICAgICAgICAvLyB2YWx1ZXMgZGVmaW5lZCBpbiAxNDQ5Ni0zXzIwMDkgYW1lbmRtZW50LTQgVGFibGUgMS4xOSAtIENoYW5uZWwgQ29uZmlndXJhdGlvbgorICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMTovLyBGQworICAgICAgICBjYXNlIDI6Ly8gRkwgRlIKKyAgICAgICAgY2FzZSAzOi8vIEZDLCBGTCBGUgorICAgICAgICBjYXNlIDQ6Ly8gRkMsIEZMIEZSLCBSQworICAgICAgICBjYXNlIDU6Ly8gRkMsIEZMIEZSLCBTTCBTUgorICAgICAgICBjYXNlIDY6Ly8gRkMsIEZMIEZSLCBTTCBTUiwgTEZFCisgICAgICAgICAgICAvL251bUNoYW5uZWxzIGFscmVhZHkgY29udGFpbnMgdGhlIHJpZ2h0IHZhbHVlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMTovLyBGQywgRkwgRlIsIFNMIFNSLCBSQywgTEZFCisgICAgICAgICAgICBudW1DaGFubmVscyA9IDc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OiAvLyBGQywgRkNMIEZDUiwgRkwgRlIsIFNMIFNSLCBMRkUKKyAgICAgICAgY2FzZSAxMjovLyBGQywgRkwgIEZSLCAgU0wgU1IsIFJMIFJSLCBMRkUKKyAgICAgICAgY2FzZSAxNDovLyBGQywgRkwgIEZSLCAgU0wgU1IsIExGRSwgRkhMIEZIUgorICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgeworICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGV4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgIG9iamVjdFR5cGUgPSBici5nZXRCaXRzKDUpOworCisgICAgICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfRVNDQVBFKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9IDMyICsgYnIuZ2V0Qml0cyg2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfQUFDX0xDIHx8IG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MQyB8fAorICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfU0NBTCB8fAorICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnID0gYnIuZ2V0Qml0cygxKTsKKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZXBlbmRzT25Db3JlQ29kZXIgPSBici5nZXRCaXRzKDEpOworCisgICAgICAgICAgICBpZiAoZGVwZW5kc09uQ29yZUNvZGVyICkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgPSBici5nZXRCaXRzKDE0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBleHRlbnNpb25GbGFnID0gYnIuZ2V0Qml0cygxKTsKKworICAgICAgICAgICAgaWYgKG51bUNoYW5uZWxzID09IDAgKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsc0VmZmVjdGl2ZU51bSA9IDA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsc051bSA9IDA7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBFbGVtZW50SW5zdGFuY2VUYWcgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHJvZmlsZSA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVNpZGVDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtQmFja0NoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1MZmVDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtQXNzb2NEYXRhRWxlbWVudHMgPSBici5nZXRCaXRzKDMpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtVmFsaWRDY0VsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKKworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICBpZiAoTW9ub01peGRvd25QcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93bkVsZW1lbnROdW1iZXIgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIGlmIChTdGVyZW9NaXhkb3duUHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgaWYgKE1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleCA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHNldWRvU3Vycm91bmRFbmFibGUgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRUYWdTZWxlY3QgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBGcm9udEVsZW1lbnRJc0NwZSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2lkZUVsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2lkZUVsZW1lbnRUYWdTZWxlY3QgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBTaWRlRWxlbWVudElzQ3BlID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudFRhZ1NlbGVjdCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEJhY2tFbGVtZW50SXNDcGUgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSBjaGFubmVsc051bTsKKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzTnVtID0gJWQiLCBjaGFubmVsc051bSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gJWQiLCBjaGFubmVsc0VmZmVjdGl2ZU51bSk7CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBjaGFubmVsc051bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChudW1DaGFubmVscyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CkBAIC0yNzQyLDkgKzI5MjUsMjAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgewotICAgICAgICAgICAgICAgIC8vICpvZmZzZXQgcG9pbnRzIHRvIHRoZSBtZGF0IGJveCBmb2xsb3dpbmcgdGhpcyBtb29mCi0gICAgICAgICAgICAgICAgcGFyc2VDaHVuayhvZmZzZXQpOyAvLyBkb2Vzbid0IGFjdHVhbGx5IHBhcnNlIGl0LCBqdXN0IHVwZGF0ZXMgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgbU5leHRNb29mT2Zmc2V0ID0gKm9mZnNldDsKKyAgICAgICAgICAgICAgICAvLyAqb2Zmc2V0IHBvaW50cyB0byB0aGUgYm94IGZvbGxvd2luZyB0aGlzIG1vb2YuIEZpbmQgdGhlIG5leHQgbW9vZiBmcm9tIHRoZXJlLgorCisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUgPSBudG9obChoZHJbMF0pOworICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0TW9vZk9mZnNldCA9ICpvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM1NDksNyArMzc0Myw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgU2lkeEVudHJ5ICpzZSA9ICZtU2VnbWVudHNbaV07CiAgICAgICAgICAgICAgICAgaWYgKHRvdGFsVGltZSArIHNlLT5tRHVyYXRpb25VcyA+IHNlZWtUaW1lVXMpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCB0aW1lIGlzIHNvbWV3aGVyZSBpbiB0aGlzIHNlZ21lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQykgfHwKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQyAmJiBzZWVrVGltZVVzID4gdG90YWxUaW1lKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vla1RpbWVVcyAtIHRvdGFsVGltZSkgPiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzIC0gc2Vla1RpbWVVcykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgbmV4dCBzeW5jLCBvciBjbG9zZXN0IHN5bmMgYW5kIGl0IHdhcyBjbG9zZXIgdG8gdGhlIGVuZCBvZgpAQCAtMzU2MiwxMSArMzc1NiwxOSBAQAogICAgICAgICAgICAgICAgIHRvdGFsVGltZSArPSBzZS0+bUR1cmF0aW9uVXM7CiAgICAgICAgICAgICAgICAgdG90YWxPZmZzZXQgKz0gc2UtPm1TaXplOwogICAgICAgICAgICAgfQotICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSB0b3RhbE9mZnNldDsKLSAgICAgICAgbUN1cnJlbnRTYW1wbGVzLmNsZWFyKCk7Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwotICAgICAgICBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7Ci0gICAgICAgIG1DdXJyZW50VGltZSA9IHRvdGFsVGltZSAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwbGw7CisgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSB0b3RhbE9mZnNldDsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CisgICAgICAgICAgICBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7CisgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2l0aG91dCBzaWR4IGJveGVzLCB3ZSBjYW4gb25seSBzZWVrIHRvIDAKKyAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworICAgICAgICAgICAgb2ZmNjRfdCB0bXAgPSBtQ3VycmVudE1vb2ZPZmZzZXQ7CisgICAgICAgICAgICBwYXJzZUNodW5rKCZ0bXApOworICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gMDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKQEAgLTM1NzgsNyArMzc4MCw3IEBACiAgICAgfQogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwotICAgIHNpemVfdCBzaXplOworICAgIHNpemVfdCBzaXplID0gMDsKICAgICB1aW50MzJfdCBjdHMgPSAwOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlID0gZmFsc2U7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKQEAgLTM1ODYsMTYgKzM3ODgsMTggQEAKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAogICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQKLSAgICAgICAgICAgIFNhbXBsZSBsYXN0U2FtcGxlID0gbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlcy5zaXplKCkgLSAxXTsKLSAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7IC8vIGxhc3RTYW1wbGUub2Zmc2V0ICsgbGFzdFNhbXBsZS5zaXplOworICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IGZyYWdtZW50IGlmIHRoZXJlIGlzIG9uZQorICAgICAgICAgICAgaWYgKG1OZXh0TW9vZk9mZnNldCA8PSBtQ3VycmVudE1vb2ZPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7CiAgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSBuZXh0TW9vZjsKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOwogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAgICAgICAgICAgICBwYXJzZUNodW5rKCZuZXh0TW9vZik7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCmluZGV4IDU4YTQ0ODcuLjI0ZTUzYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKQEAgLTQxLDYgKzQxLDEyIEBACiAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAorI2RlZmluZSBXQVJOX1VOTEVTUyhjb25kaXRpb24sIG1lc3NhZ2UsIC4uLikgXAorKCAoQ09ORElUSU9OKGNvbmRpdGlvbikpID8gZmFsc2UgOiAoeyBcCisgICAgQUxPR1coIkNvbmRpdGlvbiAlcyBmYWlsZWQgIiAgbWVzc2FnZSwgI2NvbmRpdGlvbiwgIyNfX1ZBX0FSR1NfXyk7IFwKKyAgICB0cnVlOyBcCit9KSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluU3RyZWFtYWJsZUZpbGVTaXplSW5CeXRlcyA9IDUgKiAxMDI0ICogMTAyNDsKQEAgLTk3NSwxMyArOTgxLDE2IEBACiAgICAgaWYgKHBhcmFtICYmIHBhcmFtLT5maW5kSW50MzIoa0tleUZpbGVUeXBlLCAmZmlsZVR5cGUpICYmCiAgICAgICAgIGZpbGVUeXBlICE9IE9VVFBVVF9GT1JNQVRfTVBFR180KSB7CiAgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7Ci0gICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVJbnQzMigwKTsKICAgICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKKyAgICAgICAgd3JpdGVGb3VyY2MoIjNncDQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZUZvdXJjYygibXA0MiIpOworICAgICAgICB3cml0ZUludDMyKDApOworICAgICAgICB3cml0ZUZvdXJjYygiaXNvbSIpOworICAgICAgICB3cml0ZUZvdXJjYygibXA0MiIpOwogICAgIH0KIAotICAgIHdyaXRlSW50MzIoMCk7Ci0gICAgd3JpdGVGb3VyY2MoImlzb20iKTsKLSAgICB3cml0ZUZvdXJjYygiM2dwNCIpOwogICAgIGVuZEJveCgpOwogfQogCkBAIC0xNzYzLDcgKzE3NzIsNyBAQAogfQogCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OnN0b3AoKSB7Ci0gICAgQUxPR0QoIlN0b3BwaW5nICVzIHRyYWNrIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOworICAgIEFMT0dEKCIlcyB0cmFjayBzdG9wcGluZyIsIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iKTsKICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgIEFMT0dFKCJTdG9wKCkgY2FsbGVkIGJ1dCB0cmFjayBpcyBub3Qgc3RhcnRlZCIpOwogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKQEAgLTE3NzQsMTkgKzE3ODMsMTQgQEAKICAgICB9CiAgICAgbURvbmUgPSB0cnVlOwogCisgICAgQUxPR0QoIiVzIHRyYWNrIHNvdXJjZSBzdG9wcGluZyIsIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iKTsKKyAgICBtU291cmNlLT5zdG9wKCk7CisgICAgQUxPR0QoIiVzIHRyYWNrIHNvdXJjZSBzdG9wcGVkIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOworCiAgICAgdm9pZCAqZHVtbXk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7Ci0KICAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CiAKLSAgICBBTE9HRCgiU3RvcHBpbmcgJXMgdHJhY2sgc291cmNlIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOwotICAgIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICBpZiAoZXJyID09IE9LICYmIHN0YXR1cyAhPSBPSyAmJiBzdGF0dXMgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgZXJyID0gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQUxPR0QoIiVzIHRyYWNrIHN0b3BwZWQiLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTIxMDAsNiArMjEwNCw3IEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIGNvbnN0IGNoYXIgKnRyYWNrTmFtZSA9IG1Jc0F1ZGlvID8gIkF1ZGlvIiA6ICJWaWRlbyI7CiAgICAgd2hpbGUgKCFtRG9uZSAmJiAoZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKSkgPT0gT0spIHsKICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0yMTk1LDE1ICsyMjAwLDI3IEBACiAKICAgICAgICAgaWYgKG1SZXN1bWVkKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA9IHRpbWVzdGFtcFVzIC0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICAgICAgQ0hFQ0tfR0UoZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzLCAwbGwpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludDY0X3QgcGF1c2VkRHVyYXRpb25VcyA9IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyAtIG1UcmFja0R1cmF0aW9uVXM7Ci0gICAgICAgICAgICBDSEVDS19HRShwYXVzZWREdXJhdGlvblVzLCBsYXN0RHVyYXRpb25Vcyk7CisgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1MocGF1c2VkRHVyYXRpb25VcyA+PSBsYXN0RHVyYXRpb25VcywgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzICs9IHBhdXNlZER1cmF0aW9uVXMgLSBsYXN0RHVyYXRpb25VczsKICAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0gICAgICAgIENIRUNLX0dFKHRpbWVzdGFtcFVzLCAwbGwpOworICAgICAgICBpZiAoV0FSTl9VTkxFU1ModGltZXN0YW1wVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICghbUlzQXVkaW8pIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb21wb3NpdGlvbiB0aW1lOiB0aW1lc3RhbXBVcwpAQCAtMjIxNSw3ICsyMjMyLDExIEBACiAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CiAgICAgICAgICAgICBjdHRzT2Zmc2V0VGltZVVzID0KICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMgKyBrTWF4Q3R0c09mZnNldFRpbWVVcyAtIGRlY29kaW5nVGltZVVzOwotICAgICAgICAgICAgQ0hFQ0tfR0UoY3R0c09mZnNldFRpbWVVcywgMGxsKTsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhjdHRzT2Zmc2V0VGltZVVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgdGltZXN0YW1wVXMgPSBkZWNvZGluZ1RpbWVVczsKICAgICAgICAgICAgIEFMT0dWKCJkZWNvZGluZyB0aW1lOiAlbGxkIGFuZCBjdHRzIG9mZnNldCB0aW1lOiAlbGxkIiwKICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgY3R0c09mZnNldFRpbWVVcyk7CkBAIC0yMjIzLDcgKzIyNDQsMTEgQEAKICAgICAgICAgICAgIC8vIFVwZGF0ZSBjdHRzIGJveCB0YWJsZSBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgIGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzID0KICAgICAgICAgICAgICAgICAgICAgKGN0dHNPZmZzZXRUaW1lVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMOwotICAgICAgICAgICAgQ0hFQ0tfTEUoY3VyckN0dHNPZmZzZXRUaW1lVGlja3MsIDB4MEZGRkZGRkZGTEwpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzIDw9IDB4MEZGRkZGRkZGTEwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIGZpcnN0IGN0dHMgdGFibGUgZW50cnkgdG8gaGF2ZSBvbmUgc2luZ2xlIGVudHJ5CiAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gZG8gYWRqdXN0bWVudCBmb3IgdGhlIGluaXRpYWwgdHJhY2sgc3RhcnQKQEAgLTIyNjEsOSArMjI4NiwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQ0hFQ0tfR0UodGltZXN0YW1wVXMsIDBsbCk7CisgICAgICAgIGlmIChXQVJOX1VOTEVTUyh0aW1lc3RhbXBVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKICAgICAgICAgQUxPR1YoIiVzIG1lZGlhIHRpbWUgc3RhbXA6ICVsbGQgYW5kIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbiAlbGxkIiwKLSAgICAgICAgICAgICAgICBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIiwgdGltZXN0YW1wVXMsIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgdHJhY2tOYW1lLCB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKICAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbVRyYWNrRHVyYXRpb25VcykgewogICAgICAgICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICB9CkBAIC0yMjc4LDEwICsyMzA3LDI3IEBACiAgICAgICAgICAgICAgICAgKGxhc3RUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOwogICAgICAgICBpZiAoY3VyckR1cmF0aW9uVGlja3MgPCAwbGwpIHsKICAgICAgICAgICAgIEFMT0dFKCJ0aW1lc3RhbXBVcyAlbGxkIDwgbGFzdFRpbWVzdGFtcFVzICVsbGQgZm9yICVzIHRyYWNrIiwKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGxhc3RUaW1lc3RhbXBVcywgdHJhY2tOYW1lKTsKKyAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gaWYgdGhlIGR1cmF0aW9uIGlzIGRpZmZlcmVudCBmb3IgdGhpcyBzYW1wbGUsIHNlZSBpZiBpdCBpcyBjbG9zZSBlbm91Z2ggdG8gdGhlIHByZXZpb3VzCisgICAgICAgIC8vIGR1cmF0aW9uIHRoYXQgd2UgY2FuIGZ1ZGdlIGl0IGFuZCB1c2UgdGhlIHNhbWUgdmFsdWUsIHRvIGF2b2lkIGZpbGxpbmcgdGhlIHN0dHMgdGFibGUKKyAgICAgICAgLy8gd2l0aCBsb3RzIG9mIG5lYXItaWRlbnRpY2FsIGVudHJpZXMuCisgICAgICAgIC8vICJjbG9zZSBlbm91Z2giIGhlcmUgbWVhbnMgdGhhdCB0aGUgY3VycmVudCBkdXJhdGlvbiBuZWVkcyB0byBiZSBhZGp1c3RlZCBieSBsZXNzCisgICAgICAgIC8vIHRoYW4gMC4xIG1pbGxpc2Vjb25kcworICAgICAgICBpZiAobGFzdER1cmF0aW9uVGlja3MgJiYgKGN1cnJEdXJhdGlvblRpY2tzICE9IGxhc3REdXJhdGlvblRpY2tzKSkgeworICAgICAgICAgICAgaW50NjRfdCBkZWx0YVVzID0gKChsYXN0RHVyYXRpb25UaWNrcyAtIGN1cnJEdXJhdGlvblRpY2tzKSAqIDEwMDAwMDBMTAorICAgICAgICAgICAgICAgICAgICArIChtVGltZVNjYWxlIC8gMikpIC8gbVRpbWVTY2FsZTsKKyAgICAgICAgICAgIGlmIChkZWx0YVVzID4gLTEwMCAmJiBkZWx0YVVzIDwgMTAwKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIHByZXZpb3VzIHRpY2tzLCBhbmQgYWRqdXN0IHRpbWVzdGFtcCBhcyBpZiBpdCB3YXMgYWN0dWFsbHkgdGhhdCBudW1iZXIKKyAgICAgICAgICAgICAgICAvLyBvZiB0aWNrcworICAgICAgICAgICAgICAgIGN1cnJEdXJhdGlvblRpY2tzID0gbGFzdER1cmF0aW9uVGlja3M7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMgKz0gZGVsdGFVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIG1TdHN6VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoc2FtcGxlU2l6ZSkpOwogICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPiAyKSB7CiAKQEAgLTIzMDIsNyArMjM0OCw3IEBACiAgICAgICAgICAgICBwcmV2aW91c1NhbXBsZVNpemUgPSBzYW1wbGVTaXplOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCIlcyB0aW1lc3RhbXBVcy9sYXN0VGltZXN0YW1wVXM6ICVsbGQvJWxsZCIsCi0gICAgICAgICAgICAgICAgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIHRpbWVzdGFtcFVzLCBsYXN0VGltZXN0YW1wVXMpOworICAgICAgICAgICAgICAgIHRyYWNrTmFtZSwgdGltZXN0YW1wVXMsIGxhc3RUaW1lc3RhbXBVcyk7CiAgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CiAgICAgICAgIGxhc3REdXJhdGlvblRpY2tzID0gY3VyckR1cmF0aW9uVGlja3M7CiAgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwpAQCAtMjQwNyw3ICsyNDUzLDcgQEAKICAgICBzZW5kVHJhY2tTdW1tYXJ5KGhhc011bHRpcGxlVHJhY2tzKTsKIAogICAgIEFMT0dJKCJSZWNlaXZlZCB0b3RhbC8wLWxlbmd0aCAoJWQvJWQpIGJ1ZmZlcnMgYW5kIGVuY29kZWQgJWQgZnJhbWVzLiAtICVzIiwKLSAgICAgICAgICAgIGNvdW50LCBuWmVyb0xlbmd0aEZyYW1lcywgbVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCksIG1Jc0F1ZGlvPyAiYXVkaW8iOiAidmlkZW8iKTsKKyAgICAgICAgICAgIGNvdW50LCBuWmVyb0xlbmd0aEZyYW1lcywgbVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCksIHRyYWNrTmFtZSk7CiAgICAgaWYgKG1Jc0F1ZGlvKSB7CiAgICAgICAgIEFMT0dJKCJBdWRpbyB0cmFjayBkcmlmdCB0aW1lOiAlbGxkIHVzIiwgbU93bmVyLT5nZXREcmlmdFRpbWVVcygpKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IGZlMjEyOTYuLjYwMWRjY2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0zNTIsNiArMzUyLDIwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRJbnB1dEZvcm1hdChzcDxBTWVzc2FnZT4gKmZvcm1hdCkgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRJbnB1dEZvcm1hdCwgaWQoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIENIRUNLKHJlc3BvbnNlLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OmdldE5hbWUoQVN0cmluZyAqbmFtZSkgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXROYW1lLCBpZCgpKTsKIApAQCAtNTg5LDYgKzYwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTU5OCw2ICs2MTMsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnU3RpY2t5RXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC02NDIsNiArNjU4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgaW5wdXQgc3VyZmFjZSBmbGFnCiAgICAgICAgICAgICAgICAgICAgIG1IYXZlSW5wdXRTdXJmYWNlID0gZmFsc2U7CiAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiaW5wdXQtZm9ybWF0IiwgJm1JbnB1dEZvcm1hdCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJvdXRwdXQtZm9ybWF0IiwgJm1PdXRwdXRGb3JtYXQpKTsKKwogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTMzMCwxNCArMTM0OSwxOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0R2V0SW5wdXRGb3JtYXQ6CiAgICAgICAgIGNhc2Uga1doYXRHZXRPdXRwdXRGb3JtYXQ6CiAgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPQorICAgICAgICAgICAgICAgIChtc2ctPndoYXQoKSA9PSBrV2hhdEdldE91dHB1dEZvcm1hdCA/IG1PdXRwdXRGb3JtYXQgOiBtSW5wdXRGb3JtYXQpOworCiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAoKG1TdGF0ZSAhPSBTVEFSVEVEICYmIG1TdGF0ZSAhPSBGTFVTSElORykKKyAgICAgICAgICAgIGlmICgobVN0YXRlICE9IENPTkZJR1VSRUQgJiYgbVN0YXRlICE9IFNUQVJUSU5HICYmCisgICAgICAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFSVEVEICYmIG1TdGF0ZSAhPSBGTFVTSElORykKICAgICAgICAgICAgICAgICAgICAgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXRGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB8fCBmb3JtYXQgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKIApAQCAtMTM0Niw3ICsxMzcwLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldE1lc3NhZ2UoImZvcm1hdCIsIG1PdXRwdXRGb3JtYXQpOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CiAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCA2MjQ4ZTkwLi44YTQ1MWM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC00OCwyMiArNDgsNDMgQEAKIAogTWVkaWFDb2RlY0xpc3Q6Ok1lZGlhQ29kZWNMaXN0KCkKICAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCkgewotICAgIEZJTEUgKmZpbGUgPSBmb3BlbigiL2V0Yy9tZWRpYV9jb2RlY3MueG1sIiwgInIiKTsKKyAgICBwYXJzZVRvcExldmVsWE1MRmlsZSgiL2V0Yy9tZWRpYV9jb2RlY3MueG1sIik7Cit9CiAKLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJ1bmFibGUgdG8gb3BlbiBtZWRpYSBjb2RlY3MgY29uZmlndXJhdGlvbiB4bWwgZmlsZS4iKTsKK3ZvaWQgTWVkaWFDb2RlY0xpc3Q6OnBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKmNvZGVjc194bWwpIHsKKyAgICAvLyBnZXQgaHJlZl9iYXNlCisgICAgY2hhciAqaHJlZl9iYXNlX2VuZCA9IHN0cnJjaHIoY29kZWNzX3htbCwgJy8nKTsKKyAgICBpZiAoaHJlZl9iYXNlX2VuZCAhPSBOVUxMKSB7CisgICAgICAgIG1IcmVmQmFzZSA9IEFTdHJpbmcoY29kZWNzX3htbCwgaHJlZl9iYXNlX2VuZCAtIGNvZGVjc194bWwgKyAxKTsKKyAgICB9CisKKyAgICBtSW5pdENoZWNrID0gT0s7CisgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKKyAgICBtRGVwdGggPSAwOworCisgICAgcGFyc2VYTUxGaWxlKGNvZGVjc194bWwpOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKKyAgICAgICAgbUNvZGVjUXVpcmtzLmNsZWFyKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBwYXJzZVhNTEZpbGUoZmlsZSk7CisgICAgLy8gVGhlc2UgYXJlIGN1cnJlbnRseSBzdGlsbCB1c2VkIGJ5IHRoZSB2aWRlbyBlZGl0aW5nIHN1aXRlLgorICAgIGFkZE1lZGlhQ29kZWModHJ1ZSAvKiBlbmNvZGVyICovLCAiQUFDRW5jb2RlciIsICJhdWRpby9tcDRhLWxhdG0iKTsKKyAgICBhZGRNZWRpYUNvZGVjKAorICAgICAgICAgICAgZmFsc2UgLyogZW5jb2RlciAqLywgIk9NWC5nb29nbGUucmF3LmRlY29kZXIiLCAiYXVkaW8vcmF3Iik7CiAKLSAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICAvLyBUaGVzZSBhcmUgY3VycmVudGx5IHN0aWxsIHVzZWQgYnkgdGhlIHZpZGVvIGVkaXRpbmcgc3VpdGUuCisgICAgZm9yIChzaXplX3QgaSA9IG1Db2RlY0luZm9zLnNpemUoKTsgaS0tID4gMDspIHsKKyAgICAgICAgQ29kZWNJbmZvICppbmZvID0gJm1Db2RlY0luZm9zLmVkaXRJdGVtQXQoaSk7CiAKLSAgICAgICAgYWRkTWVkaWFDb2RlYyh0cnVlIC8qIGVuY29kZXIgKi8sICJBQUNFbmNvZGVyIiwgImF1ZGlvL21wNGEtbGF0bSIpOworICAgICAgICBpZiAoaW5mby0+bVR5cGVzID09IDApIHsKKyAgICAgICAgICAgIC8vIE5vIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudD8/PworICAgICAgICAgICAgQUxPR1coIkNvbXBvbmVudCAlcyBkb2VzIG5vdCBzdXBwb3J0IGFueSB0eXBlIG9mIG1lZGlhPyIsCisgICAgICAgICAgICAgICAgICBpbmZvLT5tTmFtZS5jX3N0cigpKTsKIAotICAgICAgICBhZGRNZWRpYUNvZGVjKAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIGVuY29kZXIgKi8sICJPTVguZ29vZ2xlLnJhdy5kZWNvZGVyIiwgImF1ZGlvL3JhdyIpOworICAgICAgICAgICAgbUNvZGVjSW5mb3MucmVtb3ZlQXQoaSk7CisgICAgICAgIH0KICAgICB9CiAKICNpZiAwCkBAIC04NCw5ICsxMDUsNiBAQAogICAgICAgICBBTE9HSSgiJXMiLCBsaW5lLmNfc3RyKCkpOwogICAgIH0KICNlbmRpZgotCi0gICAgZmNsb3NlKGZpbGUpOwotICAgIGZpbGUgPSBOVUxMOwogfQogCiBNZWRpYUNvZGVjTGlzdDo6fk1lZGlhQ29kZWNMaXN0KCkgewpAQCAtOTYsMTAgKzExNCwxNCBAQAogICAgIHJldHVybiBtSW5pdENoZWNrOwogfQogCi12b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVhNTEZpbGUoRklMRSAqZmlsZSkgewotICAgIG1Jbml0Q2hlY2sgPSBPSzsKLSAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgIG1EZXB0aCA9IDA7Cit2b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCkgeworICAgIEZJTEUgKmZpbGUgPSBmb3BlbihwYXRoLCAiciIpOworCisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygidW5hYmxlIHRvIG9wZW4gbWVkaWEgY29kZWNzIGNvbmZpZ3VyYXRpb24geG1sIGZpbGU6ICVzIiwgcGF0aCk7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gOjpYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOwogICAgIENIRUNLKHBhcnNlciAhPSBOVUxMKTsKQEAgLTExMiw3ICsxMzQsNyBAQAogICAgIHdoaWxlIChtSW5pdENoZWNrID09IE9LKSB7CiAgICAgICAgIHZvaWQgKmJ1ZmYgPSA6OlhNTF9HZXRCdWZmZXIocGFyc2VyLCBCVUZGX1NJWkUpOwogICAgICAgICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGluIGNhbGwgdG8gWE1MX0dldEJ1ZmZlcigpIik7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGluIGNhbGwgdG8gWE1MX0dldEJ1ZmZlcigpIik7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMjQsOCArMTQ2LDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKDo6WE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgYnl0ZXNfcmVhZCwgYnl0ZXNfcmVhZCA9PSAwKQotICAgICAgICAgICAgICAgICE9IFhNTF9TVEFUVVNfT0spIHsKKyAgICAgICAgWE1MX1N0YXR1cyBzdGF0dXMgPSA6OlhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gWE1MX1NUQVRVU19PSykgeworICAgICAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCAoJXMpIiwgOjpYTUxfRXJyb3JTdHJpbmcoOjpYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTM3LDI1ICsxNjAsOCBAQAogCiAgICAgOjpYTUxfUGFyc2VyRnJlZShwYXJzZXIpOwogCi0gICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1Db2RlY0luZm9zLnNpemUoKTsgaS0tID4gMDspIHsKLSAgICAgICAgICAgIENvZGVjSW5mbyAqaW5mbyA9ICZtQ29kZWNJbmZvcy5lZGl0SXRlbUF0KGkpOwotCi0gICAgICAgICAgICBpZiAoaW5mby0+bVR5cGVzID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBObyB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQ/Pz8KLQotICAgICAgICAgICAgICAgIEFMT0dXKCJDb21wb25lbnQgJXMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgdHlwZSBvZiBtZWRpYT8iLAotICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1OYW1lLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgbUNvZGVjSW5mb3MucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICBtQ29kZWNJbmZvcy5jbGVhcigpOwotICAgICAgICBtQ29kZWNRdWlya3MuY2xlYXIoKTsKLSAgICB9CisgICAgZmNsb3NlKGZpbGUpOworICAgIGZpbGUgPSBOVUxMOwogfQogCiAvLyBzdGF0aWMKQEAgLTE2OSwxMiArMTc1LDYzIEBACiAgICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0xpc3QgKj4obWUpLT5lbmRFbGVtZW50SGFuZGxlcihuYW1lKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIgKmhyZWYgPSBOVUxMOworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgeworICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgImhyZWYiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBocmVmID0gYXR0cnNbaSArIDFdOworICAgICAgICAgICAgKytpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zIGFuZCBmb3Igc2ltcGxpY2l0eSwgZmlsZSBuYW1lcyBjYW4gb25seSBjb250YWluCisgICAgLy8gW2EtekEtWjAtOV8uXSBhbmQgbXVzdCBzdGFydCB3aXRoICBtZWRpYV9jb2RlY3NfIGFuZCBlbmQgd2l0aCAueG1sCisgICAgZm9yIChpID0gMDsgaHJlZltpXSAhPSAnXDAnOyBpKyspIHsKKyAgICAgICAgaWYgKGhyZWZbaV0gPT0gJy4nIHx8IGhyZWZbaV0gPT0gJ18nIHx8CisgICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJzAnICYmIGhyZWZbaV0gPD0gJzknKSB8fAorICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdBJyAmJiBocmVmW2ldIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnYScgJiYgaHJlZltpXSA8PSAneicpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgQVN0cmluZyBmaWxlbmFtZSA9IGhyZWY7CisgICAgaWYgKCFmaWxlbmFtZS5zdGFydHNXaXRoKCJtZWRpYV9jb2RlY3NfIikgfHwKKyAgICAgICAgIWZpbGVuYW1lLmVuZHNXaXRoKCIueG1sIikpIHsKKyAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBmaWxlbmFtZS5pbnNlcnQobUhyZWZCYXNlLCAwKTsKKworICAgIHBhcnNlWE1MRmlsZShmaWxlbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKwogdm9pZCBNZWRpYUNvZGVjTGlzdDo6c3RhcnRFbGVtZW50SGFuZGxlcigKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmICghc3RyY21wKG5hbWUsICJJbmNsdWRlIikpIHsKKyAgICAgICAgbUluaXRDaGVjayA9IGluY2x1ZGVYTUxGaWxlKGF0dHJzKTsKKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKKyAgICAgICAgICAgIG1QYXN0U2VjdGlvbnMucHVzaChtQ3VycmVudFNlY3Rpb24pOworICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9JTkNMVURFOworICAgICAgICB9CisgICAgICAgICsrbURlcHRoOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgc3dpdGNoIChtQ3VycmVudFNlY3Rpb24pIHsKICAgICAgICAgY2FzZSBTRUNUSU9OX1RPUExFVkVMOgogICAgICAgICB7CkBAIC0yNjQsNiArMzIxLDE1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgU0VDVElPTl9JTkNMVURFOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5jbHVkZSIpICYmIG1QYXN0U2VjdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IG1QYXN0U2VjdGlvbnMudG9wKCk7CisgICAgICAgICAgICAgICAgbVBhc3RTZWN0aW9ucy5wb3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0MTczYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCkBAIC0wLDAgKzEsODgxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNTb3VyY2UiCisjZGVmaW5lIERFQlVHX0RSSUZUX1RJTUUgMAorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIHZvaWQgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisgICAgdm9pZCAqbWJ1ZjsKKyAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kUG9pbnRlcigibWVkaWFCdWZmZXIiLCAmbWJ1ZikKKyAgICAgICAgICAgICYmIG1idWYgIT0gTlVMTCkgeworICAgICAgICBBTE9HVigicmVsZWFzaW5nIG1idWYgJXAiLCBtYnVmKTsKKworICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgTlVMTCk7CisKKyAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXIgKj4obWJ1ZiktPnJlbGVhc2UoKTsKKyAgICAgICAgbWJ1ZiA9IE5VTEw7CisgICAgfQorfQorCitzdHJ1Y3QgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBQdWxsZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCisgICAgc3RhdHVzX3Qgc3RhcnQoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisgICAgdm9pZCBzdG9wQXN5bmMoKTsKKworICAgIHZvaWQgcGF1c2UoKTsKKyAgICB2b2lkIHJlc3VtZSgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIH5QdWxsZXIoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRTdGFydCA9ICdtc3RhJywKKyAgICAgICAga1doYXRTdG9wLAorICAgICAgICBrV2hhdFB1bGwsCisgICAgICAgIGtXaGF0UGF1c2UsCisgICAgICAgIGtXaGF0UmVzdW1lLAorICAgIH07CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIGludDMyX3QgbVB1bGxHZW5lcmF0aW9uOworICAgIGJvb2wgbUlzQXVkaW87CisgICAgYm9vbCBtUGF1c2VkOworICAgIGJvb2wgbVJlYWNoZWRFT1M7CisKKyAgICBzdGF0dXNfdCBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHNjaGVkdWxlUHVsbCgpOworICAgIHZvaWQgaGFuZGxlRU9TKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQdWxsZXIpOworfTsKKworTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpQdWxsZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKCkpLAorICAgICAgbVB1bGxHZW5lcmF0aW9uKDApLAorICAgICAgbUlzQXVkaW8oZmFsc2UpLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtUmVhY2hlZEVPUyhmYWxzZSkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKKworICAgIG1Mb29wZXItPnNldE5hbWUoInB1bGxfbG9vcGVyIik7Cit9CisKK01lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6flB1bGxlcigpIHsKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICBtTG9vcGVyLT5zdG9wKCk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6cG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghcmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpzdGFydChjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KSB7CisgICAgQUxPR1YoInB1bGxlciAoJXMpIHN0YXJ0IiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgbUxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sCisgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKKyAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKKyAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CisgICAgbU5vdGlmeSA9IG5vdGlmeTsKKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7CisgICAgbXNnLT5zZXRPYmplY3QoIm1ldGEiLCBtZXRhKTsKKyAgICByZXR1cm4gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihtc2cpOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6c3RvcEFzeW5jKCkgeworICAgIEFMT0dWKCJwdWxsZXIgKCVzKSBzdG9wQXN5bmMiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpwYXVzZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6cmVzdW1lKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6c2NoZWR1bGVQdWxsKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQdWxsLCBpZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVB1bGxHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OmhhbmRsZUVPUygpIHsKKyAgICBpZiAoIW1SZWFjaGVkRU9TKSB7CisgICAgICAgIEFMT0dWKCJwdWxsZXIgKCVzKSBwb3N0aW5nIEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRQb2ludGVyKCJhY2Nlc3NVbml0IiwgTlVMTCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgibWV0YSIsICZvYmopKTsKKworICAgICAgICAgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoc3RhdGljX2Nhc3Q8TWV0YURhdGEgKj4ob2JqLmdldCgpKSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZVB1bGwoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworCisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJzb3VyY2UgKCVzKSBzdG9wcGluZyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgQUxPR1YoInNvdXJjZSAoJXMpIHN0b3BwZWQiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgICAgICsrbVB1bGxHZW5lcmF0aW9uOworCisgICAgICAgICAgICBoYW5kbGVFT1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFB1bGw6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbVB1bGxHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbWJ1Zik7CisKKyAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1idWYgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdHJlYW0gZW5kZWQsIG1idWYgJXAiLCBtYnVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgcmVhZGluZyBzdHJlYW0uIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFuZGxlRU9TKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0UG9pbnRlcigiYWNjZXNzVW5pdCIsIG1idWYpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRQYXVzZToKKyAgICAgICAgeworICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3NwPE1lZGlhQ29kZWNTb3VyY2U+IE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICB1aW50MzJfdCBmbGFncykgeworICAgIHNwPE1lZGlhQ29kZWNTb3VyY2U+IG1lZGlhU291cmNlID0KKyAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjU291cmNlKGxvb3BlciwgZm9ybWF0LCBzb3VyY2UsIGZsYWdzKTsKKworICAgIGlmIChtZWRpYVNvdXJjZS0+aW5pdCgpID09IE9LKSB7CisgICAgICAgIHJldHVybiBtZWRpYVNvdXJjZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhKiBwYXJhbXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIG1zZy0+c2V0T2JqZWN0KCJtZXRhIiwgcGFyYW1zKTsKKyAgICByZXR1cm4gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihtc2cpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpzdG9wKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICByZXR1cm4gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihtc2cpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpwYXVzZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOworICAgIHJldHVybiBPSzsKK30KKworc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gTWVkaWFDb2RlY1NvdXJjZTo6Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgeworICAgIENIRUNLKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpOworICAgIHJldHVybiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlcioqIGJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMqIC8qIG9wdGlvbnMgKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobU91dHB1dEJ1ZmZlckxvY2spOworCisgICAgKmJ1ZmZlciA9IE5VTEw7CisgICAgd2hpbGUgKG1PdXRwdXRCdWZmZXJRdWV1ZS5zaXplKCkgPT0gMCAmJiAhbUVuY29kZWRSZWFjaGVkRU9TKSB7CisgICAgICAgIG1PdXRwdXRCdWZmZXJDb25kLndhaXQobU91dHB1dEJ1ZmZlckxvY2spOworICAgIH0KKyAgICBpZiAoIW1FbmNvZGVkUmVhY2hlZEVPUykgeworICAgICAgICAqYnVmZmVyID0gKm1PdXRwdXRCdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWUuZXJhc2UobU91dHB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBtRXJyb3JDb2RlOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBidWZmZXItPnNldE9ic2VydmVyKDApOworICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworfQorCitNZWRpYUNvZGVjU291cmNlOjpNZWRpYUNvZGVjU291cmNlKAorICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIHVpbnQzMl90IGZsYWdzKQorICAgIDogbUxvb3Blcihsb29wZXIpLAorICAgICAgbU91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQpLAorICAgICAgbU1ldGEobmV3IE1ldGFEYXRhKSwKKyAgICAgIG1GbGFncyhmbGFncyksCisgICAgICBtSXNWaWRlbyhmYWxzZSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtU3RvcHBpbmcoZmFsc2UpLAorICAgICAgbURvTW9yZVdvcmtQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1QdWxsZXJSZWFjaGVkRU9TKGZhbHNlKSwKKyAgICAgIG1GaXJzdFNhbXBsZVRpbWVVcygtMWxsKSwKKyAgICAgIG1FbmNvZGVkUmVhY2hlZEVPUyhmYWxzZSksCisgICAgICBtRXJyb3JDb2RlKE9LKSB7CisgICAgQ0hFQ0sobUxvb3BlciAhPSBOVUxMKTsKKworICAgIEFTdHJpbmcgbWltZTsKKyAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUuY19zdHIoKSwgNikpIHsKKyAgICAgICAgbUlzVmlkZW8gPSB0cnVlOworICAgIH0KKworICAgIGlmICghKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpKSB7CisgICAgICAgIG1QdWxsZXIgPSBuZXcgUHVsbGVyKHNvdXJjZSk7CisgICAgfQorfQorCitNZWRpYUNvZGVjU291cmNlOjp+TWVkaWFDb2RlY1NvdXJjZSgpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworCisgICAgbUNvZGVjTG9vcGVyLT5zdG9wKCk7CisgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvci0+aWQoKSk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OmluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdEVuY29kZXIoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmVsZWFzZUVuY29kZXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjppbml0RW5jb2RlcigpIHsKKyAgICBtUmVmbGVjdG9yID0gbmV3IEFIYW5kbGVyUmVmbGVjdG9yPE1lZGlhQ29kZWNTb3VyY2U+KHRoaXMpOworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKKworICAgIG1Db2RlY0xvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1Db2RlY0xvb3Blci0+c2V0TmFtZSgiY29kZWNfbG9vcGVyIik7CisgICAgbUNvZGVjTG9vcGVyLT5zdGFydCgpOworCisgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX01FVEFEQVRBX0lOUFVUKSB7CisgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJzdG9yZS1tZXRhZGF0YS1pbi1idWZmZXJzIiwgMSk7CisgICAgfQorCisgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCIsIDEpOworICAgIH0KKworICAgIEFTdHJpbmcgb3V0cHV0TUlNRTsKKyAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm91dHB1dE1JTUUpKTsKKworICAgIG1FbmNvZGVyID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKAorICAgICAgICAgICAgbUNvZGVjTG9vcGVyLCBvdXRwdXRNSU1FLmNfc3RyKCksIHRydWUgLyogZW5jb2RlciAqLyk7CisKKyAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBBTE9HVigib3V0cHV0IGZvcm1hdCBpcyAnJXMnIiwgbU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRW5jb2Rlci0+Y29uZmlndXJlKAorICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgTlVMTCAvKiBuYXRpdmVXaW5kb3cgKi8sCisgICAgICAgICAgICAgICAgTlVMTCAvKiBjcnlwdG8gKi8sCisgICAgICAgICAgICAgICAgTWVkaWFDb2RlYzo6Q09ORklHVVJFX0ZMQUdfRU5DT0RFKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtRW5jb2Rlci0+Z2V0T3V0cHV0Rm9ybWF0KCZtT3V0cHV0Rm9ybWF0KTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobU91dHB1dEZvcm1hdCwgbU1ldGEpOworCisgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgQ0hFQ0sobUlzVmlkZW8pOworCisgICAgICAgIGVyciA9IG1FbmNvZGVyLT5jcmVhdGVJbnB1dFN1cmZhY2UoJm1HcmFwaGljQnVmZmVyUHJvZHVjZXIpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBtRW5jb2Rlci0+c3RhcnQoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBtRW5jb2Rlci0+Z2V0SW5wdXRCdWZmZXJzKCZtRW5jb2RlcklucHV0QnVmZmVycyk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gbUVuY29kZXItPmdldE91dHB1dEJ1ZmZlcnMoJm1FbmNvZGVyT3V0cHV0QnVmZmVycyk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbUVuY29kZWRSZWFjaGVkRU9TID0gZmFsc2U7CisgICAgbUVycm9yQ29kZSA9IE9LOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnJlbGVhc2VFbmNvZGVyKCkgeworICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRW5jb2Rlci0+cmVsZWFzZSgpOworICAgIG1FbmNvZGVyLmNsZWFyKCk7CisKKyAgICB3aGlsZSAoIW1JbnB1dEJ1ZmZlclF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSAqbUlucHV0QnVmZmVyUXVldWUuYmVnaW4oKTsKKyAgICAgICAgbUlucHV0QnVmZmVyUXVldWUuZXJhc2UobUlucHV0QnVmZmVyUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGlmIChtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG1FbmNvZGVySW5wdXRCdWZmZXJzLml0ZW1BdChpKTsKKyAgICAgICAgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGFjY2Vzc1VuaXQpOworICAgIH0KKworICAgIG1FbmNvZGVySW5wdXRCdWZmZXJzLmNsZWFyKCk7CisgICAgbUVuY29kZXJPdXRwdXRCdWZmZXJzLmNsZWFyKCk7Cit9CisKK2Jvb2wgTWVkaWFDb2RlY1NvdXJjZTo6cmVhY2hlZEVPUygpIHsKKyAgICByZXR1cm4gbUVuY29kZWRSZWFjaGVkRU9TICYmICgobVB1bGxlciA9PSBOVUxMKSB8fCBtUHVsbGVyUmVhY2hlZEVPUyk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6c2lnbmFsRU9TKHN0YXR1c190IGVycikgeworICAgIGlmICghbUVuY29kZWRSZWFjaGVkRU9TKSB7CisgICAgICAgIEFMT0dJKCJlbmNvZGVyICglcykgcmVhY2hlZCBFT1MiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1PdXRwdXRCdWZmZXJMb2NrKTsKKyAgICAgICAgICAgIC8vIHJlbGVhc2UgYWxsIHVucmVhZCBtZWRpYSBidWZmZXJzCisgICAgICAgICAgICBmb3IgKExpc3Q8TWVkaWFCdWZmZXIqPjo6aXRlcmF0b3IgaXQgPSBtT3V0cHV0QnVmZmVyUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gbU91dHB1dEJ1ZmZlclF1ZXVlLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAgICAgKCppdCktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS5jbGVhcigpOworICAgICAgICAgICAgbUVuY29kZWRSZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIG1FcnJvckNvZGUgPSBlcnI7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ29uZC5zaWduYWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgfQorICAgIGlmIChtU3RvcHBpbmcgJiYgcmVhY2hlZEVPUygpKSB7CisgICAgICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgZnVsbHkgc3RvcHBlZCIsCisgICAgICAgICAgICAgICAgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgIC8vIHBvc3RpbmcgcmVwbHkgdG8gZXZlcnlvbmUgdGhhdCdzIHdhaXRpbmcKKyAgICAgICAgTGlzdDx1aW50MzJfdD46Oml0ZXJhdG9yIGl0OworICAgICAgICBmb3IgKGl0ID0gbVN0b3BSZXBseUlEUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBtU3RvcFJlcGx5SURRdWV1ZS5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseSgqaXQpOworICAgICAgICB9CisgICAgICAgIG1TdG9wUmVwbHlJRFF1ZXVlLmNsZWFyKCk7CisgICAgICAgIG1TdG9wcGluZyA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzdXNwZW5kKCkgeworICAgIENIRUNLKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpOworICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgdHJ1ZSk7CisgICAgICAgIG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnJlc3VtZShpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVcykgeworICAgIENIRUNLKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpOworICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgZmFsc2UpOworICAgICAgICBpZiAoc2tpcEZyYW1lc0JlZm9yZVVzID4gMCkgeworICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgic2tpcC1mcmFtZXMtYmVmb3JlIiwgc2tpcEZyYW1lc0JlZm9yZVVzKTsKKyAgICAgICAgfQorICAgICAgICBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzY2hlZHVsZURvTW9yZVdvcmsoKSB7CisgICAgaWYgKG1Eb01vcmVXb3JrUGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbURvTW9yZVdvcmtQZW5kaW5nID0gdHJ1ZTsKKworICAgIGlmIChtRW5jb2RlckFjdGl2aXR5Tm90aWZ5ID09IE5VTEwpIHsKKyAgICAgICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBrV2hhdEVuY29kZXJBY3Rpdml0eSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgfQorICAgIG1FbmNvZGVyLT5yZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obUVuY29kZXJBY3Rpdml0eU5vdGlmeSk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OmZlZWRFbmNvZGVySW5wdXRCdWZmZXJzKCkgeworICAgIHdoaWxlICghbUlucHV0QnVmZmVyUXVldWUuZW1wdHkoKQorICAgICAgICAgICAgJiYgIW1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuZW1wdHkoKSkgeworICAgICAgICBNZWRpYUJ1ZmZlciogbWJ1ZiA9ICptSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5lcmFzZShtSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKKworICAgICAgICBzaXplX3QgYnVmZmVySW5kZXggPSAqbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5iZWdpbigpOworICAgICAgICBtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmVyYXNlKG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuYmVnaW4oKSk7CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXMgPSAwbGw7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAwOworCisgICAgICAgIGlmIChtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgIENIRUNLKG1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgLy8gcHVzaCBkZWNvZGluZyB0aW1lIGZvciB2aWRlbywgb3IgZHJpZnQgdGltZSBmb3IgYXVkaW8KKyAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgIG1EZWNvZGluZ1RpbWVRdWV1ZS5wdXNoX2JhY2sodGltZVVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisjaWYgREVCVUdfRFJJRlRfVElNRQorICAgICAgICAgICAgICAgIGlmIChtRmlyc3RTYW1wbGVUaW1lVXMgPCAwbGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3QgZHJpZnRUaW1lVXMgPSAwOworICAgICAgICAgICAgICAgIGlmIChtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlEcmlmdFRpbWUsICZkcmlmdFRpbWVVcykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRyaWZ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaWZ0VGltZVVzID0gdGltZVVzIC0gbUZpcnN0U2FtcGxlVGltZVVzIC0gZHJpZnRUaW1lVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EcmlmdFRpbWVRdWV1ZS5wdXNoX2JhY2soZHJpZnRUaW1lVXMpOworI2VuZGlmIC8vIERFQlVHX0RSSUZUX1RJTUUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZSA9IG1idWYtPnNpemUoKTsKKworICAgICAgICAgICAgbWVtY3B5KG1FbmNvZGVySW5wdXRCdWZmZXJzLml0ZW1BdChidWZmZXJJbmRleCktPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICBtYnVmLT5kYXRhKCksIHNpemUpOworCisgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAvLyB2aWRlbyBlbmNvZGVyIHdpbGwgcmVsZWFzZSBNZWRpYUJ1ZmZlciB3aGVuIGRvbmUKKyAgICAgICAgICAgICAgICAvLyB3aXRoIHVuZGVybHlpbmcgZGF0YS4KKyAgICAgICAgICAgICAgICBtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpLT5tZXRhKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0UG9pbnRlcigibWVkaWFCdWZmZXIiLCBtYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxhZ3MgPSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRW5jb2Rlci0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBidWZmZXJJbmRleCwgMCwgc2l6ZSwgdGltZVVzLCBmbGFncyk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6ZG9Nb3JlV29yaygpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisKKyAgICBpZiAoIShtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSkgeworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBzaXplX3QgYnVmZmVySW5kZXg7CisgICAgICAgICAgICBlcnIgPSBtRW5jb2Rlci0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZidWZmZXJJbmRleCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5wdXNoX2JhY2soYnVmZmVySW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgc2l6ZV90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBOVUxMOworICAgICAgICBlcnIgPSBtRW5jb2Rlci0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAmYnVmZmVySW5kZXgsICZvZmZzZXQsICZzaXplLCAmdGltZVVzLCAmZmxhZ3MpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgbUVuY29kZXItPmdldE91dHB1dEJ1ZmZlcnMoJm1FbmNvZGVyT3V0cHV0QnVmZmVycyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBvdXRidWYgPSBtRW5jb2Rlck91dHB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KTsKKworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIob3V0YnVmLT5zaXplKCkpOworICAgICAgICAgICAgbWVtY3B5KG1idWYtPmRhdGEoKSwgb3V0YnVmLT5kYXRhKCksIG91dGJ1Zi0+c2l6ZSgpKTsKKworICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykpIHsKKyAgICAgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWNvZGluZ1RpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdyYXBoaWNCdWZmZXJTb3VyY2UgaXMgc3VwcG9zZWQgdG8gZGlzY2FyZCBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVmb3JlIHN0YXJ0LCBhbmQgb2Zmc2V0IHRpbWVVcyBieSBzdGFydCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVjb2RpbmcgdGltZSBmb3Igc3VyZmFjZSBzb3VyY2UgaXMgdW5hdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgcHJlc2VudGF0aW9uIHRpbWUgZm9yIG5vdy4gTWF5IG5lZWQgdG8gbW92ZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBsb2dpYyBpbnRvIE1lZGlhQ29kZWMuCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKCFtRGVjb2RpbmdUaW1lUXVldWUuZW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyA9ICoobURlY29kaW5nVGltZVF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbURlY29kaW5nVGltZVF1ZXVlLmVyYXNlKG1EZWNvZGluZ1RpbWVRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURlY29kaW5nVGltZSwgZGVjb2RpbmdUaW1lVXMpOworCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbdmlkZW9dIHRpbWUgJWxsZCB1cyAoJS4yZiBzZWNzKSwgZHRzL3B0cyBkaWZmICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywgdGltZVVzIC8gMUU2LCBkZWNvZGluZ1RpbWVVcyAtIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkcmlmdFRpbWVVcyA9IDA7CisjaWYgREVCVUdfRFJJRlRfVElNRQorICAgICAgICAgICAgICAgICAgICBDSEVDSyghbURyaWZ0VGltZVF1ZXVlLmVtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICBkcmlmdFRpbWVVcyA9ICoobURyaWZ0VGltZVF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBtRHJpZnRUaW1lUXVldWUuZXJhc2UobURyaWZ0VGltZVF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURyaWZ0VGltZSwgZHJpZnRUaW1lVXMpOworI2VuZGlmIC8vIERFQlVHX0RSSUZUX1RJTUUKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlthdWRpb10gdGltZSAlbGxkIHVzICglLjJmIHNlY3MpLCBkcmlmdCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIHRpbWVVcyAvIDFFNiwgZHJpZnRUaW1lVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUUpIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1idWYtPnNldE9ic2VydmVyKHRoaXMpOworICAgICAgICAgICAgbWJ1Zi0+YWRkX3JlZigpOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1PdXRwdXRCdWZmZXJMb2NrKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWUucHVzaF9iYWNrKG1idWYpOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb25kLnNpZ25hbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUVuY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoYnVmZmVySW5kZXgpOworCisgICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6b25TdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgaWYgKG1TdG9wcGluZykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHdoaWxlIHdlJ3JlIHN0b3BwaW5nIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgQUxPR0koIk1lZGlhQ29kZWNTb3VyY2UgKCVzKSByZXN1bWluZyIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICAgICAgcmVzdW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDSyhtUHVsbGVyICE9IE5VTEwpOworICAgICAgICAgICAgbVB1bGxlci0+cmVzdW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgc3RhcnRpbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy0+ZmluZEludDY0KGtLZXlUaW1lLCAmc3RhcnRUaW1lVXMpKSB7CisgICAgICAgICAgICBzdGFydFRpbWVVcyA9IC0xbGw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdW1lKHN0YXJ0VGltZVVzKTsKKyAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0sobVB1bGxlciAhPSBOVUxMKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBrV2hhdFB1bGxlck5vdGlmeSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgIGVyciA9IG1QdWxsZXItPnN0YXJ0KHBhcmFtcywgbm90aWZ5KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbVB1bGxlclJlYWNoZWRFT1MgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgc3RhcnRlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICBjYXNlIGtXaGF0UHVsbGVyTm90aWZ5OgorICAgIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKm1idWY7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImFjY2Vzc1VuaXQiLCAodm9pZCoqKSZtYnVmKSk7CisKKyAgICAgICAgaWYgKG1idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0koInB1bGxlciAoJXMpIHJlYWNoZWQgRU9TIiwKKyAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgICAgICBtUHVsbGVyUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoImdvdCBtc2cgJyVzJyBhZnRlciBlbmNvZGVyIHNodXRkb3duLiIsCisgICAgICAgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICAgICAgICAgIGlmIChtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNpZ25hbEVPUygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5wdXNoX2JhY2sobWJ1Zik7CisKKyAgICAgICAgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKKyAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Uga1doYXRFbmNvZGVyQWN0aXZpdHk6CisgICAgeworICAgICAgICBtRG9Nb3JlV29ya1BlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBkb01vcmVXb3JrKCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyByZWFjaGVkIEVPUywgb3IgZXJyb3IKKyAgICAgICAgICAgIHNpZ25hbEVPUyhlcnIpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgibWV0YSIsICZvYmopKTsKKyAgICAgICAgTWV0YURhdGEgKnBhcmFtcyA9IHN0YXRpY19jYXN0PE1ldGFEYXRhICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIG9uU3RhcnQocGFyYW1zKSk7CisgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtXaGF0U3RvcDoKKyAgICB7CisgICAgICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgc3RvcHBpbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKworICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgaWYgKHJlYWNoZWRFT1MoKSkgeworICAgICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSByZWFjaGVkIEVPUywgcmVwbHkgYW5kIHJldHVybiBub3cKKyAgICAgICAgICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgYWxyZWFkeSBzdG9wcGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtU3RvcFJlcGx5SURRdWV1ZS5wdXNoX2JhY2socmVwbHlJRCk7CisgICAgICAgIGlmIChtU3RvcHBpbmcpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgd2UncmUgYWxyZWFkeSBzdG9wcGluZywgcmVwbHkgd2lsbCBiZSBwb3N0ZWQKKyAgICAgICAgICAgIC8vIHRvIGFsbCB3aGVuIHdlJ3JlIHN0b3BwZWQuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1TdG9wcGluZyA9IHRydWU7CisKKyAgICAgICAgLy8gaWYgdXNpbmcgc3VyZmFjZSwgc2lnbmFsIHNvdXJjZSBFT1MgYW5kIHdhaXQgZm9yIEVPUyB0byBjb21lIGJhY2suCisgICAgICAgIC8vIG90aGVyd2lzZSwgcmVsZWFzZSBlbmNvZGVyIGFuZCBwb3N0IEVPUyBpZiBoYXZlbid0IGRvbmUgYWxyZWFkeQorICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICAgICAgbUVuY29kZXItPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKG1QdWxsZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBtUHVsbGVyLT5zdG9wQXN5bmMoKTsKKyAgICAgICAgICAgIHNpZ25hbEVPUygpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtXaGF0UGF1c2U6CisgICAgeworICAgICAgICBpZiAobUZsYWdzICYmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgICAgIHN1c3BlbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKG1QdWxsZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBtUHVsbGVyLT5wYXVzZSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKaW5kZXggMzQwY2JhNy4uYzY3MGJiNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCkBAIC0zNiw2ICszNiw3IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgPSAiYXVkaW8vbXA0YS1sYXRtIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQID0gImF1ZGlvL3FjZWxwIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyA9ICJhdWRpby92b3JiaXMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyA9ICJhdWRpby9vcHVzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyA9ICJhdWRpby9nNzExLWFsYXciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXID0gImF1ZGlvL2c3MTEtbWxhdyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVcgPSAiYXVkaW8vcmF3IjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKaW5kZXggZDg3ZTkxMC4uOTAzMzVlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKQEAgLTE2LDYgKzE2LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYU11eGVyIgorCisjaW5jbHVkZSAid2VibS9XZWJtV3JpdGVyLmgiCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaD4KQEAgLTM2LDE5ICszOSwzMCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNZWRpYU11eGVyOjpNZWRpYU11eGVyKGNvbnN0IGNoYXIgKnBhdGgsIE91dHB1dEZvcm1hdCBmb3JtYXQpCi0gICAgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCkgeworICAgIDogbUZvcm1hdChmb3JtYXQpLAorICAgICAgbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKICAgICBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfTVBFR180KSB7CiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIocGF0aCk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihwYXRoKTsKKyAgICB9CisKKyAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CiAgICAgICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQotCiB9CiAKIE1lZGlhTXV4ZXI6Ok1lZGlhTXV4ZXIoaW50IGZkLCBPdXRwdXRGb3JtYXQgZm9ybWF0KQotICAgIDogbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKKyAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgIG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7CiAgICAgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX01QRUdfNCkgewogICAgICAgICBtV3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGZkKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgbVdyaXRlciA9IG5ldyBXZWJtV3JpdGVyKGZkKTsKKyAgICB9CisKKyAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CiAgICAgICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQpAQCAtMTA5LDggKzEyMywxMyBAQAogICAgICAgICBBTE9HRSgic2V0TG9jYXRpb24oKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnQoKS4iKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBpZiAobUZvcm1hdCAhPSBPVVRQVVRfRk9STUFUX01QRUdfNCkgeworICAgICAgICBBTE9HRSgic2V0TG9jYXRpb24oKSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgLm1wNCBvdXRwdXQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICBBTE9HVigiU2V0dGluZyBsb2NhdGlvbjogbGF0aXR1ZGUgPSAlZCwgbG9uZ2l0dWRlID0gJWQiLCBsYXRpdHVkZSwgbG9uZ2l0dWRlKTsKLSAgICByZXR1cm4gbVdyaXRlci0+c2V0R2VvRGF0YShsYXRpdHVkZSwgbG9uZ2l0dWRlKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TVBFRzRXcml0ZXIqPihtV3JpdGVyLmdldCgpKS0+c2V0R2VvRGF0YShsYXRpdHVkZSwgbG9uZ2l0dWRlKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFNdXhlcjo6c3RhcnQoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCAwNmUyZDQzLi42MWNmMGFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTIxMyw3ICsyMTMsMTQgQEAKIAogICAgIG1Mb29wZXItPnNldE5hbWUoIk51Q2FjaGVkU291cmNlMiIpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKLSAgICBtTG9vcGVyLT5zdGFydCgpOworCisgICAgLy8gU2luY2UgaXQgbWF5IG5vdCBiZSBvYnZpb3VzIHdoeSBvdXIgbG9vcGVyIHRocmVhZCBuZWVkcyB0byBiZQorICAgIC8vIGFibGUgdG8gY2FsbCBpbnRvIGphdmEgc2luY2UgaXQgZG9lc24ndCBhcHBlYXIgdG8gZG8gc28gYXQgYWxsLi4uCisgICAgLy8gSU1lZGlhSFRUUENvbm5lY3Rpb24gbWF5IGJlIChhbmQgbW9zdCBsaWtlbHkgaXMpIGltcGxlbWVudGVkIGluIEpBVkEKKyAgICAvLyBhbmQgYSBsb2NhbCBKQVZBIElCaW5kZXIgd2lsbCBjYWxsIGRpcmVjdGx5IGludG8gSk5JIG1ldGhvZHMuCisgICAgLy8gU28gd2hlbmV2ZXIgd2UgY2FsbCBEYXRhU291cmNlOjpyZWFkQXQgaXQgbWF5IGVuZCB1cCBpbiBhIGNhbGwgdG8KKyAgICAvLyBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6cmVhZEF0IGFuZCB0aGVyZWZvcmUgY2FsbCBiYWNrIGludG8gSkFWQS4KKyAgICBtTG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sIHRydWUgLyogY2FuQ2FsbEphdmEgKi8pOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hNb3JlLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggN2JjN2RhMi4uNjRmNTZlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTU4LDcgKzU4LDkgQEAKIH0KIAogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1JbXBsICE9IE5VTEwpIHsKQEAgLTY2LDcgKzY4LDcgQEAKICAgICB9CiAKICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShwYXRoLCBoZWFkZXJzKTsKKyAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShodHRwU2VydmljZSwgcGF0aCwgaGVhZGVycyk7CiAKICAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRU5PRU5UOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IDk2YzVhMzIuLmE4Nzk2NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTk2LDYgKzk2LDcgQEAKIAogI2RlZmluZSBDT0RFQ19MT0dJKHgsIC4uLikgQUxPR0koIlslc10gIngsIG1Db21wb25lbnROYW1lLCAjI19fVkFfQVJHU19fKQogI2RlZmluZSBDT0RFQ19MT0dWKHgsIC4uLikgQUxPR1YoIlslc10gIngsIG1Db21wb25lbnROYW1lLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBDT0RFQ19MT0dXKHgsIC4uLikgQUxPR1coIlslc10gIngsIG1Db21wb25lbnROYW1lLCAjI19fVkFfQVJHU19fKQogI2RlZmluZSBDT0RFQ19MT0dFKHgsIC4uLikgQUxPR0UoIlslc10gIngsIG1Db21wb25lbnROYW1lLCAjI19fVkFfQVJHU19fKQogCiBzdHJ1Y3QgT01YQ29kZWNPYnNlcnZlciA6IHB1YmxpYyBCbk9NWE9ic2VydmVyIHsKQEAgLTQ5MSw2ICs0OTIsMTMgQEAKIAogICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CiAgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShkYXRhLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5T3B1c0hlYWRlciwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworCisgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5T3B1c0NvZGVjRGVsYXksICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzODksNiArMTM5Nyw4IEBACiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiLCAiYXVkaW9fZW5jb2Rlci5hYWMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIudm9yYmlzIiwgImF1ZGlvX2VuY29kZXIudm9yYmlzIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5vcHVzIiwgImF1ZGlvX2VuY29kZXIub3B1cyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsICJhdWRpb19lbmNvZGVyLmc3MTFtbGF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywKQEAgLTE3OTYsMjEgKzE4MDYsNDIgQEAKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQorICAgIC8vIEZJWE1FOiBhc3N1bWUgdGhhdCBzdXJmYWNlIGlzIGNvbnRyb2xsZWQgYnkgYXBwIChuYXRpdmUgd2luZG93CisgICAgLy8gcmV0dXJucyB0aGUgbnVtYmVyIGZvciB0aGUgY2FzZSB3aGVuIHN1cmZhY2UgaXMgbm90IGNvbnRyb2xsZWQgYnkgYXBwKQorICAgIC8vIEZJWE1FMjogVGhpcyBtZWFucyB0aGF0IG1pblVuZGVxZXVldWRCdWZzIGNhbiBiZSAxIGxhcmdlciB0aGFuIHJlcG9ydGVkCisgICAgLy8gRm9yIG5vdywgdHJ5IHRvIGFsbG9jYXRlIDEgbW9yZSBidWZmZXIsIGJ1dCBkb24ndCBmYWlsIGlmIHVuc3VjY2Vzc2Z1bAogCi0gICAgLy8gWFhYOiBJcyB0aGlzIHRoZSByaWdodCBsb2dpYyB0byB1c2U/ICBJdCdzIG5vdCBjbGVhciB0byBtZSB3aGF0IHRoZSBPTVgKLSAgICAvLyBidWZmZXIgY291bnRzIHJlZmVyIHRvIC0gaG93IGRvIHRoZXkgYWNjb3VudCBmb3IgdGhlIHJlbmRlcmVyIGhvbGRpbmcgb24KLSAgICAvLyB0byBidWZmZXJzPwotICAgIGlmIChkZWYubkJ1ZmZlckNvdW50QWN0dWFsIDwgZGVmLm5CdWZmZXJDb3VudE1pbiArIG1pblVuZGVxdWV1ZWRCdWZzKSB7Ci0gICAgICAgIE9NWF9VMzIgbmV3QnVmZmVyQ291bnQgPSBkZWYubkJ1ZmZlckNvdW50TWluICsgbWluVW5kZXF1ZXVlZEJ1ZnM7CisgICAgLy8gVXNlIGNvbnNlcnZhdGl2ZSBhbGxvY2F0aW9uIHdoaWxlIGFsc28gdHJ5aW5nIHRvIHJlZHVjZSBzdGFydmF0aW9uCisgICAgLy8KKyAgICAvLyAxLiBhbGxvY2F0ZSBhdCBsZWFzdCBuQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmZmVycyAtIHRoYXQgaXMgdGhlCisgICAgLy8gICAgbWluaW11bSBuZWVkZWQgZm9yIHRoZSBjb25zdW1lciB0byBiZSBhYmxlIHRvIHdvcmsKKyAgICAvLyAyLiB0cnkgdG8gYWxsb2NhdGUgdHdvICgyKSBhZGRpdGlvbmFsIGJ1ZmZlcnMgdG8gcmVkdWNlIHN0YXJ2YXRpb24gZnJvbQorICAgIC8vICAgIHRoZSBjb25zdW1lcgorICAgIC8vICAgIHBsdXMgYW4gZXh0cmEgYnVmZmVyIHRvIGFjY291bnQgZm9yIGluY29ycmVjdCBtaW5VbmRlcXVldWVkQnVmcworICAgIENPREVDX0xPR0koIk9NWC1idWZmZXJzOiBtaW49JXUgYWN0dWFsPSV1IHVuZGVxPSVkKzEiLAorICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgbWluVW5kZXF1ZXVlZEJ1ZnMpOworCisgICAgZm9yIChPTVhfVTMyIGV4dHJhQnVmZmVycyA9IDIgKyAxOyAvKiBjb25kaXRpb24gaW5zaWRlIGxvb3AgKi87IGV4dHJhQnVmZmVycy0tKSB7CisgICAgICAgIE9NWF9VMzIgbmV3QnVmZmVyQ291bnQgPQorICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiArIG1pblVuZGVxdWV1ZWRCdWZzICsgZXh0cmFCdWZmZXJzOwogICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gbmV3QnVmZmVyQ291bnQ7CiAgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBDT0RFQ19MT0dFKCJzZXR0aW5nIG5CdWZmZXJDb3VudEFjdHVhbCB0byAlbHUgZmFpbGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG5ld0J1ZmZlckNvdW50LCBlcnIpOworCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1pblVuZGVxdWV1ZWRCdWZzICs9IGV4dHJhQnVmZmVyczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQ09ERUNfTE9HVygic2V0dGluZyBuQnVmZmVyQ291bnRBY3R1YWwgdG8gJWx1IGZhaWxlZDogJWQiLAorICAgICAgICAgICAgICAgIG5ld0J1ZmZlckNvdW50LCBlcnIpOworICAgICAgICAvKiBleGl0IGNvbmRpdGlvbiAqLworICAgICAgICBpZiAoZXh0cmFCdWZmZXJzID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CisgICAgQ09ERUNfTE9HSSgiT01YLWJ1ZmZlcnM6IG1pbj0ldSBhY3R1YWw9JXUgdW5kZXE9JWQrMSIsCisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50TWluLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCBtaW5VbmRlcXVldWVkQnVmcyk7CiAKICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoCiAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKQEAgLTQxMjcsNiArNDE1OCw3IEBACiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nTVAzIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdTQkMiLAogICAgICAgICAiT01YX0FVRElPX0NvZGluZ1ZPUkJJUyIsCisgICAgICAgICJPTVhfQVVESU9fQ29kaW5nT1BVUyIsCiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nV01BIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdSQSIsCiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nTUlESSIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCmluZGV4IDc3Mzg1NGYuLmUyZTZkNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFNraXBDdXRCdWZmZXI6OlNraXBDdXRCdWZmZXIoaW50MzJfdCBza2lwLCBpbnQzMl90IGN1dCkgewotICAgIG1Gcm9udFBhZGRpbmcgPSBza2lwOworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcCA9IHNraXA7CiAgICAgbUJhY2tQYWRkaW5nID0gY3V0OwogICAgIG1Xcml0ZUhlYWQgPSAwOwogICAgIG1SZWFkSGVhZCA9IDA7CkBAIC05NCw2ICs5NCw3IEBACiAKIHZvaWQgU2tpcEN1dEJ1ZmZlcjo6Y2xlYXIoKSB7CiAgICAgbVdyaXRlSGVhZCA9IG1SZWFkSGVhZCA9IDA7CisgICAgbUZyb250UGFkZGluZyA9IG1Ta2lwOwogfQogCiB2b2lkIFNraXBDdXRCdWZmZXI6OndyaXRlKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG51bSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IDJiNTFhMjkuLmZlMjA4MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KIApAQCAtMTQ3LDcgKzE0OCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgLy8gY291bGRuJ3Qgb3BlbiBpdCBsb2NhbGx5LCBtYXliZSB0aGUgbWVkaWEgc2VydmVyIGNhbj8KLSAgICAgICAgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShwYXRoKTsKKyAgICAgICAgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBwYXRoKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGZkLCAwLCAweDdmZmZmZmZmZmZmZmZmZkwpOwogICAgICAgICBjbG9zZShmZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IGZjZDlhODUuLjk0NzVkMDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlICJpbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KQEAgLTUxLDcgKzUyLDkgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJpKTsKIAogICAgIG1QYXJzZWRNZXRhRGF0YSA9IGZhbHNlOwpAQCAtNTksNyArNjIsNyBAQAogICAgIGRlbGV0ZSBtQWxidW1BcnQ7CiAgICAgbUFsYnVtQXJ0ID0gTlVMTDsKIAotICAgIG1Tb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVyaSwgaGVhZGVycyk7CisgICAgbVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoaHR0cFNlcnZpY2UsIHVyaSwgaGVhZGVycyk7CiAKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlIGZvciAnJXMnLiIsIHVyaSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAppbmRleCA2ODZkMDNhLi42MmFlYTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKQEAgLTU0LDkgKzU0LDkgQEAKICAgICAgICAgQUxPR0UoIkludmFsaWQgZGltZW5zaW9ucyAlZHglZCIsIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwogICAgIH0KIAotICAgIG1CdWZmZXJRdWV1ZSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgIG1CdWZmZXJRdWV1ZS0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7Ci0gICAgbUJ1ZmZlclF1ZXVlLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIgfAorICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKKyAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOworICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSIHwKICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSk7CiAKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBjb21wb3NlcihDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpKTsKQEAgLTY4LDcgKzY4LDcgQEAKICAgICB3cDxDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PENvbnN1bWVyTGlzdGVuZXIqPih0aGlzKTsKICAgICBzcDxCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyPiBwcm94eSA9IG5ldyBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyKGxpc3RlbmVyKTsKIAotICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJRdWV1ZS0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJTdXJmYWNlTWVkaWFTb3VyY2U6IGVycm9yIGNvbm5lY3RpbmcgdG8gQnVmZmVyUXVldWU6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBtQnVmZmVyUXVldWUtPmR1bXAocmVzdWx0LCAiIik7CisgICAgbUNvbnN1bWVyLT5kdW1wKHJlc3VsdCwgIiIpOwogfQogCiBzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNldEZyYW1lUmF0ZShpbnQzMl90IGZwcykKQEAgLTE2Niw3ICsxNjYsNyBAQAogICAgIENIRUNLX0dUKG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50LCAxKTsKIAogICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgIG1CdWZmZXJRdWV1ZS0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCk7CisgICAgICAgIG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC0yMDUsNiArMjA1LDkgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworCiAgICAgd2hpbGUgKG1OdW1QZW5kaW5nQnVmZmVycyA+IDApIHsKICAgICAgICAgQUxPR0koIlN0aWxsIHdhaXRpbmcgZm9yICVkIGJ1ZmZlcnMgdG8gYmUgcmV0dXJuZWQuIiwKICAgICAgICAgICAgICAgICBtTnVtUGVuZGluZ0J1ZmZlcnMpOwpAQCAtMjE4LDExICsyMjEsOSBAQAogICAgICAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKICAgICB9CiAKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKICAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogCi0gICAgcmV0dXJuIG1CdWZmZXJRdWV1ZS0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIG1Db25zdW1lci0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBTdXJmYWNlTWVkaWFTb3VyY2U6OmdldEZvcm1hdCgpCkBAIC0yOTIsNyArMjkzLDcgQEAKICAgICAvLyB3YWl0IGhlcmUgdGlsbCB0aGUgZnJhbWVzIGNvbWUgaW4gZnJvbSB0aGUgY2xpZW50IHNpZGUKICAgICB3aGlsZSAobVN0YXJ0ZWQpIHsKIAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogICAgICAgICBpZiAoZXJyID09IEJ1ZmZlclF1ZXVlOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CiAgICAgICAgICAgICAvLyB3YWl0IGZvciBhIGJ1ZmZlciB0byBiZSBxdWV1ZWQKICAgICAgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1NdXRleCk7CkBAIC0zMTUsNyArMzE2LDcgQEAKICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZU5zID4gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5tVGltZXN0YW1wIDwgbVN0YXJ0VGltZU5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZyYW1lIHByZWRhdGVzIHN0YXJ0IG9mIHJlY29yZCwgZGlzY2FyZAotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLCBFR0xfTk9fRElTUExBWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PX1NZTkNfS0hSLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC00MTUsNyArNDE2LDcgQEAKICAgICAgICAgICAgIEFMT0dWKCJTbG90ICVkIHJldHVybmVkLCBtYXRjaGVzIGhhbmRsZSA9ICVwIiwgaWQsCiAgICAgICAgICAgICAgICAgICAgIG1TbG90c1tpZF0ubUdyYXBoaWNCdWZmZXItPmhhbmRsZSk7CiAKLSAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcihpZCwgbVNsb3RzW2lkXS5tRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaWQsIG1TbG90c1tpZF0ubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsCiAgICAgICAgICAgICAgICAgICAgIEZlbmNlOjpOT19GRU5DRSk7CiAKQEAgLTQ3Niw0ICs0NzcsOCBAQAogICAgIH0KIH0KIAordm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgeworICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAiU3VyZmFjZU1lZGlhU291cmNlIGNhbid0IGNvbnN1bWUgc2lkZWJhbmQgc3RyZWFtcyIpOworfQorCiB9IC8vIGVuZCBvZiBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCmluZGV4IDIxNmEzMjkuLjA0N2ZhYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVXRpbHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCkBAIC0yNTEsNiArMjUyLDEzIEBACiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMSIsIGJ1ZmZlcik7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5T3B1c0hlYWRlciwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKICAgICB9CiAKICAgICAqZm9ybWF0ID0gbXNnOwpAQCAtNDUyLDYgKzQ2MCwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaW50MzJfdCB0aW1lU2NhbGU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aW1lLXNjYWxlIiwgJnRpbWVTY2FsZSkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgdGltZVNjYWxlKTsKKyAgICB9CisKICAgICAvLyBYWFggVE9ETyBhZGQgd2hhdGV2ZXIgb3RoZXIga2V5cyB0aGVyZSBhcmUKIAogI2lmIDAKQEAgLTUyMyw2ICs1MzYsNyBAQAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAgICAgIEFVRElPX0ZPUk1BVF9BTVJfV0IgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgICAgICAgICBBVURJT19GT1JNQVRfQUFDIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICAgICAgQVVESU9fRk9STUFUX1ZPUkJJUyB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgICAgICAgIEFVRElPX0ZPUk1BVF9PUFVTfSwKICAgICB7IDAsIEFVRElPX0ZPUk1BVF9JTlZBTElEIH0KIH07CiAKQEAgLTYxNSw1ICs2MjksNDAgQEAKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKIH0KIAorQVN0cmluZyB1cmlEZWJ1Z1N0cmluZyhjb25zdCBBU3RyaW5nICZ1cmksIGJvb2wgaW5jb2duaXRvKSB7CisgICAgaWYgKGluY29nbml0bykgeworICAgICAgICByZXR1cm4gQVN0cmluZygiPFVSSSBzdXBwcmVzc2VkPiIpOworICAgIH0KKworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmxvZy11cmkiLCBwcm9wLCAiZmFsc2UiKSAmJgorICAgICAgICAoIXN0cmNtcChwcm9wLCAiMSIpIHx8ICFzdHJjbXAocHJvcCwgInRydWUiKSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisKKyAgICAvLyBmaW5kIHNjaGVtZQorICAgIEFTdHJpbmcgc2NoZW1lOworICAgIGNvbnN0IGNoYXIgKmNoYXJzID0gdXJpLmNfc3RyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1cmkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciBjID0gY2hhcnNbaV07CisgICAgICAgIGlmICghaXNhc2NpaShjKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaXNhbHBoYShjKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGxldHRlcgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChjKSB8fCBjID09ICcrJyB8fCBjID09ICcuJyB8fCBjID09Jy0nKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjICE9ICc6JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2NoZW1lID0gQVN0cmluZyh1cmksIDAsIGkpOworICAgICAgICBzY2hlbWUuYXBwZW5kKCI6Ly88c3VwcHJlc3NlZD4iKTsKKyAgICAgICAgcmV0dXJuIHNjaGVtZTsKKyAgICB9CisgICAgcmV0dXJuIEFTdHJpbmcoIjxuby1zY2hlbWUgVVJJIHN1cHByZXNzZWQ+Iik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCmluZGV4IGM2YWMwZGEuLjM4YTFmNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApAQCAtNDAsNiArNDAsMjUgQEAKICAgICByZXR1cm4geCArICgxdSA8PCBudW1aZXJvZXMpIC0gMTsKIH0KIAorc2lnbmVkIHBhcnNlU0UoQUJpdFJlYWRlciAqYnIpIHsKKyAgICB1bnNpZ25lZCBjb2RlTnVtID0gcGFyc2VVRShicik7CisKKyAgICByZXR1cm4gKGNvZGVOdW0gJiAxKSA/IChjb2RlTnVtICsgMSkgLyAyIDogLShjb2RlTnVtIC8gMik7Cit9CisKK3N0YXRpYyB2b2lkIHNraXBTY2FsaW5nTGlzdChBQml0UmVhZGVyICpiciwgc2l6ZV90IHNpemVPZlNjYWxpbmdMaXN0KSB7CisgICAgc2l6ZV90IGxhc3RTY2FsZSA9IDg7CisgICAgc2l6ZV90IG5leHRTY2FsZSA9IDg7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplT2ZTY2FsaW5nTGlzdDsgKytqKSB7CisgICAgICAgIGlmIChuZXh0U2NhbGUgIT0gMCkgeworICAgICAgICAgICAgc2lnbmVkIGRlbHRhX3NjYWxlID0gcGFyc2VTRShicik7CisgICAgICAgICAgICBuZXh0U2NhbGUgPSAobGFzdFNjYWxlICsgZGVsdGFfc2NhbGUgKyAyNTYpICUgMjU2OworICAgICAgICB9CisKKyAgICAgICAgbGFzdFNjYWxlID0gKG5leHRTY2FsZSA9PSAwKSA/IGxhc3RTY2FsZSA6IG5leHRTY2FsZTsKKyAgICB9Cit9CisKIC8vIERldGVybWluZSB2aWRlbyBkaW1lbnNpb25zIGZyb20gdGhlIHNlcXVlbmNlIHBhcmFtZXRlcnNldC4KIHZvaWQgRmluZEFWQ0RpbWVuc2lvbnMoCiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzZXFQYXJhbVNldCwKQEAgLTYzLDcgKzgyLDI0IEBACiAgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIGJpdF9kZXB0aF9sdW1hX21pbnVzOAogICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBiaXRfZGVwdGhfY2hyb21hX21pbnVzOAogICAgICAgICBici5za2lwQml0cygxKTsgIC8vIHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZwotICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAwdSk7ICAvLyBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnCisKKyAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHNlcV9zY2FsaW5nX2xpc3RfcHJlc2VudF9mbGFnW2ldCisKKyAgICAgICAgICAgICAgICAgICAgLy8gV0FSTklORzogdGhlIGNvZGUgYmVsb3cgaGFzIG5vdCBldmVyIGJlZW4gZXhlcmNpc2VkLi4uCisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgYSByZWFsLXdvcmxkIGV4YW1wbGUuCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTY2FsaW5nTGlzdDR4NFtpXSwxNiwuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsaW5nTGlzdCgmYnIsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjYWxpbmdMaXN0OHg4W2ktNl0sNjQsLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwU2NhbGluZ0xpc3QoJmJyLCA2NCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwYXJzZVVFKCZicik7ICAvLyBsb2cyX21heF9mcmFtZV9udW1fbWludXM0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOWUzZmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgIFwKLSAgICAgICAgRGF0YVVyaVNvdXJjZS5jcHAgXAotICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcCBcCi0gICAgICAgIHN1cHBvcnQuY3BwIFwKLSAgICAgICAgY2hyb21pdW1faHR0cF9zdHViLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTOj0gXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBleHRlcm5hbC9jaHJvbWl1bSBcCi0gICAgICAgIGV4dGVybmFsL2Nocm9taXVtL2FuZHJvaWQKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgICAgICBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGxwb3J0IFwKLSAgICAgICAgbGliY2hyb21pdW1fbmV0IFwKLSAgICAgICAgbGlidXRpbHMgXAotICAgICAgICBsaWJiaW5kZXIgXAotICAgICAgICBsaWJjdXRpbHMgXAotICAgICAgICBsaWJsb2cgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBsaWJkcm1mcmFtZXdvcmsKLQotaW5jbHVkZSBleHRlcm5hbC9zdGxwb3J0L2xpYnN0bHBvcnQubWsKLQotTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNWMyODAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDaHJvbWl1bUhUVFBEYXRhU291cmNlIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0KLSNpbmNsdWRlICJzdXBwb3J0LmgiCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Q2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncykKLSAgICA6IG1GbGFncyhmbGFncyksCi0gICAgICBtU3RhdGUoRElTQ09OTkVDVEVEKSwKLSAgICAgIG1EZWxlZ2F0ZShuZXcgU2ZEZWxlZ2F0ZSksCi0gICAgICBtQ3VycmVudE9mZnNldCgwKSwKLSAgICAgIG1JT1Jlc3VsdChPSyksCi0gICAgICBtQ29udGVudFNpemUoLTEpLAotICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCi0gICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7Ci0gICAgbURlbGVnYXRlLT5zZXRPd25lcih0aGlzKTsKLX0KLQotQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6fkNocm9taXVtSFRUUERhdGFTb3VyY2UoKSB7Ci0gICAgZGlzY29ubmVjdCgpOwotCi0gICAgZGVsZXRlIG1EZWxlZ2F0ZTsKLSAgICBtRGVsZWdhdGUgPSBOVUxMOwotCi0gICAgY2xlYXJEUk1TdGF0ZV9sKCk7Ci0KLSAgICBpZiAobURybU1hbmFnZXJDbGllbnQgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNvbm5lY3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHVpZF90IHVpZDsKLSAgICBpZiAoZ2V0VUlEKCZ1aWQpKSB7Ci0gICAgICAgIG1EZWxlZ2F0ZS0+c2V0VUlEKHVpZCk7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRwotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywgImNvbm5lY3Qgb24gYmVoYWxmIG9mIHVpZCAlZCIsIHVpZCk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBjb25uZWN0X2wodXJpLCBoZWFkZXJzLCBvZmZzZXQpOwotfQotCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpjb25uZWN0X2woCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBESVNDT05ORUNURUQpIHsKLSAgICAgICAgZGlzY29ubmVjdF9sKCk7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRwotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywKLSAgICAgICAgICAgICAgICAiY29ubmVjdCB0byA8VVJMIHN1cHByZXNzZWQ+IEAlbGxkIiwgb2Zmc2V0KTsKLSNlbmRpZgotCi0gICAgbVVSSSA9IHVyaTsKLSAgICBtQ29udGVudFR5cGUgPSBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLQotICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKLSAgICAgICAgbUhlYWRlcnMgPSAqaGVhZGVyczsKLSAgICB9IGVsc2UgewotICAgICAgICBtSGVhZGVycy5jbGVhcigpOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7Ci0gICAgbUNvbnRlbnRTaXplID0gLTE7Ci0gICAgbUN1cnJlbnRPZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgICBtRGVsZWdhdGUtPmluaXRpYXRlQ29ubmVjdGlvbihtVVJJLmNfc3RyKCksICZtSGVhZGVycywgb2Zmc2V0KTsKLQotICAgIHdoaWxlIChtU3RhdGUgPT0gQ09OTkVDVElORyB8fCBtU3RhdGUgPT0gRElTQ09OTkVDVElORykgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIHJldHVybiBtU3RhdGUgPT0gQ09OTkVDVEVEID8gT0sgOiBtSU9SZXN1bHQ7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25SZWRpcmVjdChjb25zdCBjaGFyICp1cmwpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1VUkkgPSB1cmw7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25Db25uZWN0aW9uRXN0YWJsaXNoZWQoCi0gICAgICAgIGludDY0X3QgY29udGVudFNpemUsIGNvbnN0IGNoYXIgKmNvbnRlbnRUeXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVElORykgewotICAgICAgICAvLyBXZSBtYXkgaGF2ZSBpbml0aWF0ZWQgZGlzY29ubmVjdGlvbi4KLSAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBESVNDT05ORUNUSU5HKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICBtQ29udGVudFNpemUgPSAoY29udGVudFNpemUgPCAwKSA/IC0xIDogY29udGVudFNpemUgKyBtQ3VycmVudE9mZnNldDsKLSAgICBtQ29udGVudFR5cGUgPSBTdHJpbmc4KGNvbnRlbnRUeXBlKTsKLSAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uQ29ubmVjdGlvbkZhaWxlZChzdGF0dXNfdCBlcnIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLSAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotCi0gICAgLy8gbVVSSS5jbGVhcigpOwotCi0gICAgbUlPUmVzdWx0ID0gZXJyOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBkaXNjb25uZWN0X2woKTsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpkaXNjb25uZWN0X2woKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBESVNDT05ORUNURUQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RJTkc7Ci0gICAgbUlPUmVzdWx0ID0gLUVJTlRSOwotCi0gICAgbURlbGVnYXRlLT5pbml0aWF0ZURpc2Nvbm5lY3QoKTsKLQotICAgIHdoaWxlIChtU3RhdGUgPT0gRElTQ09OTkVDVElORykgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIENIRUNLX0VRKChpbnQpbVN0YXRlLCAoaW50KURJU0NPTk5FQ1RFRCk7Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgcmV0dXJuIG1TdGF0ZSA9PSBDT05ORUNURUQgPyBPSyA6IE5PX0lOSVQ7Ci19Ci0KLXNzaXplX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0jaWYgMAotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5kaXNhYmxlLW5ldCIsIHZhbHVlLCAwKQotICAgICAgICAgICAgJiYgKCFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpIHx8ICFzdHJjbXAodmFsdWUsICIxIikpKSB7Ci0gICAgICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIlNpbXVsYXRpbmcgdGhhdCB0aGUgbmV0d29yayBpcyBkb3duLiIpOwotICAgICAgICBkaXNjb25uZWN0X2woKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKG9mZnNldCAhPSBtQ3VycmVudE9mZnNldCkgewotICAgICAgICBBU3RyaW5nIHRtcCA9IG1VUkk7Ci0gICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IHRtcEhlYWRlcnMgPSBtSGVhZGVyczsKLQotICAgICAgICBkaXNjb25uZWN0X2woKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0X2wodG1wLmNfc3RyKCksICZ0bXBIZWFkZXJzLCBvZmZzZXQpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBSRUFESU5HOwotCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICBtRGVsZWdhdGUtPmluaXRpYXRlUmVhZChkYXRhLCBzaXplKTsKLQotICAgIHdoaWxlIChtU3RhdGUgPT0gUkVBRElORykgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGlmIChtSU9SZXN1bHQgPCBPSykgewotICAgICAgICByZXR1cm4gbUlPUmVzdWx0OwotICAgIH0KLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKLQotICAgICAgICAvLyBUaGUgcmVhZCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG1JT1Jlc3VsdCBjb250YWlucwotICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCi0gICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG1JT1Jlc3VsdCwgZGVsYXlVcyk7Ci0KLSAgICAgICAgbUN1cnJlbnRPZmZzZXQgKz0gbUlPUmVzdWx0OwotICAgICAgICByZXR1cm4gbUlPUmVzdWx0OwotICAgIH0KLQotICAgIHJldHVybiBFUlJPUl9JTzsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvblJlYWRDb21wbGV0ZWQoc3NpemVfdCBzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1JT1Jlc3VsdCA9IHNpemU7Ci0KLSAgICBpZiAobVN0YXRlID09IFJFQURJTkcpIHsKLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtQ29udGVudFNpemUgPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAqc2l6ZSA9IG1Db250ZW50U2l6ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdWludDMyX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7Ci0gICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6SW5pdGlhdGVSZWFkKAotICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBtZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uRGlzY29ubmVjdENvbXBsZXRlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpRElTQ09OTkVDVElORyk7Ci0KLSAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7Ci0gICAgLy8gbVVSSS5jbGVhcigpOwotICAgIG1JT1Jlc3VsdCA9IC1FTk9UQ09OTjsKLQotICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXNwPERlY3J5cHRIYW5kbGU+IENocm9taXVtSFRUUERhdGFTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudCgpOwotICAgIH0KLQotICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIE5vdGUgaWYgcmVkaXJlY3Qgb2NjdXJzLCBtVXJpIGlzIHRoZSByZWRpcmVjdCB1cmkgaW5zdGVhZCBvZiB0aGUKLSAgICAgICAgICogb3JpZ2luYWwgb25lCi0gICAgICAgICAqLwotICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5vcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICAgICAgU3RyaW5nOChtVVJJLmNfc3RyKCkpLCBtaW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0RHJtSW5mbygKLSAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKLSAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Ci19Ci0KLVN0cmluZzggQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0VXJpKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICByZXR1cm4gU3RyaW5nOChtVVJJLmNfc3RyKCkpOwotfQotCi1TdHJpbmc4IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICByZXR1cm4gbUNvbnRlbnRUeXBlOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNsZWFyRFJNU3RhdGVfbCgpIHsKLSAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewotICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCi0gICAgICAgIENIRUNLKG1Ecm1NYW5hZ2VyQ2xpZW50KTsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPmNsb3NlRGVjcnlwdFNlc3Npb24obURlY3J5cHRIYW5kbGUpOwotICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVVSSS5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsICJSZWNvbm5lY3RpbmcuLi4iKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0X2wobVVSSS5jX3N0cigpLCAmbUhlYWRlcnMsIG9mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsICJSZWNvbm5lY3QgZmFpbGVkIHcvIGVyciAweCUwOHgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6VXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIHJldHVybiBTZkRlbGVnYXRlOjpVcGRhdGVQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9EYXRhVXJpU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvRGF0YVVyaVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjNmYTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9EYXRhVXJpU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW5jbHVkZS9EYXRhVXJpU291cmNlLmg+Ci0KLSNpbmNsdWRlIDxuZXQvYmFzZS9kYXRhX3VybC5oPgotI2luY2x1ZGUgPGdvb2dsZXVybC9zcmMvZ3VybC5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGF0YVVyaVNvdXJjZTo6RGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpIDoKLSAgICBtRGF0YVVyaSh1cmkpLAotICAgIG1Jbml0ZWQoTk9fSU5JVCkgewotCi0gICAgLy8gQ29weTE6IGNvbnN0IGNoYXIgKnVyaSAtPiBTdHJpbmc4IG1EYXRhVXJpLgotICAgIHN0ZDo6c3RyaW5nIG1pbWVUeXBlU3RyLCB1bnVzZWRDaGFyc2V0U3RyLCBkYXRhU3RyOwotICAgIC8vIENvcHkyOiBTdHJpbmc4IG1EYXRhVXJpIC0+IHN0ZDo6c3RyaW5nCi0gICAgY29uc3QgYm9vbCByZXQgPSBuZXQ6OkRhdGFVUkw6OlBhcnNlKAotICAgICAgICAgICAgR1VSTChzdGQ6OnN0cmluZyhtRGF0YVVyaS5zdHJpbmcoKSkpLAotICAgICAgICAgICAgJm1pbWVUeXBlU3RyLCAmdW51c2VkQ2hhcnNldFN0ciwgJmRhdGFTdHIpOwotICAgIC8vIENvcHkzOiBzdGQ6OnN0cmluZyBkYXRhU3RyIC0+IEFTdHJpbmcgbURhdGEKLSAgICBtRGF0YS5zZXRUbyhkYXRhU3RyLmRhdGEoKSwgZGF0YVN0ci5sZW5ndGgoKSk7Ci0gICAgbUluaXRlZCA9IHJldCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLQotICAgIC8vIFRoZSBjaHJvbWl1bSBkYXRhIHVybCBpbXBsZW1lbnRhdGlvbiBkZWZhdWx0cyB0byB1c2luZyAidGV4dC9wbGFpbiIKLSAgICAvLyBpZiBubyBtaW1lIHR5cGUgaXMgc3BlY2lmaWVkLiBXZSBwcmVmZXIgdG8gbGVhdmUgdGhpcyB1bnNwZWNpZmllZAotICAgIC8vIGluc3RlYWQsIHNpbmNlIHRoZSBtaW1lIHR5cGUgaXMgc25pZmZlZCBpbiBtb3N0IGNhc2VzLgotICAgIGlmIChtaW1lVHlwZVN0ciAhPSAidGV4dC9wbGFpbiIpIHsKLSAgICAgICAgbU1pbWVUeXBlID0gbWltZVR5cGVTdHIuY19zdHIoKTsKLSAgICB9Ci19Ci0KLXNzaXplX3QgRGF0YVVyaVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpvdXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1Jbml0ZWQgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0ZWQ7Ci0gICAgfQotCi0gICAgY29uc3Qgb2ZmNjRfdCBsZW5ndGggPSBtRGF0YS5zaXplKCk7Ci0gICAgaWYgKG9mZnNldCA+PSBsZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqZGF0YUJ1ZiA9IG1EYXRhLmNfc3RyKCk7Ci0gICAgY29uc3Qgc2l6ZV90IGJ5dGVzVG9Db3B5ID0KLSAgICAgICAgICAgIG9mZnNldCArIHNpemUgPj0gbGVuZ3RoID8gKGxlbmd0aCAtIG9mZnNldCkgOiBzaXplOwotCi0gICAgaWYgKGJ5dGVzVG9Db3B5ID4gMCkgewotICAgICAgICBtZW1jcHkob3V0LCBkYXRhQnVmICsgb2Zmc2V0LCBieXRlc1RvQ29weSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ5dGVzVG9Db3B5OwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODlmNmRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvY2hyb21pdW1faHR0cF9zdHViLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLQotI2luY2x1ZGUgPGluY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9EYXRhVXJpU291cmNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotSFRUUEJhc2UgKmNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MpIHsKLSAgICByZXR1cm4gbmV3IENocm9taXVtSFRUUERhdGFTb3VyY2UoZmxhZ3MpOwotfQotCi1zdGF0dXNfdCBVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIHJldHVybiBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpVcGRhdGVQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQotRGF0YVNvdXJjZSAqY3JlYXRlRGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpIHsKLSAgICByZXR1cm4gbmV3IERhdGFVcmlTb3VyY2UodXJpKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTQ4NzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDaHJvbWl1bUhUVFBEYXRhU291cmNlU3VwcG9ydCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotCi0jaW5jbHVkZSAic3VwcG9ydC5oIgotCi0jaW5jbHVkZSAiYW5kcm9pZC9uZXQvYW5kcm9pZF9uZXR3b3JrX2xpYnJhcnlfaW1wbC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2NlcnRfdmVyaWZpZXIuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9jb29raWVfbW9uc3Rlci5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2hvc3RfcmVzb2x2ZXIuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9zc2xfY29uZmlnX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJuZXQvaHR0cC9odHRwX2F1dGhfaGFuZGxlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9jYWNoZS5oIgotI2luY2x1ZGUgIm5ldC9wcm94eS9wcm94eV9jb25maWdfc2VydmljZV9hbmRyb2lkLmgiCi0KLSNpbmNsdWRlICJpbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaCIKLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGludGVyZmFjZSBkZWZpbmVkIGluIElBdWRpb1NlcnZpY2UuYWlkbAotY2xhc3MgSUF1ZGlvU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBdWRpb1NlcnZpY2UpOwotCi0gICAgdmlydHVhbCBpbnQgdmVyaWZ5WDUwOUNlcnRDaGFpbigKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2VydF9jaGFpbiwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpID0gMDsKLX07Ci0KLWNsYXNzIEJwQXVkaW9TZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgQnBBdWRpb1NlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUF1ZGlvU2VydmljZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBpbnQgdmVyaWZ5WDUwOUNlcnRDaGFpbigKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2VydF9jaGFpbiwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIC8vIFRoZSB2ZWN0b3Igb2Ygc3RkOjpzdHJpbmcgd2UgZ2V0IGlzbid0IHJlYWxseSBhIHZlY3RvciBvZiBzdHJpbmdzLAotICAgICAgICAvLyBidXQgcmF0aGVyIGEgdmVjdG9yIG9mIGJpbmFyeSBjZXJ0aWZpY2F0ZSBkYXRhLiBJZiB3ZSB0cnkgdG8gcGFzcwotICAgICAgICAvLyBpdCB0byBKYXZhIGxhbmd1YWdlIGNvZGUgYXMgYSBzdHJpbmcsIGl0IGVuZHMgdXAgbWFuZ2xlZCBvbiB0aGUgb3RoZXIKLSAgICAgICAgLy8gc2lkZSwgc28gc2VuZCB0aGVtIGFzIGJ5dGVzIGluc3RlYWQuCi0gICAgICAgIC8vIFNpbmNlIHdlIGNhbid0IHNlbmQgYW4gYXJyYXkgb2YgYnl0ZSBhcnJheXMsIHNlbmQgYSBzaW5nbGUgYXJyYXksCi0gICAgICAgIC8vIHdoaWNoIHdpbGwgYmUgc3BsaXQgb3V0IGJ5IHRoZSByZWNpcGllbnQuCi0KLSAgICAgICAgaW50IG51bWNlcnRzID0gY2VydF9jaGFpbi5zaXplKCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1jZXJ0cyk7Ci0gICAgICAgIHNpemVfdCB0b3RhbCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtY2VydHM7IGkrKykgewotICAgICAgICAgICAgdG90YWwgKz0gY2VydF9jaGFpbltpXS5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90IGJ5dGVzaXplID0gdG90YWwgKyBudW1jZXJ0cyAqIDQ7Ci0gICAgICAgIHVpbnQ4X3QgKmJ5dGVzID0gKHVpbnQ4X3QqKSBtYWxsb2MoYnl0ZXNpemUpOwotICAgICAgICBpZiAoIWJ5dGVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gNTsgLy8gU1NMX0lOVkFMSUQKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiJWQgY2VydHM6ICVkIC0+ICVkIiwgbnVtY2VydHMsIHRvdGFsLCBieXRlc2l6ZSk7Ci0KLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtY2VydHM7IGkrKykgewotICAgICAgICAgICAgaW50MzJfdCBjZXJ0c2l6ZSA9IGNlcnRfY2hhaW5baV0uc2l6ZSgpOwotICAgICAgICAgICAgLy8gc3RvcmUgdGhpcyBpbiBhIGtub3duIG9yZGVyLCB3aGljaCBqdXN0IGhhcHBlbnMgdG8gbWF0Y2ggdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIC8vIGJ5dGUgb3JkZXIgb2YgYSBqYXZhIEJ5dGVCdWZmZXIKLSAgICAgICAgICAgIGludDMyX3QgYmlnc2l6ZSA9IGh0b25sKGNlcnRzaXplKTsKLSAgICAgICAgICAgIEFMT0dWKCJjZXJ0ICVkLCBzaXplICVkIiwgaSwgY2VydHNpemUpOwotICAgICAgICAgICAgbWVtY3B5KGJ5dGVzICsgb2Zmc2V0LCAmYmlnc2l6ZSwgc2l6ZW9mKGJpZ3NpemUpKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2YoYmlnc2l6ZSk7Ci0gICAgICAgICAgICBtZW1jcHkoYnl0ZXMgKyBvZmZzZXQsIGNlcnRfY2hhaW5baV0uZGF0YSgpLCBjZXJ0c2l6ZSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gY2VydHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUJ5dGVBcnJheShieXRlc2l6ZSwgYnl0ZXMpOwotICAgICAgICBmcmVlKGJ5dGVzKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KFN0cmluZzE2KGhvc3RuYW1lLmNfc3RyKCkpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KFN0cmluZzE2KGF1dGhfdHlwZS5jX3N0cigpKSk7Ci0KLSAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgIGlmIChyZW1vdGUoKS0+dHJhbnNhY3QoSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwgZGF0YSwgJnJlcGx5KSAhPSBOT19FUlJPUgotICAgICAgICAgICAgICAgIHx8IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCkgPCAwIHx8IHJlcGx5LnJlYWRJbnQzMigmcmVzdWx0KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIDU7IC8vIFNTTF9JTlZBTElEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9TZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9TZXJ2aWNlIik7Ci0KLQotc3RhdGljIE11dGV4IGdOZXR3b3JrVGhyZWFkTG9jazsKLXN0YXRpYyBiYXNlOjpUaHJlYWQgKmdOZXR3b3JrVGhyZWFkID0gTlVMTDsKLXN0YXRpYyBzY29wZWRfcmVmcHRyPFNmUmVxdWVzdENvbnRleHQ+IGdSZXFDb250ZXh0Owotc3RhdGljIHNjb3BlZF9wdHI8bmV0OjpOZXR3b3JrQ2hhbmdlTm90aWZpZXI+IGdOZXR3b3JrQ2hhbmdlTm90aWZpZXI7Ci0KLWJvb2wgbG9nTWVzc2FnZUhhbmRsZXIoCi0gICAgICAgIGludCBzZXZlcml0eSwKLSAgICAgICAgY29uc3QgY2hhciogZmlsZSwKLSAgICAgICAgaW50IGxpbmUsCi0gICAgICAgIHNpemVfdCBtZXNzYWdlX3N0YXJ0LAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgaW50IGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX1ZFUkJPU0U7Ci0gICAgc3dpdGNoKHNldmVyaXR5KSB7Ci0gICAgY2FzZSBsb2dnaW5nOjpMT0dfRkFUQUw6Ci0gICAgICAgIGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX0ZBVEFMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGxvZ2dpbmc6OkxPR19FUlJPUl9SRVBPUlQ6Ci0gICAgY2FzZSBsb2dnaW5nOjpMT0dfRVJST1I6Ci0gICAgICAgIGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX0VSUk9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGxvZ2dpbmc6OkxPR19XQVJOSU5HOgotICAgICAgICBhbmRyb2lkU2V2ZXJpdHkgPSBBTkRST0lEX0xPR19XQVJOOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBhbmRyb2lkU2V2ZXJpdHkgPSBBTkRST0lEX0xPR19WRVJCT1NFOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgYW5kcm9pZF9wcmludExvZyhhbmRyb2lkU2V2ZXJpdHksICJjaHJvbWl1bS1saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICAgICAgICAgICAgICIlczolZDogJXMiLCBmaWxlLCBsaW5lLCBzdHIuY19zdHIoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdHJ1Y3QgQXV0b1ByaW9yaXR5U2F2ZXIgewotICAgIEF1dG9Qcmlvcml0eVNhdmVyKCkKLSAgICAgICAgOiBtVElEKGFuZHJvaWRHZXRUaWQoKSksCi0gICAgICAgICAgbVByZXZQcmlvcml0eShhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkobVRJRCkpIHsKLSAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KG1USUQsIEFORFJPSURfUFJJT1JJVFlfTk9STUFMKTsKLSAgICB9Ci0KLSAgICB+QXV0b1ByaW9yaXR5U2F2ZXIoKSB7Ci0gICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eShtVElELCBtUHJldlByaW9yaXR5KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgcGlkX3QgbVRJRDsKLSAgICBpbnQgbVByZXZQcmlvcml0eTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEF1dG9Qcmlvcml0eVNhdmVyKTsKLX07Ci0KLXN0YXRpYyB2b2lkIEluaXRpYWxpemVOZXR3b3JrVGhyZWFkSWZOZWNlc3NhcnkoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdOZXR3b3JrVGhyZWFkTG9jayk7Ci0KLSAgICBpZiAoZ05ldHdvcmtUaHJlYWQgPT0gTlVMTCkgewotICAgICAgICAvLyBNYWtlIHN1cmUgYW55IHRocmVhZHMgc3Bhd25lZCBieSB0aGUgY2hyb21pdW0gZnJhbWV3b3JrIGFyZQotICAgICAgICAvLyBydW5uaW5nIGF0IG5vcm1hbCBwcmlvcml0eSBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgdGhpcyB0aHJlYWQncy4KLSAgICAgICAgQXV0b1ByaW9yaXR5U2F2ZXIgc2F2ZXI7Ci0KLSAgICAgICAgZ05ldHdvcmtUaHJlYWQgPSBuZXcgYmFzZTo6VGhyZWFkKCJuZXR3b3JrIik7Ci0gICAgICAgIGJhc2U6OlRocmVhZDo6T3B0aW9ucyBvcHRpb25zOwotICAgICAgICBvcHRpb25zLm1lc3NhZ2VfbG9vcF90eXBlID0gTWVzc2FnZUxvb3A6OlRZUEVfSU87Ci0gICAgICAgIENIRUNLKGdOZXR3b3JrVGhyZWFkLT5TdGFydFdpdGhPcHRpb25zKG9wdGlvbnMpKTsKLQotICAgICAgICBnUmVxQ29udGV4dCA9IG5ldyBTZlJlcXVlc3RDb250ZXh0OwotCi0gICAgICAgIGdOZXR3b3JrQ2hhbmdlTm90aWZpZXIucmVzZXQobmV0OjpOZXR3b3JrQ2hhbmdlTm90aWZpZXI6OkNyZWF0ZSgpKTsKLQotICAgICAgICBuZXQ6OkFuZHJvaWROZXR3b3JrTGlicmFyeTo6UmVnaXN0ZXJTaGFyZWRJbnN0YW5jZSgKLSAgICAgICAgICAgICAgICBuZXcgU2ZOZXR3b3JrTGlicmFyeSk7Ci0gICAgICAgIGxvZ2dpbmc6OlNldExvZ01lc3NhZ2VIYW5kbGVyKGxvZ01lc3NhZ2VIYW5kbGVyKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIE1ZX0xPR0koY29uc3QgY2hhciAqcykgewotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIiVzIiwgcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1ZX0xPR1YoY29uc3QgY2hhciAqcykgewotI2lmICFkZWZpbmVkKExPR19OREVCVUcpIHx8IExPR19OREVCVUcgPT0gMAotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywgIiVzIiwgcyk7Ci0jZW5kaWYKLX0KLQotU2ZOZXRMb2c6OlNmTmV0TG9nKCkKLSAgICA6IG1OZXh0SUQoMSkgewotfQotCi12b2lkIFNmTmV0TG9nOjpBZGRFbnRyeSgKLSAgICAgICAgRXZlbnRUeXBlIHR5cGUsCi0gICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyAmdGltZSwKLSAgICAgICAgY29uc3QgU291cmNlICZzb3VyY2UsCi0gICAgICAgIEV2ZW50UGhhc2UgcGhhc2UsCi0gICAgICAgIEV2ZW50UGFyYW1ldGVycyAqcGFyYW1zKSB7Ci0jaWYgMAotICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICJBZGRFbnRyeSB0aW1lPSVzIHR5cGU9JXMgc291cmNlPSVzIHBoYXNlPSVzXG4iLAotICAgICAgICAgICAgICAgIFRpY2tDb3VudFRvU3RyaW5nKHRpbWUpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgRXZlbnRUeXBlVG9TdHJpbmcodHlwZSksCi0gICAgICAgICAgICAgICAgU291cmNlVHlwZVRvU3RyaW5nKHNvdXJjZS50eXBlKSwKLSAgICAgICAgICAgICAgICBFdmVudFBoYXNlVG9TdHJpbmcocGhhc2UpKS5jX3N0cigpKTsKLSNlbmRpZgotfQotCi11aW50MzIgU2ZOZXRMb2c6Ok5leHRJRCgpIHsKLSAgICByZXR1cm4gbU5leHRJRCsrOwotfQotCi1uZXQ6Ok5ldExvZzo6TG9nTGV2ZWwgU2ZOZXRMb2c6OkdldExvZ0xldmVsKCkgY29uc3QgewotICAgIHJldHVybiBMT0dfQkFTSUM7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVNmUmVxdWVzdENvbnRleHQ6OlNmUmVxdWVzdENvbnRleHQoKSB7Ci0gICAgbVVzZXJBZ2VudCA9IE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpOwotCi0gICAgc2V0X25ldF9sb2cobmV3IFNmTmV0TG9nKCkpOwotCi0gICAgc2V0X2hvc3RfcmVzb2x2ZXIoCi0gICAgICAgIG5ldDo6Q3JlYXRlU3lzdGVtSG9zdFJlc29sdmVyKAotICAgICAgICAgICAgICAgIG5ldDo6SG9zdFJlc29sdmVyOjprRGVmYXVsdFBhcmFsbGVsaXNtLAotICAgICAgICAgICAgICAgIE5VTEwgLyogcmVzb2x2ZXJfcHJvYyAqLywKLSAgICAgICAgICAgICAgICBuZXRfbG9nKCkpKTsKLQotICAgIHNldF9zc2xfY29uZmlnX3NlcnZpY2UoCi0gICAgICAgIG5ldDo6U1NMQ29uZmlnU2VydmljZTo6Q3JlYXRlU3lzdGVtU1NMQ29uZmlnU2VydmljZSgpKTsKLQotICAgIG1Qcm94eUNvbmZpZ1NlcnZpY2UgPSBuZXcgbmV0OjpQcm94eUNvbmZpZ1NlcnZpY2VBbmRyb2lkOwotCi0gICAgc2V0X3Byb3h5X3NlcnZpY2UobmV0OjpQcm94eVNlcnZpY2U6OkNyZWF0ZVdpdGhvdXRQcm94eVJlc29sdmVyKAotICAgICAgICBtUHJveHlDb25maWdTZXJ2aWNlLCBuZXRfbG9nKCkpKTsKLQotICAgIHNldF9odHRwX3RyYW5zYWN0aW9uX2ZhY3RvcnkobmV3IG5ldDo6SHR0cENhY2hlKAotICAgICAgICAgICAgaG9zdF9yZXNvbHZlcigpLAotICAgICAgICAgICAgbmV3IG5ldDo6Q2VydFZlcmlmaWVyKCksCi0gICAgICAgICAgICBkbnNycl9yZXNvbHZlcigpLAotICAgICAgICAgICAgZG5zX2NlcnRfY2hlY2tlcigpLAotICAgICAgICAgICAgcHJveHlfc2VydmljZSgpLAotICAgICAgICAgICAgc3NsX2NvbmZpZ19zZXJ2aWNlKCksCi0gICAgICAgICAgICBuZXQ6Okh0dHBBdXRoSGFuZGxlckZhY3Rvcnk6OkNyZWF0ZURlZmF1bHQoaG9zdF9yZXNvbHZlcigpKSwKLSAgICAgICAgICAgIG5ldHdvcmtfZGVsZWdhdGUoKSwKLSAgICAgICAgICAgIG5ldF9sb2coKSwKLSAgICAgICAgICAgIE5VTEwpKTsgIC8vIGJhY2tlbmRfZmFjdG9yeQotCi0gICAgc2V0X2Nvb2tpZV9zdG9yZShuZXcgbmV0OjpDb29raWVNb25zdGVyKE5VTEwsIE5VTEwpKTsKLX0KLQotY29uc3Qgc3RkOjpzdHJpbmcgJlNmUmVxdWVzdENvbnRleHQ6OkdldFVzZXJBZ2VudChjb25zdCBHVVJMICZ1cmwpIGNvbnN0IHsKLSAgICByZXR1cm4gbVVzZXJBZ2VudDsKLX0KLQotc3RhdHVzX3QgU2ZSZXF1ZXN0Q29udGV4dDo6dXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUHJveHlDb25maWdMb2NrKTsKLQotICAgIGlmIChob3N0ID09IE5VTEwgfHwgKmhvc3QgPT0gJ1wwJykgewotICAgICAgICBNWV9MT0dWKCJ1cGRhdGVQcm94eUNvbmZpZyBOVUxMIik7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgcHJveHk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGV4TGlzdDsKLSAgICAgICAgbVByb3h5Q29uZmlnU2VydmljZS0+VXBkYXRlUHJveHlTZXR0aW5ncyhwcm94eSwgZXhMaXN0KTsKLSAgICB9IGVsc2UgewotI2lmICFkZWZpbmVkKExPR19OREVCVUcpIHx8IExPR19OREVCVUcgPT0gMAotICAgICAgICBMT0dfUFJJKEFORFJPSURfTE9HX1ZFUkJPU0UsIExPR19UQUcsCi0gICAgICAgICAgICAgICAgInVwZGF0ZVByb3h5Q29uZmlnICVzOiVkLCBleGNsdWRlICclcyciLAotICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotI2VuZGlmCi0KLSAgICAgICAgc3RkOjpzdHJpbmcgcHJveHkgPSBTdHJpbmdQcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkuY19zdHIoKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhMaXN0ID0gZXhjbHVzaW9uTGlzdDsKLSAgICAgICAgbVByb3h5Q29uZmlnU2VydmljZS0+VXBkYXRlUHJveHlTZXR0aW5ncyhwcm94eSwgZXhMaXN0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVNmTmV0d29ya0xpYnJhcnk6OlNmTmV0d29ya0xpYnJhcnkoKSB7fQotCi1TZk5ldHdvcmtMaWJyYXJ5OjpWZXJpZnlSZXN1bHQgU2ZOZXR3b3JrTGlicmFyeTo6VmVyaWZ5WDUwOUNlcnRDaGFpbigKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpIHsKLQotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9Ci0gICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoImF1ZGlvIikpOwotICAgIGlmIChiaW5kZXIgPT0gMCkgewotICAgICAgICBBTE9HVygiVGhyZWFkIGNhbm5vdCBjb25uZWN0IHRvIHRoZSBhdWRpbyBzZXJ2aWNlIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElBdWRpb1NlcnZpY2U+KGJpbmRlcik7Ci0gICAgICAgIGludCBjb2RlID0gc2VydmljZS0+dmVyaWZ5WDUwOUNlcnRDaGFpbihjZXJ0X2NoYWluLCBob3N0bmFtZSwgYXV0aF90eXBlKTsKLSAgICAgICAgQUxPR1YoInZlcmlmaWVkOiAlZCIsIGNvZGUpOwotICAgICAgICBpZiAoY29kZSA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIFZFUklGWV9PSzsKLSAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IDIpIHsgLy8gU1NMX0lETUlTTUFUQ0gKLSAgICAgICAgICAgIHJldHVybiBWRVJJRllfQkFEX0hPU1ROQU1FOwotICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMykgeyAvLyBTU0xfVU5UUlVTVEVECi0gICAgICAgICAgICByZXR1cm4gVkVSSUZZX05PX1RSVVNURURfUk9PVDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVkVSSUZZX0lOVk9DQVRJT05fRVJST1I7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVNmRGVsZWdhdGU6OlNmRGVsZWdhdGUoKQotICAgIDogbU93bmVyKE5VTEwpLAotICAgICAgbVVSTFJlcXVlc3QoTlVMTCksCi0gICAgICBtUmVhZEJ1ZmZlcihuZXcgbmV0OjpJT0J1ZmZlcldpdGhTaXplKDgxOTIpKSwKLSAgICAgIG1OdW1CeXRlc1JlYWQoMCksCi0gICAgICBtTnVtQnl0ZXNUb3RhbCgwKSwKLSAgICAgIG1EYXRhRGVzdGluYXRpb24oTlVMTCksCi0gICAgICBtQXRFT1MoZmFsc2UpIHsKLSAgICBJbml0aWFsaXplTmV0d29ya1RocmVhZElmTmVjZXNzYXJ5KCk7Ci19Ci0KLVNmRGVsZWdhdGU6On5TZkRlbGVnYXRlKCkgewotICAgIENIRUNLKG1VUkxSZXF1ZXN0ID09IE5VTEwpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IFNmRGVsZWdhdGU6OlVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICBJbml0aWFsaXplTmV0d29ya1RocmVhZElmTmVjZXNzYXJ5KCk7Ci0KLSAgICByZXR1cm4gZ1JlcUNvbnRleHQtPnVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OnNldE93bmVyKENocm9taXVtSFRUUERhdGFTb3VyY2UgKm93bmVyKSB7Ci0gICAgbU93bmVyID0gb3duZXI7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6c2V0VUlEKHVpZF90IHVpZCkgewotICAgIGdSZXFDb250ZXh0LT5zZXRVSUQodWlkKTsKLX0KLQotYm9vbCBTZkRlbGVnYXRlOjpnZXRVSUQodWlkX3QgKnVpZCkgY29uc3QgewotICAgIHJldHVybiBnUmVxQ29udGV4dC0+Z2V0VUlEKHVpZCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25SZWNlaXZlZFJlZGlyZWN0KAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBjb25zdCBHVVJMICZuZXdfdXJsLCBib29sICpkZWZlcl9yZWRpcmVjdCkgewotICAgIE1ZX0xPR1YoIk9uUmVjZWl2ZWRSZWRpcmVjdCIpOwotICAgIG1Pd25lci0+b25SZWRpcmVjdChuZXdfdXJsLnNwZWMoKS5jX3N0cigpKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPbkF1dGhSZXF1aXJlZCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpBdXRoQ2hhbGxlbmdlSW5mbyAqYXV0aF9pbmZvKSB7Ci0gICAgTVlfTE9HVigiT25BdXRoUmVxdWlyZWQiKTsKLQotICAgIGluaGVyaXRlZDo6T25BdXRoUmVxdWlyZWQocmVxdWVzdCwgYXV0aF9pbmZvKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPbkNlcnRpZmljYXRlUmVxdWVzdGVkKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OlNTTENlcnRSZXF1ZXN0SW5mbyAqY2VydF9yZXF1ZXN0X2luZm8pIHsKLSAgICBNWV9MT0dWKCJPbkNlcnRpZmljYXRlUmVxdWVzdGVkIik7Ci0KLSAgICBpbmhlcml0ZWQ6Ok9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQocmVxdWVzdCwgY2VydF9yZXF1ZXN0X2luZm8pOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uU1NMQ2VydGlmaWNhdGVFcnJvcigKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGNlcnRfZXJyb3IsIG5ldDo6WDUwOUNlcnRpZmljYXRlICpjZXJ0KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPblNTTENlcnRpZmljYXRlRXJyb3IgY2VydF9lcnJvcj0lZFxuIiwgY2VydF9lcnJvcik7Ci0KLSAgICBpbmhlcml0ZWQ6Ok9uU1NMQ2VydGlmaWNhdGVFcnJvcihyZXF1ZXN0LCBjZXJ0X2Vycm9yLCBjZXJ0KTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPbkdldENvb2tpZXMobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBib29sIGJsb2NrZWRfYnlfcG9saWN5KSB7Ci0gICAgTVlfTE9HVigiT25HZXRDb29raWVzIik7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25TZXRDb29raWUoCi0gICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvb2tpZV9saW5lLAotICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMgJm9wdGlvbnMsCi0gICAgICAgIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpIHsKLSAgICBNWV9MT0dWKCJPblNldENvb2tpZSIpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uUmVzcG9uc2VTdGFydGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCkgewotICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBuZXQ6OlVSTFJlcXVlc3RTdGF0dXM6OlNVQ0NFU1MpIHsKLSAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCBhbmQgb3NfZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkub3NfZXJyb3IoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgZGVsZXRlIG1VUkxSZXF1ZXN0OwotICAgICAgICBtVVJMUmVxdWVzdCA9IE5VTEw7Ci0KLSAgICAgICAgbU93bmVyLT5vbkNvbm5lY3Rpb25GYWlsZWQoRVJST1JfSU8pOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtUmFuZ2VSZXF1ZXN0ZWQgJiYgcmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkgIT0gMjA2KSB7Ci0gICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiV2UgcmVxdWVzdGVkIGEgY29udGVudCByYW5nZSwgYnV0IHNlcnZlciBkaWRuJ3QgIgotICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCB0aGF0LiAocmVzcG9uZGVkIHdpdGggJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkpLmNfc3RyKCkpOwotCi0gICAgICAgIGRlbGV0ZSBtVVJMUmVxdWVzdDsKLSAgICAgICAgbVVSTFJlcXVlc3QgPSBOVUxMOwotCi0gICAgICAgIG1Pd25lci0+b25Db25uZWN0aW9uRmFpbGVkKC1FUElQRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKChyZXF1ZXN0LT5HZXRSZXNwb25zZUNvZGUoKSAvIDEwMCkgIT0gMikgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIlNlcnZlciByZXNwb25kZWQgd2l0aCBodHRwIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPkdldFJlc3BvbnNlQ29kZSgpKS5jX3N0cigpKTsKLQotICAgICAgICBkZWxldGUgbVVSTFJlcXVlc3Q7Ci0gICAgICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKLQotICAgICAgICBtT3duZXItPm9uQ29ubmVjdGlvbkZhaWxlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBNWV9MT0dWKCJPblJlc3BvbnNlU3RhcnRlZCIpOwotCi0gICAgc3RkOjpzdHJpbmcgaGVhZGVyczsKLSAgICByZXF1ZXN0LT5HZXRBbGxSZXNwb25zZUhlYWRlcnMoJmhlYWRlcnMpOwotCi0gICAgTVlfTE9HVihTdHJpbmdQcmludGYoInJlc3BvbnNlIGhlYWRlcnM6ICVzIiwgaGVhZGVycy5jX3N0cigpKS5jX3N0cigpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlOwotICAgIHJlcXVlc3QtPkdldFJlc3BvbnNlSGVhZGVyQnlOYW1lKCJDb250ZW50LVR5cGUiLCAmY29udGVudFR5cGUpOwotCi0gICAgbU93bmVyLT5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgKLSAgICAgICAgICAgIHJlcXVlc3QtPkdldEV4cGVjdGVkQ29udGVudFNpemUoKSwgY29udGVudFR5cGUuY19zdHIoKSk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25SZWFkQ29tcGxldGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGJ5dGVzX3JlYWQpIHsKLSAgICBpZiAoYnl0ZXNfcmVhZCA9PSAtMSkgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIk9uUmVhZENvbXBsZXRlZCwgcmVhZCBmYWlsZWQsIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKLQotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBNWV9MT0dWKFN0cmluZ1ByaW50ZigiT25SZWFkQ29tcGxldGVkLCByZWFkICVkIGJ5dGVzIiwgYnl0ZXNfcmVhZCkuY19zdHIoKSk7Ci0KLSAgICBpZiAoYnl0ZXNfcmVhZCA8IDApIHsKLSAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJSZWFkIGZhaWxlZCB3LyBzdGF0dXMgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKLQotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgICAgICBtQXRFT1MgPSB0cnVlOwotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChtTnVtQnl0ZXNSZWFkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENIRUNLX0dUKGJ5dGVzX3JlYWQsIDApOwotICAgIENIRUNLX0xFKG1OdW1CeXRlc1JlYWQgKyBieXRlc19yZWFkLCBtTnVtQnl0ZXNUb3RhbCk7Ci0KLSAgICBtZW1jcHkoKHVpbnQ4X3QgKiltRGF0YURlc3RpbmF0aW9uICsgbU51bUJ5dGVzUmVhZCwKLSAgICAgICAgICAgbVJlYWRCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgYnl0ZXNfcmVhZCk7Ci0KLSAgICBtTnVtQnl0ZXNSZWFkICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgICByZWFkTW9yZShyZXF1ZXN0KTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpyZWFkTW9yZShuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpIHsKLSAgICB3aGlsZSAobU51bUJ5dGVzUmVhZCA8IG1OdW1CeXRlc1RvdGFsKSB7Ci0gICAgICAgIHNpemVfdCBjb3B5ID0gbU51bUJ5dGVzVG90YWwgLSBtTnVtQnl0ZXNSZWFkOwotICAgICAgICBpZiAoY29weSA+IG1SZWFkQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgIGNvcHkgPSBtUmVhZEJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG47Ci0gICAgICAgIGlmIChyZXF1ZXN0LT5SZWFkKG1SZWFkQnVmZmVyLCBjb3B5LCAmbikpIHsKLSAgICAgICAgICAgIE1ZX0xPR1YoU3RyaW5nUHJpbnRmKCJSZWFkICVkIGJ5dGVzIGRpcmVjdGx5LiIsIG4pLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBDSEVDS19MRSgoc2l6ZV90KW4sIGNvcHkpOwotCi0gICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKiltRGF0YURlc3RpbmF0aW9uICsgbU51bUJ5dGVzUmVhZCwKLSAgICAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgICAgIG4pOwotCi0gICAgICAgICAgICBtTnVtQnl0ZXNSZWFkICs9IG47Ci0KLSAgICAgICAgICAgIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTVlfTE9HVigicmVhZE1vcmUgcGVuZGluZyByZWFkIik7Ci0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBuZXQ6OlVSTFJlcXVlc3RTdGF0dXM6OklPX1BFTkRJTkcpIHsKLSAgICAgICAgICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlyZWN0IHJlYWQgZmFpbGVkIHcvIHN0YXR1cyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChtTnVtQnl0ZXNSZWFkKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjppbml0aWF0ZUNvbm5lY3Rpb24oCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgR1VSTCB1cmwodXJpKTsKLQotICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOwotICAgIGxvb3AtPlBvc3RUYXNrKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKLSAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZUNvbm5lY3Rpb25XcmFwcGVyLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgdXJsLAotICAgICAgICAgICAgICAgIGhlYWRlcnMsCi0gICAgICAgICAgICAgICAgb2Zmc2V0KSk7Ci0KLX0KLQotLy8gc3RhdGljCi12b2lkIFNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVDb25uZWN0aW9uV3JhcHBlcigKLSAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsIEdVUkwgdXJsLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBtZS0+b25Jbml0aWF0ZUNvbm5lY3Rpb24odXJsLCBoZWFkZXJzLCBvZmZzZXQpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Om9uSW5pdGlhdGVDb25uZWN0aW9uKAotICAgICAgICBjb25zdCBHVVJMICZ1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpleHRyYSwKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBDSEVDSyhtVVJMUmVxdWVzdCA9PSBOVUxMKTsKLQotICAgIG1VUkxSZXF1ZXN0ID0gbmV3IG5ldDo6VVJMUmVxdWVzdCh1cmwsIHRoaXMpOwotICAgIG1BdEVPUyA9IGZhbHNlOwotCi0gICAgbVJhbmdlUmVxdWVzdGVkID0gZmFsc2U7Ci0KLSAgICBpZiAob2Zmc2V0ICE9IDAgfHwgZXh0cmEgIT0gTlVMTCkgewotICAgICAgICBuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVycyBoZWFkZXJzID0KLSAgICAgICAgICAgIG1VUkxSZXF1ZXN0LT5leHRyYV9yZXF1ZXN0X2hlYWRlcnMoKTsKLQotICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKLSAgICAgICAgICAgIGhlYWRlcnMuQWRkSGVhZGVyRnJvbVN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJSYW5nZTogYnl0ZXM9JWxsZC0iLCBvZmZzZXQpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBtUmFuZ2VSZXF1ZXN0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dHJhICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmEtPnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgQVN0cmluZyBzOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKGV4dHJhLT5rZXlBdChpKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIjogIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoZXh0cmEtPnZhbHVlQXQoaSkuc3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgaGVhZGVycy5BZGRIZWFkZXJGcm9tU3RyaW5nKHMuY19zdHIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtVVJMUmVxdWVzdC0+U2V0RXh0cmFSZXF1ZXN0SGVhZGVycyhoZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBtVVJMUmVxdWVzdC0+c2V0X2NvbnRleHQoZ1JlcUNvbnRleHQpOwotCi0gICAgbVVSTFJlcXVlc3QtPlN0YXJ0KCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6aW5pdGlhdGVEaXNjb25uZWN0KCkgewotICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOwotICAgIGxvb3AtPlBvc3RUYXNrKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKLSAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZURpc2Nvbm5lY3RXcmFwcGVyLCB0aGlzKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBTZkRlbGVnYXRlOjpPbkluaXRpYXRlRGlzY29ubmVjdFdyYXBwZXIoU2ZEZWxlZ2F0ZSAqbWUpIHsKLSAgICBtZS0+b25Jbml0aWF0ZURpc2Nvbm5lY3QoKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpvbkluaXRpYXRlRGlzY29ubmVjdCgpIHsKLSAgICBpZiAobVVSTFJlcXVlc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVVSTFJlcXVlc3QtPkNhbmNlbCgpOwotCi0gICAgZGVsZXRlIG1VUkxSZXF1ZXN0OwotICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKLQotICAgIG1Pd25lci0+b25EaXNjb25uZWN0Q29tcGxldGUoKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjppbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBNZXNzYWdlTG9vcCAqbG9vcCA9IGdOZXR3b3JrVGhyZWFkLT5tZXNzYWdlX2xvb3AoKTsKLSAgICBsb29wLT5Qb3N0VGFzaygKLSAgICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICAgIE5ld1J1bm5hYmxlRnVuY3Rpb24oCi0gICAgICAgICAgICAgICAgJlNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVSZWFkV3JhcHBlciwgdGhpcywgZGF0YSwgc2l6ZSkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZVJlYWRXcmFwcGVyKAotICAgICAgICBTZkRlbGVnYXRlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBtZS0+b25Jbml0aWF0ZVJlYWQoZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6b25Jbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBDSEVDSyhtVVJMUmVxdWVzdCAhPSBOVUxMKTsKLQotICAgIG1OdW1CeXRlc1JlYWQgPSAwOwotICAgIG1OdW1CeXRlc1RvdGFsID0gc2l6ZTsKLSAgICBtRGF0YURlc3RpbmF0aW9uID0gZGF0YTsKLQotICAgIGlmIChtQXRFT1MpIHsKLSAgICAgICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQoMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZWFkTW9yZShtVVJMUmVxdWVzdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NWExZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1VQUE9SVF9IXwotCi0jZGVmaW5lIFNVUFBPUlRfSF8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSAibmV0L2Jhc2UvbmV0X2xvZy5oIgotI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdC5oIgotI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdF9jb250ZXh0LmgiCi0jaW5jbHVkZSAibmV0L2Jhc2UvYW5kcm9pZF9uZXR3b3JrX2xpYnJhcnkuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9pb19idWZmZXIuaCIKLQotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBuZXQgewotICAgIHN0cnVjdCBQcm94eUNvbmZpZ1NlcnZpY2VBbmRyb2lkOwotfTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU2ZOZXRMb2cgOiBwdWJsaWMgbmV0OjpOZXRMb2cgewotICAgIFNmTmV0TG9nKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgQWRkRW50cnkoCi0gICAgICAgICAgICBFdmVudFR5cGUgdHlwZSwKLSAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyAmdGltZSwKLSAgICAgICAgICAgIGNvbnN0IFNvdXJjZSAmc291cmNlLAotICAgICAgICAgICAgRXZlbnRQaGFzZSBwaGFzZSwKLSAgICAgICAgICAgIEV2ZW50UGFyYW1ldGVycyAqcGFyYW1zKTsKLQotICAgIHZpcnR1YWwgdWludDMyIE5leHRJRCgpOwotICAgIHZpcnR1YWwgTG9nTGV2ZWwgR2V0TG9nTGV2ZWwoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB1aW50MzIgbU5leHRJRDsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmTmV0TG9nKTsKLX07Ci0KLXN0cnVjdCBTZlJlcXVlc3RDb250ZXh0IDogcHVibGljIG5ldDo6VVJMUmVxdWVzdENvbnRleHQgewotICAgIFNmUmVxdWVzdENvbnRleHQoKTsKLQotICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgJkdldFVzZXJBZ2VudChjb25zdCBHVVJMICZ1cmwpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1wcml2YXRlOgotICAgIE11dGV4IG1Qcm94eUNvbmZpZ0xvY2s7Ci0KLSAgICBzdGQ6OnN0cmluZyBtVXNlckFnZW50OwotICAgIG5ldDo6UHJveHlDb25maWdTZXJ2aWNlQW5kcm9pZCAqbVByb3h5Q29uZmlnU2VydmljZTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmUmVxdWVzdENvbnRleHQpOwotfTsKLQotLy8gVGhpcyBpcyByZXF1aXJlZCBmb3IgaHR0cHMgc3VwcG9ydCwgd2UgZG9uJ3QgcmVhbGx5IHZlcmlmeSBjZXJ0aWZpY2F0ZXMsCi0vLyB3ZSBhY2NlcHQgYW55dGhpbmcuLi4KLXN0cnVjdCBTZk5ldHdvcmtMaWJyYXJ5IDogcHVibGljIG5ldDo6QW5kcm9pZE5ldHdvcmtMaWJyYXJ5IHsKLSAgICBTZk5ldHdvcmtMaWJyYXJ5KCk7Ci0KLSAgICB2aXJ0dWFsIFZlcmlmeVJlc3VsdCBWZXJpZnlYNTA5Q2VydENoYWluKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3RuYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF1dGhfdHlwZSk7Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZOZXR3b3JrTGlicmFyeSk7Ci19OwotCi1zdHJ1Y3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTsKLQotc3RydWN0IFNmRGVsZWdhdGUgOiBwdWJsaWMgbmV0OjpVUkxSZXF1ZXN0OjpEZWxlZ2F0ZSB7Ci0gICAgU2ZEZWxlZ2F0ZSgpOwotICAgIHZpcnR1YWwgflNmRGVsZWdhdGUoKTsKLQotICAgIHZvaWQgaW5pdGlhdGVDb25uZWN0aW9uKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICB2b2lkIGluaXRpYXRlRGlzY29ubmVjdCgpOwotICAgIHZvaWQgaW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgc2V0T3duZXIoQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqbU93bmVyKTsKLQotICAgIC8vIEdldHMgdGhlIFVJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzCi0gICAgYm9vbCBnZXRVSUQodWlkX3QgKnVpZCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uUmVjZWl2ZWRSZWRpcmVjdCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgY29uc3QgR1VSTCAmbmV3X3VybCwgYm9vbCAqZGVmZXJfcmVkaXJlY3QpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uQXV0aFJlcXVpcmVkKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OkF1dGhDaGFsbGVuZ2VJbmZvICphdXRoX2luZm8pOwotCi0gICAgdmlydHVhbCB2b2lkIE9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIG5ldDo6U1NMQ2VydFJlcXVlc3RJbmZvICpjZXJ0X3JlcXVlc3RfaW5mbyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25TU0xDZXJ0aWZpY2F0ZUVycm9yKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgY2VydF9lcnJvciwgbmV0OjpYNTA5Q2VydGlmaWNhdGUgKmNlcnQpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uR2V0Q29va2llcyhuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uU2V0Q29va2llKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvb2tpZV9saW5lLAotICAgICAgICAgICAgY29uc3QgbmV0OjpDb29raWVPcHRpb25zICZvcHRpb25zLAotICAgICAgICAgICAgYm9vbCBibG9ja2VkX2J5X3BvbGljeSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25SZXNwb25zZVN0YXJ0ZWQobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBPblJlYWRDb21wbGV0ZWQobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgYnl0ZXNfcmVhZCk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgVXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1wcml2YXRlOgotICAgIHR5cGVkZWYgRGVsZWdhdGUgaW5oZXJpdGVkOwotCi0gICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqbU93bmVyOwotCi0gICAgbmV0OjpVUkxSZXF1ZXN0ICptVVJMUmVxdWVzdDsKLSAgICBzY29wZWRfcmVmcHRyPG5ldDo6SU9CdWZmZXJXaXRoU2l6ZT4gbVJlYWRCdWZmZXI7Ci0KLSAgICBzaXplX3QgbU51bUJ5dGVzUmVhZDsKLSAgICBzaXplX3QgbU51bUJ5dGVzVG90YWw7Ci0gICAgdm9pZCAqbURhdGFEZXN0aW5hdGlvbjsKLQotICAgIGJvb2wgbVJhbmdlUmVxdWVzdGVkOwotICAgIGJvb2wgbUF0RU9TOwotCi0gICAgdm9pZCByZWFkTW9yZShuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpOwotCi0gICAgc3RhdGljIHZvaWQgT25Jbml0aWF0ZUNvbm5lY3Rpb25XcmFwcGVyKAotICAgICAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsCi0gICAgICAgICAgICBHVVJMIHVybCwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgc3RhdGljIHZvaWQgT25Jbml0aWF0ZURpc2Nvbm5lY3RXcmFwcGVyKFNmRGVsZWdhdGUgKm1lKTsKLQotICAgIHN0YXRpYyB2b2lkIE9uSW5pdGlhdGVSZWFkV3JhcHBlcigKLSAgICAgICAgICAgIFNmRGVsZWdhdGUgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIG9uSW5pdGlhdGVDb25uZWN0aW9uKAotICAgICAgICAgICAgY29uc3QgR1VSTCAmdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICB2b2lkIG9uSW5pdGlhdGVEaXNjb25uZWN0KCk7Ci0gICAgdm9pZCBvbkluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZkRlbGVnYXRlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gU1VQUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cF9zdHViLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHBfc3R1Yi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOGE4NzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cF9zdHViLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIgotI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgYm9vbCBnRmlyc3QgPSB0cnVlOwotc3RhdGljIHZvaWQgKmdIYW5kbGU7Ci1zdGF0aWMgTXV0ZXggZ0xpYk11dGV4OwotCi1IVFRQQmFzZSAqKCpnTGliX2NyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UpKHVpbnQzMl90IGZsYWdzKTsKLURhdGFTb3VyY2UgKigqZ0xpYl9jcmVhdGVEYXRhVXJpU291cmNlKShjb25zdCBjaGFyICp1cmkpOwotCi1zdGF0dXNfdCAoKmdMaWJfVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKSgKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotc3RhdGljIGJvb2wgbG9hZF9saWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnTGliTXV0ZXgpOwotICAgIHZvaWQgKnN5bTsKLQotICAgIGlmICghZ0ZpcnN0KSB7Ci0gICAgICAgIHJldHVybiAoZ0hhbmRsZSAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgICBnRmlyc3QgPSBmYWxzZTsKLQotICAgIGdIYW5kbGUgPSBkbG9wZW4oImxpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAuc28iLCBSVExEX05PVyk7Ci0gICAgaWYgKGdIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3ltID0gZGxzeW0oZ0hhbmRsZSwgImNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UiKTsKLSAgICBpZiAoc3ltID09IE5VTEwpIHsKLSAgICAgICAgZ0hhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ0xpYl9jcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlID0gKEhUVFBCYXNlICooKikodWludDMyX3QpKXN5bTsKLQotICAgIHN5bSA9IGRsc3ltKGdIYW5kbGUsICJjcmVhdGVEYXRhVXJpU291cmNlIik7Ci0gICAgaWYgKHN5bSA9PSBOVUxMKSB7Ci0gICAgICAgIGdIYW5kbGUgPSBOVUxMOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGdMaWJfY3JlYXRlRGF0YVVyaVNvdXJjZSA9IChEYXRhU291cmNlICooKikoY29uc3QgY2hhciAqKSlzeW07Ci0KLSAgICBzeW0gPSBkbHN5bShnSGFuZGxlLCAiVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnIik7Ci0gICAgaWYgKHN5bSA9PSBOVUxMKSB7Ci0gICAgICAgIGdIYW5kbGUgPSBOVUxMOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGdMaWJfVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnID0KLSAgICAgICAgKHN0YXR1c190ICgqKShjb25zdCBjaGFyICosIGludDMyX3QsIGNvbnN0IGNoYXIgKikpc3ltOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUhUVFBCYXNlICpjcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgaWYgKCFsb2FkX2xpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ0xpYl9jcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKGZsYWdzKTsKLX0KLQotc3RhdHVzX3QgVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICBpZiAoIWxvYWRfbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cCgpKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ0xpYl9VcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoCi0gICAgICAgICAgICBob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQotRGF0YVNvdXJjZSAqY3JlYXRlRGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpIHsKLSAgICBpZiAoIWxvYWRfbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cCgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBnTGliX2NyZWF0ZURhdGFVcmlTb3VyY2UodXJpKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCmluZGV4IGZmYTY0ZjkuLjQ5ZmYyMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKQEAgLTE3LDYgKzE3LDggQEAKIAogTE9DQUxfQ0ZMQUdTIDo9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliRnJhdW5ob2ZlckFBQwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKaW5kZXggZDRiMGRlNy4uNTMyZTM2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCA2NCAgLyogNjQqLTAuMjVkQiA9IC0xNiBkQiBiZWxvdyBmdWxsIHNjYWxlIGZvciBtb2JpbGUgY29uZiAqLwogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCAgIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMTI3IC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KLSNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA2ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLwogLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncwogI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKICNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCkBAIC0yOTYsOCArMjk2LDExIEBACiAgICAgICAgIGlmICghKHByb3BlcnR5X2dldCgibWVkaWEuYWFjXzUxX291dHB1dF9lbmFibGVkIiwgdmFsdWUsIE5VTEwpICYmCiAgICAgICAgICAgICAgICAgKCFzdHJjbXAodmFsdWUsICIxIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpKSkgewogICAgICAgICAgICAgQUxPR0koIkRvd25taXhpbmcgbXVsdGljaGFubmVsIEFBQyB0byBzdGVyZW8iKTsKLSAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxTLCAyKTsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgMik7CiAgICAgICAgICAgICBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgdGhlIGRlY29kZXIgY3JlYXRlcyBhIDUuMSBjaGFubmVsIGRvd25taXggc2lnbmFsCisgICAgICAgICAgICAvLyBmb3Igc2V2ZW4gYW5kIGVpZ2h0IGNoYW5uZWwgaW5wdXQgc3RyZWFtcy4gVG8gZW5hYmxlIDYuMSBhbmQgNy4xIGNoYW5uZWwgb3V0cHV0CisgICAgICAgICAgICAvLyB1c2UgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTLCAtMSkKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTM3NCw3ICszNzcsNyBAQAogICAgICAgICAgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1Jc0FEVFMpIHsKKyAgICAgICAgICAgIGlmIChtSXNBRFRTICYmIGluSGVhZGVyLT5uRmlsbGVkTGVuKSB7CiAgICAgICAgICAgICAgICAgc2l6ZV90IGFkdHNIZWFkZXJTaXplID0gMDsKICAgICAgICAgICAgICAgICAvLyBza2lwIDMwIGJpdHMsIGFhY19mcmFtZV9sZW5ndGggZm9sbG93cy4KICAgICAgICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCmluZGV4IDA1N2M2OWIuLjU4ZWMzYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKQEAgLTgyLDYgKzgyLDggQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMvYXNtL0FSTVY3CiBlbmRpZgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMDYsNiArMTA4LDggQEAKIAogICBMT0NBTF9DRkxBR1MgOj0KIAorICBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiAgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliRnJhdW5ob2ZlckFBQwogCiAgIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApAQCAtMTI4LDYgKzEzMiw4IEBACiAKICAgTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQogCisgIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKICAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZW5jCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYwppbmRleCBjYzAxOTI3Li4xZDAyOWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSAiYmFzaWNfb3AuaCIKICNpbmNsdWRlICJvcGVyXzMyYi5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqICBGdW5jdGlvbiBMX0V4dHJhY3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgpAQCAtMjQzLDYgKzI0NSw4IEBACiBXb3JkMzIgcnNxcnQoV29yZDMyIHZhbHVlLCAgICAgLyohPCBPcGVyYW5kIHRvIHNxdWFyZSByb290ICgwLjAgLi4uIDEpICovCiAgICAgICAgICAgICAgV29yZDMyIGFjY3VyYWN5KSAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYml0cyB0aGF0IHdpbGwgYmUgY2FsY3VsYXRlZCAqLwogeworICAgIFVOVVNFRChhY2N1cmFjeSk7CisKICAgICBXb3JkMzIgcm9vdCA9IDA7CiAJV29yZDMyIHNjYWxlOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCmluZGV4IGQxYzg2MjEuLjQwZGI5MmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSAiY21uTWVtb3J5LmgiCiAjaW5jbHVkZSAibWVtYWxpZ24uaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qKgogKiBJbml0IHRoZSBhdWRpbyBjb2RlYyBtb2R1bGUgYW5kIHJldHVybiBjb2RlYyBoYW5kbGUKICogXHBhcmFtIHBoQ29kZWMgW09VVF0gUmV0dXJuIHRoZSB2aWRlbyBjb2RlYyBoYW5kbGUKQEAgLTQ2LDYgKzQ4LDggQEAKIAlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsKIAlpbnQgaW50ZXJNZW07CiAKKyAgICAgICAgVU5VU0VEKHZUeXBlKTsKKwogCWludGVyTWVtID0gMDsKIAllcnJvciA9IDA7CiAKQEAgLTQ3MSw2ICs0NzUsMTAgQEAKICovCiBWT19VMzIgVk9fQVBJIHZvQUFDRW5jR2V0UGFyYW0oVk9fSEFORExFIGhDb2RlYywgVk9fUzMyIHVQYXJhbUlELCBWT19QVFIgcERhdGEpCiB7CisgICAgICAgIFVOVVNFRChoQ29kZWMpOworICAgICAgICBVTlVTRUQodVBhcmFtSUQpOworICAgICAgICBVTlVTRUQocERhdGEpOworCiAJcmV0dXJuIFZPX0VSUl9OT05FOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCmluZGV4IGZjYzEyZGQuLmQxZmQ2NDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAicWNfZGF0YS5oIgogI2luY2x1ZGUgImludGVyZmFjZS5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKIAogc3RhdGljIGNvbnN0ICBXb3JkMTYgZ2xvYmFsR2Fpbk9mZnNldCA9IDEwMDsKIHN0YXRpYyBjb25zdCAgV29yZDE2IGljc1Jlc2VydmVkQml0ICAgPSAwOwpAQCAtNTg1LDYgKzU4Niw4IEBACiAgIFdvcmQxNiBlbGVtZW50VXNlZEJpdHM7CiAgIFdvcmQxNiBmcmFtZUJpdHM9MDsKIAorICBVTlVTRUQoYW5jQnl0ZXMpOworCiAgIC8qICAgc3RydWN0IGJpdGJ1ZmZlciBic1dyaXRlQ29weTsgKi8KICAgYml0TWFya1VwID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOwogICBpZihxY091dC0+cWNFbGVtZW50LmFkdHNVc2VkKSAgLyogIHdyaXRlIGFkdHMgaGVhZGVyKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCmluZGV4IDRlOTIxOGMuLjZmMDY3OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYwpAQCAtMzgsNiArMzgsOCBAQAogI2luY2x1ZGUgInRuc19mdW5jLmgiCiAjaW5jbHVkZSAibWVtYWxpZ24uaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzdGFydCAgICAgICBzaG9ydCAgICAgICBzdG9wICovCiBzdGF0aWMgV29yZDE2IGJsb2NrVHlwZTJ3aW5kb3dTaGFwZVtdID0ge0tCRF9XSU5ET1csU0lORV9XSU5ET1csU0lORV9XSU5ET1csS0JEX1dJTkRPV307CiAKQEAgLTE3MCw3ICsxNzIsOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBXb3JkMTYgUHN5T3V0RGVsZXRlKFBTWV9PVVQgKmhQc3lPdXQsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQogewotICBoUHN5T3V0PU5VTEw7CisgIFVOVVNFRChoUHN5T3V0KTsKKyAgVU5VU0VEKHBNZW1PUCk7CisKICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYwppbmRleCA0OGZmMzAwLi5lNWQ3OGFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKICNpbmNsdWRlICJtZW1hbGlnbi5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKIAogdHlwZWRlZiBlbnVtewogICBGUkFNRV9MRU5fQllURVNfTU9EVUxPID0gIDEsCkBAIC0yMDQsMTEgKzIwNSw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBRQ0RlbGV0ZShRQ19TVEFURSAqaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKIHsKLQotICAvKgotICAgICBub3RoaW5nIHRvIGRvCi0gICovCi0gIGhRQz1OVUxMOworICBVTlVTRUQoaFFDKTsKKyAgVU5VU0VEKHBNZW1PUCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMKaW5kZXggNDU1YTg2NC4uNTE3MjYxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMKQEAgLTMwLDYgKzMwLDggQEAKICNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInRuc19mdW5jLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAjZGVmaW5lIFROU19NT0RJRllfQkVHSU4gICAgICAgICAyNjAwICAvKiBIeiAqLwogI2RlZmluZSBSQVRJT19QQVRDSF9MT1dFUl9CT1JERVIgMzgwICAgLyogSHogKi8KICNkZWZpbmUgVE5TX0dBSU5fVEhSRVNICQkJIDE0MSAgIC8qIDEuNDEqMTAwICovCkBAIC02NDMsNiArNjQ1LDggQEAKICAgV29yZDMyIGk7CiAgIFdvcmQzMiB0bnNPcmRlclBsdXMxID0gdG5zT3JkZXIgKyAxOwogCisgIFVOVVNFRCh3aW5kb3cpOworCiAgIGFzc2VydCh0bnNPcmRlciA8PSBUTlNfTUFYX09SREVSKTsgICAgICAvKiByZW1vdmUgYXNzZXJ0cyBsYXRlcj8gKGJ0ZykgKi8KIAogICBmb3IoaT0wO2k8dG5zT3JkZXI7aSsrKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsKaW5kZXggMzBjZTI5Yy4uYTJiM2M4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5tawpAQCAtNjksNiArNjksOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfRVhQT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKaW5kZXggOGQ2YzZmOC4uYjA2NzQ1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tawpAQCAtNDcsNiArNDcsOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9JTVBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpAQCAtNjgsNiArNzAsOCBAQAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyBsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKaW5kZXggZjRlNDY3YS4uYWZjMGI4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tawpAQCAtNjksNiArNjksOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJuYmVuYwogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCkBAIC04OCw2ICs5MCw4IEBACiAgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXAogICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5tawppbmRleCA2NzcxMDdmLi5lZmRmOTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5tawpAQCAtNTAsNiArNTAsOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9JTVBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawppbmRleCBjNWI4ZTBjLi42NGZlOGQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawpAQCAtMTEyLDYgKzExMiw4IEBACiBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNwogZW5kaWYKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTI2LDYgKzEyOCw4IEBACiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUgXAogCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jCmluZGV4IDhjNDc3Y2EuLjBiMmVhODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlICJhY2VscC5oIgogI2luY2x1ZGUgImhhbV93aW5kLnRhYiIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIHZvaWQgQXV0b2NvcnIoCiAJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogSW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICovCiAJCVdvcmQxNiBtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogTFBDIG9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MCw2ICs0Miw4IEBACiAJV29yZDMyIExfc3VtLCBMX3N1bTEsIExfdG1wLCBGX0xFTjsKIAlXb3JkMTYgKnAxLCpwMiwqcDM7CiAJY29uc3QgV29yZDE2ICpwNDsKKyAgICAgICAgVU5VU0VEKG0pOworCiAJLyogV2luZG93aW5nIG9mIHNpZ25hbCAqLwogCXAxID0geDsKIAlwNCA9IHZvX3dpbmRvdzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYwppbmRleCBhY2JhNTMyLi40YzFmN2Q0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSAidHlwZWRlZi5oIgogI2luY2x1ZGUgImJhc2ljX29wLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiB2b2lkIENvbnZvbHZlICgKIAkJV29yZDE2IHhbXSwgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCQlXb3JkMTYgaFtdLCAgICAgICAgLyogKGkpICAgICA6IGltcHVsc2UgcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNSw2ICszNyw4IEBACiAJV29yZDMyICBpLCBuOwogCVdvcmQxNiAqdG1wSCwqdG1wWDsKIAlXb3JkMzIgczsKKyAgICAgICAgVU5VU0VEKEwpOworCiAJZm9yIChuID0gMDsgbiA8IDY0OykKIAl7CiAJCXRtcEggPSBoK247CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMKaW5kZXggMGQ2NmMzMS4uYjY2YjU1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYwpAQCAtMzEsNiArMzEsOCBAQAogI2RlZmluZSBVUF9TQU1QICAgICAgNAogI2RlZmluZSBMX0lOVEVSUE9MMSAgNAogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyogTG9jYWwgZnVuY3Rpb25zICovCiAKICNpZmRlZiBBU01fT1BUCkBAIC0xNzEsNiArMTczLDcgQEAKIAlXb3JkMzIgY29yciwgZXhwX2NvcnIsIG5vcm0sIGV4cCwgc2NhbGU7CiAJV29yZDE2IGV4cF9ub3JtLCBleGNmW0xfU1VCRlJdLCB0bXA7CiAJV29yZDMyIExfdG1wLCBMX3RtcDEsIExfdG1wMjsKKyAgICAgICAgVU5VU0VEKExfc3ViZnIpOwogCiAJLyogY29tcHV0ZSB0aGUgZmlsdGVyZWQgZXhjaXRhdGlvbiBmb3IgdGhlIGZpcnN0IGRlbGF5IHRfbWluICovCiAJayA9IC10X21pbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYwppbmRleCAxYmRhMDVhLi45NjFhYWRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSAibWF0aF9vcC5oIgogI2luY2x1ZGUgImNuc3QuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIHZvaWQgU3luX2ZpbHQoCiAJCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgKi8KIAkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTUsNiArOTcsOCBAQAogCVdvcmQzMiBpLGEwOwogCVdvcmQzMiBMX3RtcCwgTF90bXAxOwogCVdvcmQxNiAqcDEsICpwMiwgKnAzOworICAgICAgICBVTlVTRUQobSk7CisKIAlhMCA9IGFbMF0gPj4gKDQgKyBRbmV3KTsgICAgICAgICAgLyogaW5wdXQgLyAxNiBhbmQgPj5RbmV3ICovCiAJLyogRG8gdGhlIGZpbHRlcmluZy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbGc7IGkrKykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMKaW5kZXggZWE5ZGE1Mi4uZGY3YjliMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlICJtZW1fYWxpZ24uaCIKICNpbmNsdWRlICJjbW5NZW1vcnkuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKQEAgLTE2MDIsNiArMTYwNCw4IEBACiAJVk9fTUVNX09QRVJBVE9SIHZvTWVtb3ByYXRvcjsKICNlbmRpZgogCVZPX01FTV9PUEVSQVRPUiAqcE1lbU9QOworICAgICAgICBVTlVTRUQodlR5cGUpOworCiAJaW50IGludGVyTWVtID0gMDsKIAogCWlmKHBVc2VyRGF0YSA9PSBOVUxMIHx8IHBVc2VyRGF0YS0+bWVtZmxhZyAhPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SIHx8IHBVc2VyRGF0YS0+bWVtRGF0YSA9PSBOVUxMICkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvY29tbW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9BbmRyb2lkLm1rCmluZGV4IDIyZGVlMTUuLjg0NGVmMGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vQW5kcm9pZC5tawpAQCAtMTYsNCArMTYsNiBAQAogCSQoTE9DQUxfUEFUSCkvc3JjIFwKICAJJChMT0NBTF9QQVRIKS9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCmluZGV4IDdkMTdjMmEuLjUzN2JhNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawpAQCAtMzAsNiArMzAsOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9FWFBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC02OSw0ICs3MSw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9oMjY0ZW5jCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAKaW5kZXggODlmMGZlZC4uMGY0YTAwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcApAQCAtMzQsNiArMzQsMTIgQEAKIAogI2luY2x1ZGUgIlNvZnRBVkNFbmNvZGVyLmgiCiAKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KSAodm9pZCkoeCkKKyNlbHNlCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KQorI2VuZGlmCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdGVtcGxhdGU8Y2xhc3MgVD4KQEAgLTEzNiwxNCArMTQyLDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkKiBNYWxsb2NXcmFwcGVyKAotICAgICAgICB2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBzaXplLCBpbnQzMl90IGF0dHJzKSB7CisgICAgICAgIHZvaWQgKiAvKiB1c2VyRGF0YSAqLywgaW50MzJfdCBzaXplLCBpbnQzMl90IC8qIGF0dHJzICovKSB7CiAgICAgdm9pZCAqcHRyID0gbWFsbG9jKHNpemUpOwogICAgIGlmIChwdHIpCiAgICAgICAgIG1lbXNldChwdHIsIDAsIHNpemUpOwogICAgIHJldHVybiBwdHI7CiB9CiAKLXN0YXRpYyB2b2lkIEZyZWVXcmFwcGVyKHZvaWQgKnVzZXJEYXRhLCB2b2lkKiBwdHIpIHsKK3N0YXRpYyB2b2lkIEZyZWVXcmFwcGVyKHZvaWQgKiAvKiB1c2VyRGF0YSAqLywgdm9pZCogcHRyKSB7CiAgICAgZnJlZShwdHIpOwogfQogCkBAIC03MjIsNyArNzI4LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEFWQ0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFWQ0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TYXdJbnB1dEVPUykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzk1LDcgKzgwMSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBidWZmZXJfaGFuZGxlX3Qgc3JjQnVmZmVyOyAvLyBmb3IgTWV0YURhdGFNb2RlIG9ubHkKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90IHNyY0J1ZmZlciA9IE5VTEw7IC8vIGZvciBNZXRhRGF0YU1vZGUgb25seQogCiAgICAgICAgIC8vIEdldCBuZXh0IGlucHV0IHZpZGVvIGZyYW1lCiAgICAgICAgIGlmIChtUmVhZHlGb3JOZXh0RnJhbWUpIHsKQEAgLTk2NCw2ICs5NzAsNyBAQAogfQogCiB2b2lkIFNvZnRBVkNFbmNvZGVyOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKGJ1ZmZlcik7CiAgICAgQUxPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkOiAlcCIsIGJ1ZmZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tawppbmRleCBhMzNjYjkyLi5iMDAxMGZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0xNCw2ICsxNCw4IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQubWsKaW5kZXggZjAxZDYwNS4uNTlhMTFkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQubWsKQEAgLTksNiArOSw4IEBACiAgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgIGV4dGVybmFsL2ZsYWMvaW5jbHVkZQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMgbGlibG9nCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKaW5kZXggZDc5NzE5Ny4uMTMwMTA2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKQEAgLTI3LDYgKzI3LDEyIEBACiAjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVCA1CiAjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfTUFYICAgICA4CiAKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KSAodm9pZCkoeCkKKyNlbHNlCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KQorI2VuZGlmCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdGVtcGxhdGU8Y2xhc3MgVD4KQEAgLTI1Nyw3ICsyNjMsNyBAQAogfQogCiB2b2lkIFNvZnRGbGFjRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewotICAgIC8vVU5VU0VEX1VOTEVTU19WRVJCT1NFKHBvcnRJbmRleCk7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHBvcnRJbmRleCk7CiAgICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChwb3J0SW5kZXg9JWQpIiwgcG9ydEluZGV4KTsKIAogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKQEAgLTM0MywxNiArMzQ5LDE3IEBACiAgICAgfQogfQogCi0KIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBTb2Z0RmxhY0VuY29kZXI6Om9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCiAgICAgICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAotICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLCB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKSB7Ci0gICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZShieXRlcz0lZCwgc2FtcGxlcz0lZCwgY3Vycl9mcmFtZT0lZCkiLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSkgeworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShjdXJyZW50X2ZyYW1lKTsKKyAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjpvbkVuY29kZWRGbGFjQXZhaWxhYmxlKGJ5dGVzPSV6dSwgc2FtcGxlcz0ldSwgY3Vycl9mcmFtZT0ldSkiLAogICAgICAgICAgICAgYnl0ZXMsIHNhbXBsZXMsIGN1cnJlbnRfZnJhbWUpOwogCiAjaWZkZWYgV1JJVEVfRkxBQ19IRUFERVJfSU5fRklSU1RfQlVGRkVSCiAgICAgaWYgKHNhbXBsZXMgPT0gMCkgewotICAgICAgICBBTE9HSSgiIHNhdmluZyAlZCBieXRlcyBvZiBoZWFkZXIiLCBieXRlcyk7CisgICAgICAgIEFMT0dJKCIgc2F2aW5nICV6dSBieXRlcyBvZiBoZWFkZXIiLCBieXRlcyk7CiAgICAgICAgIG1lbWNweShtSGVhZGVyICsgbUhlYWRlck9mZnNldCwgYnVmZmVyLCBieXRlcyk7CiAgICAgICAgIG1IZWFkZXJPZmZzZXQgKz0gYnl0ZXM7Ly8gd2lsbCBjb250YWluIGhlYWRlciBzaXplIHdoZW4gZmluaXNoZWQgcmVjZWl2aW5nIGhlYWRlcgogICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOwpAQCAtNDQ0LDggKzQ1MSwxMiBAQAogCiAvLyBzdGF0aWMKIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBTb2Z0RmxhY0VuY29kZXI6OmZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjaygKLSAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKmVuY29kZXIsIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCi0gICAgICAgICAgICBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsIHZvaWQgKmNsaWVudF9kYXRhKSB7CisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICogLyogZW5jb2RlciAqLywKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCisgICAgICAgICAgICBzaXplX3QgYnl0ZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKSB7CiAgICAgcmV0dXJuICgoU29mdEZsYWNFbmNvZGVyKikgY2xpZW50X2RhdGEpLT5vbkVuY29kZWRGbGFjQXZhaWxhYmxlKAogICAgICAgICAgICAgYnVmZmVyLCBieXRlcywgc2FtcGxlcywgY3VycmVudF9mcmFtZSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rCmluZGV4IDRjODBkYTYuLmEwMTEyZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rCkBAIC0xNCw0ICsxNCw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9nNzExZGVjCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5tawppbmRleCA3MTYxM2QyLi4zMDg2OGQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQubWsKQEAgLTksNiArOSw4IEBACiAgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgIGV4dGVybmFsL2xpYmdzbS9pbmMKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKaW5kZXggYTNkNTc3OS4uMWQyMzJjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tawpAQCAtNDYsNiArNDYsOCBAQAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0VYUE9SVF9SRUY9IC1ET1NDTF9JTVBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC03Miw0ICs3NCw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGRlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCmluZGV4IDgzYTJkZDIuLmM5MDA2ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKQEAgLTMzLDYgKzMzLDggQEAKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTcyLDQgKzc0LDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWc0ZW5jCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAppbmRleCBkYTViNzg1Li5lMjU3MDlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKQEAgLTY3OSw3ICs2NzksNyBAQAogICAgICAgICAgICAgbVNhd0lucHV0RU9TID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBzcmNCdWZmZXI7IC8vIGZvciBNZXRhRGF0YU1vZGUgb25seQorICAgICAgICBidWZmZXJfaGFuZGxlX3Qgc3JjQnVmZmVyID0gTlVMTDsgLy8gZm9yIE1ldGFEYXRhTW9kZSBvbmx5CiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDApIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKmlucHV0RGF0YSA9IE5VTEw7CiAgICAgICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tawppbmRleCAxMzVjNzE1Li44Mjg0NDkwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCkBAIC01MCw2ICs1MCw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X21wM2RlYwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KQEAgLTY5LDYgKzcxLDggQEAKICAgICAgICAgJChMT0NBTF9QQVRIKS9zcmMgXAogICAgICAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAppbmRleCA0ZDg2NGRmLi41Mzk2MDIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKQEAgLTE0Niw2ICsxNDYsMjMgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvTXAzOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSAqbXAzUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX01QM1RZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChtcDNQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbXAzUGFyYW1zLT5uQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7CisgICAgICAgICAgICBtcDNQYXJhbXMtPm5CaXRSYXRlID0gMCAvKiB1bmtub3duICovOworICAgICAgICAgICAgbXAzUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IG1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAvLyBvdGhlciBmaWVsZHMgYXJlIGVuY29kZXItb25seQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CiAgICAgfQpAQCAtMzM1LDYgKzM1Miw5IEBACiAgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KICAgICAgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOwogICAgICAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgICAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKaW5kZXggN2YyYzQ2ZC4uOTNmZjY0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCkBAIC0yMCw0ICsyMCw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF92cHhkZWMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAppbmRleCA1ZWZlMDIyLi5kYzM4ZWE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCkBAIC0yNyw3ICsyNyw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotCiB0ZW1wbGF0ZTxjbGFzcyBUPgogc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKICAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOwpAQCAtMTQxLDE3ICsxNDAsMjcgQEAKICAgICAgIG1XaWR0aCgxNzYpLAogICAgICAgbUhlaWdodCgxNDQpLAogICAgICAgbUJpdHJhdGUoMTkyMDAwKSwgIC8vIGluIGJwcworICAgICAgbUZyYW1lcmF0ZSgzMCA8PCAxNiksIC8vIGluIFExNiBmb3JtYXQKICAgICAgIG1CaXRyYXRlVXBkYXRlZChmYWxzZSksCiAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlKFZQWF9WQlIpLCAgLy8gdmFyaWFibGUgYml0cmF0ZQotICAgICAgbUZyYW1lRHVyYXRpb25VcygzMzMzMyksICAvLyBEZWZhdWx0cyB0byAzMCBmcHMKICAgICAgIG1EQ1RQYXJ0aXRpb25zKDApLAogICAgICAgbUVycm9yUmVzaWxpZW5jZShPTVhfRkFMU0UpLAogICAgICAgbUNvbG9yRm9ybWF0KE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpLAogICAgICAgbUxldmVsKE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMCksCisgICAgICBtS2V5RnJhbWVJbnRlcnZhbCgwKSwKKyAgICAgIG1NaW5RdWFudGl6ZXIoMCksCisgICAgICBtTWF4UXVhbnRpemVyKDApLAorICAgICAgbVRlbXBvcmFsTGF5ZXJzKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVyblR5cGUoT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTm9uZSksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVybklkeCgwKSwKKyAgICAgIG1MYXN0VGltZXN0YW1wKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKSwKICAgICAgIG1Db252ZXJzaW9uQnVmZmVyKE5VTEwpLAogICAgICAgbUlucHV0RGF0YUlzTWV0YShmYWxzZSksCiAgICAgICBtR3JhbGxvY01vZHVsZShOVUxMKSwKICAgICAgIG1LZXlGcmFtZVJlcXVlc3RlZChmYWxzZSkgeworICAgIG1lbXNldChtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgMCwgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMF0gPSAxMDA7CiAgICAgaW5pdFBvcnRzKCk7CiB9CiAKQEAgLTE4MCw5ICsxODksOCBAQAogICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGlucHV0UG9ydC5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CiAgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKICAgICBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKLSAgICAvLyBmcmFtZVJhdGUgaXMgcmVjaXByb2NhbCBvZiBmcmFtZUR1cmF0aW9uLCB3aGljaCBpcwotICAgIC8vIGluIG1pY3Jvc2Vjb25kcy4gSXQgaXMgYWxzbyBpbiBRMTYgZm9ybWF0LgotICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9ICgxMDAwMDAwL21GcmFtZUR1cmF0aW9uVXMpIDw8IDE2OworICAgIC8vIGZyYW1lUmF0ZSBpcyBpbiBRMTYgZm9ybWF0LgorICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IG1GcmFtZXJhdGU7CiAgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CiAgICAgaW5wdXRQb3J0Lm5Qb3J0SW5kZXggPSBrSW5wdXRQb3J0SW5kZXg7CiAgICAgaW5wdXRQb3J0LmVEaXIgPSBPTVhfRGlySW5wdXQ7CkBAIC0yMjAsNyArMjI4LDcgQEAKICAgICBvdXRwdXRQb3J0LmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVlA4OwogICAgIG91dHB1dFBvcnQuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CiAgICAgb3V0cHV0UG9ydC5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7Ci0gICAgb3V0cHV0UG9ydC5uQnVmZmVyU2l6ZSA9IDI1NiAqIDEwMjQ7ICAvLyBhcmJpdHJhcnkKKyAgICBvdXRwdXRQb3J0Lm5CdWZmZXJTaXplID0gMTAyNCAqIDEwMjQ7IC8vIGFyYml0cmFyeQogCiAgICAgYWRkUG9ydChvdXRwdXRQb3J0KTsKIH0KQEAgLTIzNiw3ICsyNDQsOSBAQAogICAgIGlmIChtQ29kZWNJbnRlcmZhY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9Ci0KKyAgICBBTE9HRCgiVlA4OiBpbml0RW5jb2Rlci4gQlJNb2RlOiAldS4gVFNMYXllcnM6ICV6dS4gS0Y6ICV1LiBRUDogJXUgLSAldSIsCisgICAgICAgICAgKHVpbnQzMl90KW1CaXRyYXRlQ29udHJvbE1vZGUsIG1UZW1wb3JhbExheWVycywgbUtleUZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgbU1pblF1YW50aXplciwgbU1heFF1YW50aXplcik7CiAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdChtQ29kZWNJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAvLyBDb2RlYyBzcGVjaWZpYyBmbGFncwpAQCAtMjc3LDggKzI4NywxMjAgQEAKICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RpbWViYXNlLm51bSA9IDE7CiAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aW1lYmFzZS5kZW4gPSAxMDAwMDAwOwogICAgIC8vIHJjX3RhcmdldF9iaXRyYXRlIGlzIGluIGticHMsIG1CaXRyYXRlIGluIGJwcwotICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlID0gbUJpdHJhdGUvMTAwMDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9IChtQml0cmF0ZSArIDUwMCkgLyAxMDAwOwogICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2VuZF91c2FnZSA9IG1CaXRyYXRlQ29udHJvbE1vZGU7CisgICAgLy8gRGlzYWJsZSBmcmFtZSBkcm9wIC0gbm90IGFsbG93ZWQgaW4gTWVkaWFDb2RlYyBub3cuCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfZHJvcGZyYW1lX3RocmVzaCA9IDA7CisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICAvLyBEaXNhYmxlIHNwYXRpYWwgcmVzaXppbmcuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3Jlc2l6ZV9hbGxvd2VkID0gMDsKKyAgICAgICAgLy8gU2luZ2xlLXBhc3MgbW9kZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wYXNzID0gVlBYX1JDX09ORV9QQVNTOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0CisgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3VuZGVyc2hvb3RfcGN0ID0gMTAwOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfb3ZlcnNob290X3BjdCA9IDE1OworICAgICAgICAvLyBJbml0aWFsIHZhbHVlIG9mIHRoZSBidWZmZXIgbGV2ZWwgaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9pbml0aWFsX3N6ID0gNTAwOworICAgICAgICAvLyBBbW91bnQgb2YgZGF0YSB0aGF0IHRoZSBlbmNvZGVyIHNob3VsZCB0cnkgdG8gbWFpbnRhaW4gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9vcHRpbWFsX3N6ID0gNjAwOworICAgICAgICAvLyBUaGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgYnVmZmVyZWQgYnkgdGhlIGRlY29kaW5nCisgICAgICAgIC8vIGFwcGxpY2F0aW9uIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfc3ogPSAxMDAwOworICAgICAgICAvLyBFbmFibGUgZXJyb3IgcmVzaWxpZW5jZSAtIG5lZWRlZCBmb3IgcGFja2V0IGxvc3MuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gMTsKKyAgICAgICAgLy8gRGlzYWJsZSBsYWdnZWQgZW5jb2RpbmcuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfbGFnX2luX2ZyYW1lcyA9IDA7CisgICAgICAgIC8vIE1heGltdW0ga2V5IGZyYW1lIGludGVydmFsIC0gZm9yIENCUiBib29zdCB0byAzMDAwCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gMzAwMDsKKyAgICAgICAgLy8gRW5jb2RlciBkZXRlcm1pbmVzIG9wdGltYWwga2V5IGZyYW1lIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5LgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgICAgfQorCisgICAgLy8gRnJhbWVzIHRlbXBvcmFsIHBhdHRlcm4gLSBmb3Igbm93IFdlYlJUQyBsaWtlIHBhdHRlcm4gaXMgb25seSBzdXBwb3J0ZWQuCisgICAgc3dpdGNoIChtVGVtcG9yYWxMYXllcnMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICB7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgeworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsyXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzNdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls2XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAzOgorICAgICAgICB7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMzsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzNdID0gMjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0UoIldyb25nIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgJXUiLCBtVGVtcG9yYWxMYXllcnMpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgYml0cmF0ZSB2YWx1ZXMgZm9yIGVhY2ggbGF5ZXIKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnM7IGkrKykgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c190YXJnZXRfYml0cmF0ZVtpXSA9CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSAqCisgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSAvIDEwMDsKKyAgICB9CisgICAgaWYgKG1LZXlGcmFtZUludGVydmFsID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tYXhfZGlzdCA9IG1LZXlGcmFtZUludGVydmFsOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9taW5fZGlzdCA9IG1LZXlGcmFtZUludGVydmFsOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgICAgfQorICAgIGlmIChtTWluUXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19taW5fcXVhbnRpemVyID0gbU1pblF1YW50aXplcjsKKyAgICB9CisgICAgaWYgKG1NYXhRdWFudGl6ZXIgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX21heF9xdWFudGl6ZXIgPSBtTWF4UXVhbnRpemVyOworICAgIH0KIAogICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNfaW5pdChtQ29kZWNDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNJbnRlcmZhY2UsCkBAIC0yOTgsNiArNDIwLDMzIEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIC8vIEV4dHJhIENCUiBzZXR0aW5ncworICAgIGlmIChtQml0cmF0ZUNvbnRyb2xNb2RlID09IFZQWF9DQlIpIHsKKyAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gPT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICB1aW50MzJfdCByY19tYXhfaW50cmFfdGFyZ2V0ID0KKyAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfb3B0aW1hbF9zeiAqIChtRnJhbWVyYXRlID4+IDE3KSAvIDEwOworICAgICAgICAgICAgLy8gRG9uJ3QgZ28gYmVsb3cgMyB0aW1lcyBwZXIgZnJhbWUgYmFuZHdpZHRoLgorICAgICAgICAgICAgaWYgKHJjX21heF9pbnRyYV90YXJnZXQgPCAzMDApIHsKKyAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0ID0gMzAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX01BWF9JTlRSQV9CSVRSQVRFX1BDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjX21heF9pbnRyYV90YXJnZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gPT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfQ1BVVVNFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgY2JyIHBhcmFtZXRlcnMgZm9yIHZweCBlbmNvZGVyLiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyIHx8IG1JbnB1dERhdGFJc01ldGEpIHsKICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKTsKQEAgLTM2MSw5ICs1MTAsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKLSAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIGZyb20gbWljcm9zZWNvbmRzCi0gICAgICAgICAgICAgICAgLy8gQWxzbyBjb252ZXJ0aW5nIHRvIFExNiBmb3JtYXQKLSAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAoMTAwMDAwMC9tRnJhbWVEdXJhdGlvblVzKSA8PCAxNjsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSBtRnJhbWVyYXRlOwogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0ga091dHB1dFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1ZQODsKQEAgLTQxMSw2ICs1NTgsMjQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyOiB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSAqdnA4QW5kcm9pZFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFICopcGFyYW07CisKKyAgICAgICAgICAgICAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5LZXlGcmFtZUludGVydmFsID0gbUtleUZyYW1lSW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiA9IG1UZW1wb3JhbFBhdHRlcm5UeXBlOworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQ291bnQgPSBtVGVtcG9yYWxMYXllcnM7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+bk1pblF1YW50aXplciA9IG1NaW5RdWFudGl6ZXI7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+bk1heFF1YW50aXplciA9IG1NYXhRdWFudGl6ZXI7CisgICAgICAgICAgICAgICAgbWVtY3B5KHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZDogewogICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnByb2ZpbGVBbmRMZXZlbCA9CiAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcGFyYW07CkBAIC00OTcsMTEgKzY2MiwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0VnA4UGFyYW1zKAogICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSAqKXBhcmFtKTsKIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlcjoKKyAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFNldEFuZHJvaWRWcDhQYXJhbXMoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFICopcGFyYW0pOworCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6CiAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxTZXRQcm9maWxlTGV2ZWwoCiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcGFyYW0pOwogCi0gICAgICAgIGNhc2UgT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQ6CisgICAgICAgIGNhc2Uga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleDoKICAgICAgICAgewogICAgICAgICAgICAgLy8gc3RvcmVNZXRhRGF0YUluQnVmZmVycwogICAgICAgICAgICAgY29uc3QgU3RvcmVNZXRhRGF0YUluQnVmZmVyc1BhcmFtcyAqc3RvcmVQYXJhbSA9CkBAIC02MTAsNiArNzc5LDUwIEBACiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKK09NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcygKKyAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUqIHZwOEFuZHJvaWRQYXJhbXMpIHsKKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgIH0KKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiAhPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lICYmCisgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gIT0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50ID4gT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlMpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5NaW5RdWFudGl6ZXIgPiB2cDhBbmRyb2lkUGFyYW1zLT5uTWF4UXVhbnRpemVyKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorCisgICAgbVRlbXBvcmFsUGF0dGVyblR5cGUgPSB2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuOworICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuID09IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQykgeworICAgICAgICBtVGVtcG9yYWxMYXllcnMgPSB2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50OworICAgIH0gZWxzZSBpZiAodnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiA9PSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lKSB7CisgICAgICAgIG1UZW1wb3JhbExheWVycyA9IDA7CisgICAgfQorICAgIC8vIENoZWNrIHRoZSBiaXRyYXRlIGRpc3RyaWJ1dGlvbiBiZXR3ZWVuIGxheWVycyBpcyBpbiBpbmNyZWFzaW5nIG9yZGVyCisgICAgaWYgKG1UZW1wb3JhbExheWVycyA+IDEpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVGVtcG9yYWxMYXllcnMgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpICsgMV0gPD0KKyAgICAgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0pIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiV3JvbmcgYml0cmF0ZSByYXRpbyAtIHNob3VsZCBiZSBpbiBpbmNyZWFzaW5nIG9yZGVyLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUtleUZyYW1lSW50ZXJ2YWwgPSB2cDhBbmRyb2lkUGFyYW1zLT5uS2V5RnJhbWVJbnRlcnZhbDsKKyAgICBtTWluUXVhbnRpemVyID0gdnA4QW5kcm9pZFBhcmFtcy0+bk1pblF1YW50aXplcjsKKyAgICBtTWF4UXVhbnRpemVyID0gdnA4QW5kcm9pZFBhcmFtcy0+bk1heFF1YW50aXplcjsKKyAgICBtZW1jcHkobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLAorICAgICAgICAgICAgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgQUxPR0QoIlZQODogaW50ZXJuYWxTZXRBbmRyb2lkVnA4UGFyYW1zLiBCUk1vZGU6ICV1LiBUUzogJXp1LiBLRjogJXUuIgorICAgICAgICAgICIgUVA6ICV1IC0gJXUgQlIwOiAldS4gQlIxOiAldS4gQlIyOiAldSIsCisgICAgICAgICAgKHVpbnQzMl90KW1CaXRyYXRlQ29udHJvbE1vZGUsIG1UZW1wb3JhbExheWVycywgbUtleUZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgbU1pblF1YW50aXplciwgbU1heFF1YW50aXplciwgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMF0sCisgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMV0sIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzJdKTsKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KIAogT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRGb3JtYXRQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSogZm9ybWF0KSB7CkBAIC02NjAsOSArODczLDcgQEAKICAgICAgICAgbUhlaWdodCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAKICAgICAgICAgLy8geEZyYW1lcmF0ZSBjb21lcyBpbiBRMTYgZm9ybWF0LCBpbiBmcmFtZXMgcGVyIHNlY29uZCB1bml0Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGZyYW1lcmF0ZSA9IHBvcnQtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID4+IDE2OwotICAgICAgICAvLyBmcmFtZSBkdXJhdGlvbiBpcyBpbiBtaWNyb3NlY29uZHMKLSAgICAgICAgbUZyYW1lRHVyYXRpb25VcyA9ICgxMDAwMDAwL2ZyYW1lcmF0ZSk7CisgICAgICAgIG1GcmFtZXJhdGUgPSBwb3J0LT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKIAogICAgICAgICBpZiAocG9ydC0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIHx8CiAgICAgICAgICAgICBwb3J0LT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyIHx8CkBAIC02NzUsNyArODg2LDcgQEAKICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrSW5wdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKLSAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IHBvcnQtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gbUZyYW1lcmF0ZTsKICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gbUNvbG9yRm9ybWF0OwogICAgICAgICBkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKQEAgLTY4NCw2ICs4OTUsMTMgQEAKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfSBlbHNlIGlmIChwb3J0LT5uUG9ydEluZGV4ID09IGtPdXRwdXRQb3J0SW5kZXgpIHsKICAgICAgICAgbUJpdHJhdGUgPSBwb3J0LT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CisgICAgICAgIG1XaWR0aCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgbUhlaWdodCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gbUJpdHJhdGU7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CkBAIC03MTAsNiArOTI4LDc0IEBACiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKK3ZweF9lbmNfZnJhbWVfZmxhZ3NfdCBTb2Z0VlBYRW5jb2Rlcjo6Z2V0RW5jb2RlRmxhZ3MoKSB7CisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGZsYWdzID0gMDsKKyAgICBpbnQgcGF0dGVybklkeCA9IG1UZW1wb3JhbFBhdHRlcm5JZHggJSBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgrKzsKKyAgICBzd2l0Y2ggKG1UZW1wb3JhbFBhdHRlcm5bcGF0dGVybklkeF0pIHsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0OgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5OgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZToKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfRU5UUk9QWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmxhZ3M7Cit9CiAKIHZvaWQgU29mdFZQWEVuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkKQEAgLTc5NCw2ICsxMDgwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgIGtJbnB1dEJ1ZmZlckFsaWdubWVudCwgc291cmNlKTsKIAogICAgICAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAobVRlbXBvcmFsUGF0dGVybkxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZsYWdzID0gZ2V0RW5jb2RlRmxhZ3MoKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUtleUZyYW1lUmVxdWVzdGVkKSB7CiAgICAgICAgICAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CiAgICAgICAgICAgICBtS2V5RnJhbWVSZXF1ZXN0ZWQgPSBmYWxzZTsKQEAgLTgxNCwxMSArMTEwMywxOCBAQAogICAgICAgICAgICAgbUJpdHJhdGVVcGRhdGVkID0gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICB1aW50MzJfdCBmcmFtZUR1cmF0aW9uOworICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPiBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICAgICAgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgLSBtTGFzdFRpbWVzdGFtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KSgoKHVpbnQ2NF90KTEwMDAwMDAgPDwgMTYpIC8gbUZyYW1lcmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RUaW1lc3RhbXAgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY29kZSgKICAgICAgICAgICAgICAgICBtQ29kZWNDb250ZXh0LAogICAgICAgICAgICAgICAgICZyYXdfZnJhbWUsCiAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAsICAvLyBpbiB0aW1lYmFzZSB1bml0cwotICAgICAgICAgICAgICAgIG1GcmFtZUR1cmF0aW9uVXMsICAvLyBmcmFtZSBkdXJhdGlvbiBpbiB0aW1lYmFzZSB1bml0cworICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb24sICAvLyBmcmFtZSBkdXJhdGlvbiBpbiB0aW1lYmFzZSB1bml0cwogICAgICAgICAgICAgICAgIGZsYWdzLCAgLy8gZnJhbWUgZmxhZ3MKICAgICAgICAgICAgICAgICBWUFhfRExfUkVBTFRJTUUpOyAgLy8gZW5jb2RpbmcgZGVhZGxpbmUKICAgICAgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKQEAgLTg2MCwxMCArMTE1Niw5IEBACiBPTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjpnZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKICAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKSkgewotICAgICAgICAqaW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZDsKKyAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXg7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KLQogICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleChuYW1lLCBpbmRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCmluZGV4IDA3NjgzMGYuLmM1YTgzZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaApAQCAtOTEsNiArOTEsNDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKIAogcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleCA9IE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkICsgMSwKKyAgICB9OworCisgICAgZW51bSBUZW1wb3JhbFJlZmVyZW5jZXMgeworICAgICAgICAvLyBGb3IgMSBsYXllciBjYXNlOiByZWZlcmVuY2UgYWxsIChsYXN0LCBnb2xkZW4sIGFuZCBhbHQgcmVmKSwgYnV0IG9ubHkKKyAgICAgICAgLy8gdXBkYXRlIGxhc3QuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbGwgPSAxMiwKKyAgICAgICAgLy8gRmlyc3QgYmFzZSBsYXllciBmcmFtZSBmb3IgMyB0ZW1wb3JhbCBsYXllcnMsIHdoaWNoIHVwZGF0ZXMgbGFzdCBhbmQKKyAgICAgICAgLy8gZ29sZGVuIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmID0gMTEsCisgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWYgPSAxMCwKKyAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmID0gOSwKKyAgICAgICAgLy8gQmFzZSBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZiA9IDgsCisgICAgICAgIC8vIEhpZ2hlc3QgZW5oYWNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gZ29sZGVuIHdpdGggYWx0IHJlZgorICAgICAgICAvLyBkZXBlbmRlbmN5LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZHb2xkZW5SZWZBbHRSZWYgPSA3LAorICAgICAgICAvLyBTZWNvbmQgbGF5ZXIgYW5kIGxhc3QgZnJhbWUgaW4gY3ljbGUsIGZvciAyIGxheWVycy4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmQWx0cmVmID0gNiwKKyAgICAgICAgLy8gSGlnaGVzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZSA9IDUsCisgICAgICAgIC8vIFNlY29uZCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlQWx0cmVmID0gNCwKKyAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgLy8gdGhlIHNlY29uZCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlQWx0cmVmV2l0aG91dERlcGVuZGVuY3kgPSAzLAorICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuID0gMiwKKyAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIHByZXZpb3VzIGZyYW1lcyBpbgorICAgICAgICAvLyB0aGUgZmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5ID0gMSwKKyAgICAgICAgLy8gQmFzZSBsYXllci4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdCA9IDAsCisgICAgfTsKKyAgICBlbnVtIHsKKyAgICAgICAga01heFRlbXBvcmFsUGF0dGVybiA9IDgKKyAgICB9OworCiAgICAgLy8gbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIHBlciBwb3J0CiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtOdW1CdWZmZXJzID0gNDsKIApAQCAtMTMwLDE2ICsxNzEsMTUgQEAKICAgICAvLyBUYXJnZXQgYml0cmF0ZSBzZXQgZm9yIHRoZSBlbmNvZGVyLCBpbiBiaXRzIHBlciBzZWNvbmQuCiAgICAgdWludDMyX3QgbUJpdHJhdGU7CiAKKyAgICAvLyBUYXJnZXQgZnJhbWVyYXRlIHNldCBmb3IgdGhlIGVuY29kZXIuCisgICAgdWludDMyX3QgbUZyYW1lcmF0ZTsKKwogICAgIC8vIElmIGEgcmVxdWVzdCBmb3IgYSBjaGFuZ2UgaXQgYml0cmF0ZSBoYXMgYmVlbiByZWNlaXZlZC4KICAgICBib29sIG1CaXRyYXRlVXBkYXRlZDsKIAogICAgIC8vIEJpdHJhdGUgY29udHJvbCBtb2RlLCBlaXRoZXIgY29uc3RhbnQgb3IgdmFyaWFibGUKICAgICB2cHhfcmNfbW9kZSBtQml0cmF0ZUNvbnRyb2xNb2RlOwogCi0gICAgLy8gRnJhbWUgZHVyYXRpb24gaXMgdGhlIHJlY2lwcm9jYWwgb2YgZnJhbWVyYXRlLCBkZW5vdGVkCi0gICAgLy8gaW4gbWljcm9zZWNvbmRzCi0gICAgdWludDY0X3QgbUZyYW1lRHVyYXRpb25VczsKLQogICAgIC8vIHZwOCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcgogICAgIC8vIHRoYXQgZW5hYmxlcyB0b2tlbiBwYXJ0aXRpb25pbmcgb2YKICAgICAvLyB0aGUgc3RyZWFtIGludG8gc3Vic3RyZWFtcwpAQCAtMTYwLDYgKzIwMCwzNiBAQAogICAgIC8vIHNvbWV0aGluZyBlbHNlLgogICAgIE9NWF9WSURFT19WUDhMRVZFTFRZUEUgbUxldmVsOwogCisgICAgLy8gS2V5IGZyYW1lIGludGVydmFsIGluIGZyYW1lcworICAgIHVpbnQzMl90IG1LZXlGcmFtZUludGVydmFsOworCisgICAgLy8gTWluaW11bSAoYmVzdCBxdWFsaXR5KSBxdWFudGl6ZXIKKyAgICB1aW50MzJfdCBtTWluUXVhbnRpemVyOworCisgICAgLy8gTWF4aW11bSAod29yc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgdWludDMyX3QgbU1heFF1YW50aXplcjsKKworICAgIC8vIE51bWJlciBvZiBjb2RpbmcgdGVtcG9yYWwgbGF5ZXJzIHRvIGJlIHVzZWQuCisgICAgc2l6ZV90IG1UZW1wb3JhbExheWVyczsKKworICAgIC8vIFRlbXBvcmFsIGxheWVyIGJpdHJhcmUgcmF0aW8gaW4gcGVyY2VudGFnZQorICAgIHVpbnQzMl90IG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW09NWF9WSURFT19BTkRST0lEX01BWFZQOFRFTVBPUkFMTEFZRVJTXTsKKworICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gdHlwZQorICAgIE9NWF9WSURFT19BTkRST0lEX1ZQWFRFTVBPUkFMTEFZRVJQQVRURVJOVFlQRSBtVGVtcG9yYWxQYXR0ZXJuVHlwZTsKKworICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gbGVuZ3RoCisgICAgc2l6ZV90IG1UZW1wb3JhbFBhdHRlcm5MZW5ndGg7CisKKyAgICAvLyBUZW1wb3JhbCBwYXR0ZXJuIGN1cnJlbnQgaW5kZXgKKyAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybklkeDsKKworICAgIC8vIEZyYW1lIHR5cGUgdGVtcG9yYWwgcGF0dGVybgorICAgIFRlbXBvcmFsUmVmZXJlbmNlcyBtVGVtcG9yYWxQYXR0ZXJuW2tNYXhUZW1wb3JhbFBhdHRlcm5dOworCisgICAgLy8gTGFzdCBpbnB1dCBidWZmZXIgdGltZXN0YW1wCisgICAgT01YX1RJQ0tTIG1MYXN0VGltZXN0YW1wOworCiAgICAgLy8gQ29udmVyc2lvbiBidWZmZXIgaXMgbmVlZGVkIHRvIGNvbnZlcnQgc2VtaQogICAgIC8vIHBsYW5hciB5dXY0MjAgdG8gcGxhbmFyIGZvcm1hdAogICAgIC8vIEl0IGlzIG9ubHkgYWxsb2NhdGVkIGlmIGlucHV0IGZvcm1hdCBpcwpAQCAtMTg1LDYgKzI1NSw5IEBACiAgICAgLy8gZHRvci4KICAgICBzdGF0dXNfdCByZWxlYXNlRW5jb2RlcigpOwogCisgICAgLy8gR2V0IGN1cnJlbnQgZW5jb2RlIGZsYWdzCisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGdldEVuY29kZUZsYWdzKCk7CisKICAgICAvLyBIYW5kbGVzIHBvcnQgY2hhbmdlcyB3aXRoIHJlc3BlY3QgdG8gY29sb3IgZm9ybWF0cwogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRGb3JtYXRQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSogZm9ybWF0KTsKQEAgLTIwNiw2ICsyNzksMTAgQEAKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0VnA4UGFyYW1zKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSogdnA4UGFyYW1zKTsKIAorICAgIC8vIEhhbmRsZXMgQW5kcm9pZCB2cDggc3BlY2lmaWMgcGFyYW1ldGVycy4KKyAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcygKKyAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUqIHZwOEFuZHJvaWRQYXJhbXMpOworCiAgICAgLy8gVXBkYXRlcyBlbmNvZGVyIHByb2ZpbGUKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UHJvZmlsZUxldmVsKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSogcHJvZmlsZUFuZExldmVsKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCmluZGV4IDJiYjRjNGQuLjUyNGEzZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYwpAQCAtNDIsNiArNDIsOCBAQAogI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgogI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBWZXJzaW9uIEluZm9ybWF0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNzMsNiArNzUsNyBAQAogI2VuZGlmCiAKIHZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKSB7CisgICAgVU5VU0VEKHN0cmluZyk7CiB9CiAKIHZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwppbmRleCBjOTQ4Nzc2Li5iNDA5YTA2IDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwpAQCAtNDIsNiArNDIsOCBAQAogI2luY2x1ZGUgImFybVZDLmgiCiAjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIxMzYsNyArMjEzOCw4IEBACiAgIGkzMiBjZW50ZXIsCiAgIGkzMiByaWdodCkKIHsKLQorICAgIFVOVVNFRChsZWZ0KTsKKyAgICBVTlVTRUQocmlnaHQpOwogICAgIEFTU0VSVChyZWYpOwogICAgIEFTU0VSVChmaWxsKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCmluZGV4IGE3YzZmNjQuLjIzNDAxYzYgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKQEAgLTQ3LDYgKzQ3LDggQEAKICNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCiAjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDA3LDYgKzE0MDksNyBAQAogICAgIHUzMiB0bXAsIHZhbHVlLCBpOwogICAgIGkzMiBpdmFsdWU7CiAgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKyAgICBVTlVTRUQobmFsVW5pdFR5cGUpOwogCiAvKiBDb2RlICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NWIxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3OWM1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTkgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIFNvZnRPcHVzLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgZXh0ZXJuYWwvbGlib3B1cy9pbmNsdWRlIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYm9wdXMgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBsaWJsb2cKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfb3B1c2RlYworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDg0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCkBAIC0wLDAgKzEsNTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0T3B1cyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNvZnRPcHVzLmgiCisjaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8b3B1cy5oPgorICAgICNpbmNsdWRlIDxvcHVzX211bHRpc3RyZWFtLmg+Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludCBrUmF0ZSA9IDQ4MDAwOworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKKyAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKK30KKworU29mdE9wdXM6OlNvZnRPcHVzKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbURlY29kZXIoTlVMTCksCisgICAgICBtSGVhZGVyKE5VTEwpLAorICAgICAgbUNvZGVjRGVsYXkoMCksCisgICAgICBtU2Vla1ByZVJvbGwoMCksCisgICAgICBtQW5jaG9yVGltZVVzKDApLAorICAgICAgbU51bUZyYW1lc091dHB1dCgwKSwKKyAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSkgeworICAgIGluaXRQb3J0cygpOworICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKK1NvZnRPcHVzOjp+U29mdE9wdXMoKSB7CisgICAgaWYgKG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICBtRGVjb2RlciA9IE5VTEw7CisgICAgfQorICAgIGlmIChtSGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1IZWFkZXI7CisgICAgICAgIG1IZWFkZXIgPSBOVUxMOworICAgIH0KK30KKwordm9pZCBTb2Z0T3B1czo6aW5pdFBvcnRzKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDA7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDk2MCAqIDY7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPQorICAgICAgICBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0KKyAgICAgICAgKE9NWF9BVURJT19DT0RJTkdUWVBFKU9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUzsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyICogc2l6ZW9mKGludDE2X3QpOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgIGFkZFBvcnQoZGVmKTsKK30KKworc3RhdHVzX3QgU29mdE9wdXM6OmluaXREZWNvZGVyKCkgeworICAgIHJldHVybiBPSzsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T3B1czo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAob3B1c1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkF1ZGlvQmFuZFdpZHRoID0gMDsKKyAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5TYW1wbGVSYXRlID0ga1JhdGU7CisgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQml0UmF0ZSA9IDA7CisKKyAgICAgICAgICAgIGlmICghaXNDb25maWd1cmVkKCkpIHsKKyAgICAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQ2hhbm5lbHMgPSBtSGVhZGVyLT5jaGFubmVsczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOworICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOworICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0ga1JhdGU7CisKKyAgICAgICAgICAgIGlmICghaXNDb25maWd1cmVkKCkpIHsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gbUhlYWRlci0+Y2hhbm5lbHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9wdXM6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoKGludClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5vcHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAob3B1c1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworYm9vbCBTb2Z0T3B1czo6aXNDb25maWd1cmVkKCkgY29uc3QgeworICAgIHJldHVybiBtSW5wdXRCdWZmZXJDb3VudCA+PSAxOworfQorCitzdGF0aWMgdWludDE2X3QgUmVhZExFMTYoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWFkX29mZnNldCkgeworICAgIGlmIChyZWFkX29mZnNldCArIDEgPiBkYXRhX3NpemUpCisgICAgICAgIHJldHVybiAwOworICAgIHVpbnQxNl90IHZhbDsKKyAgICB2YWwgPSBkYXRhW3JlYWRfb2Zmc2V0XTsKKyAgICB2YWwgfD0gZGF0YVtyZWFkX29mZnNldCArIDFdIDw8IDg7CisgICAgcmV0dXJuIHZhbDsKK30KKworLy8gT3B1cyB1c2VzIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcsIGFuZCBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nIHNwZWNpZmllcworLy8gbWFwcGluZ3MgZm9yIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgVm9yYmlzIEkKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vd3d3LnhpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVscyA9IDg7CisKKy8vIE1heGltdW0gcGFja2V0IHNpemUgdXNlZCBpbiBYaXBoJ3Mgb3B1c2RlYy4KK3N0YXRpYyBjb25zdCBpbnQga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcyA9IDk2MCAqIDY7CisKKy8vIERlZmF1bHQgYXVkaW8gb3V0cHV0IGNoYW5uZWwgbGF5b3V0LiBVc2VkIHRvIGluaXRpYWxpemUgfHN0cmVhbV9tYXB8IGluCisvLyBPcHVzSGVhZGVyLCBhbmQgcGFzc2VkIHRvIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoKSB3aGVuIHRoZSBoZWFkZXIKKy8vIGRvZXMgbm90IGNvbnRhaW4gbWFwcGluZyBpbmZvcm1hdGlvbi4gVGhlIHZhbHVlcyBhcmUgdmFsaWQgb25seSBmb3IgbW9ubyBhbmQKKy8vIHN0ZXJlbyBvdXRwdXQ6IE9wdXMgc3RyZWFtcyB3aXRoIG1vcmUgdGhhbiAyIGNoYW5uZWxzIHJlcXVpcmUgYSBzdHJlYW0gbWFwLgorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCA9IDI7CitzdGF0aWMgY29uc3QgdWludDhfdCBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0W2tNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0XSA9IHsgMCwgMSB9OworCisvLyBQYXJzZXMgT3B1cyBIZWFkZXIuIEhlYWRlciBzcGVjOiBodHRwOi8vd2lraS54aXBoLm9yZy9PZ2dPcHVzI0lEX0hlYWRlcgorc3RhdGljIGJvb2wgUGFyc2VPcHVzSGVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B1c0hlYWRlciogaGVhZGVyKSB7CisgICAgLy8gU2l6ZSBvZiB0aGUgT3B1cyBoZWFkZXIgZXhjbHVkaW5nIG9wdGlvbmFsIG1hcHBpbmcgaW5mb3JtYXRpb24uCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2l6ZSA9IDE5OworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBjaGFubmVsIGNvdW50IGJ5dGUgaW4gdGhlIE9wdXMgaGVhZGVyLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlckNoYW5uZWxzT2Zmc2V0ID0gOTsKKworICAgIC8vIE9mZnNldCB0byB0aGUgcHJlLXNraXAgdmFsdWUgaW4gdGhlIE9wdXMgaGVhZGVyLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0ID0gMTA7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGdhaW4gdmFsdWUgaW4gdGhlIE9wdXMgaGVhZGVyLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlckdhaW5PZmZzZXQgPSAxNjsKKworICAgIC8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBtYXBwaW5nIGJ5dGUgaW4gdGhlIE9wdXMgaGVhZGVyLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0ID0gMTg7CisKKyAgICAvLyBPcHVzIEhlYWRlciBjb250YWlucyBhIHN0cmVhbSBtYXAuIFRoZSBtYXBwaW5nIHZhbHVlcyBhcmUgaW4gdGhlIGhlYWRlcgorICAgIC8vIGJleW9uZCB0aGUgYWx3YXlzIHByZXNlbnQgfGtPcHVzSGVhZGVyU2l6ZXwgYnl0ZXMgb2YgZGF0YS4gVGhlIG1hcHBpbmcKKyAgICAvLyBkYXRhIGNvbnRhaW5zIHN0cmVhbSBjb3VudCwgY291cGxpbmcgaW5mb3JtYXRpb24sIGFuZCBwZXIgY2hhbm5lbCBtYXBwaW5nCisgICAgLy8gdmFsdWVzOgorICAgIC8vICAgLSBCeXRlIDA6IE51bWJlciBvZiBzdHJlYW1zLgorICAgIC8vICAgLSBCeXRlIDE6IE51bWJlciBjb3VwbGVkLgorICAgIC8vICAgLSBCeXRlIDI6IFN0YXJ0aW5nIGF0IGJ5dGUgMiBhcmUgfGhlYWRlci0+Y2hhbm5lbHN8IHVpbnQ4IG1hcHBpbmcKKyAgICAvLyAgICAgICAgICAgICB2YWx1ZXMuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCA9IGtPcHVzSGVhZGVyU2l6ZTsKKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJOdW1Db3VwbGVkT2Zmc2V0ID0ga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ICsgMTsKKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgPSBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgKyAyOworCisgICAgaWYgKGRhdGFfc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZSkgeworICAgICAgICBBTE9HVigiSGVhZGVyIHNpemUgaXMgdG9vIHNtYWxsLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+Y2hhbm5lbHMgPSAqKGRhdGEgKyBrT3B1c0hlYWRlckNoYW5uZWxzT2Zmc2V0KTsKKworICAgIGlmIChoZWFkZXItPmNoYW5uZWxzIDw9IDAgfHwgaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIHdyb25nIGNoYW5uZWwgY291bnQ6ICVkIiwgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5za2lwX3NhbXBsZXMgPSBSZWFkTEUxNihkYXRhLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCk7CisgICAgaGVhZGVyLT5nYWluX2RiID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkTEUxNihkYXRhLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3B1c0hlYWRlckdhaW5PZmZzZXQpKTsKKyAgICBoZWFkZXItPmNoYW5uZWxfbWFwcGluZyA9ICooZGF0YSArIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQpOworICAgIGlmICghaGVhZGVyLT5jaGFubmVsX21hcHBpbmcpIHsKKyAgICAgICAgaWYgKGhlYWRlci0+Y2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCkgeworICAgICAgICAgICAgQUxPR1YoIkludmFsaWQgSGVhZGVyLCBtaXNzaW5nIHN0cmVhbSBtYXAuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9IDE7CisgICAgICAgIGhlYWRlci0+bnVtX2NvdXBsZWQgPSBoZWFkZXItPmNoYW5uZWxzID4gMTsKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwWzBdID0gMDsKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwWzFdID0gMTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChkYXRhX3NpemUgPCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkludmFsaWQgc3RyZWFtIG1hcDsgaW5zdWZmaWNpZW50IGRhdGEgZm9yIGN1cnJlbnQgY2hhbm5lbCAiCisgICAgICAgICAgICAgICJjb3VudDogJWQiLCBoZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPm51bV9zdHJlYW1zID0gKihkYXRhICsga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0KTsKKyAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gKihkYXRhICsga09wdXNIZWFkZXJOdW1Db3VwbGVkT2Zmc2V0KTsKKyAgICBpZiAoaGVhZGVyLT5udW1fc3RyZWFtcyArIGhlYWRlci0+bnVtX2NvdXBsZWQgIT0gaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW5jb25zaXN0ZW50IGNoYW5uZWwgbWFwcGluZy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci0+Y2hhbm5lbHM7ICsraSkKKyAgICAgIGhlYWRlci0+c3RyZWFtX21hcFtpXSA9ICooZGF0YSArIGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIENvbnZlcnQgbmFub3NlY29uZHMgdG8gbnVtYmVyIG9mIHNhbXBsZXMuCitzdGF0aWMgdWludDY0X3QgbnNfdG9fc2FtcGxlcyh1aW50NjRfdCBucywgaW50IGtSYXRlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obnMpICoga1JhdGUgLyAxMDAwMDAwMDAwOworfQorCit2b2lkIFNvZnRPcHVzOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICBpZiAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgbUlucHV0QnVmZmVyQ291bnQgPCAzKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gaW5mby0+bUhlYWRlcjsKKworICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaGVhZGVyLT5wQnVmZmVyICsgaGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBzaXplX3Qgc2l6ZSA9IGhlYWRlci0+bkZpbGxlZExlbjsKKworICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgQ0hFQ0sobUhlYWRlciA9PSBOVUxMKTsKKyAgICAgICAgICAgIG1IZWFkZXIgPSBuZXcgT3B1c0hlYWRlcigpOworICAgICAgICAgICAgbWVtc2V0KG1IZWFkZXIsIDAsIHNpemVvZigqbUhlYWRlcikpOworICAgICAgICAgICAgaWYgKCFQYXJzZU9wdXNIZWFkZXIoZGF0YSwgc2l6ZSwgbUhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiUGFyc2luZyBPcHVzIEhlYWRlciBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX21hcHBpbmdba01heENoYW5uZWxzXSA9IHswfTsKKyAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXQsCisgICAgICAgICAgICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOworCisgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bV9zdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bV9jb3VwbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICghbURlY29kZXIgfHwgc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVigib3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSBmYWlsZWQgc3RhdHVzPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPQorICAgICAgICAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFVTX1NFVF9HQUlOKG1IZWFkZXItPmdhaW5fZGIpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJGYWlsZWQgdG8gc2V0IE9QVVMgaGVhZGVyIGdhaW47IHN0YXR1cz0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDEpIHsKKyAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gbnNfdG9fc2FtcGxlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oaGVhZGVyLT5wQnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5uT2Zmc2V0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gbnNfdG9fc2FtcGxlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGhlYWRlci0+cEJ1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPm5PZmZzZXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSk7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgIH0KKworICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGhlYWRlcik7CisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworCisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoZW4gc2Vla2luZyB0byB6ZXJvLCB8bUNvZGVjRGVsYXl8IHNhbXBsZXMgaGFzIHRvIGJlIGRpc2NhcmRlZAorICAgICAgICAvLyBpbnN0ZWFkIG9mIHxtU2Vla1ByZVJvbGx8IHNhbXBsZXMgKGFzIHdlIHdvdWxkIHdoZW4gc2Vla2luZyB0byBhbnkKKyAgICAgICAgLy8gb3RoZXIgdGltZXN0YW1wKS4KKyAgICAgICAgaWYgKGluSGVhZGVyLT5uVGltZVN0YW1wID09IDApIHsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworCisgICAgICAgIGludCBudW1GcmFtZXMgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZShtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKilvdXRIZWFkZXItPnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGlmIChudW1GcmFtZXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgib3B1c19tdWx0aXN0cmVhbV9kZWNvZGUgcmV0dXJuZWQgJWQiLCBudW1GcmFtZXMpOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKKyAgICAgICAgaWYgKG1TYW1wbGVzVG9EaXNjYXJkID4gMCkgeworICAgICAgICAgICAgaWYgKG1TYW1wbGVzVG9EaXNjYXJkID4gbnVtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgLT0gbnVtRnJhbWVzOworICAgICAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG51bUZyYW1lcyAtPSBtU2FtcGxlc1RvRGlzY2FyZDsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSBtU2FtcGxlc1RvRGlzY2FyZCAqIHNpemVvZihpbnQxNl90KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHM7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci0+Y2hhbm5lbHM7CisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKworICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtQW5jaG9yVGltZVVzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGU7CisKKyAgICAgICAgbU51bUZyYW1lc091dHB1dCArPSBudW1GcmFtZXM7CisKKyAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworCisgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworCisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgfQorfQorCit2b2lkIFNvZnRPcHVzOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBuZXh0IGJ1ZmZlciBvdXRwdXQgZG9lcyBub3Qgc3RpbGwKKyAgICAgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgorICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwgT1BVU19SRVNFVF9TVEFURSk7CisgICAgICAgIG1BbmNob3JUaW1lVXMgPSAwOworICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1TZWVrUHJlUm9sbDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdE9wdXM6Om9uUmVzZXQoKSB7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgIGlmIChtRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBOVUxMOworICAgIH0KKyAgICBpZiAobUhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtSGVhZGVyOworICAgICAgICBtSGVhZGVyID0gTlVMTDsKKyAgICB9CisKKyAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKK30KKwordm9pZCBTb2Z0T3B1czo6b25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpIHsKKyAgICBpZiAocG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFXQUlUSU5HX0RJU0FCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyghZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlLCAoaW50KUFXQUlUSU5HX0VOQUJMRUQpOworICAgICAgICAgICAgQ0hFQ0soZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRPcHVzKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmNjU2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhlIE9wdXMgc3BlY2lmaWNhdGlvbiBpcyBwYXJ0IG9mIElFVEYgUkZDIDY3MTY6CisgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NzE2CisgKi8KKworI2lmbmRlZiBTT0ZUX09QVVNfSF8KKworI2RlZmluZSBTT0ZUX09QVVNfSF8KKworI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKworc3RydWN0IE9wdXNNU0RlY29kZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE9wdXNIZWFkZXIgeworICBpbnQgY2hhbm5lbHM7CisgIGludCBza2lwX3NhbXBsZXM7CisgIGludCBjaGFubmVsX21hcHBpbmc7CisgIGludCBudW1fc3RyZWFtczsKKyAgaW50IG51bV9jb3VwbGVkOworICBpbnQxNl90IGdhaW5fZGI7CisgIHVpbnQ4X3Qgc3RyZWFtX21hcFs4XTsKK307CisKK3N0cnVjdCBTb2Z0T3B1cyA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICBTb2Z0T3B1cyhjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U29mdE9wdXMoKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCk7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bUJ1ZmZlcnMgPSA0LAorICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciA9IDk2MCAqIDYKKyAgICB9OworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgT3B1c01TRGVjb2RlciAqbURlY29kZXI7CisgICAgT3B1c0hlYWRlciAqbUhlYWRlcjsKKworICAgIGludDY0X3QgbUNvZGVjRGVsYXk7CisgICAgaW50NjRfdCBtU2Vla1ByZVJvbGw7CisgICAgaW50NjRfdCBtU2FtcGxlc1RvRGlzY2FyZDsKKyAgICBpbnQ2NF90IG1BbmNob3JUaW1lVXM7CisgICAgaW50NjRfdCBtTnVtRnJhbWVzT3V0cHV0OworCisgICAgZW51bSB7CisgICAgICAgIE5PTkUsCisgICAgICAgIEFXQUlUSU5HX0RJU0FCTEVELAorICAgICAgICBBV0FJVElOR19FTkFCTEVECisgICAgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOworCisgICAgdm9pZCBpbml0UG9ydHMoKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0T3B1cyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfT1BVU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLm1rCmluZGV4IGZlOTBhMDMuLjg3MDgwZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQubWsKQEAgLTgsNiArOCw4IEBACiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCiAgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfb214IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMgbGlibG9nCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCmluZGV4IDIyMzIzNTMuLjIxN2E2ZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tawpAQCAtMTYsNCArMTYsNiBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfdm9yYmlzZGVjCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWY5M2RlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5tcDMuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXBlZyIgLz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5kZWNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIiAvPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiIgLz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIiAvPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLWFsYXciIC8+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL2c3MTEtbWxhdyIgLz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vdm9yYmlzIiAvPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vb3B1cyIgLz4KKyAgICA8L0RlY29kZXJzPgorCisgICAgPEVuY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmFhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iIC8+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZW5jb2RlciIgdHlwZT0iYXVkaW8vM2dwcCIgLz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5lbmNvZGVyIiB0eXBlPSJhdWRpby9hbXItd2IiIC8+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIiAvPgorICAgIDwvRW5jb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGY1ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxJbmNsdWRlZD4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZ3NtLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2dzbSIgLz4KKyAgICA8L0RlY29kZXJzPgorPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTBlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmRlY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiIC8+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2My5kZWNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIiAvPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIgdHlwZT0idmlkZW8vYXZjIiAvPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4IiAvPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLnZwOS5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5IiAvPgorICAgIDwvRGVjb2RlcnM+CisKKyAgICA8RW5jb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2My5lbmNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIiAvPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIiAvPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmVuY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiIC8+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudnA4LmVuY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiIC8+CisgICAgPC9FbmNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAppbmRleCBiNmIyMWYxLi5mMmQ1MDFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlICJBRGVidWcuaCIKICNpbmNsdWRlICJBU3RyaW5nLmgiCiAKQEAgLTQ4LDYgKzQ5LDEzIEBACiAgICAgc2V0VG8ocywgc2l6ZSk7CiB9CiAKK0FTdHJpbmc6OkFTdHJpbmcoY29uc3QgU3RyaW5nOCAmZnJvbSkKKyAgICA6IG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtQWxsb2NTaXplKDEpIHsKKyAgICBzZXRUbyhmcm9tLnN0cmluZygpLCBmcm9tLmxlbmd0aCgpKTsKK30KKwogQVN0cmluZzo6QVN0cmluZyhjb25zdCBBU3RyaW5nICZmcm9tKQogICAgIDogbURhdGEoTlVMTCksCiAgICAgICBtU2l6ZSgwKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAppbmRleCBkNWZiNGUwLi5kY2Y1YmVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCkBAIC0zMyw2ICszMywxMCBAQAogCiAgICAgICAgIGlmIChuID49IDIgJiYgcy5jX3N0cigpW24gLSAyXSA9PSAnPScpIHsKICAgICAgICAgICAgIHBhZGRpbmcgPSAyOworCisgICAgICAgICAgICBpZiAobiA+PSAzICYmIHMuY19zdHIoKVtuIC0gM10gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgcGFkZGluZyA9IDM7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTcxLDcgKzc1LDcgQEAKICAgICAgICAgaWYgKCgoaSArIDEpICUgNCkgPT0gMCkgewogICAgICAgICAgICAgb3V0W2orK10gPSAoYWNjdW0gPj4gMTYpOwogCi0gICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeyBvdXRbaisrXSA9IChhY2N1bSA+PiA4KSAmIDB4ZmY7IH0gCisgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeyBvdXRbaisrXSA9IChhY2N1bSA+PiA4KSAmIDB4ZmY7IH0KICAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gYWNjdW0gJiAweGZmOyB9CiAKICAgICAgICAgICAgIGFjY3VtID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjMzMDdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjggQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSwgdHJ1ZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgIFwKKyAgICAgICAgSFRUUEhlbHBlci5jcHAgICAgICAgICAgXAorCitMT0NBTF9DX0lOQ0xVREVTOj0gXAorCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKyAgICAgICAgbGliYW5kcm9pZF9ydW50aW1lIFwKKyAgICAgICAgbGlibWVkaWEKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfaHR0cF9zdXBwb3J0CisKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzg0NWUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmNwcApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJIVFRQSGVscGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSFRUUEhlbHBlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSAiYW5kcm9pZF91dGlsX0JpbmRlci5oIgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvU2NvcGVkTG9jYWxSZWYuaD4KKyNpbmNsdWRlICJqbmkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzcDxJTWVkaWFIVFRQU2VydmljZT4gQ3JlYXRlSFRUUFNlcnZpY2VJbkN1cnJlbnRKYXZhQ29udGV4dCgpIHsKKyAgICBpZiAoQW5kcm9pZFJ1bnRpbWU6OmdldEphdmFWTSgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkNyZWF0ZUhUVFBTZXJ2aWNlSW5DdXJyZW50SmF2YUNvbnRleHQgY2FsbGVkIG91dHNpZGUgIgorICAgICAgICAgICAgICAiSkFWQSBlbnZpcm9ubWVudC4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IGNsYXp6KAorICAgICAgICAgICAgZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlIikpOworICAgIENIRUNLKGNsYXp6LmdldCgpICE9IE5VTEwpOworCisgICAgam1ldGhvZElEIGNvbnN0cnVjdElEID0gZW52LT5HZXRNZXRob2RJRChjbGF6ei5nZXQoKSwgIjxpbml0PiIsICIoKVYiKTsKKyAgICBDSEVDSyhjb25zdHJ1Y3RJRCAhPSBOVUxMKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpvYmplY3Q+IGh0dHBTZXJ2aWNlT2JqKAorICAgICAgICAgICAgZW52LCBlbnYtPk5ld09iamVjdChjbGF6ei5nZXQoKSwgY29uc3RydWN0SUQpKTsKKworICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKKyAgICBpZiAoaHR0cFNlcnZpY2VPYmouZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICBqbWV0aG9kSUQgYXNCaW5kZXJJRCA9CisgICAgICAgICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LmdldCgpLCAiYXNCaW5kZXIiLCAiKClMYW5kcm9pZC9vcy9JQmluZGVyOyIpOworICAgICAgICBDSEVDSyhhc0JpbmRlcklEICE9IE5VTEwpOworCisgICAgICAgIFNjb3BlZExvY2FsUmVmPGpvYmplY3Q+IGh0dHBTZXJ2aWNlQmluZGVyT2JqKAorICAgICAgICAgICAgICAgIGVudiwgZW52LT5DYWxsT2JqZWN0TWV0aG9kKGh0dHBTZXJ2aWNlT2JqLmdldCgpLCBhc0JpbmRlcklEKSk7CisgICAgICAgIENIRUNLKGh0dHBTZXJ2aWNlQmluZGVyT2JqLmdldCgpICE9IE5VTEwpOworCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgICAgICBpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIGh0dHBTZXJ2aWNlQmluZGVyT2JqLmdldCgpKTsKKworICAgICAgICBodHRwU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihiaW5kZXIpOworICAgIH0KKworICAgIHJldHVybiBodHRwU2VydmljZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2NSUKcmVuYW1lIGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuaAppbmRleCAxM2NhYzZkLi44YWVmMTE1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaWZuZGVmIEhUVFBfSEVMUEVSX0hfCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjZGVmaW5lIEhUVFBfSEVMUEVSX0hfCiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK25hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworCitzcDxJTWVkaWFIVFRQU2VydmljZT4gQ3JlYXRlSFRUUFNlcnZpY2VJbkN1cnJlbnRKYXZhQ29udGV4dCgpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEhUVFBfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyOTkxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFIVFRQIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUhUVFA6Ok1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAorICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCisgICAgICBtQ2FjaGVkU2l6ZSgwbGwpLAorICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgeworICAgIG1Jbml0Q2hlY2sgPSBPSzsKK30KKworTWVkaWFIVFRQOjp+TWVkaWFIVFRQKCkgeworICAgIGNsZWFyRFJNU3RhdGVfbCgpOworfQorCitzdGF0dXNfdCBNZWRpYUhUVFA6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIG9mZjY0X3QgLyogb2Zmc2V0ICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gZXh0SGVhZGVyczsKKyAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGV4dEhlYWRlcnMgPSAqaGVhZGVyczsKKyAgICB9CisgICAgZXh0SGVhZGVycy5hZGQoU3RyaW5nOCgiVXNlci1BZ2VudCIpLCBTdHJpbmc4KE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpKSk7CisKKyAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QodXJpLCAmZXh0SGVhZGVycyk7CisKKyAgICBtTGFzdEhlYWRlcnMgPSBleHRIZWFkZXJzOworICAgIG1MYXN0VVJJID0gdXJpOworCisgICAgbUNhY2hlZFNpemVWYWxpZCA9IGZhbHNlOworCisgICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3ZvaWQgTWVkaWFIVFRQOjpkaXNjb25uZWN0KCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSFRUUENvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3NzaXplX3QgTWVkaWFIVFRQOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKKyAgICB3aGlsZSAobnVtQnl0ZXNSZWFkIDwgc2l6ZSkgeworICAgICAgICBzaXplX3QgY29weSA9IHNpemUgLSBudW1CeXRlc1JlYWQ7CisKKyAgICAgICAgaWYgKGNvcHkgPiA2NCAqIDEwMjQpIHsKKyAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBidWZmZXIgc2l6ZXMgdHJhbnNmZXJyZWQgYWNyb3NzIGJpbmRlciBib3VuZGFyaWVzCisgICAgICAgICAgICAvLyB0byBhdm9pZCBzcHVyaW91cyB0cmFuc2FjdGlvbiBmYWlsdXJlcy4KKyAgICAgICAgICAgIGNvcHkgPSA2NCAqIDEwMjQ7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG4gPSBtSFRUUENvbm5lY3Rpb24tPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBvZmZzZXQgKyBudW1CeXRlc1JlYWQsICh1aW50OF90ICopZGF0YSArIG51bUJ5dGVzUmVhZCwgY29weSk7CisKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbnVtQnl0ZXNSZWFkICs9IG47CisgICAgfQorCisgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworCisgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobnVtQnl0ZXNSZWFkLCBkZWxheVVzKTsKKworICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Cit9CisKK3N0YXR1c190IE1lZGlhSFRUUDo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgLy8gQ2FjaGluZyB0aGUgcmV0dXJuZWQgc2l6ZSBzbyB0aGF0IGl0IHN0YXlzIHZhbGlkIGV2ZW4gYWZ0ZXIgYQorICAgIC8vIGRpc2Nvbm5lY3QuIE51Q2FjaGVkU291cmNlMiByZWxpZXMgb24gdGhpcy4KKworICAgIGlmICghbUNhY2hlZFNpemVWYWxpZCkgeworICAgICAgICBtQ2FjaGVkU2l6ZSA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0U2l6ZSgpOworICAgICAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAqc2l6ZSA9IG1DYWNoZWRTaXplOworCisgICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogT0s7Cit9CisKK3VpbnQzMl90IE1lZGlhSFRUUDo6ZmxhZ3MoKSB7CisgICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOworfQorCitzdGF0dXNfdCBNZWRpYUhUVFA6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgcmV0dXJuIGNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJm1MYXN0SGVhZGVycywgb2Zmc2V0KTsKK30KKworLy8gRFJNLi4uCisKK3NwPERlY3J5cHRIYW5kbGU+IE1lZGlhSFRUUDo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSkgeworICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gbmV3IERybU1hbmFnZXJDbGllbnQoKTsKKyAgICB9CisKKyAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5vcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICAgICAgU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKSwgbWltZSk7CisgICAgfQorCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1Ecm1NYW5hZ2VyQ2xpZW50OworICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOworfQorCit2b2lkIE1lZGlhSFRUUDo6Z2V0RHJtSW5mbygKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgeworICAgIGhhbmRsZSA9IG1EZWNyeXB0SGFuZGxlOworICAgICpjbGllbnQgPSBtRHJtTWFuYWdlckNsaWVudDsKK30KKworU3RyaW5nOCBNZWRpYUhUVFA6OmdldFVyaSgpIHsKKyAgICBTdHJpbmc4IHVyaTsKKyAgICBpZiAoT0sgPT0gbUhUVFBDb25uZWN0aW9uLT5nZXRVcmkoJnVyaSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSk7Cit9CisKK1N0cmluZzggTWVkaWFIVFRQOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgU3RyaW5nOCBtaW1lVHlwZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUENvbm5lY3Rpb24tPmdldE1JTUVUeXBlKCZtaW1lVHlwZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWltZVR5cGU7Cit9CisKK3ZvaWQgTWVkaWFIVFRQOjpjbGVhckRSTVN0YXRlX2woKSB7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgLy8gVG8gcmVsZWFzZSBtRGVjcnlwdEhhbmRsZQorICAgICAgICBDSEVDSyhtRHJtTWFuYWdlckNsaWVudCk7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5jbG9zZURlY3J5cHRTZXNzaW9uKG1EZWNyeXB0SGFuZGxlKTsKKyAgICAgICAgbURlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCmluZGV4IGYzNTI5ZjkuLmU4ZDU1OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawpAQCAtMTMsNiArMTMsOCBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCSQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYmNyeXB0byBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKaW5kZXggNmQ0OGFiNy4uMDhhMTQ2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcApAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM0LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCkBAIC00NywxNyArNTAsMTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTGl2ZVNlc3Npb246OkxpdmVTZXNzaW9uKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWludDMyX3QgZmxhZ3MsIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCkKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKQogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1VSURWYWxpZCh1aWRWYWxpZCksCi0gICAgICBtVUlEKHVpZCksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAogICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSh0cnVlKSwKLSAgICAgIG1IVFRQRGF0YVNvdXJjZSgKLSAgICAgICAgICAgICAgSFRUUEJhc2U6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykKLSAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KLSAgICAgICAgICAgICAgICAgICAgOiAwKSksCisgICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChtSFRUUFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCiAgICAgICBtUHJldkJhbmR3aWR0aEluZGV4KC0xKSwKICAgICAgIG1TdHJlYW1NYXNrKDApLAogICAgICAgbU5ld1N0cmVhbU1hc2soMCksCkBAIC03MCw5ICs2OSw2IEBACiAgICAgICBtU3dpdGNoSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtRGlzY29ubmVjdFJlcGx5SUQoMCksCiAgICAgICBtU2Vla1JlcGx5SUQoMCkgewotICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgbUhUVFBEYXRhU291cmNlLT5zZXRVSUQobVVJRCk7Ci0gICAgfQogCiAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdID0gU3RyZWFtSXRlbSgiYXVkaW8iKTsKICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0gPSBTdHJlYW1JdGVtKCJ2aWRlbyIpOwpAQCAtNDgxLDExICs0NzcsOCBAQAogICAgICAgICBoZWFkZXJzID0gTlVMTDsKICAgICB9CiAKLSNpZiAxCi0gICAgQUxPR0koIm9uQ29ubmVjdCA8VVJMIHN1cHByZXNzZWQ+Iik7Ci0jZWxzZQotICAgIEFMT0dJKCJvbkNvbm5lY3QgJXMiLCB1cmwuY19zdHIoKSk7Ci0jZW5kaWYKKyAgICAvLyBUT0RPIGN1cnJlbnRseSB3ZSBkb24ndCBrbm93IGlmIHdlIGFyZSBjb21pbmcgaGVyZSBmcm9tIGluY29nbml0byBtb2RlCisgICAgQUxPR0koIm9uQ29ubmVjdCAlcyIsIHVyaURlYnVnU3RyaW5nKHVybCkuY19zdHIoKSk7CiAKICAgICBtTWFzdGVyVVJMID0gdXJsOwogCkBAIC00OTMsNyArNDg2LDcgQEAKICAgICBtUGxheWxpc3QgPSBmZXRjaFBsYXlsaXN0KHVybC5jX3N0cigpLCBOVUxMIC8qIGN1clBsYXlsaXN0SGFzaCAqLywgJmR1bW15KTsKIAogICAgIGlmIChtUGxheWxpc3QgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGZldGNoIG1hc3RlciBwbGF5bGlzdCA8VVJMIHN1cHByZXNzZWQ+LiIpOworICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGZldGNoIG1hc3RlciBwbGF5bGlzdCAlcy4iLCB1cmlEZWJ1Z1N0cmluZyh1cmwpLmNfc3RyKCkpOwogCiAgICAgICAgIHBvc3RQcmVwYXJlZChFUlJPUl9JTyk7CiAgICAgICAgIHJldHVybjsKQEAgLTY4MCw3ICs2NzMsNyBAQAogCiAgICAgc3NpemVfdCBieXRlc1JlYWQgPSAwOwogICAgIC8vIGFkanVzdCByYW5nZV9sZW5ndGggaWYgb25seSByZWFkaW5nIHBhcnRpYWwgYmxvY2sKLSAgICBpZiAoYmxvY2tfc2l6ZSA+IDAgJiYgKHJhbmdlX2xlbmd0aCA9PSAtMSB8fCBidWZmZXItPnNpemUoKSArIGJsb2NrX3NpemUgPCByYW5nZV9sZW5ndGgpKSB7CisgICAgaWYgKGJsb2NrX3NpemUgPiAwICYmIChyYW5nZV9sZW5ndGggPT0gLTEgfHwgKGludDY0X3QpKGJ1ZmZlci0+c2l6ZSgpICsgYmxvY2tfc2l6ZSkgPCByYW5nZV9sZW5ndGgpKSB7CiAgICAgICAgIHJhbmdlX2xlbmd0aCA9IGJ1ZmZlci0+c2l6ZSgpICsgYmxvY2tfc2l6ZTsKICAgICB9CiAgICAgZm9yICg7OykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKaW5kZXggM2Y4ZmVlNS4uZDdlZDU2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCkBAIC0yOCw2ICsyOCw3IEBACiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBEYXRhU291cmNlOwogc3RydWN0IEhUVFBCYXNlOworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IExpdmVEYXRhU291cmNlOwogc3RydWN0IE0zVVBhcnNlcjsKIHN0cnVjdCBQbGF5bGlzdEZldGNoZXI7CkBAIC00MCw3ICs0MSw4IEBACiAgICAgfTsKICAgICBMaXZlU2Vzc2lvbigKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwLCBib29sIHVpZFZhbGlkID0gZmFsc2UsIHVpZF90IHVpZCA9IDApOworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIGVudW0gU3RyZWFtSW5kZXggewogICAgICAgICBrQXVkaW9JbmRleCAgICA9IDAsCkBAIC0xMzQsOCArMTM2LDcgQEAKIAogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICBib29sIG1VSURWYWxpZDsKLSAgICB1aWRfdCBtVUlEOworICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAKICAgICBib29sIG1JblByZXBhcmF0aW9uUGhhc2U7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IDIwYzNhNzYuLjc4NWM1MTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtMTcwLDE0ICsxNzAsMTQgQEAKICAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgYWxyZWFkeSBzZWxlY3RlZCIsIGluZGV4KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoInNlbGVjdGVkIHRyYWNrICVkIiwgaW5kZXgpOworICAgICAgICBBTE9HVigic2VsZWN0ZWQgdHJhY2sgJXp1IiwgaW5kZXgpOwogICAgICAgICBtU2VsZWN0ZWRJbmRleCA9IGluZGV4OwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCAhPSAoc3NpemVfdClpbmRleCkgewogICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBpcyBub3Qgc2VsZWN0ZWQiLCBpbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJ1bnNlbGVjdGVkIHRyYWNrICVkIiwgaW5kZXgpOworICAgICAgICBBTE9HVigidW5zZWxlY3RlZCB0cmFjayAlenUiLCBpbmRleCk7CiAgICAgICAgIG1TZWxlY3RlZEluZGV4ID0gLTE7CiAgICAgfQogCkBAIC03OTgsNyArNzk4LDggQEAKICAgICAgICAgICAgICAgICBpZiAoTWFrZVVSTChiYXNlVVJJLmNfc3RyKCksIHZhbC5jX3N0cigpLCAmYWJzVVJJKSkgewogICAgICAgICAgICAgICAgICAgICB2YWwgPSBhYnNVUkk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBtYWtlIGFic29sdXRlIHVybCBmb3IgPFVSTCBzdXBwcmVzc2VkPi4iKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBtYWtlIGFic29sdXRlIHVybCBmb3IgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmlEZWJ1Z1N0cmluZyhiYXNlVVJJKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCmluZGV4IDUxM2YxMTQuLmMzNGYzY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcApAQCAtMzE3LDcgKzMxNyw3IEBACiAgICAgICAgIG1heERlbGF5VXMgPSBtaW5EZWxheVVzOwogICAgIH0KICAgICBpZiAoZGVsYXlVcyA+IG1heERlbGF5VXMpIHsKLSAgICAgICAgQUxPR1YoIk5lZWQgdG8gcmVmcmVzaCBwbGF5bGlzdCBpbiAlbGxkIiwgbWF4RGVsYXlVcyk7CisgICAgICAgIEFMT0dWKCJOZWVkIHRvIHJlZnJlc2ggcGxheWxpc3QgaW4gJSIgUFJJZDY0ICwgbWF4RGVsYXlVcyk7CiAgICAgICAgIGRlbGF5VXMgPSBtYXhEZWxheVVzOwogICAgIH0KICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TW9uaXRvclF1ZXVlLCBpZCgpKTsKQEAgLTYyOCw3ICs2MjgsNyBAQAogCiAgICAgICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25VcyA9CiAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKS0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7Ci0gICAgICAgICAgICBBTE9HVigiYnVmZmVyZWQgJWxsZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgIEFMT0dWKCJidWZmZXJlZCAlIiBQUklkNjQgIiBmb3Igc3RyZWFtICVkIiwKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzLCBtUGFja2V0U291cmNlcy5rZXlBdChpKSk7CiAgICAgICAgICAgICBpZiAoYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzID4gYnVmZmVyZWREdXJhdGlvblVzKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0gYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzOwpAQCAtNjQxLDcgKzY0MSw3IEBACiAgICAgaWYgKCFtUHJlcGFyZWQgJiYgYnVmZmVyZWREdXJhdGlvblVzID4gdGFyZ2V0RHVyYXRpb25VcyAmJiBkb3dubG9hZE1vcmUpIHsKICAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKIAotICAgICAgICBBTE9HVigicHJlcGFyZWQsIGJ1ZmZlcmVkPSVsbGQgPiAlbGxkIiwKKyAgICAgICAgQUxPR1YoInByZXBhcmVkLCBidWZmZXJlZD0lIiBQUklkNjQgIiA+ICUiIFBSSWQ2NCAiIiwKICAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMsIHRhcmdldER1cmF0aW9uVXMpOwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFRlbXBvcmFyaWx5RG9uZUZldGNoaW5nKTsKQEAgLTY0OSw3ICs2NDksNyBAQAogICAgIH0KIAogICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSyAmJiBkb3dubG9hZE1vcmUpIHsKLSAgICAgICAgQUxPR1YoIm1vbml0b3JpbmcsIGJ1ZmZlcmVkPSVsbGQgPCAlbGxkIiwKKyAgICAgICAgQUxPR1YoIm1vbml0b3JpbmcsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiIDwgJSIgUFJJZDY0ICIiLAogICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcywgZHVyYXRpb25Ub0J1ZmZlclVzKTsKICAgICAgICAgLy8gZGVsYXkgdGhlIG5leHQgZG93bmxvYWQgc2xpZ2h0bHk7IGhvcGVmdWxseSB0aGlzIGdpdmVzIG90aGVyIGNvbmN1cnJlbnQgZmV0Y2hlcnMKICAgICAgICAgLy8gYSBiZXR0ZXIgY2hhbmNlIHRvIHJ1bi4KQEAgLTY2NSw3ICs2NjUsNyBAQAogICAgICAgICBtc2ctPnBvc3QoKTsKIAogICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBtUHJlcGFyZWQgPyBrTWF4TW9uaXRvckRlbGF5VXMgOiB0YXJnZXREdXJhdGlvblVzIC8gMjsKLSAgICAgICAgQUxPR1YoInBhdXNpbmcgZm9yICVsbGQsIGJ1ZmZlcmVkPSVsbGQgPiAlbGxkIiwKKyAgICAgICAgQUxPR1YoInBhdXNpbmcgZm9yICUiIFBSSWQ2NCAiLCBidWZmZXJlZD0lIiBQUklkNjQgIiA+ICUiIFBSSWQ2NCAiIiwKICAgICAgICAgICAgICAgICBkZWxheVVzLCBidWZmZXJlZER1cmF0aW9uVXMsIGR1cmF0aW9uVG9CdWZmZXJVcyk7CiAgICAgICAgIC8vIDpUUklDS1k6IG5lZWQgdG8gZW5mb3JjZSBtaW5pbXVtIGRlbGF5IGJlY2F1c2UgdGhlIGRlbGF5IHRvCiAgICAgICAgIC8vIHJlZnJlc2ggdGhlIHBsYXlsaXN0IHdpbGwgYmVjb21lIDAKQEAgLTczOSw3ICs3MzksNyBAQAogCiAgICAgICAgIGlmIChtUGxheWxpc3QtPmlzQ29tcGxldGUoKSB8fCBtUGxheWxpc3QtPmlzRXZlbnQoKSkgewogICAgICAgICAgICAgbVNlcU51bWJlciA9IGdldFNlcU51bWJlckZvclRpbWUobVN0YXJ0VGltZVVzKTsKLSAgICAgICAgICAgIEFMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgdGltZSAlbGxkIGlzICVsZCBmcm9tICglbGQgLi4gJWxkKSIsCisgICAgICAgICAgICBBTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIHRpbWUgJSIgUFJJZDY0ICIgaXMgJWQgZnJvbSAoJWQgLi4gJWQpIiwKICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzLCBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCiAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTc0OCw3ICs3NDgsNyBAQAogICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpIHsKICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciBsaXZlIGV2ZW50ICVsZCBmcm9tICglbGQgLi4gJWxkKSIsCisgICAgICAgICAgICBBTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIGxpdmUgZXZlbnQgJWQgZnJvbSAoJWQgLi4gJWQpIiwKICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAogICAgICAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CiAgICAgICAgIH0KQEAgLTc3Miw3ICs3NzIsOCBAQAogICAgICAgICAgICAgICAgIGlmIChkZWxheVVzID4ga01heE1vbml0b3JEZWxheVVzKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgPSBrTWF4TW9uaXRvckRlbGF5VXM7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBudW1iZXIgaGlnaDogJWxkIGZyb20gKCVsZCAuLiAlbGQpLCBtb25pdG9yIGluICVsbGQgKHJldHJ5PSVkKSIsCisgICAgICAgICAgICAgICAgQUxPR1YoInNlcXVlbmNlIG51bWJlciBoaWdoOiAlZCBmcm9tICglZCAuLiAlZCksICIKKyAgICAgICAgICAgICAgICAgICAgICAibW9uaXRvciBpbiAlIiBQUklkNjQgIiAocmV0cnk9JWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0LCBkZWxheVVzLCBtTnVtUmV0cmllcyk7CiAgICAgICAgICAgICAgICAgcG9zdE1vbml0b3JRdWV1ZShkZWxheVVzKTsKQEAgLTkxNSw2ICs5MTYsNyBAQAogCiAgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewogICAgICAgICAgICAgLy8gYmFkIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciBoaW50CisgICAgICAgICAgICBtVFNQYXJzZXIuY2xlYXIoKTsKICAgICAgICAgICAgIHBvc3RNb25pdG9yUXVldWUoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawppbmRleCBiZjZmN2JiLi4yMTk0YzM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawpAQCAtNCw2ICs0LDggQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJSUQzLmNwcAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfaWQzCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTE1LDYgKzE3LDggQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJdGVzdGlkMy5jcHAKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlic3RhZ2VmcmlnaHQgbGlidXRpbHMgbGlibG9nIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKaW5kZXggMTE5OWMyMi4uN2YyMjFhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKQEAgLTQ2OCw0OSArNDY4LDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRJU084ODU5VG9TdHJpbmc4KAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgU3RyaW5nOCAqcykgewotICAgIHNpemVfdCB1dGY4bGVuID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBpZiAoZGF0YVtpXSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICBzaXplID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGRhdGFbaV0gPCAweDgwKSB7Ci0gICAgICAgICAgICArK3V0ZjhsZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1dGY4bGVuICs9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodXRmOGxlbiA9PSBzaXplKSB7Ci0gICAgICAgIC8vIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBwcmVzZW50LgotCi0gICAgICAgIHMtPnNldFRvKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjaGFyICp0bXAgPSBuZXcgY2hhclt1dGY4bGVuXTsKLSAgICBjaGFyICpwdHIgPSB0bXA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgaWYgKGRhdGFbaV0gPT0gJ1wwJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA8IDB4ODApIHsKLSAgICAgICAgICAgICpwdHIrKyA9IGRhdGFbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA8IDB4YzApIHsKLSAgICAgICAgICAgICpwdHIrKyA9IDB4YzI7Ci0gICAgICAgICAgICAqcHRyKysgPSBkYXRhW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKnB0cisrID0gMHhjMzsKLSAgICAgICAgICAgICpwdHIrKyA9IGRhdGFbaV0gLSA2NDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHMtPnNldFRvKHRtcCwgdXRmOGxlbik7Ci0KLSAgICBkZWxldGVbXSB0bXA7Ci0gICAgdG1wID0gTlVMTDsKLX0KIAogLy8gdGhlIDJuZCBhcmd1bWVudCBpcyB1c2VkIHRvIGdldCB0aGUgZGF0YSBmb2xsb3dpbmcgdGhlIFwwIGluIGEgY29tbWVudCBmaWVsZAogdm9pZCBJRDM6Okl0ZXJhdG9yOjpnZXRTdHJpbmcoU3RyaW5nOCAqaWQsIFN0cmluZzggKmNvbW1lbnQpIGNvbnN0IHsKQEAgLTU0Myw3ICs1MDAsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgY29udmVydElTTzg4NTlUb1N0cmluZzgoZnJhbWVEYXRhLCBtRnJhbWVTaXplLCBpZCk7CisgICAgICAgIC8vIHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgSVNPLTg4NTktMSwgYnV0IHBhc3MgaXQgdXAgYXMtaXMgdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgZmlndXJlCisgICAgICAgIC8vIG91dCB0aGUgcmVhbCBlbmNvZGluZworICAgICAgICBpZC0+c2V0VG8oKGNvbnN0IGNoYXIqKWZyYW1lRGF0YSwgbUZyYW1lU2l6ZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTU2MSwxMyArNTIwLDEzIEBACiAgICAgfQogCiAgICAgaWYgKGVuY29kaW5nID09IDB4MDApIHsKLSAgICAgICAgLy8gSVNPIDg4NTktMQotICAgICAgICBjb252ZXJ0SVNPODg1OVRvU3RyaW5nOChmcmFtZURhdGEgKyAxLCBuLCBpZCk7CisgICAgICAgIC8vIHN1cHBvc2VkbHkgSVNPIDg4NTktMQorICAgICAgICBpZC0+c2V0VG8oKGNvbnN0IGNoYXIqKWZyYW1lRGF0YSArIDEsIG4pOwogICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgPT0gMHgwMykgewotICAgICAgICAvLyBVVEYtOAorICAgICAgICAvLyBzdXBwb3NlZGx5IFVURi04CiAgICAgICAgIGlkLT5zZXRUbygoY29uc3QgY2hhciAqKShmcmFtZURhdGEgKyAxKSwgbik7CiAgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PSAweDAyKSB7Ci0gICAgICAgIC8vIFVURi0xNiBCRSwgbm8gYnl0ZSBvcmRlciBtYXJrLgorICAgICAgICAvLyBzdXBwb3NlZGx5IFVURi0xNiBCRSwgbm8gYnl0ZSBvcmRlciBtYXJrLgogICAgICAgICAvLyBBUEkgd2FudHMgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIG5vdCBudW1iZXIgb2YgYnl0ZXMuLi4KICAgICAgICAgaW50IGxlbiA9IG4gLyAyOwogICAgICAgICBjb25zdCBjaGFyMTZfdCAqZnJhbWVkYXRhID0gKGNvbnN0IGNoYXIxNl90ICopIChmcmFtZURhdGEgKyAxKTsKQEAgLTU4Myw3ICs1NDIsNyBAQAogICAgICAgICBpZiAoZnJhbWVkYXRhY29weSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGVbXSBmcmFtZWRhdGFjb3B5OwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09IDB4MDEpIHsKICAgICAgICAgLy8gVUNTLTIKICAgICAgICAgLy8gQVBJIHdhbnRzIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBub3QgbnVtYmVyIG9mIGJ5dGVzLi4uCiAgICAgICAgIGludCBsZW4gPSBuIC8gMjsKQEAgLTYwMiw3ICs1NjEsMjcgQEAKICAgICAgICAgICAgIGZyYW1lZGF0YSsrOwogICAgICAgICAgICAgbGVuLS07CiAgICAgICAgIH0KLSAgICAgICAgaWQtPnNldFRvKGZyYW1lZGF0YSwgbGVuKTsKKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgcmVzdWx0aW5nIGRhdGEgY29uc2lzdHMgZW50aXJlbHkgb2YgOC1iaXQgdmFsdWVzCisgICAgICAgIGJvb2wgZWlnaHRCaXQgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZnJhbWVkYXRhW2ldID4gMHhmZikgeworICAgICAgICAgICAgICAgIGVpZ2h0Qml0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVpZ2h0Qml0KSB7CisgICAgICAgICAgICAvLyBjb2xsYXBzZSB0byA4IGJpdCwgdGhlbiBsZXQgdGhlIG1lZGlhIHNjYW5uZXIgY2xpZW50IGZpZ3VyZSBvdXQgdGhlIHJlYWwgZW5jb2RpbmcKKyAgICAgICAgICAgIGNoYXIgKmZyYW1lOCA9IG5ldyBjaGFyW2xlbl07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZnJhbWU4W2ldID0gZnJhbWVkYXRhW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWQtPnNldFRvKGZyYW1lOCwgbGVuKTsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBmcmFtZTg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZC0+c2V0VG8oZnJhbWVkYXRhLCBsZW4pOworICAgICAgICB9CisKICAgICAgICAgaWYgKGZyYW1lZGF0YWNvcHkgIT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlW10gZnJhbWVkYXRhY29weTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAppbmRleCAyNzFkZjhlLi5hODFiYmJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaApAQCAtNjMsNiArNjMsNyBAQAogICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKQEAgLTE1OSw2ICsxNjAsNyBAQAogICAgIFN5c3RlbVRpbWVTb3VyY2UgbVN5c3RlbVRpbWVTb3VyY2U7CiAgICAgVGltZVNvdXJjZSAqbVRpbWVTb3VyY2U7CiAKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogICAgIFN0cmluZzggbVVyaTsKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtVXJpSGVhZGVyczsKIApAQCAtMjQ3LDYgKzI0OSw3IEBACiAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IG1FeHRyYWN0b3I7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExODhkZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDSFJPTUVfSFRUUF9EQVRBX1NPVVJDRV9IXwotCi0jZGVmaW5lIENIUk9NRV9IVFRQX0RBVEFfU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJIVFRQQmFzZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBTZkRlbGVnYXRlOwotCi1zdHJ1Y3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSA6IHB1YmxpYyBIVFRQQmFzZSB7Ci0gICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUpOwotCi0gICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgc3RhdGljIHN0YXR1c190IFVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkNocm9taXVtSFRUUERhdGFTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgc3RydWN0IFNmRGVsZWdhdGU7Ci0KLSAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgRElTQ09OTkVDVEVELAotICAgICAgICBDT05ORUNUSU5HLAotICAgICAgICBDT05ORUNURUQsCi0gICAgICAgIFJFQURJTkcsCi0gICAgICAgIERJU0NPTk5FQ1RJTkcKLSAgICB9OwotCi0gICAgY29uc3QgdWludDMyX3QgbUZsYWdzOwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKLQotICAgIFN0YXRlIG1TdGF0ZTsKLQotICAgIFNmRGVsZWdhdGUgKm1EZWxlZ2F0ZTsKLQotICAgIEFTdHJpbmcgbVVSSTsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtSGVhZGVyczsKLQotICAgIG9mZjY0X3QgbUN1cnJlbnRPZmZzZXQ7Ci0KLSAgICAvLyBBbnkgY29ubmVjdGlvbiBlcnJvciBvciB0aGUgcmVzdWx0IG9mIGEgcmVhZCBvcGVyYXRpb24KLSAgICAvLyAoZm9yIHRoZSBsYXR0dGVyIHRoaXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBpZiBzdWNjZXNzZnVsKS4KLSAgICBzc2l6ZV90IG1JT1Jlc3VsdDsKLQotICAgIGludDY0X3QgbUNvbnRlbnRTaXplOwotCi0gICAgU3RyaW5nOCBtQ29udGVudFR5cGU7Ci0KLSAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKLSAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKLQotICAgIHZvaWQgZGlzY29ubmVjdF9sKCk7Ci0KLSAgICBzdGF0dXNfdCBjb25uZWN0X2woCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHN0YXRpYyB2b2lkIEluaXRpYXRlUmVhZCgKLSAgICAgICAgICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIGluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKAotICAgICAgICAgICAgaW50NjRfdCBjb250ZW50U2l6ZSwgY29uc3QgY2hhciAqY29udGVudFR5cGUpOwotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25GYWlsZWQoc3RhdHVzX3QgZXJyKTsKLSAgICB2b2lkIG9uUmVhZENvbXBsZXRlZChzc2l6ZV90IHNpemUpOwotICAgIHZvaWQgb25EaXNjb25uZWN0Q29tcGxldGUoKTsKLSAgICB2b2lkIG9uUmVkaXJlY3QoY29uc3QgY2hhciAqdXJsKTsKLQotICAgIHZvaWQgY2xlYXJEUk1TdGF0ZV9sKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDaHJvbWl1bUhUVFBEYXRhU291cmNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQ0hST01FX0hUVFBfREFUQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTAyYjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgUEFSU0VSX0hfCi0KLSNkZWZpbmUgUEFSU0VSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlciA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgc3RydWN0IFNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICAgICAgU291cmNlKCkge30KLQotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWVrYWJsZSgpID0gMDsKLQotICAgICAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgflNvdXJjZSgpIHt9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU291cmNlKTsKLSAgICB9OwotCi0gICAgRnJhZ21lbnRlZE1QNFBhcnNlcigpOwotCi0gICAgdm9pZCBzdGFydChjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgdm9pZCBzdGFydChjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UpOwotICAgIHZvaWQgc3RhcnQoc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8sIGJvb2wgc3luY2hyb25vdXMgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQsIGJvb2wgc3luY2hyb25vdXMgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3Qgc2Vla1RvKGJvb2wgYXVkaW8sIGludDY0X3QgdGltZVVzKTsKLSAgICBib29sIGlzU2Vla2FibGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5GcmFnbWVudGVkTVA0UGFyc2VyKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U3RhcnQsCi0gICAgICAgIGtXaGF0UHJvY2VlZCwKLSAgICAgICAga1doYXRSZWFkTW9yZSwKLSAgICAgICAga1doYXRHZXRGb3JtYXQsCi0gICAgICAgIGtXaGF0RGVxdWV1ZUFjY2Vzc1VuaXQsCi0gICAgICAgIGtXaGF0U2Vla1RvLAotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudDsKLSAgICBzdHJ1Y3QgRHluYW1pY1RyYWNrRnJhZ21lbnQ7Ci0gICAgc3RydWN0IFN0YXRpY1RyYWNrRnJhZ21lbnQ7Ci0KLSAgICBzdHJ1Y3QgRGlzcGF0Y2hFbnRyeSB7Ci0gICAgICAgIHVpbnQzMl90IG1UeXBlOwotICAgICAgICB1aW50MzJfdCBtUGFyZW50VHlwZTsKLSAgICAgICAgc3RhdHVzX3QgKEZyYWdtZW50ZWRNUDRQYXJzZXI6OiptSGFuZGxlcikodWludDMyX3QsIHNpemVfdCwgdWludDY0X3QpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgQ29udGFpbmVyIHsKLSAgICAgICAgdWludDY0X3QgbU9mZnNldDsKLSAgICAgICAgdWludDY0X3QgbUJ5dGVzUmVtYWluaW5nOwotICAgICAgICB1aW50MzJfdCBtVHlwZTsKLSAgICAgICAgYm9vbCBtRXh0ZW5kc1RvRU9GOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU2FtcGxlRGVzY3JpcHRpb24gewotICAgICAgICB1aW50MzJfdCBtVHlwZTsKLSAgICAgICAgdWludDE2X3QgbURhdGFSZWZJbmRleDsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKLSAgICB9OwotCi0gICAgc3RydWN0IFNhbXBsZUluZm8gewotICAgICAgICBvZmY2NF90IG1PZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBtU2l6ZTsKLSAgICAgICAgdWludDMyX3QgbVByZXNlbnRhdGlvblRpbWU7Ci0gICAgICAgIHNpemVfdCBtU2FtcGxlRGVzY0luZGV4OwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBNZWRpYURhdGFJbmZvIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICAgICAgb2ZmNjRfdCBtT2Zmc2V0OwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU2lkeEVudHJ5IHsKLSAgICAgICAgc2l6ZV90IG1TaXplOwotICAgICAgICB1aW50MzJfdCBtRHVyYXRpb25VczsKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrSW5mbyB7Ci0gICAgICAgIGVudW0gRmxhZ3MgewotICAgICAgICAgICAga1RyYWNrRW5hYmxlZCAgICAgPSAweDAxLAotICAgICAgICAgICAga1RyYWNrSW5Nb3ZpZSAgICAgPSAweDAyLAotICAgICAgICAgICAga1RyYWNrSW5QcmV2aWV3ICAgPSAweDA0LAotICAgICAgICB9OwotCi0gICAgICAgIHVpbnQzMl90IG1UcmFja0lEOwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgICAgIHVpbnQzMl90IG1EdXJhdGlvbjsgIC8vIFRoaXMgaXMgdGhlIGR1cmF0aW9uIGluIHRlcm1zIG9mIG1vdmllIHRpbWVzY2FsZSEKLSAgICAgICAgdWludDY0X3QgbVNpZHhEdXJhdGlvbjsgLy8gdXNlYywgZnJvbSBzaWR4IGJveCwgd2hpY2ggY2FuIHVzZSBhIGRpZmZlcmVudCB0aW1lc2NhbGUKLQotICAgICAgICB1aW50MzJfdCBtTWVkaWFUaW1lU2NhbGU7Ci0KLSAgICAgICAgdWludDMyX3QgbU1lZGlhSGFuZGxlclR5cGU7Ci0gICAgICAgIFZlY3RvcjxTYW1wbGVEZXNjcmlwdGlvbj4gbVNhbXBsZURlc2NzOwotCi0gICAgICAgIC8vIGZyb20gdHJhY2sgZXh0ZW5kczoKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVEZXNjcmlwdGlvbkluZGV4OwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0KLSAgICAgICAgdWludDMyX3QgbURlY29kaW5nVGltZTsKLQotICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeDsKLSAgICAgICAgc3A8U3RhdGljVHJhY2tGcmFnbWVudD4gbVN0YXRpY0ZyYWdtZW50OwotICAgICAgICBMaXN0PHNwPFRyYWNrRnJhZ21lbnQ+ID4gbUZyYWdtZW50czsKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvIHsKLSAgICAgICAgZW51bSBGbGFncyB7Ci0gICAgICAgICAgICBrQmFzZURhdGFPZmZzZXRQcmVzZW50ICAgICAgICAgPSAweDAxLAotICAgICAgICAgICAga1NhbXBsZURlc2NyaXB0aW9uSW5kZXhQcmVzZW50ID0gMHgwMiwKLSAgICAgICAgICAgIGtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50ICA9IDB4MDgsCi0gICAgICAgICAgICBrRGVmYXVsdFNhbXBsZVNpemVQcmVzZW50ICAgICAgPSAweDEwLAotICAgICAgICAgICAga0RlZmF1bHRTYW1wbGVGbGFnc1ByZXNlbnQgICAgID0gMHgyMCwKLSAgICAgICAgICAgIGtEdXJhdGlvbklzRW1wdHkgICAgICAgICAgICAgICA9IDB4MTAwMDAsCi0gICAgICAgIH07Ci0KLSAgICAgICAgdWludDMyX3QgbVRyYWNrSUQ7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICAgICAgdWludDY0X3QgbUJhc2VEYXRhT2Zmc2V0OwotICAgICAgICB1aW50MzJfdCBtU2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVTaXplOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUZsYWdzOwotCi0gICAgICAgIHVpbnQ2NF90IG1EYXRhT2Zmc2V0OwotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRGlzcGF0Y2hFbnRyeSBrRGlzcGF0Y2hUYWJsZVtdOwotCi0gICAgc3A8U291cmNlPiBtU291cmNlOwotICAgIG9mZl90IG1CdWZmZXJQb3M7Ci0gICAgYm9vbCBtU3VzcGVuZGVkOwotICAgIGJvb2wgbURvbmVXaXRoTW9vdjsKLSAgICBvZmZfdCBtRmlyc3RNb29mT2Zmc2V0OyAvLyB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3Igb2Zmc2V0cyBjYWxjdWxhdGVkIGZyb20gdGhlIHNpZHggYm94Ci0gICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICBWZWN0b3I8Q29udGFpbmVyPiBtU3RhY2s7Ci0gICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFRyYWNrSW5mbz4gbVRyYWNrczsgIC8vIFRyYWNrSW5mbyBieSB0cmFja0lECi0gICAgVmVjdG9yPE1lZGlhRGF0YUluZm8+IG1NZWRpYURhdGE7Ci0KLSAgICB1aW50MzJfdCBtQ3VycmVudFRyYWNrSUQ7Ci0KLSAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7Ci0KLSAgICBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyBtVHJhY2tGcmFnbWVudEhlYWRlckluZm87Ci0KLSAgICBzdGF0dXNfdCBvblByb2NlZWQoKTsKLSAgICBzdGF0dXNfdCBvbkRlcXVldWVBY2Nlc3NVbml0KHNpemVfdCB0cmFja0luZGV4LCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7Ci0gICAgc3RhdHVzX3Qgb25TZWVrVG8oYm9vbCB3YW50QXVkaW8sIGludDY0X3QgcG9zaXRpb24pOwotCi0gICAgdm9pZCBlbnRlcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgdHlwZSwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICB1aW50MTZfdCByZWFkVTE2KHNpemVfdCBvZmZzZXQpOwotICAgIHVpbnQzMl90IHJlYWRVMzIoc2l6ZV90IG9mZnNldCk7Ci0gICAgdWludDY0X3QgcmVhZFU2NChzaXplX3Qgb2Zmc2V0KTsKLSAgICB2b2lkIHNraXAob2ZmX3QgZGlzdGFuY2UpOwotICAgIHN0YXR1c190IG5lZWQoc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZml0c0NvbnRhaW5lcih1aW50NjRfdCBzaXplKSBjb25zdDsKLQotICAgIHN0YXR1c190IHBhcnNlVHJhY2tIZWFkZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlTWVkaWFIZWFkZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlTWVkaWFIYW5kbGVyKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRXh0ZW5kcygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRnJhZ21lbnRSdW4oCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlVmlzdWFsU2FtcGxlRW50cnkoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQXVkaW9TYW1wbGVFbnRyeSgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlRVNEU0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZU1lZGlhRGF0YSgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VTZWdtZW50SW5kZXgoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIFRyYWNrSW5mbyAqZWRpdFRyYWNrKHVpbnQzMl90IHRyYWNrSUQsIGJvb2wgY3JlYXRlSWZOZWNlc3NhcnkgPSBmYWxzZSk7Ci0KLSAgICBzc2l6ZV90IGZpbmRUcmFjayhib29sIHdhbnRBdWRpbykgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBtYWtlQWNjZXNzVW5pdCgKLSAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbywKLSAgICAgICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJnNhbXBsZSwKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvLAotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwotCi0gICAgc3RhdHVzX3QgZ2V0U2FtcGxlKAotICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvLAotICAgICAgICAgICAgc3A8VHJhY2tGcmFnbWVudD4gKmZyYWdtZW50LAotICAgICAgICAgICAgU2FtcGxlSW5mbyAqc2FtcGxlSW5mbyk7Ci0KLSAgICBzdGF0aWMgaW50IENvbXBhcmVTYW1wbGVMb2NhdGlvbigKLSAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmc2FtcGxlLCBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbyk7Ci0KLSAgICB2b2lkIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0KLSAgICB2b2lkIGNvcHlCdWZmZXIoCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiAqZHN0LAotICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgY29uc3Q7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGcmFnbWVudGVkTVA0UGFyc2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gUEFSU0VSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAppbmRleCBkNGI3ZjlmLi4xYzNjZDVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC00OCwxNCArNDgsNiBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCYW5kd2lkdGhTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpOwogCi0gICAgc3RhdGljIHN0YXR1c190IFVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7Ci0gICAgYm9vbCBnZXRVSUQodWlkX3QgKnVpZCkgY29uc3Q7Ci0KLSAgICBzdGF0aWMgc3A8SFRUUEJhc2U+IENyZWF0ZSh1aW50MzJfdCBmbGFncyA9IDApOwotCiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZyk7CiAgICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCk7CiAKQEAgLTg3LDkgKzc5LDYgQEAKICAgICBpbnQzMl90IG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwczsKICAgICBpbnQzMl90IG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zOwogCi0gICAgYm9vbCBtVUlEVmFsaWQ7Ci0gICAgdWlkX3QgbVVJRDsKLQogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEhUVFBCYXNlKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCmluZGV4IGNhNTlkYzAuLjJjNGY1NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaApAQCAtMjUsNiArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgSFRUUEJhc2U7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiAKIHN0cnVjdCBTRFBMb2FkZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMzQsNyArMzUsMTAgQEAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRTRFBMb2FkZWQgPSAnc2RwbCcKICAgICB9OwotICAgIFNEUExvYWRlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWludDMyX3QgZmxhZ3MgPSAwLCBib29sIHVpZFZhbGlkID0gZmFsc2UsIHVpZF90IHVpZCA9IDApOworICAgIFNEUExvYWRlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIHZvaWQgbG9hZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApAQCAtNTUsOCArNTksNiBAQAogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogICAgIGNvbnN0IGNoYXIqIG1Vcmw7CiAgICAgdWludDMyX3QgbUZsYWdzOwotICAgIGJvb2wgbVVJRFZhbGlkOwotICAgIHVpZF90IG1VSUQ7CiAgICAgc3A8QUxvb3Blcj4gbU5ldExvb3BlcjsKICAgICBib29sIG1DYW5jZWxsZWQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggYjAyZWQwZS4uNjYzMmMyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTMzLDYgKzMzLDcgQEAKICAgICB2aXJ0dWFsIH5TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2NTFhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ0hST01JVU1fSFRUUF9TVFVCX0hfCi0jZGVmaW5lIENIUk9NSVVNX0hUVFBfU1RVQl9IXwotCi0jaW5jbHVkZSA8aW5jbHVkZS9IVFRQQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotZXh0ZXJuICJDIiB7Ci1IVFRQQmFzZSAqY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncyk7Ci0KLXN0YXR1c190IFVwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotRGF0YVNvdXJjZSAqY3JlYXRlRGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpOwotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCAwZTRkZDJiLi5kN2JlYzU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC0zMTUsNyArMzE1LDcgQEAKIAogICAgICphY3R1YWxGcmFtZVRpbWVVcyA9IC0xbGw7CiAKLSAgICBjb25zdCBpbnQ2NF90IHNlZWtUaW1lTnMgPSBzZWVrVGltZVVzICogMTAwMGxsOworICAgIGNvbnN0IGludDY0X3Qgc2Vla1RpbWVOcyA9IHNlZWtUaW1lVXMgKiAxMDAwbGwgLSBtRXh0cmFjdG9yLT5tU2Vla1ByZVJvbGxOczsKIAogICAgIG1rdnBhcnNlcjo6U2VnbWVudCogY29uc3QgcFNlZ21lbnQgPSBtRXh0cmFjdG9yLT5tU2VnbWVudDsKIApAQCAtNjMwLDcgKzYzMCw4IEBACiAgICAgICBtUmVhZGVyKG5ldyBEYXRhU291cmNlUmVhZGVyKG1EYXRhU291cmNlKSksCiAgICAgICBtU2VnbWVudChOVUxMKSwKICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzKGZhbHNlKSwKLSAgICAgIG1Jc1dlYm0oZmFsc2UpIHsKKyAgICAgIG1Jc1dlYm0oZmFsc2UpLAorICAgICAgbVNlZWtQcmVSb2xsTnMoMCkgewogICAgIG9mZjY0X3Qgc2l6ZTsKICAgICBtSXNMaXZlU3RyZWFtaW5nID0KICAgICAgICAgKG1EYXRhU291cmNlLT5mbGFncygpCkBAIC02NTYsMTQgKzY1NywyMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gZnJvbSBta3ZwYXJzZXI6OlNlZ21lbnQ6OkxvYWQoKSwgYnV0IHN0b3AgYXQgZmlyc3QgY2x1c3RlcgogICAgIHJldCA9IG1TZWdtZW50LT5QYXJzZUhlYWRlcnMoKTsKLSAgICBDSEVDS19FUShyZXQsIDApOwotCi0gICAgbG9uZyBsZW47Ci0gICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKLSAgICBDSEVDS19FUShyZXQsIDApOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKKyAgICAgICAgaWYgKHJldCA+PSAxKSB7CisgICAgICAgICAgICAvLyBubyBtb3JlIGNsdXN0ZXJzCisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgIHJldCA9IG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEw7CisgICAgfQogCiAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR1coIkNvcnJ1cHQgJXMgc291cmNlOiAlcyIsIG1Jc1dlYm0gPyAid2VibSIgOiAibWF0cm9za2EiLAorICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKG1EYXRhU291cmNlLT5nZXRVcmkoKSkuY19zdHIoKSk7CiAgICAgICAgIGRlbGV0ZSBtU2VnbWVudDsKICAgICAgICAgbVNlZ21lbnQgPSBOVUxMOwogICAgICAgICByZXR1cm47CkBAIC05MjEsNiArOTMwLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkVm9yYmlzQ29kZWNJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX09QVVMiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSwgdHJhY2stPkdldENvZGVjRGVsYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwsIHRyYWNrLT5HZXRTZWVrUHJlUm9sbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsTnMgPSB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfTVBFRy9MMyIsIGNvZGVjSUQpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgKaW5kZXggMTI5NGI0Zi4uY2YyMDBmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCkBAIC02OSw2ICs2OSw3IEBACiAgICAgYm9vbCBtRXh0cmFjdGVkVGh1bWJuYWlsczsKICAgICBib29sIG1Jc0xpdmVTdHJlYW1pbmc7CiAgICAgYm9vbCBtSXNXZWJtOworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsTnM7CiAKICAgICB2b2lkIGFkZFRyYWNrcygpOwogICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9GcmFnbWVudGVkTVA0UGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9GcmFnbWVudGVkTVA0UGFyc2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwMjY1Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvRnJhZ21lbnRlZE1QNFBhcnNlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkZyYWdtZW50ZWRNUDRQYXJzZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgotI2luY2x1ZGUgImluY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oIgotI2luY2x1ZGUgIlRyYWNrRnJhZ21lbnQuaCIKLQotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IGNoYXIgKkZvdXJjYzJTdHJpbmcodWludDMyX3QgZm91cmNjKSB7Ci0gICAgc3RhdGljIGNoYXIgYnVmZmVyWzVdOwotICAgIGJ1ZmZlcls0XSA9ICdcMCc7Ci0gICAgYnVmZmVyWzBdID0gZm91cmNjID4+IDI0OwotICAgIGJ1ZmZlclsxXSA9IChmb3VyY2MgPj4gMTYpICYgMHhmZjsKLSAgICBidWZmZXJbMl0gPSAoZm91cmNjID4+IDgpICYgMHhmZjsKLSAgICBidWZmZXJbM10gPSBmb3VyY2MgJiAweGZmOwotCi0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKkluZGVudFN0cmluZyhzaXplX3QgbikgewotICAgIHN0YXRpYyBjb25zdCBjaGFyIGtTcGFjZVtdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Ci0gICAgcmV0dXJuIGtTcGFjZSArIHNpemVvZihrU3BhY2UpIC0gMiAqIG4gLSAxOwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEZyYWdtZW50ZWRNUDRQYXJzZXI6OkRpc3BhdGNoRW50cnkgRnJhZ21lbnRlZE1QNFBhcnNlcjo6a0Rpc3BhdGNoVGFibGVbXSA9IHsKLSAgICB7IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpLCAwLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSwgRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygndScsICdkJywgJ3QnLCAnYScpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCd1JywgJ2QnLCAndCcsICdhJyksIEZPVVJDQygnbScsICdvJywgJ28nLCAndicpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKSwgRk9VUkNDKCd1JywgJ2QnLCAndCcsICdhJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygnaScsICdsJywgJ3MnLCAndCcpLCBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKSwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ3QnLCAnaycsICdoJywgJ2QnKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrSGVhZGVyCi0gICAgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ3YnLCAnZScsICd4JyksIEZPVVJDQygnbScsICdvJywgJ28nLCAndicpLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygndCcsICdyJywgJ2UnLCAneCcpLCBGT1VSQ0MoJ20nLCAndicsICdlJywgJ3gnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tFeHRlbmRzCi0gICAgfSwKLQotICAgIHsgRk9VUkNDKCdlJywgJ2QnLCAndCcsICdzJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyksIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ2QnLCAnaCcsICdkJyksIEZPVVJDQygnbScsICdkJywgJ2knLCAnYScpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYUhlYWRlcgotICAgIH0sCi0KLSAgICB7IEZPVVJDQygnaCcsICdkJywgJ2wnLCAncicpLCBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFIYW5kbGVyCi0gICAgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ2knLCAnbicsICdmJyksIEZPVVJDQygnbScsICdkJywgJ2knLCAnYScpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ2QnLCAnaScsICduJywgJ2YnKSwgRk9VUkNDKCdtJywgJ2knLCAnbicsICdmJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLCBGT1VSQ0MoJ20nLCAnaScsICduJywgJ2YnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygncycsICd0JywgJ3MnLCAneicpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2FtcGxlU2l6ZXMgfSwKLQotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAneicsICcyJyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMgfSwKLQotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAncycsICdjJyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTYW1wbGVUb0NodW5rIH0sCi0KLSAgICB7IEZPVVJDQygncycsICd0JywgJ2MnLCAnbycpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ2h1bmtPZmZzZXRzIH0sCi0KLSAgICB7IEZPVVJDQygnYycsICdvJywgJzYnLCAnNCcpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ2h1bmtPZmZzZXRzNjQgfSwKLQotICAgIHsgRk9VUkNDKCdhJywgJ3YnLCAnYycsICdDJyksIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VBVkNDb2RlY1NwZWNpZmljRGF0YSB9LAotCi0gICAgeyBGT1VSQ0MoJ2UnLCAncycsICdkJywgJ3MnKSwgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUVTRFNDb2RlY1NwZWNpZmljRGF0YSB9LAotCi0gICAgeyBGT1VSQ0MoJ2UnLCAncycsICdkJywgJ3MnKSwgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2JyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUVTRFNDb2RlY1NwZWNpZmljRGF0YSB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKSwgMCwgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFEYXRhIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpLCAwLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKSwgRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJyksIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCd0JywgJ2YnLCAnaCcsICdkJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyCi0gICAgfSwKLSAgICB7IEZPVVJDQygndCcsICdyJywgJ3UnLCAnbicpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tGcmFnbWVudFJ1bgotICAgIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICdmJywgJ3InLCAnYScpLCAwLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygncycsICdpJywgJ2QnLCAneCcpLCAwLCAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTZWdtZW50SW5kZXggfSwKLX07Ci0KLXN0cnVjdCBGaWxlU291cmNlIDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlNvdXJjZSB7Ci0gICAgRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSkKLSAgICAgICAgOiBtRmlsZShmb3BlbihmaWxlbmFtZSwgInJiIikpIHsKLSAgICAgICAgICAgIENIRUNLKG1GaWxlICE9IE5VTEwpOwotICAgICAgICB9Ci0KLSAgICB2aXJ0dWFsIH5GaWxlU291cmNlKCkgewotICAgICAgICBmY2xvc2UobUZpbGUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIGZzZWVrKG1GaWxlLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSAgICAgICAgcmV0dXJuIGZyZWFkKGRhdGEsIDEsIHNpemUsIG1GaWxlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTZWVrYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICBGSUxFICptRmlsZTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVTb3VyY2UpOwotfTsKLQotc3RydWN0IFJlYWRUcmFja2VyIDogcHVibGljIFJlZkJhc2UgewotICAgIFJlYWRUcmFja2VyKG9mZjY0X3Qgc2l6ZSkgewotICAgICAgICBhbGxvY1NpemUgPSAxICsgc2l6ZSAvIDgxOTI7IC8vIDEgYml0IHBlciBraWxvYnl0ZQotICAgICAgICBiaXRtYXAgPSAoY2hhciopIGNhbGxvYygxLCBhbGxvY1NpemUpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5SZWFkVHJhY2tlcigpIHsKLSAgICAgICAgZHVtcFRvTG9nKCk7Ci0gICAgICAgIGZyZWUoYml0bWFwKTsKLSAgICB9Ci0gICAgdm9pZCBtYXJrKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBpbnQgZmlyc3RiaXQgPSBvZmZzZXQgLyAxMDI0OwotICAgICAgICBpbnQgbGFzdGJpdCA9IChvZmZzZXQgKyBzaXplIC0gMSkgLyAxMDI0OwotICAgICAgICBmb3IgKGludCBpID0gZmlyc3RiaXQ7IGkgPD0gbGFzdGJpdDsgaSsrKSB7Ci0gICAgICAgICAgICBiaXRtYXBbaS84XSB8PSAoMHg4MCA+PiAoaSAmIDcpKTsKLSAgICAgICAgfQotICAgIH0KLQotIHByaXZhdGU6Ci0gICAgdm9pZCBkdW1wVG9Mb2coKSB7Ci0gICAgICAgIC8vIDk2IGNoYXJzIHBlciBsaW5lLCBlYWNoIGNoYXIgcmVwcmVzZW50cyBvbmUga2lsb2J5dGUsIDEga2IgcGVyIGJpdAotICAgICAgICBpbnQgbnVtbGluZXMgPSBhbGxvY1NpemUgLyAxMjsKLSAgICAgICAgY2hhciBidWZbOTddOwotICAgICAgICBjaGFyICpjdXIgPSBiaXRtYXA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtbGluZXM7IGkrKyAmJiBjdXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTI7IGorKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgODsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZlsoaiAqIDgpICsga10gPSAoKmN1ciAmICgweDgwID4+IGspKSA/ICdYJyA6ICcuJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZbOTZdID0gJ1wwJzsKLSAgICAgICAgICAgIEFMT0dJKCIlNWRrOiAlcyIsIGkgKiA5NiwgYnVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNpemVfdCBhbGxvY1NpemU7Ci0gICAgY2hhciAqYml0bWFwOwotfTsKLQotc3RydWN0IERhdGFTb3VyY2VTb3VyY2UgOiBwdWJsaWMgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U291cmNlIHsKLSAgICBEYXRhU291cmNlU291cmNlKHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCi0gICAgICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSB7Ci0gICAgICAgICAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMKTsKLSNpZiAwCi0gICAgICAgICAgICBvZmY2NF90IHNpemU7Ci0gICAgICAgICAgICBpZiAoc291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgewotICAgICAgICAgICAgICAgIG1SZWFkVHJhY2tlciA9IG5ldyBSZWFkVHJhY2tlcihzaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNvdWxkbid0IGdldCBkYXRhIHNvdXJjZSBzaXplIik7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgaWYgKG1SZWFkVHJhY2tlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUmVhZFRyYWNrZXItPm1hcmsob2Zmc2V0LCBzaXplKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc1NlZWthYmxlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHNwPFJlYWRUcmFja2VyPiBtUmVhZFRyYWNrZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEYXRhU291cmNlU291cmNlKTsKLX07Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OkZyYWdtZW50ZWRNUDRQYXJzZXIoKQotICAgIDogbUJ1ZmZlclBvcygwKSwKLSAgICAgIG1TdXNwZW5kZWQoZmFsc2UpLAotICAgICAgbURvbmVXaXRoTW9vdihmYWxzZSksCi0gICAgICBtRmlyc3RNb29mT2Zmc2V0KDApLAotICAgICAgbUZpbmFsUmVzdWx0KE9LKSB7Ci19Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6On5GcmFnbWVudGVkTVA0UGFyc2VyKCkgewotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OnN0YXJ0KGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKLSAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IEZpbGVTb3VyY2UoZmlsZW5hbWUpKTsKLSAgICBtc2ctPnBvc3QoKTsKLSAgICBBTE9HVigiUGFyc2VyOjpzdGFydCglcykiLCBmaWxlbmFtZSk7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6c3RhcnQoY29uc3Qgc3A8U291cmNlPiAmc291cmNlKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKLSAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKLSAgICBtc2ctPnBvc3QoKTsKLSAgICBBTE9HVigiUGFyc2VyOjpzdGFydChTb3VyY2UpIik7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6c3RhcnQoc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7Ci0gICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBEYXRhU291cmNlU291cmNlKHNvdXJjZSkpOwotICAgIG1zZy0+cG9zdCgpOwotICAgIEFMT0dWKCJQYXJzZXI6OnN0YXJ0KERhdGFTb3VyY2UpIik7Ci19Ci0KLXNwPEFNZXNzYWdlPiBGcmFnbWVudGVkTVA0UGFyc2VyOjpnZXRGb3JtYXQoYm9vbCBhdWRpbywgYm9vbCBzeW5jaHJvbm91cykgewotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgYm9vbCBtb292RG9uZSA9IG1Eb25lV2l0aE1vb3Y7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRGb3JtYXQsIGlkKCkpOwotICAgICAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIGF1ZGlvKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0Rm9ybWF0IHBvc3QgZmFpbGVkOiAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSAmJiBlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChzeW5jaHJvbm91cyAmJiBlcnIgPT0gLUVXT1VMREJMT0NLICYmICFtb292RG9uZSkgewotICAgICAgICAgICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkBnZXRGb3JtYXQgcGFyc2VyIG5vdCByZWFkeSB5ZXQsIHJldHJ5aW5nIik7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJnZXRGb3JtYXQgZmFpbGVkOiAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7Ci0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOwotCi0gICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgZm9ybWF0ICVzIiwgZm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZm9ybWF0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6c2Vla1RvKGJvb2wgd2FudEF1ZGlvLCBpbnQ2NF90IHRpbWVVcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrVG8sIGlkKCkpOwotICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgd2FudEF1ZGlvKTsKLSAgICBtc2ctPnNldEludDY0KCJwb3NpdGlvbiIsIHRpbWVVcyk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWJvb2wgRnJhZ21lbnRlZE1QNFBhcnNlcjo6aXNTZWVrYWJsZSgpIGNvbnN0IHsKLSAgICB3aGlsZSAobUZpcnN0TW9vZk9mZnNldCA9PSAwICYmIG1GaW5hbFJlc3VsdCA9PSBPSykgewotICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgIH0KLSAgICBib29sIHNlZWthYmxlID0gbVNvdXJjZS0+aXNTZWVrYWJsZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBzZWVrYWJsZSAmJiBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICBzZWVrYWJsZSAmPSAhaW5mby0+bVNpZHguZW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlZWthYmxlOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpvblNlZWtUbyhib29sIHdhbnRBdWRpbywgaW50NjRfdCBwb3NpdGlvbikgewotICAgIHN0YXR1c190IGVyciA9IC1FSU5WQUw7Ci0gICAgc3NpemVfdCB0cmFja0luZGV4ID0gZmluZFRyYWNrKHdhbnRBdWRpbyk7Ci0gICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgIGVyciA9IHRyYWNrSW5kZXg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdFZhbHVlQXQodHJhY2tJbmRleCk7Ci0KLSAgICAgICAgaW50IG51bVNpZHhFbnRyaWVzID0gaW5mby0+bVNpZHguc2l6ZSgpOwotICAgICAgICBpbnQ2NF90IHRvdGFsVGltZSA9IDA7Ci0gICAgICAgIG9mZl90IHRvdGFsT2Zmc2V0ID0gbUZpcnN0TW9vZk9mZnNldDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaWR4RW50cmllczsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBTaWR4RW50cnkgKnNlID0gJmluZm8tPm1TaWR4W2ldOwotICAgICAgICAgICAgaWYgKHRvdGFsVGltZSArIHNlLT5tRHVyYXRpb25VcyA+IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwwKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyUG9zID0gdG90YWxPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1GaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IE9LOwotICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkID0gdHJ1ZTsgLy8gZm9yY2UgcmVzdW1lCi0gICAgICAgICAgICAgICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZm8tPm1GcmFnbWVudHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBpbmZvLT5tRGVjb2RpbmdUaW1lID0gdG90YWxUaW1lICogaW5mby0+bU1lZGlhVGltZVNjYWxlIC8gMTAwMDAwMGxsOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvdGFsVGltZSArPSBzZS0+bUR1cmF0aW9uVXM7Ci0gICAgICAgICAgICB0b3RhbE9mZnNldCArPSBzZS0+bVNpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoInNlZWtUbyBvdXQgb2YgcmFuZ2UiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3luY2hyb25vdXMpIHsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREZXF1ZXVlQWNjZXNzVW5pdCwgaWQoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgYXVkaW8pOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dWKCJkZXF1ZXVlIGZhaWwgMTogJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSAmJiBlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChzeW5jaHJvbm91cyAmJiBlcnIgPT0gLUVXT1VMREJMT0NLKSB7Ci0gICAgICAgICAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUGFyc2VyIG5vdCByZWFkeSB5ZXQsIHJldHJ5aW5nIik7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJkZXF1ZXVlIGZhaWwgMjogJWQsICVkIiwgZXJyLCBzeW5jaHJvbm91cyk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRCdWZmZXIoImFjY2Vzc1VuaXQiLCBhY2Nlc3NVbml0KSk7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLX0KLQotc3NpemVfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpmaW5kVHJhY2soYm9vbCB3YW50QXVkaW8pIGNvbnN0IHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MudmFsdWVBdChpKTsKLQotICAgICAgICBib29sIGlzQXVkaW8gPQotICAgICAgICAgICAgaW5mby0+bU1lZGlhSGFuZGxlclR5cGUgPT0gRk9VUkNDKCdzJywgJ28nLCAndScsICduJyk7Ci0KLSAgICAgICAgYm9vbCBpc1ZpZGVvID0KLSAgICAgICAgICAgIGluZm8tPm1NZWRpYUhhbmRsZXJUeXBlID09IEZPVVJDQygndicsICdpJywgJ2QnLCAnZScpOwotCi0gICAgICAgIGlmICgod2FudEF1ZGlvICYmIGlzQXVkaW8pIHx8ICghd2FudEF1ZGlvICYmICFpc0F1ZGlvKSkgewotICAgICAgICAgICAgaWYgKGluZm8tPm1TYW1wbGVEZXNjcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKLQotICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwotCi0gICAgICAgICAgICBtQnVmZmVyID0gbmV3IEFCdWZmZXIoNTEyICogMTAyNCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLQotICAgICAgICAgICAgZW50ZXIoMGxsLCAwLCAwKTsKLQotICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByb2NlZWQsIGlkKCkpKS0+cG9zdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UHJvY2VlZDoKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0soIW1TdXNwZW5kZWQpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvblByb2NlZWQoKTsKLQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIGlmICghbVN1c3BlbmRlZCkgewotICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm9uUHJvY2VlZCByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFJlYWRNb3JlOgotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplX3QgbmVlZGVkOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgibmVlZGVkIiwgJm5lZWRlZCkpOwotCi0gICAgICAgICAgICBtZW1tb3ZlKG1CdWZmZXItPmJhc2UoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgbUJ1ZmZlclBvcyArPSBtQnVmZmVyLT5vZmZzZXQoKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9IG1CdWZmZXItPmNhcGFjaXR5KCkgLSBtQnVmZmVyLT5zaXplKCk7Ci0KLSAgICAgICAgICAgIGlmIChtYXhCeXRlc1RvUmVhZCA8IG5lZWRlZCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJyZXNpemluZyBidWZmZXIuIik7Ci0KLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQUJ1ZmZlcigobUJ1ZmZlci0+c2l6ZSgpICsgbmVlZGVkICsgMTAyMykgJiB+MTAyMyk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KG5ld0J1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgbmV3QnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICAgICAgbUJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICAgICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IG1CdWZmZXItPmNhcGFjaXR5KCkgLSBtQnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLX0dFKG1heEJ5dGVzVG9SZWFkLCBuZWVkZWQpOwotCi0gICAgICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXJQb3MgKyBtQnVmZmVyLT5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnNpemUoKSwgbmVlZGVkKTsKLQotICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdCluZWVkZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiUmVhY2hlZCBFT0Ygd2hlbiByZWFkaW5nICVkIEAgJWQgKyAlZCIsIG5lZWRlZCwgbUJ1ZmZlclBvcywgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IEVSUk9SX0lPOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpICsgbik7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByb2NlZWQsIGlkKCkpKS0+cG9zdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRHZXRGb3JtYXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2FudEF1ZGlvOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJndhbnRBdWRpbykpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSAtRVdPVUxEQkxPQ0s7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgdHJhY2tJbmRleCA9IGZpbmRUcmFjayh3YW50QXVkaW8pOwotCi0gICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSB0cmFja0luZGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0VmFsdWVBdCh0cmFja0luZGV4KTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBpbmZvLT5tU2FtcGxlRGVzY3MuaXRlbUF0KDApLm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8tPm1TaWR4RHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGluZm8tPm1TaWR4RHVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUgemVyby4gT2ggd2VsbC4uLgotICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KCJkdXJhdGlvblVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgKiBpbmZvLT5tRHVyYXRpb24gLyBpbmZvLT5tTWVkaWFUaW1lU2NhbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQiLCBmb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdERlcXVldWVBY2Nlc3NVbml0OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdhbnRBdWRpbzsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZ3YW50QXVkaW8pKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gLUVXT1VMREJMT0NLOwotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotCi0gICAgICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXggPSBmaW5kVHJhY2sod2FudEF1ZGlvKTsKLQotICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gdHJhY2tJbmRleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKLSAgICAgICAgICAgICAgICBlcnIgPSBvbkRlcXVldWVBY2Nlc3NVbml0KHRyYWNrSW5kZXgsICZhY2Nlc3NVbml0KTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEJ1ZmZlcigiYWNjZXNzVW5pdCIsIGFjY2Vzc1VuaXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotCi0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCi0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U2Vla1RvOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigia1doYXRTZWVrVG8iKTsKLSAgICAgICAgICAgIGludDMyX3Qgd2FudEF1ZGlvOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJndhbnRBdWRpbykpOwotICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJwb3NpdGlvbiIsICZwb3NpdGlvbikpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSAtRVdPVUxEQkxPQ0s7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgdHJhY2tJbmRleCA9IGZpbmRUcmFjayh3YW50QXVkaW8pOwotCi0gICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSB0cmFja0luZGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBvblNlZWtUbyh3YW50QXVkaW8sIHBvc2l0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpvblByb2NlZWQoKSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgaWYgKChlcnIgPSBuZWVkKDgpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHVpbnQ2NF90IHNpemUgPSByZWFkVTMyKDApOwotICAgIHVpbnQzMl90IHR5cGUgPSByZWFkVTMyKDQpOwotCi0gICAgc2l6ZV90IG9mZnNldCA9IDg7Ci0KLSAgICBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgIGlmICgoZXJyID0gbmVlZCgxNikpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZSA9IHJlYWRVNjQob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgfQotCi0gICAgdWludDhfdCB1c2VyVHlwZVsxNl07Ci0KLSAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ3UnLCAndScsICdpJywgJ2QnKSkgewotICAgICAgICBpZiAoKGVyciA9IG5lZWQob2Zmc2V0ICsgMTYpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWNweSh1c2VyVHlwZSwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCAxNik7Ci0gICAgICAgIG9mZnNldCArPSAxNjsKLSAgICB9Ci0KLSAgICBDSEVDSyghbVN0YWNrLmlzRW1wdHkoKSk7Ci0gICAgdWludDMyX3QgcHR5cGUgPSBtU3RhY2suaXRlbUF0KG1TdGFjay5zaXplKCkgLSAxKS5tVHlwZTsKLQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bURpc3BhdGNoZXJzID0KLSAgICAgICAgc2l6ZW9mKGtEaXNwYXRjaFRhYmxlKSAvIHNpemVvZihrRGlzcGF0Y2hUYWJsZVswXSk7Ci0KLSAgICBzaXplX3QgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwga051bURpc3BhdGNoZXJzOyArK2kpIHsKLSAgICAgICAgaWYgKGtEaXNwYXRjaFRhYmxlW2ldLm1UeXBlID09IHR5cGUKLSAgICAgICAgICAgICAgICAmJiBrRGlzcGF0Y2hUYWJsZVtpXS5tUGFyZW50VHlwZSA9PSBwdHlwZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTYW1wbGVFbnRyeSBib3hlcyBhcmUgY29udGFpbmVyIGJveGVzIHRoYXQgc3RhcnQgd2l0aCBhIHZhcmlhYmxlCi0gICAgLy8gYW1vdW50IG9mIGRhdGEgZGVwZW5kaW5nIG9uIHRoZSBtZWRpYSBoYW5kbGVyIHR5cGUuCi0gICAgLy8gV2UgZG9uJ3QgbG9vayBpbnNpZGUgJ2hpbnQnIHR5cGUgU2FtcGxlRW50cnkgYm94ZXMuCi0KLSAgICBib29sIGlzU2FtcGxlRW50cnlCb3ggPQotICAgICAgICAocHR5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJykpCi0gICAgICAgICYmIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tTWVkaWFIYW5kbGVyVHlwZQotICAgICAgICAhPSBGT1VSQ0MoJ2gnLCAnaScsICduJywgJ3QnKTsKLQotICAgIGlmICgoaSA8IGtOdW1EaXNwYXRjaGVycyAmJiBrRGlzcGF0Y2hUYWJsZVtpXS5tSGFuZGxlciA9PSAwKQotICAgICAgICAgICAgfHwgaXNTYW1wbGVFbnRyeUJveCB8fCBwdHlwZSA9PSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKSkgewotICAgICAgICAvLyBUaGlzIGlzIGEgY29udGFpbmVyIGJveC4KLSAgICAgICAgaWYgKHR5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKLSAgICAgICAgICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmlyc3QgbW9vZiBAICUwOHgiLCBtQnVmZmVyUG9zICsgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBtRmlyc3RNb29mT2Zmc2V0ID0gbUJ1ZmZlclBvcyArIG9mZnNldCAtIDg7IC8vIHBvaW50IGF0IHRoZSBzaXplCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgPT0gRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJykpIHsKLSAgICAgICAgICAgIGlmICgoZXJyID0gbmVlZChvZmZzZXQgKyA0KSkgPCBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZPVVJDQygncycsICd0JywgJ3MnLCAnZCcpKSB7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IG5lZWQob2Zmc2V0ICsgOCkpIDwgT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlYWRVMzIob2Zmc2V0ICsgNCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgYXQgbGVhc3Qgc29tZSBlbnRyaWVzLgotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgKz0gODsKLSAgICAgICAgfSBlbHNlIGlmIChpc1NhbXBsZUVudHJ5Qm94KSB7Ci0gICAgICAgICAgICBzaXplX3QgaGVhZGVyU2l6ZTsKLQotICAgICAgICAgICAgc3dpdGNoIChlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bU1lZGlhSGFuZGxlclR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygndicsICdpJywgJ2QnLCAnZScpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gOCBieXRlcyBTYW1wbGVFbnRyeSArIDcwIGJ5dGVzIFZpc3VhbFNhbXBsZUVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclNpemUgPSA3ODsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnbycsICd1JywgJ24nKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDggYnl0ZXMgU2FtcGxlRW50cnkgKyAyMCBieXRlcyBBdWRpb1NhbXBsZUVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclNpemUgPSAyODsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclNpemUgPSA4OyAgLy8gOCBieXRlcyBTYW1wbGVFbnRyeQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob2Zmc2V0ICsgaGVhZGVyU2l6ZSA+IHNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChlcnIgPSBuZWVkKG9mZnNldCArIGhlYWRlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1NZWRpYUhhbmRsZXJUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3YnLCAnaScsICdkJywgJ2UnKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlVmlzdWFsU2FtcGxlRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb2Zmc2V0LCBvZmZzZXQgKyBoZWFkZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnbycsICd1JywgJ24nKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlQXVkaW9TYW1wbGVFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvZmZzZXQsIG9mZnNldCArIGhlYWRlclNpemUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgKz0gaGVhZGVyU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNraXAob2Zmc2V0KTsKLQotICAgICAgICBBTE9HVigiJXNlbnRlcmluZyBib3ggb2YgdHlwZSAnJXMnIiwKLSAgICAgICAgICAgICAgICBJbmRlbnRTdHJpbmcobVN0YWNrLnNpemUoKSksIEZvdXJjYzJTdHJpbmcodHlwZSkpOwotCi0gICAgICAgIGVudGVyKG1CdWZmZXJQb3MgLSBvZmZzZXQsIHR5cGUsIHNpemUgLSBvZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghZml0c0NvbnRhaW5lcihzaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA8IGtOdW1EaXNwYXRjaGVycyAmJiBrRGlzcGF0Y2hUYWJsZVtpXS5tSGFuZGxlciAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBXZSBoYXZlIGEgaGFuZGxlciBmb3IgdGhpcyBib3ggdHlwZS4KLQotICAgICAgICAgICAgaWYgKChlcnIgPSBuZWVkKHNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCIlc3BhcnNpbmcgYm94IG9mIHR5cGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgIEluZGVudFN0cmluZyhtU3RhY2suc2l6ZSgpKSwgRm91cmNjMlN0cmluZyh0eXBlKSk7Ci0KLSAgICAgICAgICAgIGlmICgoZXJyID0gKHRoaXMtPiprRGlzcGF0Y2hUYWJsZVtpXS5tSGFuZGxlcikoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb2Zmc2V0LCBzaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVW5rbm93biBib3ggdHlwZQotCi0gICAgICAgICAgICBBTE9HVigiJXNza2lwcGluZyBib3ggb2YgdHlwZSAnJXMnLCBzaXplICVsbHUiLAotICAgICAgICAgICAgICAgICAgICBJbmRlbnRTdHJpbmcobVN0YWNrLnNpemUoKSksCi0gICAgICAgICAgICAgICAgICAgIEZvdXJjYzJTdHJpbmcodHlwZSksIHNpemUpOwotCi0gICAgICAgIH0KLQotICAgICAgICBza2lwKHNpemUpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi1pbnQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6Q29tcGFyZVNhbXBsZUxvY2F0aW9uKAotICAgICAgICBjb25zdCBTYW1wbGVJbmZvICZzYW1wbGUsIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvKSB7Ci0gICAgaWYgKHNhbXBsZS5tT2Zmc2V0ICsgc2FtcGxlLm1TaXplIDwgbWRhdEluZm8ubU9mZnNldCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKHNhbXBsZS5tT2Zmc2V0ID49IG1kYXRJbmZvLm1PZmZzZXQgKyBtZGF0SW5mby5tQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLy8gT3RoZXJ3aXNlIG1ha2Ugc3VyZSB0aGUgc2FtcGxlIGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIHdpdGhpbiB0aGlzCi0gICAgLy8gbWVkaWEgZGF0YSBibG9jay4KLQotICAgIENIRUNLX0dFKHNhbXBsZS5tT2Zmc2V0LCBtZGF0SW5mby5tT2Zmc2V0KTsKLQotICAgIENIRUNLX0xFKHNhbXBsZS5tT2Zmc2V0ICsgc2FtcGxlLm1TaXplLAotICAgICAgICAgICAgIG1kYXRJbmZvLm1PZmZzZXQgKyBtZGF0SW5mby5tQnVmZmVyLT5zaXplKCkpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cmVzdW1lSWZOZWNlc3NhcnkoKSB7Ci0gICAgaWYgKCFtU3VzcGVuZGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigicmVzdW1pbmcuIik7Ci0KLSAgICBtU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFByb2NlZWQsIGlkKCkpKS0+cG9zdCgpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpnZXRTYW1wbGUoCi0gICAgICAgIFRyYWNrSW5mbyAqaW5mbywgc3A8VHJhY2tGcmFnbWVudD4gKmZyYWdtZW50LCBTYW1wbGVJbmZvICpzYW1wbGVJbmZvKSB7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoaW5mby0+bUZyYWdtZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobUZpbmFsUmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1GaW5hbFJlc3VsdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7Ci0gICAgICAgIH0KLQotICAgICAgICAqZnJhZ21lbnQgPSAqaW5mby0+bUZyYWdtZW50cy5iZWdpbigpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9ICgqZnJhZ21lbnQpLT5nZXRTYW1wbGUoc2FtcGxlSW5mbyk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVhbGx5LCBlbmQgb2YgdGhpcyBmcmFnbWVudC4uLgotCi0gICAgICAgIGluZm8tPm1GcmFnbWVudHMuZXJhc2UoaW5mby0+bUZyYWdtZW50cy5iZWdpbigpKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6Om9uRGVxdWV1ZUFjY2Vzc1VuaXQoCi0gICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewotICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRWYWx1ZUF0KHRyYWNrSW5kZXgpOwotCi0gICAgc3A8VHJhY2tGcmFnbWVudD4gZnJhZ21lbnQ7Ci0gICAgU2FtcGxlSW5mbyBzYW1wbGVJbmZvOwotICAgIHN0YXR1c190IGVyciA9IGdldFNhbXBsZShpbmZvLCAmZnJhZ21lbnQsICZzYW1wbGVJbmZvKTsKLQotICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7Ci0gICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAtRVdPVUxEQkxPQ0s7Ci0KLSAgICBib29sIGNoZWNrRHJvcHBhYmxlID0gZmFsc2U7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYURhdGEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8gPSBtTWVkaWFEYXRhLml0ZW1BdChpKTsKLQotICAgICAgICBpbnQgY21wID0gQ29tcGFyZVNhbXBsZUxvY2F0aW9uKHNhbXBsZUluZm8sIG1kYXRJbmZvKTsKLQotICAgICAgICBpZiAoY21wIDwgMCAmJiAhbVNvdXJjZS0+aXNTZWVrYWJsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVQSVBFOwotICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBjaGVja0Ryb3BwYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IG1ha2VBY2Nlc3NVbml0KGluZm8sIHNhbXBsZUluZm8sIG1kYXRJbmZvLCBhY2Nlc3NVbml0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZyYWdtZW50LT5hZHZhbmNlKCk7Ci0KLSAgICBpZiAoIW1NZWRpYURhdGEuZW1wdHkoKSAmJiBjaGVja0Ryb3BwYWJsZSkgewotICAgICAgICBzaXplX3QgbnVtRHJvcHBhYmxlID0gMDsKLSAgICAgICAgYm9vbCBkb25lID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gWFhYIEZJWE1FOiBpZiBvbmUgb2YgdGhlIHRyYWNrcyBpcyBub3QgYWR2YW5jZWQgKGUuZy4gaWYgeW91IHBsYXkgYW4gYXVkaW8rdmlkZW8KLSAgICAgICAgLy8gZmlsZSB3aXRoIHNmMiksIHRoZW4gbU1lZGlhRGF0YSB3aWxsIG5vdCBiZSBwcnVuZWQgYW5kIGtlZXBzIGdyb3dpbmcKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7ICFkb25lICYmIGkgPCBtTWVkaWFEYXRhLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbyA9IG1NZWRpYURhdGEuaXRlbUF0KGkpOwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1UcmFja3Muc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0VmFsdWVBdChqKTsKLQotICAgICAgICAgICAgICAgIHNwPFRyYWNrRnJhZ21lbnQ+IGZyYWdtZW50OwotICAgICAgICAgICAgICAgIFNhbXBsZUluZm8gc2FtcGxlSW5mbzsKLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRTYW1wbGUoaW5mbywgJmZyYWdtZW50LCAmc2FtcGxlSW5mbyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgY21wID0gQ29tcGFyZVNhbXBsZUxvY2F0aW9uKHNhbXBsZUluZm8sIG1kYXRJbmZvKTsKLQotICAgICAgICAgICAgICAgIGlmIChjbXAgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgICAgICAgICArK251bURyb3BwYWJsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudW1Ecm9wcGFibGUgPiAwKSB7Ci0gICAgICAgICAgICBtTWVkaWFEYXRhLnJlbW92ZUl0ZW1zQXQoMCwgbnVtRHJvcHBhYmxlKTsKLQotICAgICAgICAgICAgaWYgKG1NZWRpYURhdGEuc2l6ZSgpIDwgNSkgewotICAgICAgICAgICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgc2l6ZV90IHBhcnNlTkFMU2l6ZShzaXplX3QgbmFsTGVuZ3RoU2l6ZSwgY29uc3QgdWludDhfdCAqZGF0YSkgewotICAgIHN3aXRjaCAobmFsTGVuZ3RoU2l6ZSkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICByZXR1cm4gKmRhdGE7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHJldHVybiBVMTZfQVQoZGF0YSk7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHJldHVybiAoKHNpemVfdClkYXRhWzBdIDw8IDE2KSB8IFUxNl9BVCgmZGF0YVsxXSk7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJldHVybiBVMzJfQVQoZGF0YSk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBjYW5ub3QgaGFwcGVuLCBtTkFMTGVuZ3RoU2l6ZSBzcHJpbmdzIHRvIGxpZmUgYnkgYWRkaW5nIDEgdG8KLSAgICAvLyBhIDItYml0IGludGVnZXIuCi0gICAgVFJFU1BBU1MoKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjptYWtlQWNjZXNzVW5pdCgKLSAgICAgICAgVHJhY2tJbmZvICppbmZvLAotICAgICAgICBjb25zdCBTYW1wbGVJbmZvICZzYW1wbGUsCi0gICAgICAgIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvLAotICAgICAgICBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewotICAgIGlmIChzYW1wbGUubVNhbXBsZURlc2NJbmRleCA8IDEKLSAgICAgICAgICAgIHx8IHNhbXBsZS5tU2FtcGxlRGVzY0luZGV4ID4gaW5mby0+bVNhbXBsZURlc2NzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGludDY0X3QgcHJlc2VudGF0aW9uVGltZVVzID0KLSAgICAgICAgMTAwMDAwMGxsICogc2FtcGxlLm1QcmVzZW50YXRpb25UaW1lIC8gaW5mby0+bU1lZGlhVGltZVNjYWxlOwotCi0gICAgY29uc3QgU2FtcGxlRGVzY3JpcHRpb24gJnNhbXBsZURlc2MgPQotICAgICAgICBpbmZvLT5tU2FtcGxlRGVzY3MuaXRlbUF0KHNhbXBsZS5tU2FtcGxlRGVzY0luZGV4IC0gMSk7Ci0KLSAgICBzaXplX3QgbmFsTGVuZ3RoU2l6ZTsKLSAgICBpZiAoIXNhbXBsZURlc2MubUZvcm1hdC0+ZmluZFNpemUoIm5hbC1sZW5ndGgtc2l6ZSIsICZuYWxMZW5ndGhTaXplKSkgewotICAgICAgICAqYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHNhbXBsZS5tU2l6ZSk7Ci0KLSAgICAgICAgbWVtY3B5KCgqYWNjZXNzVW5pdCktPmRhdGEoKSwKLSAgICAgICAgICAgICAgIG1kYXRJbmZvLm1CdWZmZXItPmRhdGEoKSArIChzYW1wbGUubU9mZnNldCAtIG1kYXRJbmZvLm1PZmZzZXQpLAotICAgICAgICAgICAgICAgc2FtcGxlLm1TaXplKTsKLQotICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBwcmVzZW50YXRpb25UaW1lVXMpOwotICAgICAgICBpZiAoSXNJRFIoKmFjY2Vzc1VuaXQpKSB7Ci0gICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDMyKCJpcy1zeW5jLWZyYW1lIiwgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqc3JjUHRyID0KLSAgICAgICAgbWRhdEluZm8ubUJ1ZmZlci0+ZGF0YSgpICsgKHNhbXBsZS5tT2Zmc2V0IC0gbWRhdEluZm8ubU9mZnNldCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDIgOyArK2kpIHsKLSAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwotCi0gICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzYW1wbGUubVNpemUpIHsKLSAgICAgICAgICAgIGlmIChzcmNPZmZzZXQgKyBuYWxMZW5ndGhTaXplID4gc2FtcGxlLm1TaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2l6ZV90IG5hbFNpemUgPSBwYXJzZU5BTFNpemUobmFsTGVuZ3RoU2l6ZSwgJnNyY1B0cltzcmNPZmZzZXRdKTsKLSAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGhTaXplOwotCi0gICAgICAgICAgICBpZiAoc3JjT2Zmc2V0ICsgbmFsU2l6ZSA+IHNhbXBsZS5tU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpID09IDEpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKCphY2Nlc3NVbml0KS0+ZGF0YSgpICsgZHN0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMSIsCi0gICAgICAgICAgICAgICAgICAgICAgIDQpOwotCi0gICAgICAgICAgICAgICAgbWVtY3B5KCgqYWNjZXNzVW5pdCktPmRhdGEoKSArIGRzdE9mZnNldCArIDQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciArIHNyY09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgbmFsU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxTaXplOwotICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbFNpemUgKyA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgKCphY2Nlc3NVbml0KSA9IG5ldyBBQnVmZmVyKGRzdE9mZnNldCk7Ci0gICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAidGltZVVzIiwgcHJlc2VudGF0aW9uVGltZVVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoSXNJRFIoKmFjY2Vzc1VuaXQpKSB7Ci0gICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50MzIoImlzLXN5bmMtZnJhbWUiLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6Om5lZWQoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoIWZpdHNDb250YWluZXIoc2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPD0gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVhZE1vcmUsIGlkKCkpOwotICAgIG1zZy0+c2V0U2l6ZSgibmVlZGVkIiwgc2l6ZSAtIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0KLSAgICAvLyBBTE9HVigibmVlZCglZCkgcmV0dXJuaW5nIC1FQUdBSU4sIG9ubHkgaGF2ZSAlZCIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICByZXR1cm4gLUVBR0FJTjsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjplbnRlcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgdHlwZSwgdWludDY0X3Qgc2l6ZSkgewotICAgIENvbnRhaW5lciBjb250YWluZXI7Ci0gICAgY29udGFpbmVyLm1PZmZzZXQgPSBvZmZzZXQ7Ci0gICAgY29udGFpbmVyLm1UeXBlID0gdHlwZTsKLSAgICBjb250YWluZXIubUV4dGVuZHNUb0VPRiA9IChzaXplID09IDApOwotICAgIGNvbnRhaW5lci5tQnl0ZXNSZW1haW5pbmcgPSBzaXplOwotCi0gICAgbVN0YWNrLnB1c2goY29udGFpbmVyKTsKLX0KLQotYm9vbCBGcmFnbWVudGVkTVA0UGFyc2VyOjpmaXRzQ29udGFpbmVyKHVpbnQ2NF90IHNpemUpIGNvbnN0IHsKLSAgICBDSEVDSyghbVN0YWNrLmlzRW1wdHkoKSk7Ci0gICAgY29uc3QgQ29udGFpbmVyICZjb250YWluZXIgPSBtU3RhY2suaXRlbUF0KG1TdGFjay5zaXplKCkgLSAxKTsKLQotICAgIHJldHVybiBjb250YWluZXIubUV4dGVuZHNUb0VPRiB8fCBzaXplIDw9IGNvbnRhaW5lci5tQnl0ZXNSZW1haW5pbmc7Ci19Ci0KLXVpbnQxNl90IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnJlYWRVMTYoc2l6ZV90IG9mZnNldCkgewotICAgIENIRUNLX0xFKG9mZnNldCArIDIsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICBjb25zdCB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7Ci0gICAgcmV0dXJuIChwdHJbMF0gPDwgOCkgfCBwdHJbMV07Ci19Ci0KLXVpbnQzMl90IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnJlYWRVMzIoc2l6ZV90IG9mZnNldCkgewotICAgIENIRUNLX0xFKG9mZnNldCArIDQsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICBjb25zdCB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7Ci0gICAgcmV0dXJuIChwdHJbMF0gPDwgMjQpIHwgKHB0clsxXSA8PCAxNikgfCAocHRyWzJdIDw8IDgpIHwgcHRyWzNdOwotfQotCi11aW50NjRfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpyZWFkVTY0KHNpemVfdCBvZmZzZXQpIHsKLSAgICByZXR1cm4gKCgodWludDY0X3QpcmVhZFUzMihvZmZzZXQpKSA8PCAzMikgfCByZWFkVTMyKG9mZnNldCArIDQpOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OnNraXAob2ZmX3QgZGlzdGFuY2UpIHsKLSAgICBDSEVDSyghbVN0YWNrLmlzRW1wdHkoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IG1TdGFjay5zaXplKCk7IGktLSA+IDA7KSB7Ci0gICAgICAgIENvbnRhaW5lciAqY29udGFpbmVyID0gJm1TdGFjay5lZGl0SXRlbUF0KGkpOwotICAgICAgICBpZiAoIWNvbnRhaW5lci0+bUV4dGVuZHNUb0VPRikgewotICAgICAgICAgICAgQ0hFQ0tfTEUoZGlzdGFuY2UsIChvZmZfdCljb250YWluZXItPm1CeXRlc1JlbWFpbmluZyk7Ci0KLSAgICAgICAgICAgIGNvbnRhaW5lci0+bUJ5dGVzUmVtYWluaW5nIC09IGRpc3RhbmNlOwotCi0gICAgICAgICAgICBpZiAoY29udGFpbmVyLT5tQnl0ZXNSZW1haW5pbmcgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlc2xlYXZpbmcgYm94IG9mIHR5cGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbmRlbnRTdHJpbmcobVN0YWNrLnNpemUoKSAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgRm91cmNjMlN0cmluZyhjb250YWluZXItPm1UeXBlKSk7Ci0KLSNpZiAwCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci0+bVR5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA8IHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm9ybWF0ICMlZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLml0ZW1BdChpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubUZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci0+bVR5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJykpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgICAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TdGF0aWNGcmFnbWVudC0+c2lnbmFsQ29tcGxldGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgIENIRUNLKHRyYWNrSW5mby0+bUZyYWdtZW50cy5lbXB0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tRnJhZ21lbnRzLnB1c2hfYmFjayh0cmFja0luZm8tPm1TdGF0aWNGcmFnbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVN0YXRpY0ZyYWdtZW50LmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXItPm1UeXBlID09IEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRUcmFjayhtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrRnJhZ21lbnQ+ICZmcmFnbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLS10cmFja0luZm8tPm1GcmFnbWVudHMuZW5kKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RHluYW1pY1RyYWNrRnJhZ21lbnQgKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQuZ2V0KCkpLT5zaWduYWxDb21wbGV0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXItPm1UeXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Eb25lV2l0aE1vb3YgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgbVN0YWNrLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZGlzdGFuY2UgPCAob2ZmX3QpbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgIG1CdWZmZXItPnNldFJhbmdlKG1CdWZmZXItPm9mZnNldCgpICsgZGlzdGFuY2UsIG1CdWZmZXItPnNpemUoKSAtIGRpc3RhbmNlKTsKLSAgICAgICAgbUJ1ZmZlclBvcyArPSBkaXN0YW5jZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwotICAgIG1CdWZmZXJQb3MgKz0gZGlzdGFuY2U7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tIZWFkZXIoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uID0gZmxhZ3MgPj4gMjQ7Ci0gICAgZmxhZ3MgJj0gMHhmZmZmZmY7Ci0KLSAgICB1aW50MzJfdCB0cmFja0lEOwotICAgIHVpbnQ2NF90IGR1cmF0aW9uOwotCi0gICAgaWYgKHZlcnNpb24gPT0gMSkgewotICAgICAgICBpZiAob2Zmc2V0ICsgMzYgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyYWNrSUQgPSByZWFkVTMyKG9mZnNldCArIDIwKTsKLSAgICAgICAgZHVyYXRpb24gPSByZWFkVTY0KG9mZnNldCArIDI4KTsKLQotICAgICAgICBvZmZzZXQgKz0gMzY7Ci0gICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDI0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cmFja0lEID0gcmVhZFUzMihvZmZzZXQgKyAxMik7Ci0gICAgICAgIGR1cmF0aW9uID0gcmVhZFUzMihvZmZzZXQgKyAyMCk7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IDI0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIFRyYWNrSW5mbyAqaW5mbyA9IGVkaXRUcmFjayh0cmFja0lELCB0cnVlIC8qIGNyZWF0ZUlmTmVjZXNzYXJ5ICovKTsKLSAgICBpbmZvLT5tRmxhZ3MgPSBmbGFnczsKLSAgICBpbmZvLT5tRHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICBpZiAoaW5mby0+bUR1cmF0aW9uID09IDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgLy8gZmZtcGVnIHNldHMgdGhpcyB0byAtMSwgd2hpY2ggaXMgaW5jb3JyZWN0LgotICAgICAgICBpbmZvLT5tRHVyYXRpb24gPSAwOwotICAgIH0KLQotICAgIGluZm8tPm1TdGF0aWNGcmFnbWVudCA9IG5ldyBTdGF0aWNUcmFja0ZyYWdtZW50OwotCi0gICAgbUN1cnJlbnRUcmFja0lEID0gdHJhY2tJRDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYUhlYWRlcigKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uQW5kRmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0KLSAgICBpZiAodmVyc2lvbkFuZEZsYWdzICYgMHhmZmZmZmYpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uID0gdmVyc2lvbkFuZEZsYWdzID4+IDI0OwotCi0gICAgVHJhY2tJbmZvICppbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ICsgMzIgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBpbmZvLT5tTWVkaWFUaW1lU2NhbGUgPSBVMzJfQVQobUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0ICsgMjApOwotICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ICsgMjAgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBpbmZvLT5tTWVkaWFUaW1lU2NhbGUgPSBVMzJfQVQobUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0ICsgMTIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhSGFuZGxlcigKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyAxMiA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IGhhbmRsZXJUeXBlID0gcmVhZFUzMihvZmZzZXQgKyA4KTsKLQotICAgIHN3aXRjaCAoaGFuZGxlclR5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3YnLCAnaScsICdkJywgJ2UnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnbycsICd1JywgJ24nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnaScsICduJywgJ3QnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bU1lZGlhSGFuZGxlclR5cGUgPSBoYW5kbGVyVHlwZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VWaXN1YWxTYW1wbGVFbnRyeSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA3OCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnB1c2goKTsKLSAgICBTYW1wbGVEZXNjcmlwdGlvbiAqc2FtcGxlRGVzYyA9Ci0gICAgICAgICZ0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5lZGl0SXRlbUF0KAotICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnNpemUoKSAtIDEpOwotCi0gICAgc2FtcGxlRGVzYy0+bVR5cGUgPSB0eXBlOwotICAgIHNhbXBsZURlc2MtPm1EYXRhUmVmSW5kZXggPSByZWFkVTE2KG9mZnNldCArIDYpOwotCi0gICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPVVJDQygncycsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnSCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHJlYWRVMTYob2Zmc2V0ICsgOCArIDE2KSk7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgcmVhZFUxNihvZmZzZXQgKyA4ICsgMTgpKTsKLQotICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQXVkaW9TYW1wbGVFbnRyeSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyAyOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnB1c2goKTsKLSAgICBTYW1wbGVEZXNjcmlwdGlvbiAqc2FtcGxlRGVzYyA9Ci0gICAgICAgICZ0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5lZGl0SXRlbUF0KAotICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnNpemUoKSAtIDEpOwotCi0gICAgc2FtcGxlRGVzYy0+bVR5cGUgPSB0eXBlOwotICAgIHNhbXBsZURlc2MtPm1EYXRhUmVmSW5kZXggPSByZWFkVTE2KG9mZnNldCArIDYpOwotCi0gICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKLQotICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCByZWFkVTE2KG9mZnNldCArIDggKyA4KSk7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXNpemUiLCByZWFkVTE2KG9mZnNldCArIDggKyAxMCkpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcmVhZFUzMihvZmZzZXQgKyA4ICsgMTYpIC8gNjU1MzYuMGYpOwotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ20nLCAncicpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwotICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIDEpOwotICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCA4MDAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAndycsICdiJyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQik7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgMSk7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIDE2MDAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzYW1wbGVEZXNjLT5tRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgdm9pZCBhZGRDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGludDMyX3QgaW5kZXgsCi0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICBib29sIGluc2VydFN0YXJ0Q29kZSA9IGZhbHNlKSB7Ci0gICAgc3A8QUJ1ZmZlcj4gY3NkID0gbmV3IEFCdWZmZXIoaW5zZXJ0U3RhcnRDb2RlID8gc2l6ZSArIDQgOiBzaXplKTsKLQotICAgIG1lbWNweShjc2QtPmRhdGEoKSArIChpbnNlcnRTdGFydENvZGUgPyA0IDogMCksIGRhdGEsIHNpemUpOwotCi0gICAgaWYgKGluc2VydFN0YXJ0Q29kZSkgewotICAgICAgICBtZW1jcHkoY3NkLT5kYXRhKCksICJceDAwXHgwMFx4MDBceDAxIiwgNCk7Ci0gICAgfQotCi0gICAgY3NkLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKLSAgICBjc2QtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDBsbCk7Ci0KLSAgICBmb3JtYXQtPnNldEJ1ZmZlcihTdHJpbmdQcmludGYoImNzZC0lZCIsIGluZGV4KS5jX3N0cigpLCBjc2QpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNhbXBsZVNpemVzKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tU3RhdGljRnJhZ21lbnQtPnBhcnNlU2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICB0aGlzLCB0eXBlLCBvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNvbXBhY3RTYW1wbGVTaXplcygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIHJldHVybiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bVN0YXRpY0ZyYWdtZW50LT5wYXJzZUNvbXBhY3RTYW1wbGVTaXplcygKLSAgICAgICAgICAgIHRoaXMsIHR5cGUsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIHJldHVybiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bVN0YXRpY0ZyYWdtZW50LT5wYXJzZVNhbXBsZVRvQ2h1bmsoCi0gICAgICAgICAgICB0aGlzLCB0eXBlLCBvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNodW5rT2Zmc2V0cygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIHJldHVybiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bVN0YXRpY0ZyYWdtZW50LT5wYXJzZUNodW5rT2Zmc2V0cygKLSAgICAgICAgICAgIHRoaXMsIHR5cGUsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1TdGF0aWNGcmFnbWVudC0+cGFyc2VDaHVua09mZnNldHM2NCgKLSAgICAgICAgICAgIHRoaXMsIHR5cGUsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgU2FtcGxlRGVzY3JpcHRpb24gKnNhbXBsZURlc2MgPQotICAgICAgICAmdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MuZWRpdEl0ZW1BdCgKLSAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5zaXplKCkgLSAxKTsKLQotICAgIGlmIChzYW1wbGVEZXNjLT5tVHlwZSAhPSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7Ci0KLSAgICBzaXplIC09IG9mZnNldDsKLSAgICBvZmZzZXQgPSAwOwotCi0gICAgaWYgKHNpemUgPCA3IHx8IHB0clswXSAhPSAweDAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgc2FtcGxlRGVzYy0+bUZvcm1hdC0+c2V0U2l6ZSgibmFsLWxlbmd0aC1zaXplIiwgMSArIChwdHJbNF0gJiAzKSk7Ci0KLSAgICBzaXplX3QgbnVtU1BTID0gcHRyWzVdICYgMzE7Ci0KLSAgICBwdHIgKz0gNjsKLSAgICBzaXplIC09IDY7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNQUzsgKytpKSB7Ci0gICAgICAgIGlmIChzaXplIDwgMikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKLQotICAgICAgICBwdHIgKz0gMjsKLSAgICAgICAgc2l6ZSAtPSAyOwotCi0gICAgICAgIGlmIChzaXplIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICAgICAgc2FtcGxlRGVzYy0+bUZvcm1hdCwgaSwgcHRyLCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbnNlcnRTdGFydENvZGUgKi8pOwotCi0gICAgICAgIHB0ciArPSBsZW5ndGg7Ci0gICAgICAgIHNpemUgLT0gbGVuZ3RoOwotICAgIH0KLQotICAgIGlmIChzaXplIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHNpemVfdCBudW1QUFMgPSAqcHRyOwotICAgICsrcHRyOwotICAgIC0tc2l6ZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUFBTOyArK2kpIHsKLSAgICAgICAgaWYgKHNpemUgPCAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IFUxNl9BVChwdHIpOwotCi0gICAgICAgIHB0ciArPSAyOwotICAgICAgICBzaXplIC09IDI7Ci0KLSAgICAgICAgaWYgKHNpemUgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgICAgICBzYW1wbGVEZXNjLT5tRm9ybWF0LCBudW1TUFMgKyBpLCBwdHIsIGxlbmd0aCwKLSAgICAgICAgICAgICAgICB0cnVlIC8qIGluc2VydFN0YXJ0Q29kZSAqLyk7Ci0KLSAgICAgICAgcHRyICs9IGxlbmd0aDsKLSAgICAgICAgc2l6ZSAtPSBsZW5ndGg7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUVTRFNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICBTYW1wbGVEZXNjcmlwdGlvbiAqc2FtcGxlRGVzYyA9Ci0gICAgICAgICZ0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5lZGl0SXRlbUF0KAotICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnNpemUoKSAtIDEpOwotCi0gICAgaWYgKHNhbXBsZURlc2MtPm1UeXBlICE9IEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpCi0gICAgICAgICAgICAmJiBzYW1wbGVEZXNjLT5tVHlwZSAhPSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7Ci0KLSAgICBzaXplIC09IG9mZnNldDsKLSAgICBvZmZzZXQgPSAwOwotCi0gICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChVMzJfQVQocHRyKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHB0ciArPSA0OwotICAgIHNpemUgLT00OwotCi0gICAgRVNEUyBlc2RzKHB0ciwgc2l6ZSk7Ci0KLSAgICB1aW50OF90IG9iamVjdFR5cGVJbmRpY2F0aW9uOwotICAgIGlmIChlc2RzLmdldE9iamVjdFR5cGVJbmRpY2F0aW9uKCZvYmplY3RUeXBlSW5kaWNhdGlvbikgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpjc2Q7Ci0gICAgc2l6ZV90IGNzZF9zaXplOwotICAgIGlmIChlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKAotICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICoqKSZjc2QsICZjc2Rfc2l6ZSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShzYW1wbGVEZXNjLT5tRm9ybWF0LCAwLCBjc2QsIGNzZF9zaXplKTsKLQotICAgIGlmIChzYW1wbGVEZXNjLT5tVHlwZSAhPSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKGNzZF9zaXplID09IDApIHsKLSAgICAgICAgLy8gVGhlcmUncyBubyBmdXJ0aGVyIGluZm9ybWF0aW9uLCBpLmUuIG5vIGNvZGVjIHNwZWNpZmljIGRhdGEKLSAgICAgICAgLy8gTGV0J3MgYXNzdW1lIHRoYXQgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIHRoZSBtcGVnNCBoZWFkZXJzCi0gICAgICAgIC8vIGlzIGFjY3VyYXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKGNzZF9zaXplIDwgMikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IG9iamVjdFR5cGUgPSBjc2RbMF0gPj4gMzsKLQotICAgIGlmIChvYmplY3RUeXBlID09IDMxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmcmVxSW5kZXggPSAoY3NkWzBdICYgNykgPDwgMSB8IChjc2RbMV0gPj4gNyk7Ci0gICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKLSAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMDsKLSAgICBpZiAoZnJlcUluZGV4ID09IDE1KSB7Ci0gICAgICAgIGlmIChjc2Rfc2l6ZSA8IDUpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzYW1wbGVSYXRlID0gKGNzZFsxXSAmIDB4N2YpIDw8IDE3Ci0gICAgICAgICAgICAgICAgICAgICAgICB8IGNzZFsyXSA8PCA5Ci0gICAgICAgICAgICAgICAgICAgICAgICB8IGNzZFszXSA8PCAxCi0gICAgICAgICAgICAgICAgICAgICAgICB8IChjc2RbNF0gPj4gNyk7Ci0KLSAgICAgICAgbnVtQ2hhbm5lbHMgPSAoY3NkWzRdID4+IDMpICYgMTU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdGljIHVpbnQzMl90IGtTYW1wbGluZ1JhdGVbXSA9IHsKLSAgICAgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKLSAgICAgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAKLSAgICAgICAgfTsKLQotICAgICAgICBpZiAoZnJlcUluZGV4ID09IDEzIHx8IGZyZXFJbmRleCA9PSAxNCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2ZyZXFJbmRleF07Ci0gICAgICAgIG51bUNoYW5uZWxzID0gKGNzZFsxXSA+PiAzKSAmIDE1OwotICAgIH0KLQotICAgIGlmIChudW1DaGFubmVscyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBzYW1wbGVEZXNjLT5tRm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBzYW1wbGVSYXRlKTsKLSAgICBzYW1wbGVEZXNjLT5tRm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIG51bUNoYW5uZWxzKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYURhdGEoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBBTE9HVigic2tpcHBpbmcgJ21kYXQnIGNodW5rIGF0IG9mZnNldHMgMHglMDhseC0weCUwOGxseC4iLAotICAgICAgICAgIG1CdWZmZXJQb3MgKyBvZmZzZXQsIG1CdWZmZXJQb3MgKyBzaXplKTsKLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUgLSBvZmZzZXQpOwotICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKLQotICAgIG1NZWRpYURhdGEucHVzaCgpOwotICAgIE1lZGlhRGF0YUluZm8gKmluZm8gPSAmbU1lZGlhRGF0YS5lZGl0SXRlbUF0KG1NZWRpYURhdGEuc2l6ZSgpIC0gMSk7Ci0gICAgaW5mby0+bUJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICBpbmZvLT5tT2Zmc2V0ID0gbUJ1ZmZlclBvcyArIG9mZnNldDsKLQotICAgIGlmIChtTWVkaWFEYXRhLnNpemUoKSA+IDEwKSB7Ci0gICAgICAgIEFMT0dWKCJzdXNwZW5kaW5nIGZvciBub3cuIik7Ci0gICAgICAgIG1TdXNwZW5kZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTZWdtZW50SW5kZXgoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBBTE9HVigic2lkeCBib3ggdHlwZSAlZCwgb2Zmc2V0ICVkLCBzaXplICVkIiwgdHlwZSwgaW50KG9mZnNldCksIGludChzaXplKSk7Ci0vLyAgICBBU3RyaW5nIHNpZHhzdHI7Ci0vLyAgICBoZXhkdW1wKG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgc2l6ZSwgMCAvKiBpbmRlbnQgKi8sICZzaWR4c3RyKTsKLS8vICAgIEFMT0dWKCJyYXcgc2lkeDoiKTsKLS8vICAgIEFMT0dWKCIlcyIsIHNpZHhzdHIuY19zdHIoKSk7Ci0gICAgaWYgKG9mZnNldCArIDEyID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24gPSBmbGFncyA+PiAyNDsKLSAgICBmbGFncyAmPSAweGZmZmZmZjsKLQotICAgIEFMT0dWKCJzaWR4IHZlcnNpb24gJWQiLCB2ZXJzaW9uKTsKLQotICAgIHVpbnQzMl90IHJlZmVyZW5jZUlkID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICB1aW50MzJfdCB0aW1lU2NhbGUgPSByZWFkVTMyKG9mZnNldCArIDgpOwotICAgIEFMT0dWKCJzaWR4IHJlZmlkL3RpbWVzY2FsZTogJWQvJWQiLCByZWZlcmVuY2VJZCwgdGltZVNjYWxlKTsKLQotICAgIHVpbnQ2NF90IGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZTsKLSAgICB1aW50NjRfdCBmaXJzdE9mZnNldDsKLQotICAgIG9mZnNldCArPSAxMjsKLQotICAgIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIGZpcnN0T2Zmc2V0ID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDE2ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgZWFybGllc3RQcmVzZW50YXRpb25UaW1lID0gcmVhZFU2NChvZmZzZXQpOwotICAgICAgICBmaXJzdE9mZnNldCA9IHJlYWRVNjQob2Zmc2V0ICsgOCk7Ci0gICAgICAgIG9mZnNldCArPSAxNjsKLSAgICB9Ci0gICAgQUxPR1YoInNpZHggcHJlcy9vZmY6ICVMZC8lTGQiLCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUsIGZpcnN0T2Zmc2V0KTsKLQotICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaWYgKHJlYWRVMTYob2Zmc2V0KSAhPSAwKSB7IC8vIHJlc2VydmVkCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpbnQzMl90IHJlZmVyZW5jZUNvdW50ID0gcmVhZFUxNihvZmZzZXQgKyAyKTsKLSAgICBvZmZzZXQgKz0gNDsKLSAgICBBTE9HVigicmVmY291bnQ6ICVkIiwgcmVmZXJlbmNlQ291bnQpOwotCi0gICAgaWYgKG9mZnNldCArIHJlZmVyZW5jZUNvdW50ICogMTIgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIFRyYWNrSW5mbyAqaW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotICAgIHVpbnQ2NF90IHRvdGFsX2R1cmF0aW9uID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZUNvdW50OyBpKyspIHsKLSAgICAgICAgdWludDMyX3QgZDEgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIHVpbnQzMl90IGQyID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICAgICAgdWludDMyX3QgZDMgPSByZWFkVTMyKG9mZnNldCArIDgpOwotCi0gICAgICAgIGlmIChkMSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJzdWItc2lkeCBib3hlcyBub3Qgc3VwcG9ydGVkIHlldCIpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgc2FwID0gZDMgJiAweDgwMDAwMDAwOwotICAgICAgICBib29sIHNhcHR5cGUgPSBkMyA+PiAyODsKLSAgICAgICAgaWYgKCFzYXAgfHwgc2FwdHlwZSA+IDIpIHsKLSAgICAgICAgICAgIEFMT0dXKCJub3QgYSBzdHJlYW0gYWNjZXNzIHBvaW50LCBvciB1bnN1cHBvcnRlZCB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgdG90YWxfZHVyYXRpb24gKz0gZDI7Ci0gICAgICAgIG9mZnNldCArPSAxMjsKLSAgICAgICAgQUxPR1YoIiBpdGVtICVkLCAlMDh4ICUwOHggJTA4eCIsIGksIGQxLCBkMiwgZDMpOwotICAgICAgICBTaWR4RW50cnkgc2U7Ci0gICAgICAgIHNlLm1TaXplID0gZDEgJiAweDdmZmZmZmZmOwotICAgICAgICBzZS5tRHVyYXRpb25VcyA9IDEwMDAwMDBMTCAqIGQyIC8gdGltZVNjYWxlOwotICAgICAgICBpbmZvLT5tU2lkeC5hZGQoc2UpOwotICAgIH0KLQotICAgIGluZm8tPm1TaWR4RHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbiAqIDEwMDAwMDAgLyB0aW1lU2NhbGU7Ci0gICAgQUxPR1YoImR1cmF0aW9uOiAlbGxkIiwgaW5mby0+bVNpZHhEdXJhdGlvbik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRXh0ZW5kcygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyAyNCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IHRyYWNrSUQgPSByZWFkVTMyKG9mZnNldCArIDQpOwotCi0gICAgVHJhY2tJbmZvICppbmZvID0gZWRpdFRyYWNrKHRyYWNrSUQsIHRydWUgLyogY3JlYXRlSWZOZWNlc3NhcnkgKi8pOwotICAgIGluZm8tPm1EZWZhdWx0U2FtcGxlRGVzY3JpcHRpb25JbmRleCA9IHJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0gICAgaW5mby0+bURlZmF1bHRTYW1wbGVEdXJhdGlvbiA9IHJlYWRVMzIob2Zmc2V0ICsgMTIpOwotICAgIGluZm8tPm1EZWZhdWx0U2FtcGxlU2l6ZSA9IHJlYWRVMzIob2Zmc2V0ICsgMTYpOwotICAgIGluZm8tPm1EZWZhdWx0U2FtcGxlRmxhZ3MgPSByZWFkVTMyKG9mZnNldCArIDIwKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6VHJhY2tJbmZvICpGcmFnbWVudGVkTVA0UGFyc2VyOjplZGl0VHJhY2soCi0gICAgICAgIHVpbnQzMl90IHRyYWNrSUQsIGJvb2wgY3JlYXRlSWZOZWNlc3NhcnkpIHsKLSAgICBzc2l6ZV90IGkgPSBtVHJhY2tzLmluZGV4T2ZLZXkodHJhY2tJRCk7Ci0KLSAgICBpZiAoaSA+PSAwKSB7Ci0gICAgICAgIHJldHVybiAmbVRyYWNrcy5lZGl0VmFsdWVBdChpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWNyZWF0ZUlmTmVjZXNzYXJ5KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFRyYWNrSW5mbyBpbmZvOwotICAgIGluZm8ubVRyYWNrSUQgPSB0cmFja0lEOwotICAgIGluZm8ubUZsYWdzID0gMDsKLSAgICBpbmZvLm1EdXJhdGlvbiA9IDB4ZmZmZmZmZmY7Ci0gICAgaW5mby5tU2lkeER1cmF0aW9uID0gMDsKLSAgICBpbmZvLm1NZWRpYVRpbWVTY2FsZSA9IDA7Ci0gICAgaW5mby5tTWVkaWFIYW5kbGVyVHlwZSA9IDA7Ci0gICAgaW5mby5tRGVmYXVsdFNhbXBsZURlc2NyaXB0aW9uSW5kZXggPSAwOwotICAgIGluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbiA9IDA7Ci0gICAgaW5mby5tRGVmYXVsdFNhbXBsZVNpemUgPSAwOwotICAgIGluZm8ubURlZmF1bHRTYW1wbGVGbGFncyA9IDA7Ci0KLSAgICBpbmZvLm1EZWNvZGluZ1RpbWUgPSAwOwotCi0gICAgbVRyYWNrcy5hZGQodHJhY2tJRCwgaW5mbyk7Ci0gICAgcmV0dXJuICZtVHJhY2tzLmVkaXRWYWx1ZUF0KG1UcmFja3MuaW5kZXhPZktleSh0cmFja0lEKSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcigKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLQotICAgIGlmIChmbGFncyAmIDB4ZmYwMDAwMDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncyA9IGZsYWdzOwotCi0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1UcmFja0lEID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICBvZmZzZXQgKz0gODsKLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprQmFzZURhdGFPZmZzZXRQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0ID0gcmVhZFU2NChvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gODsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a1NhbXBsZURlc2NyaXB0aW9uSW5kZXhQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVNhbXBsZURlc2NyaXB0aW9uSW5kZXggPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb24gPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVTaXplID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBpZiAoIShmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprQmFzZURhdGFPZmZzZXRQcmVzZW50KSkgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBwb2ludCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlCi0gICAgICAgIC8vIGVuY2xvc2luZyAnbW9vZicgY29udGFpbmVyIGZvciB0aGUgZmlyc3QgdHJhY2sgYW5kCi0gICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGRhdGEgb2YgdGhlIHByZWNlZGluZyBmcmFnbWVudCBmb3Igc3Vic2VxdWVudAotICAgICAgICAvLyB0cmFja3MuCi0KLSAgICAgICAgQ0hFQ0tfR0UobVN0YWNrLnNpemUoKSwgMnUpOwotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQgPQotICAgICAgICAgICAgbVN0YWNrLml0ZW1BdChtU3RhY2suc2l6ZSgpIC0gMikubU9mZnNldDsKLQotICAgICAgICAvLyBYWFggVE9ETzogVGhpcyBkb2VzIG5vdCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIHRoZSAybmQgYW5kCi0gICAgICAgIC8vIHN1YnNlcXVlbnQgdHJhY2tzIHlldC4KLSAgICB9Ci0KLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURhdGFPZmZzZXQgPQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0OwotCi0gICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1UcmFja0lEKTsKLQotICAgIGlmICh0cmFja0luZm8tPm1GcmFnbWVudHMuZW1wdHkoKQotICAgICAgICAgICAgfHwgKCp0cmFja0luZm8tPm1GcmFnbWVudHMuYmVnaW4oKSktPmNvbXBsZXRlKCkpIHsKLSAgICAgICAgdHJhY2tJbmZvLT5tRnJhZ21lbnRzLnB1c2hfYmFjayhuZXcgRHluYW1pY1RyYWNrRnJhZ21lbnQpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0ZyYWdtZW50UnVuKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGVudW0gewotICAgICAgICBrRGF0YU9mZnNldFByZXNlbnQgICAgICAgICAgICAgICAgICA9IDB4MDEsCi0gICAgICAgIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCAgICAgICAgICAgID0gMHgwNCwKLSAgICAgICAga1NhbXBsZUR1cmF0aW9uUHJlc2VudCAgICAgICAgICAgICAgPSAweDEwMCwKLSAgICAgICAga1NhbXBsZVNpemVQcmVzZW50ICAgICAgICAgICAgICAgICAgPSAweDIwMCwKLSAgICAgICAga1NhbXBsZUZsYWdzUHJlc2VudCAgICAgICAgICAgICAgICAgPSAweDQwMCwKLSAgICAgICAga1NhbXBsZUNvbXBvc2l0aW9uVGltZU9mZnNldFByZXNlbnQgPSAweDgwMCwKLSAgICB9OwotCi0gICAgdWludDMyX3QgZmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0KLSAgICBpZiAoZmxhZ3MgJiAweGZmMDAwMDAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmICgoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIChmbGFncyAmIGtTYW1wbGVGbGFnc1ByZXNlbnQpKSB7Ci0gICAgICAgIC8vIFRoZXNlIHR3byBzaGFsbCBub3QgYmUgdXNlZCB0b2dldGhlci4KLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSByZWFkVTMyKG9mZnNldCArIDQpOwotICAgIG9mZnNldCArPSA4OwotCi0gICAgdWludDY0X3QgZGF0YU9mZnNldCA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGF0YU9mZnNldDsKLQotICAgIHVpbnQzMl90IGZpcnN0U2FtcGxlRmxhZ3MgPSAwOwotCi0gICAgaWYgKGZsYWdzICYga0RhdGFPZmZzZXRQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQzMl90IGRhdGFPZmZzZXREZWx0YSA9IChpbnQzMl90KXJlYWRVMzIob2Zmc2V0KTsKLQotICAgICAgICBkYXRhT2Zmc2V0ID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1CYXNlRGF0YU9mZnNldCArIGRhdGFPZmZzZXREZWx0YTsKLQotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGZpcnN0U2FtcGxlRmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIFRyYWNrSW5mbyAqaW5mbyA9IGVkaXRUcmFjayhtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQpOwotCi0gICAgaWYgKGluZm8gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVEdXJhdGlvbiA9IDAsIHNhbXBsZVNpemUgPSAwLCBzYW1wbGVGbGFncyA9IDAsCi0gICAgICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKLQotICAgIHNpemVfdCBieXRlc1BlclNhbXBsZSA9IDA7Ci0gICAgaWYgKGZsYWdzICYga1NhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSBpZiAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncwotICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKLSAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICB9IGVsc2UgewotICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IGluZm8tPm1EZWZhdWx0U2FtcGxlRHVyYXRpb247Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga1NhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgIHNhbXBsZVNpemUgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVTaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZVNpemUgPSBpbmZvLT5tRGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga1NhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSBpZiAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncwotICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgc2FtcGxlRmxhZ3MgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVGbGFnczsKLSAgICB9IGVsc2UgewotICAgICAgICBzYW1wbGVGbGFncyA9IGluZm8tPm1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga1NhbXBsZUNvbXBvc2l0aW9uVGltZU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKLSAgICB9IGVsc2UgewotICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOwotICAgIH0KLQotICAgIGlmIChvZmZzZXQgKyBzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVEZXNjSW5kZXggPQotICAgICAgICAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncwotICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a1NhbXBsZURlc2NyaXB0aW9uSW5kZXhQcmVzZW50KQotICAgICAgICAgICAgPyBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVNhbXBsZURlc2NyaXB0aW9uSW5kZXgKLSAgICAgICAgICAgIDogaW5mby0+bURlZmF1bHRTYW1wbGVEZXNjcmlwdGlvbkluZGV4OwotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24gPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICAgICAgc2FtcGxlU2l6ZSA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICAgICAgc2FtcGxlRmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXRQcmVzZW50KSB7Ci0gICAgICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJhZGRpbmcgc2FtcGxlIGF0IG9mZnNldCAweCUwOGxseCwgc2l6ZSAldSwgZHVyYXRpb24gJXUsICIKLSAgICAgICAgICAgICAgInNhbXBsZURlc2NJbmRleD0ldSwgZmxhZ3MgMHglMDh4IiwKLSAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBzYW1wbGVTaXplLCBzYW1wbGVEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICBzYW1wbGVEZXNjSW5kZXgsCi0gICAgICAgICAgICAgICAgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiBpID09IDAKLSAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MpOwotCi0gICAgICAgIGNvbnN0IHNwPFRyYWNrRnJhZ21lbnQ+ICZmcmFnbWVudCA9ICotLWluZm8tPm1GcmFnbWVudHMuZW5kKCk7Ci0KLSAgICAgICAgdWludDMyX3QgZGVjb2RpbmdUaW1lID0gaW5mby0+bURlY29kaW5nVGltZTsKLSAgICAgICAgaW5mby0+bURlY29kaW5nVGltZSArPSBzYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uVGltZSA9IGRlY29kaW5nVGltZSArIHNhbXBsZUN0c09mZnNldDsKLQotICAgICAgICBzdGF0aWNfY2FzdDxEeW5hbWljVHJhY2tGcmFnbWVudCAqPigKLSAgICAgICAgICAgICAgICBmcmFnbWVudC5nZXQoKSktPmFkZFNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uVGltZSwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY0luZGV4LAotICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiBpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICA/IGZpcnN0U2FtcGxlRmxhZ3MgOiBzYW1wbGVGbGFncyk7Ci0KLSAgICAgICAgZGF0YU9mZnNldCArPSBzYW1wbGVTaXplOwotICAgIH0KLQotICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGF0YU9mZnNldCA9IGRhdGFPZmZzZXQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6Y29weUJ1ZmZlcigKLSAgICAgICAgc3A8QUJ1ZmZlcj4gKmRzdCwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgY29uc3QgewotICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgIG1lbWNweShidWYtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBzaXplKTsKLQotICAgICpkc3QgPSBidWY7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OTkwMzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlRyYWNrRnJhZ21lbnQiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJUcmFja0ZyYWdtZW50LmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6RHluYW1pY1RyYWNrRnJhZ21lbnQoKQotICAgIDogbUNvbXBsZXRlKGZhbHNlKSwKLSAgICAgIG1TYW1wbGVJbmRleCgwKSB7Ci19Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50Ojp+RHluYW1pY1RyYWNrRnJhZ21lbnQoKSB7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50OjpnZXRTYW1wbGUoU2FtcGxlSW5mbyAqaW5mbykgewotICAgIGlmIChtU2FtcGxlSW5kZXggPj0gbVNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBtQ29tcGxldGUgPyBFUlJPUl9FTkRfT0ZfU1RSRUFNIDogLUVXT1VMREJMT0NLOwotICAgIH0KLQotICAgICppbmZvID0gbVNhbXBsZXMuaXRlbUF0KG1TYW1wbGVJbmRleCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OmFkdmFuY2UoKSB7Ci0gICAgKyttU2FtcGxlSW5kZXg7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OmFkZFNhbXBsZSgKLSAgICAgICAgb2ZmNjRfdCBkYXRhT2Zmc2V0LCBzaXplX3Qgc2FtcGxlU2l6ZSwKLSAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uVGltZSwKLSAgICAgICAgc2l6ZV90IHNhbXBsZURlc2NJbmRleCwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBtU2FtcGxlcy5wdXNoKCk7Ci0gICAgU2FtcGxlSW5mbyAqc2FtcGxlSW5mbyA9ICZtU2FtcGxlcy5lZGl0SXRlbUF0KG1TYW1wbGVzLnNpemUoKSAtIDEpOwotCi0gICAgc2FtcGxlSW5mby0+bU9mZnNldCA9IGRhdGFPZmZzZXQ7Ci0gICAgc2FtcGxlSW5mby0+bVNpemUgPSBzYW1wbGVTaXplOwotICAgIHNhbXBsZUluZm8tPm1QcmVzZW50YXRpb25UaW1lID0gcHJlc2VudGF0aW9uVGltZTsKLSAgICBzYW1wbGVJbmZvLT5tU2FtcGxlRGVzY0luZGV4ID0gc2FtcGxlRGVzY0luZGV4OwotICAgIHNhbXBsZUluZm8tPm1GbGFncyA9IGZsYWdzOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6c2lnbmFsQ29tcGxldGlvbigpIHsKLSAgICBtQ29tcGxldGUgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50Ojpjb21wbGV0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNvbXBsZXRlOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpTdGF0aWNUcmFja0ZyYWdtZW50KCkKLSAgICA6IG1TYW1wbGVJbmRleCgwKSwKLSAgICAgIG1TYW1wbGVDb3VudCgwKSwKLSAgICAgIG1DaHVua0luZGV4KDApLAotICAgICAgbVNhbXBsZVRvQ2h1bmtJbmRleCgtMSksCi0gICAgICBtU2FtcGxlVG9DaHVua1JlbWFpbmluZygwKSwKLSAgICAgIG1QcmV2Q2h1bmtJbmRleCgweGZmZmZmZmZmKSwKLSAgICAgIG1OZXh0U2FtcGxlT2Zmc2V0KDApIHsKLX0KLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6flN0YXRpY1RyYWNrRnJhZ21lbnQoKSB7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OmdldFNhbXBsZShTYW1wbGVJbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TYW1wbGVJbmRleCA+PSBtU2FtcGxlQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgKmluZm8gPSBtU2FtcGxlSW5mbzsKLQotICAgIEFMT0dWKCJyZXR1cm5pbmcgc2FtcGxlICVkIGF0IFsweCUwOGxseCwgMHglMDhsbHgpIiwKLSAgICAgICAgICBtU2FtcGxlSW5kZXgsCi0gICAgICAgICAgaW5mby0+bU9mZnNldCwgaW5mby0+bU9mZnNldCArIGluZm8tPm1TaXplKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50Ojp1cGRhdGVTYW1wbGVJbmZvKCkgewotICAgIGlmIChtU2FtcGxlSW5kZXggPj0gbVNhbXBsZUNvdW50KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVNhbXBsZVNpemVzICE9IE5VTEwpIHsKLSAgICAgICAgdWludDMyX3QgZGVmYXVsdFNhbXBsZVNpemUgPSBVMzJfQVQobVNhbXBsZVNpemVzLT5kYXRhKCkgKyA0KTsKLSAgICAgICAgaWYgKGRlZmF1bHRTYW1wbGVTaXplID4gMCkgewotICAgICAgICAgICAgbVNhbXBsZUluZm8ubVNpemUgPSBkZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TYW1wbGVJbmZvLm1TaXplPSBVMzJfQVQobVNhbXBsZVNpemVzLT5kYXRhKCkgKyAxMiArIDQgKiBtU2FtcGxlSW5kZXgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0sobUNvbXBhY3RTYW1wbGVTaXplcyAhPSBOVUxMKTsKLQotICAgICAgICB1aW50MzJfdCBmaWVsZFNpemUgPSBVMzJfQVQobUNvbXBhY3RTYW1wbGVTaXplcy0+ZGF0YSgpICsgNCk7Ci0KLSAgICAgICAgc3dpdGNoIChmaWVsZFNpemUpIHsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBieXRlID0gbUNvbXBhY3RTYW1wbGVTaXplcy0+ZGF0YSgpWzEyICsgbVNhbXBsZUluZGV4IC8gMl07Ci0gICAgICAgICAgICAgICAgbVNhbXBsZUluZm8ubVNpemUgPSAobVNhbXBsZUluZGV4ICYgMSkgPyBieXRlICYgMHgwZiA6IGJ5dGUgPj4gNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1TYW1wbGVJbmZvLm1TaXplID0gbUNvbXBhY3RTYW1wbGVTaXplcy0+ZGF0YSgpWzEyICsgbVNhbXBsZUluZGV4XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShmaWVsZFNpemUsIDE2KTsKLSAgICAgICAgICAgICAgICBtU2FtcGxlSW5mby5tU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIFUxNl9BVChtQ29tcGFjdFNhbXBsZVNpemVzLT5kYXRhKCkgKyAxMiArIG1TYW1wbGVJbmRleCAqIDIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ0hFQ0tfR1QobVNhbXBsZVRvQ2h1bmtSZW1haW5pbmcsIDApOwotCi0gICAgLy8gVGhlIHNhbXBsZSBkZXNjIGluZGV4IGlzIDEtYmFzZWQuLi4gWFhYCi0gICAgbVNhbXBsZUluZm8ubVNhbXBsZURlc2NJbmRleCA9Ci0gICAgICAgIFUzMl9BVChtU2FtcGxlVG9DaHVuay0+ZGF0YSgpICsgOCArIDEyICogbVNhbXBsZVRvQ2h1bmtJbmRleCArIDgpOwotCi0gICAgaWYgKG1DaHVua0luZGV4ICE9IG1QcmV2Q2h1bmtJbmRleCkgewotICAgICAgICBtUHJldkNodW5rSW5kZXggPSBtQ2h1bmtJbmRleDsKLQotICAgICAgICBpZiAobUNodW5rT2Zmc2V0cyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gVTMyX0FUKG1DaHVua09mZnNldHMtPmRhdGEoKSArIDQpOwotCi0gICAgICAgICAgICBpZiAobUNodW5rSW5kZXggPj0gZW50cnlDb3VudCkgewotICAgICAgICAgICAgICAgIG1TYW1wbGVJbmRleCA9IG1TYW1wbGVDb3VudDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1OZXh0U2FtcGxlT2Zmc2V0ID0KLSAgICAgICAgICAgICAgICBVMzJfQVQobUNodW5rT2Zmc2V0cy0+ZGF0YSgpICsgOCArIDQgKiBtQ2h1bmtJbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDSEVDSyhtQ2h1bmtPZmZzZXRzNjQgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBVMzJfQVQobUNodW5rT2Zmc2V0czY0LT5kYXRhKCkgKyA0KTsKLQotICAgICAgICAgICAgaWYgKG1DaHVua0luZGV4ID49IGVudHJ5Q291bnQpIHsKLSAgICAgICAgICAgICAgICBtU2FtcGxlSW5kZXggPSBtU2FtcGxlQ291bnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTmV4dFNhbXBsZU9mZnNldCA9Ci0gICAgICAgICAgICAgICAgVTY0X0FUKG1DaHVua09mZnNldHM2NC0+ZGF0YSgpICsgOCArIDggKiBtQ2h1bmtJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtU2FtcGxlSW5mby5tT2Zmc2V0ID0gbU5leHRTYW1wbGVPZmZzZXQ7Ci0KLSAgICBtU2FtcGxlSW5mby5tUHJlc2VudGF0aW9uVGltZSA9IDA7Ci0gICAgbVNhbXBsZUluZm8ubUZsYWdzID0gMDsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjphZHZhbmNlKCkgewotICAgIG1OZXh0U2FtcGxlT2Zmc2V0ICs9IG1TYW1wbGVJbmZvLm1TaXplOwotCi0gICAgKyttU2FtcGxlSW5kZXg7Ci0gICAgaWYgKC0tbVNhbXBsZVRvQ2h1bmtSZW1haW5pbmcgPT0gMCkgewotICAgICAgICArK21DaHVua0luZGV4OwotCi0gICAgICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBVMzJfQVQobVNhbXBsZVRvQ2h1bmstPmRhdGEoKSArIDQpOwotCi0gICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHNhbXBsZSB0byBjaHVuayB0YWJsZSwgd2Ugd2lsbAotICAgICAgICAvLyBzdGF5IG9uIHRoaXMgZW50cnkuCi0gICAgICAgIGlmICgodWludDMyX3QpKG1TYW1wbGVUb0NodW5rSW5kZXggKyAxKSA8IGVudHJ5Q291bnQpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG5leHRDaHVua0luZGV4ID0KLSAgICAgICAgICAgICAgICBVMzJfQVQobVNhbXBsZVRvQ2h1bmstPmRhdGEoKSArIDggKyAxMiAqIChtU2FtcGxlVG9DaHVua0luZGV4ICsgMSkpOwotCi0gICAgICAgICAgICBDSEVDS19HRShuZXh0Q2h1bmtJbmRleCwgMXUpOwotICAgICAgICAgICAgLS1uZXh0Q2h1bmtJbmRleDsKLQotICAgICAgICAgICAgaWYgKG1DaHVua0luZGV4ID49IG5leHRDaHVua0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNodW5rSW5kZXgsIG5leHRDaHVua0luZGV4KTsKLSAgICAgICAgICAgICAgICArK21TYW1wbGVUb0NodW5rSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtU2FtcGxlVG9DaHVua1JlbWFpbmluZyA9Ci0gICAgICAgICAgICBVMzJfQVQobVNhbXBsZVRvQ2h1bmstPmRhdGEoKSArIDggKyAxMiAqIG1TYW1wbGVUb0NodW5rSW5kZXggKyA0KTsKLSAgICB9Ci0KLSAgICB1cGRhdGVTYW1wbGVJbmZvKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldFUzMkF0KHVpbnQ4X3QgKnB0ciwgdWludDMyX3QgeCkgewotICAgIHB0clswXSA9IHggPj4gMjQ7Ci0gICAgcHRyWzFdID0gKHggPj4gMTYpICYgMHhmZjsKLSAgICBwdHJbMl0gPSAoeCA+PiA4KSAmIDB4ZmY7Ci0gICAgcHRyWzNdID0geCAmIDB4ZmY7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnNpZ25hbENvbXBsZXRpb24oKSB7Ci0gICAgbVNhbXBsZVRvQ2h1bmtJbmRleCA9IDA7Ci0KLSAgICBtU2FtcGxlVG9DaHVua1JlbWFpbmluZyA9Ci0gICAgICAgIChtU2FtcGxlVG9DaHVuayA9PSBOVUxMKQotICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICA6IFUzMl9BVChtU2FtcGxlVG9DaHVuay0+ZGF0YSgpICsgOCArIDEyICogbVNhbXBsZVRvQ2h1bmtJbmRleCArIDQpOwotCi0gICAgdXBkYXRlU2FtcGxlSW5mbygpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OmNvbXBsZXRlKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpwYXJzZVNhbXBsZVNpemVzKAotICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgMTIgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcnNlci0+cmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVTaXplID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDQpOwotICAgIHVpbnQzMl90IHNhbXBsZUNvdW50ID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDgpOwotCi0gICAgaWYgKHNhbXBsZVNpemUgPT0gMCAmJiBvZmZzZXQgKyAxMiArIHNhbXBsZUNvdW50ICogNCAhPSBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jb3B5QnVmZmVyKCZtU2FtcGxlU2l6ZXMsIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICBtU2FtcGxlQ291bnQgPSBzYW1wbGVDb3VudDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6cGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyAxMiA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VyLT5yZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZpZWxkU2l6ZSA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA0KTsKLQotICAgIGlmIChmaWVsZFNpemUgIT0gNCAmJiBmaWVsZFNpemUgIT0gOCAmJiBmaWVsZFNpemUgIT0gMTYpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVDb3VudCA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA4KTsKLQotICAgIGlmIChvZmZzZXQgKyAxMiArIChzYW1wbGVDb3VudCAqIGZpZWxkU2l6ZSArIDQpIC8gOCAhPSBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jb3B5QnVmZmVyKCZtQ29tcGFjdFNhbXBsZVNpemVzLCBvZmZzZXQsIHNpemUpOwotCi0gICAgbVNhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcnNlci0+cmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDQpOwotCi0gICAgaWYgKGVudHJ5Q291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG9mZnNldCArIDggKyBlbnRyeUNvdW50ICogMTIgIT0gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlci0+Y29weUJ1ZmZlcigmbVNhbXBsZVRvQ2h1bmssIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnBhcnNlQ2h1bmtPZmZzZXRzKAotICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VyLT5yZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0KLSAgICBpZiAob2Zmc2V0ICsgOCArIGVudHJ5Q291bnQgKiA0ICE9IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmNvcHlCdWZmZXIoJm1DaHVua09mZnNldHMsIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChwYXJzZXItPnJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZW50cnlDb3VudCA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA0KTsKLQotICAgIGlmIChvZmZzZXQgKyA4ICsgZW50cnlDb3VudCAqIDggIT0gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlci0+Y29weUJ1ZmZlcigmbUNodW5rT2Zmc2V0czY0LCBvZmZzZXQsIHNpemUpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhZDQ2ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRSQUNLX0ZSQUdNRU5UX0hfCi0KLSNkZWZpbmUgVFJBQ0tfRlJBR01FTlRfSF8KLQotI2luY2x1ZGUgImluY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpUcmFja0ZyYWdtZW50IDogcHVibGljIFJlZkJhc2UgewotICAgIFRyYWNrRnJhZ21lbnQoKSB7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGUoU2FtcGxlSW5mbyAqaW5mbykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxDb21wbGV0aW9uKCkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBjb21wbGV0ZSgpIGNvbnN0ID0gMDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflRyYWNrRnJhZ21lbnQoKSB7fQotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRyYWNrRnJhZ21lbnQpOwotfTsKLQotc3RydWN0IEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50IDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlRyYWNrRnJhZ21lbnQgewotICAgIER5bmFtaWNUcmFja0ZyYWdtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZShTYW1wbGVJbmZvICppbmZvKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZSgpOwotCi0gICAgdm9pZCBhZGRTYW1wbGUoCi0gICAgICAgICAgICBvZmY2NF90IGRhdGFPZmZzZXQsIHNpemVfdCBzYW1wbGVTaXplLAotICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uVGltZSwKLSAgICAgICAgICAgIHNpemVfdCBzYW1wbGVEZXNjSW5kZXgsCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICAvLyBObyBtb3JlIHNhbXBsZXMgd2lsbCBiZSBhZGRlZCB0byB0aGlzIGZyYWdtZW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsQ29tcGxldGlvbigpOwotCi0gICAgdmlydHVhbCBib29sIGNvbXBsZXRlKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EeW5hbWljVHJhY2tGcmFnbWVudCgpOwotCi1wcml2YXRlOgotICAgIGJvb2wgbUNvbXBsZXRlOwotICAgIHNpemVfdCBtU2FtcGxlSW5kZXg7Ci0gICAgVmVjdG9yPFNhbXBsZUluZm8+IG1TYW1wbGVzOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHluYW1pY1RyYWNrRnJhZ21lbnQpOwotfTsKLQotc3RydWN0IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQgOiBwdWJsaWMgRnJhZ21lbnRlZE1QNFBhcnNlcjo6VHJhY2tGcmFnbWVudCB7Ci0gICAgU3RhdGljVHJhY2tGcmFnbWVudCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGUoU2FtcGxlSW5mbyAqaW5mbyk7Ci0gICAgdmlydHVhbCB2b2lkIGFkdmFuY2UoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsQ29tcGxldGlvbigpOwotICAgIHZpcnR1YWwgYm9vbCBjb21wbGV0ZSgpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNvbXBhY3RTYW1wbGVTaXplcygKLSAgICAgICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZVRvQ2h1bmsoCi0gICAgICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDaHVua09mZnNldHM2NCgKLSAgICAgICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5TdGF0aWNUcmFja0ZyYWdtZW50KCk7Ci0KLXByaXZhdGU6Ci0gICAgc2l6ZV90IG1TYW1wbGVJbmRleDsKLSAgICBzaXplX3QgbVNhbXBsZUNvdW50OwotICAgIHVpbnQzMl90IG1DaHVua0luZGV4OwotCi0gICAgU2FtcGxlSW5mbyBtU2FtcGxlSW5mbzsKLQotICAgIHNwPEFCdWZmZXI+IG1TYW1wbGVTaXplczsKLSAgICBzcDxBQnVmZmVyPiBtQ29tcGFjdFNhbXBsZVNpemVzOwotCi0gICAgc3A8QUJ1ZmZlcj4gbVNhbXBsZVRvQ2h1bms7Ci0gICAgc3NpemVfdCBtU2FtcGxlVG9DaHVua0luZGV4OwotICAgIHNpemVfdCBtU2FtcGxlVG9DaHVua1JlbWFpbmluZzsKLQotICAgIHNwPEFCdWZmZXI+IG1DaHVua09mZnNldHM7Ci0gICAgc3A8QUJ1ZmZlcj4gbUNodW5rT2Zmc2V0czY0OwotICAgIHVpbnQzMl90IG1QcmV2Q2h1bmtJbmRleDsKLSAgICB1aW50NjRfdCBtTmV4dFNhbXBsZU9mZnNldDsKLQotICAgIHZvaWQgdXBkYXRlU2FtcGxlSW5mbygpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RhdGljVHJhY2tGcmFnbWVudCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFRSQUNLX0ZSQUdNRU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKaW5kZXggYzFhN2E5ZC4uYzE3YTBiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawpAQCAtMTMsNiArMTMsOCBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X21wZWcydHMKIAogaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKaW5kZXggNmRmYWE5NC4uMDIxYjY0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY29uc3QgaW50NjRfdCBrTmVhckVPU01hcmtVcyA9IDIwMDAwMDBsbDsgLy8gMiBzZWNzCkBAIC0xODYsNyArMTg4LDcgQEAKICAgICBpbnQ2NF90IGxhc3RRdWV1ZWRUaW1lVXM7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmxhc3RRdWV1ZWRUaW1lVXMpKTsKICAgICBtTGFzdFF1ZXVlZFRpbWVVcyA9IGxhc3RRdWV1ZWRUaW1lVXM7Ci0gICAgQUxPR1YoInF1ZXVlQWNjZXNzVW5pdCB0aW1lVXM9JWxsZCB1cyAoJS4yZiBzZWNzKSIsIG1MYXN0UXVldWVkVGltZVVzLCBtTGFzdFF1ZXVlZFRpbWVVcyAvIDFFNik7CisgICAgQUxPR1YoInF1ZXVlQWNjZXNzVW5pdCB0aW1lVXM9JSIgUFJJaTY0ICIgdXMgKCUuMmYgc2VjcykiLCBtTGFzdFF1ZXVlZFRpbWVVcywgbUxhc3RRdWV1ZWRUaW1lVXMgLyAxRTYpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtQnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IGU5MjUyY2MuLmY3YWJmMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtMjY1LDcgKzI2NSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBILjI2NC9NUEVHIHN5bmN3b3JkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IG9mZnNldCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhdCBvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMzU5LDcgKzM1OSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBBQzMgc3luY3dvcmQgYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlemQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggM2ZlOWMyMy4uMTZmNmM1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtMjksNiArMjksOCBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGJvb2wgRVhUUkFfQ0hFQ0sgPSB0cnVlOwpAQCAtNDMsMTYgKzQ1LDIxIEBACiAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSgwKSwKICAgICBtRW5kT2ZTdHJlYW0oZmFsc2UpLAogICAgIG1FbmRPZlN0cmVhbVNlbnQoZmFsc2UpLAotICAgIG1SZXBlYXRBZnRlclVzKC0xbGwpLAogICAgIG1NYXhUaW1lc3RhbXBHYXBVcygtMWxsKSwKICAgICBtUHJldk9yaWdpbmFsVGltZVVzKC0xbGwpLAogICAgIG1QcmV2TW9kaWZpZWRUaW1lVXMoLTFsbCksCisgICAgbVNraXBGcmFtZXNCZWZvcmVOcygtMWxsKSwKKyAgICBtUmVwZWF0QWZ0ZXJVcygtMWxsKSwKICAgICBtUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbigwKSwKICAgICBtUmVwZWF0TGFzdEZyYW1lVGltZXN0YW1wKC0xbGwpLAogICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCgtMSksCiAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtKDApLAogICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudCgwKSwKLSAgICBtUmVwZWF0QnVmZmVyRGVmZXJyZWQoZmFsc2UpIHsKKyAgICBtUmVwZWF0QnVmZmVyRGVmZXJyZWQoZmFsc2UpLAorICAgIG1UaW1lUGVyQ2FwdHVyZVVzKC0xbGwpLAorICAgIG1UaW1lUGVyRnJhbWVVcygtMWxsKSwKKyAgICBtUHJldkNhcHR1cmVVcygtMWxsKSwKKyAgICBtUHJldkZyYW1lVXMoLTFsbCkgewogCiAgICAgQUxPR1YoIkdyYXBoaWNCdWZmZXJTb3VyY2Ugdz0ldSBoPSV1IGM9JXUiLAogICAgICAgICAgICAgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCwgYnVmZmVyQ291bnQpOwpAQCAtNjUsMTMgKzcyLDEzIEBACiAKICAgICBTdHJpbmc4IG5hbWUoIkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKIAotICAgIG1CdWZmZXJRdWV1ZSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgIG1CdWZmZXJRdWV1ZS0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOwotICAgIG1CdWZmZXJRdWV1ZS0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7Ci0gICAgbUJ1ZmZlclF1ZXVlLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIgfAorICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKKyAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyTmFtZShuYW1lKTsKKyAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOworICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSIHwKICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSk7CiAKLSAgICBtSW5pdENoZWNrID0gbUJ1ZmZlclF1ZXVlLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKKyAgICBtSW5pdENoZWNrID0gbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKICAgICBpZiAobUluaXRDaGVjayAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBCUSBtYXggYWNxdWlyZWQgYnVmZmVyIGNvdW50IHRvICV1OiAlZCIsCiAgICAgICAgICAgICAgICAgYnVmZmVyQ291bnQsIG1Jbml0Q2hlY2spOwpAQCAtODUsNyArOTIsNyBAQAogICAgIHdwPEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyKj4odGhpcyk7CiAgICAgc3A8QnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcj4gcHJveHkgPSBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihsaXN0ZW5lcik7CiAKLSAgICBtSW5pdENoZWNrID0gbUJ1ZmZlclF1ZXVlLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKKyAgICBtSW5pdENoZWNrID0gbUNvbnN1bWVyLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiRXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLW1Jbml0Q2hlY2spLCBtSW5pdENoZWNrKTsKQEAgLTk3LDggKzEwNCw4IEBACiAKIEdyYXBoaWNCdWZmZXJTb3VyY2U6On5HcmFwaGljQnVmZmVyU291cmNlKCkgewogICAgIEFMT0dWKCJ+R3JhcGhpY0J1ZmZlclNvdXJjZSIpOwotICAgIGlmIChtQnVmZmVyUXVldWUgIT0gTlVMTCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmNvbnN1bWVyRGlzY29ubmVjdCgpOworICAgIGlmIChtQ29uc3VtZXIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmNvbnN1bWVyRGlzY29ubmVjdCgpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HVygiY29uc3VtZXJEaXNjb25uZWN0IGZhaWxlZDogJWQiLCBlcnIpOwogICAgICAgICB9CkBAIC0yNzAsNyArMjc3LDcgQEAKICAgICAgICAgaWYgKGlkID09IG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCkgewogICAgICAgICAgICAgQ0hFQ0tfR1QobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50LS0sIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKGlkLCBjb2RlY0J1ZmZlci5tRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaWQsIGNvZGVjQnVmZmVyLm1GcmFtZU51bWJlciwKICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0zMzksNyArMzQ2LDcgQEAKIAogICAgICAgICB3aGlsZSAobU51bUZyYW1lc0F2YWlsYWJsZSA+IDApIHsKICAgICAgICAgICAgIEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtIGl0ZW07Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgewogICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4uCkBAIC0zNTIsNyArMzU5LDcgQEAKIAogICAgICAgICAgICAgLS1tTnVtRnJhbWVzQXZhaWxhYmxlOwogCi0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBpdGVtLm1GZW5jZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwpAQCAtMzg5LDcgKzM5Niw3IEBACiAgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBhY3F1aXJpbmcgYnVmZmVyLCBhdmFpbD0lZCIsCiAgICAgICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKICAgICBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSBpdGVtOwotICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJRdWV1ZS0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CisgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKICAgICBpZiAoZXJyID09IEJ1ZmZlclF1ZXVlOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CiAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4KICAgICAgICAgQUxPR1coImZpbGxDb2RlY0J1ZmZlcl9sOiBmcmFtZSB3YXMgbm90IGF2YWlsYWJsZSIpOwpAQCAtNDE2LDEwICs0MjMsMjEgQEAKICAgICAgICAgbUJ1ZmZlclNsb3RbaXRlbS5tQnVmXSA9IGl0ZW0ubUdyYXBoaWNCdWZmZXI7CiAgICAgfQogCi0gICAgZXJyID0gc3VibWl0QnVmZmVyX2woaXRlbSwgY2JpKTsKKyAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgLy8gb25seSBzdWJtaXQgc2FtcGxlIGlmIHN0YXJ0IHRpbWUgaXMgdW5zcGVjaWZpZWQsIG9yIHNhbXBsZQorICAgIC8vIGlzIHF1ZXVlZCBhZnRlciB0aGUgc3BlY2lmaWVkIHN0YXJ0IHRpbWUKKyAgICBpZiAobVNraXBGcmFtZXNCZWZvcmVOcyA8IDBsbCB8fCBpdGVtLm1UaW1lc3RhbXAgPj0gbVNraXBGcmFtZXNCZWZvcmVOcykgeworICAgICAgICAvLyBpZiBzdGFydCB0aW1lIGlzIHNldCwgb2Zmc2V0IHRpbWUgc3RhbXAgYnkgc3RhcnQgdGltZQorICAgICAgICBpZiAobVNraXBGcmFtZXNCZWZvcmVOcyA+IDApIHsKKyAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCAtPSBtU2tpcEZyYW1lc0JlZm9yZU5zOworICAgICAgICB9CisgICAgICAgIGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKGl0ZW0sIGNiaSk7CisgICAgfQorCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HVigic3VibWl0QnVmZmVyX2wgZmFpbGVkLCByZWxlYXNpbmcgYnEgYnVmICVkIiwgaXRlbS5tQnVmKTsKLSAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCisgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoImJ1ZmZlciBzdWJtaXR0ZWQgKGJxICVkLCBjYmkgJWQpIiwgaXRlbS5tQnVmLCBjYmkpOwpAQCAtNDQyLDcgKzQ2MCw3IEBACiAgICAgICAgIC8vCiAgICAgICAgIC8vIFRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgd2UgdHJ5IHRvIHJlbGVhc2UgdGhlIGJ1ZmZlci4KICAgICAgICAgQUxPR0QoInJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sOiBzbG90IHdhcyBOVUxMIik7Ci0gICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAogICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCwKICAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW0sCiAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksCkBAIC00OTYsNyArNTE0LDcgQEAKIAogICAgIGlmIChtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQgPj0gMCkgewogICAgICAgICBpZiAobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkLAogICAgICAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW0sCiAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLApAQCAtNTUwLDcgKzU2OCwzMCBAQAogaW50NjRfdCBHcmFwaGljQnVmZmVyU291cmNlOjpnZXRUaW1lc3RhbXAoY29uc3QgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gJml0ZW0pIHsKICAgICBpbnQ2NF90IHRpbWVVcyA9IGl0ZW0ubVRpbWVzdGFtcCAvIDEwMDA7CiAKLSAgICBpZiAobU1heFRpbWVzdGFtcEdhcFVzID4gMGxsKSB7CisgICAgaWYgKG1UaW1lUGVyQ2FwdHVyZVVzID4gMGxsKSB7CisgICAgICAgIC8vIFRpbWUgbGFwc2Ugb3Igc2xvdyBtb3Rpb24gbW9kZQorICAgICAgICBpZiAobVByZXZDYXB0dXJlVXMgPCAwbGwpIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IGNhcHR1cmUKKyAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gdGltZVVzOworICAgICAgICAgICAgbVByZXZGcmFtZVVzID0gdGltZVVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc25hcCB0byBuZWFyZXN0IGNhcHR1cmUgcG9pbnQKKyAgICAgICAgICAgIGludDY0X3QgbkZyYW1lcyA9ICh0aW1lVXMgKyBtVGltZVBlckNhcHR1cmVVcyAvIDIgLSBtUHJldkNhcHR1cmVVcykKKyAgICAgICAgICAgICAgICAgICAgLyBtVGltZVBlckNhcHR1cmVVczsKKyAgICAgICAgICAgIGlmIChuRnJhbWVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIHRoaXMgZnJhbWUgYXMgaXQncyB0b28gY2xvc2UgdG8gcHJldmlvdXMgY2FwdHVyZQorICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBmcmFtZSwgdGltZVVzICVsbGQiLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gbVByZXZDYXB0dXJlVXMgKyBuRnJhbWVzICogbVRpbWVQZXJDYXB0dXJlVXM7CisgICAgICAgICAgICBtUHJldkZyYW1lVXMgKz0gbVRpbWVQZXJGcmFtZVVzICogbkZyYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJ0aW1lVXMgJWxsZCwgY2FwdHVyZVVzICVsbGQsIGZyYW1lVXMgJWxsZCIsCisgICAgICAgICAgICAgICAgdGltZVVzLCBtUHJldkNhcHR1cmVVcywgbVByZXZGcmFtZVVzKTsKKworICAgICAgICByZXR1cm4gbVByZXZGcmFtZVVzOworICAgIH0gZWxzZSBpZiAobU1heFRpbWVzdGFtcEdhcFVzID4gMGxsKSB7CiAgICAgICAgIC8qIENhcCB0aW1lc3RhbXAgZ2FwIGJldHdlZW4gYWRqYWNlbnQgZnJhbWVzIHRvIHNwZWNpZmllZCBtYXgKICAgICAgICAgICoKICAgICAgICAgICogSW4gdGhlIHNjZW5hcmlvIG9mIGNhc3QgbWlycm9yaW5nLCBlbmNvZGluZyBjb3VsZCBiZSBzdXNwZW5kZWQgZm9yCkBAIC02OTYsMTUgKzczNywxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gaXRlbTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBzZWVpbmcgdGhpcyBidWZmZXIsIGFkZCBpdCB0byBvdXIKICAgICAgICAgICAgIC8vIHNsb3QgdGFibGUuCiAgICAgICAgICAgICBpZiAoaXRlbS5tR3JhcGhpY0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBzZXR0aW5nIG1CdWZmZXJTbG90ICVkIiwgaXRlbS5tQnVmKTsKKyAgICAgICAgICAgICAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZTogc2V0dGluZyBtQnVmZmVyU2xvdCAlZCIsIGl0ZW0ubUJ1Zik7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclNsb3RbaXRlbS5tQnVmXSA9IGl0ZW0ubUdyYXBoaWNCdWZmZXI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBpdGVtLm1GZW5jZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwpAQCAtNzI0LDEzICs3NjUsMTMgQEAKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25CdWZmZXJzUmVsZWFzZWQoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAotICAgIHVpbnQzMl90IHNsb3RNYXNrOwotICAgIGlmIChtQnVmZmVyUXVldWUtPmdldFJlbGVhc2VkQnVmZmVycygmc2xvdE1hc2spICE9IE5PX0VSUk9SKSB7CisgICAgdWludDY0X3Qgc2xvdE1hc2s7CisgICAgaWYgKG1Db25zdW1lci0+Z2V0UmVsZWFzZWRCdWZmZXJzKCZzbG90TWFzaykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coIm9uQnVmZmVyc1JlbGVhc2VkOiB1bmFibGUgdG8gZ2V0IHJlbGVhc2VkIGJ1ZmZlciBzZXQiKTsKLSAgICAgICAgc2xvdE1hc2sgPSAweGZmZmZmZmZmOworICAgICAgICBzbG90TWFzayA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTDsKICAgICB9CiAKLSAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQ6IDB4JTA4eCIsIHNsb3RNYXNrKTsKKyAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQ6IDB4JTAxNiIgUFJJeDY0LCBzbG90TWFzayk7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTOyBpKyspIHsKICAgICAgICAgaWYgKChzbG90TWFzayAmIDB4MDEpICE9IDApIHsKQEAgLTc0MCw2ICs3ODEsMTEgQEAKICAgICB9CiB9CiAKKy8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGNhbGxiYWNrCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgeworICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAiR3JhcGhpY0J1ZmZlclNvdXJjZSBjYW4ndCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMiKTsKK30KKwogc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoCiAgICAgICAgIGludDY0X3QgcmVwZWF0QWZ0ZXJVcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwpAQCAtNzY0LDYgKzgxMCwyNyBAQAogCiAgICAgcmV0dXJuIE9LOwogfQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFNraXBGcmFtZXNCZWZvcmVVcyhpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVNraXBGcmFtZXNCZWZvcmVOcyA9CisgICAgICAgICAgICAoc2tpcEZyYW1lc0JlZm9yZVVzID4gMCkgPyAoc2tpcEZyYW1lc0JlZm9yZVVzICogMTAwMCkgOiAtMWxsOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRUaW1lTGFwc2VVcyhpbnQ2NF90KiBkYXRhKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpZiAobUV4ZWN1dGluZyB8fCBkYXRhWzBdIDw9IDBsbCB8fCBkYXRhWzFdIDw9IDBsbCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVRpbWVQZXJGcmFtZVVzID0gZGF0YVswXTsKKyAgICBtVGltZVBlckNhcHR1cmVVcyA9IGRhdGFbMV07CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRSZXBlYXRMYXN0RnJhbWU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaAppbmRleCAzYjBlNDU0Li5hNzBjYzFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKQEAgLTYxLDcgKzYxLDcgQEAKICAgICAvLyBSZXR1cm5zIHRoZSBoYW5kbGUgdG8gdGhlIHByb2R1Y2VyIHNpZGUgb2YgdGhlIEJ1ZmZlclF1ZXVlLiAgQnVmZmVycwogICAgIC8vIHF1ZXVlZCBvbiB0aGlzIHdpbGwgYmUgcmVjZWl2ZWQgYnkgR3JhcGhpY0J1ZmZlclNvdXJjZS4KICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUJ1ZmZlclF1ZXVlOworICAgICAgICByZXR1cm4gbVByb2R1Y2VyOwogICAgIH0KIAogICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gT01YIHRyYW5zaXRpb25zIHRvIE9NWF9TdGF0ZUV4ZWN1dGluZywgd2hpY2ggbWVhbnMKQEAgLTExOCw2ICsxMTgsMTcgQEAKICAgICAvLyBvZiBzdXNwZW5zaW9uIG9uIGlucHV0LgogICAgIHN0YXR1c190IHNldE1heFRpbWVzdGFtcEdhcFVzKGludDY0X3QgbWF4R2FwVXMpOwogCisgICAgLy8gU2V0cyB0aGUgdGltZSBsYXBzZSAob3Igc2xvdyBtb3Rpb24pIHBhcmFtZXRlcnMuCisgICAgLy8gZGF0YVswXSBpcyB0aGUgdGltZSAodXMpIGJldHdlZW4gdHdvIGZyYW1lcyBmb3IgcGxheWJhY2sKKyAgICAvLyBkYXRhWzFdIGlzIHRoZSB0aW1lICh1cykgYmV0d2VlbiB0d28gZnJhbWVzIGZvciBjYXB0dXJlCisgICAgLy8gV2hlbiBzZXQsIHRoZSBzYW1wbGUncyB0aW1lc3RhbXAgd2lsbCBiZSBtb2RpZmllZCB0byBwbGF5YmFjayBmcmFtZXJhdGUsCisgICAgLy8gYW5kIGNhcHR1cmUgdGltZXN0YW1wIHdpbGwgYmUgbW9kaWZpZWQgdG8gY2FwdHVyZSByYXRlLgorICAgIHN0YXR1c190IHNldFRpbWVMYXBzZVVzKGludDY0X3QqIGRhdGEpOworCisgICAgLy8gU2V0cyB0aGUgc3RhcnQgdGltZSB1cyAoaW4gc3lzdGVtIHRpbWUpLCBzYW1wbGVzIGJlZm9yZSB3aGljaCBzaG91bGQKKyAgICAvLyBiZSBkcm9wcGVkIGFuZCBub3Qgc3VibWl0dGVkIHRvIGVuY29kZXIKKyAgICB2b2lkIHNldFNraXBGcmFtZXNCZWZvcmVVcyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKKwogcHJvdGVjdGVkOgogICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gYSBuZXcgZnJhbWUgb2YKICAgICAvLyBkYXRhIGlzIGF2YWlsYWJsZS4gIElmIHdlJ3JlIGV4ZWN1dGluZyBhbmQgYSBjb2RlYyBidWZmZXIgaXMKQEAgLTEzMiw2ICsxNDMsMTEgQEAKICAgICAvLyBzZXQgb2YgbUJ1ZmZlclNsb3QgZW50cmllcy4KICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKTsKIAorICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMKKyAgICAvLyBjaGFuZ2VkIHRoZSBzaWRlYmFuZCBzdHJlYW0uIEdyYXBoaWNCdWZmZXJTb3VyY2UgZG9lc24ndCBoYW5kbGUgc2lkZWJhbmQKKyAgICAvLyBzdHJlYW1zIHNvIHRoaXMgaXMgYSBuby1vcCAoYW5kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQpLgorICAgIHZpcnR1YWwgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpOworCiBwcml2YXRlOgogICAgIC8vIEtlZXAgdHJhY2sgb2YgY29kZWMgaW5wdXQgYnVmZmVycy4gIFRoZXkgbWF5IGVpdGhlciBiZSBhdmFpbGFibGUKICAgICAvLyAobUdyYXBoaWNCdWZmZXIgPT0gTlVMTCkgb3IgaW4gdXNlIGJ5IHRoZSBjb2RlYy4KQEAgLTE5NCw4ICsyMTAsMTEgQEAKIAogICAgIGJvb2wgbVN1c3BlbmRlZDsKIAotICAgIC8vIFdlIGNvbnN1bWUgZ3JhcGhpYyBidWZmZXJzIGZyb20gdGhpcy4KLSAgICBzcDxCdWZmZXJRdWV1ZT4gbUJ1ZmZlclF1ZXVlOworICAgIC8vIE91ciBCdWZmZXJRdWV1ZSBpbnRlcmZhY2VzLiBtUHJvZHVjZXIgaXMgcGFzc2VkIHRvIHRoZSBwcm9kdWNlciB0aHJvdWdoCisgICAgLy8gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgYW5kIG1Db25zdW1lciBpcyB1c2VkIGludGVybmFsbHkgdG8gcmV0cmlldmUKKyAgICAvLyB0aGUgYnVmZmVycyBxdWV1ZWQgYnkgdGhlIHByb2R1Y2VyLgorICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBtQ29uc3VtZXI7CiAKICAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIHBlbmRpbmcgaW4gQnVmZmVyUXVldWUgdGhhdCBoYXZlbid0IHlldCBiZWVuCiAgICAgLy8gZm9yd2FyZGVkIHRvIHRoZSBjb2RlYy4KQEAgLTIyMywxNiArMjQyLDE3IEBACiAgICAgZW51bSB7CiAgICAgICAgIGtSZXBlYXRMYXN0RnJhbWVDb3VudCA9IDEwLAogICAgIH07Ci0gICAgaW50NjRfdCBtUmVwZWF0QWZ0ZXJVczsKLSAgICBpbnQ2NF90IG1NYXhUaW1lc3RhbXBHYXBVczsKIAogICAgIEtleWVkVmVjdG9yPGludDY0X3QsIGludDY0X3Q+IG1PcmlnaW5hbFRpbWVVczsKKyAgICBpbnQ2NF90IG1NYXhUaW1lc3RhbXBHYXBVczsKICAgICBpbnQ2NF90IG1QcmV2T3JpZ2luYWxUaW1lVXM7CiAgICAgaW50NjRfdCBtUHJldk1vZGlmaWVkVGltZVVzOworICAgIGludDY0X3QgbVNraXBGcmFtZXNCZWZvcmVOczsKIAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT4gPiBtUmVmbGVjdG9yOwogCisgICAgaW50NjRfdCBtUmVwZWF0QWZ0ZXJVczsKICAgICBpbnQzMl90IG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uOwogICAgIGludDY0X3QgbVJlcGVhdExhc3RGcmFtZVRpbWVzdGFtcDsKICAgICBpbnQzMl90IG1SZXBlYXRMYXN0RnJhbWVDb3VudDsKQEAgLTI0NSw2ICsyNjUsMTIgQEAKICAgICAvLyBubyBjb2RlYyBidWZmZXIgd2FzIGF2YWlsYWJsZSBhdCB0aGUgdGltZS4KICAgICBib29sIG1SZXBlYXRCdWZmZXJEZWZlcnJlZDsKIAorICAgIC8vIFRpbWUgbGFwc2UgLyBzbG93IG1vdGlvbiBjb25maWd1cmF0aW9uCisgICAgaW50NjRfdCBtVGltZVBlckNhcHR1cmVVczsKKyAgICBpbnQ2NF90IG1UaW1lUGVyRnJhbWVVczsKKyAgICBpbnQ2NF90IG1QcmV2Q2FwdHVyZVVzOworICAgIGludDY0X3QgbVByZXZGcmFtZVVzOworCiAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHcmFwaGljQnVmZmVyU291cmNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKaW5kZXggODM5MTI5MC4uMGZiMzhmYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKQEAgLTg1MCw2ICs4NTAsOCBAQAogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9TVVNQRU5EOgogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9SRVBFQVRfUFJFVklPVVNfRlJBTUVfREVMQVk6CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX01BWF9USU1FU1RBTVBfR0FQOgorICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FOgorICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlID0KICAgICAgICAgICAgICAgICBnZXRHcmFwaGljQnVmZmVyU291cmNlKCk7CkBAIC04NzQsNyArODc2LDggQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSAqKGludDY0X3QgKilkYXRhOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclNvdXJjZS0+c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoZGVsYXlVcyk7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09CisgICAgICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9NQVhfVElNRVNUQU1QX0dBUCl7CiAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKGludDY0X3QpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICB9CkBAIC04ODIsNiArODg1LDIwIEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBtYXhHYXBVcyA9ICooaW50NjRfdCAqKWRhdGE7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyU291cmNlLT5zZXRNYXhUaW1lc3RhbXBHYXBVcyhtYXhHYXBVcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoaW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzID0gKihpbnQ2NF90ICopZGF0YTsKKworICAgICAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+c2V0U2tpcEZyYW1lc0JlZm9yZVVzKHNraXBGcmFtZXNCZWZvcmVVcyk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBJT01YOjpJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRQorICAgICAgICAgICAgICAgIGlmIChzaXplICE9IHNpemVvZihpbnQ2NF90KSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+c2V0VGltZUxhcHNlVXMoKGludDY0X3QgKilkYXRhKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCmluZGV4IGQ0OWU1MGIuLjY1ZjU0MDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKQEAgLTUwLDYgKzUwLDcgQEAKICAgICB7ICJPTVguZ29vZ2xlLm1wZWc0LmVuY29kZXIiLCAibXBlZzRlbmMiLCAidmlkZW9fZW5jb2Rlci5tcGVnNCIgfSwKICAgICB7ICJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiwgIm1wM2RlYyIsICJhdWRpb19kZWNvZGVyLm1wMyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLnZvcmJpcy5kZWNvZGVyIiwgInZvcmJpc2RlYyIsICJhdWRpb19kZWNvZGVyLnZvcmJpcyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIsICJvcHVzZGVjIiwgImF1ZGlvX2RlY29kZXIub3B1cyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLnZwOC5kZWNvZGVyIiwgInZweGRlYyIsICJ2aWRlb19kZWNvZGVyLnZwOCIgfSwKICAgICB7ICJPTVguZ29vZ2xlLnZwOS5kZWNvZGVyIiwgInZweGRlYyIsICJ2aWRlb19kZWNvZGVyLnZwOSIgfSwKICAgICB7ICJPTVguZ29vZ2xlLnZwOC5lbmNvZGVyIiwgInZweGVuYyIsICJ2aWRlb19lbmNvZGVyLnZwOCIgfSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZTM2ODEzNC4uNDQ3YjI5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTExLDYgKzExLDggQEAKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gb214X3Rlc3RzCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKaW5kZXggNDRlNGY5ZC4uZjRkZmQ2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CkBAIC0yNDIsNyArMjQzLDggQEAKIH07CiAKIHN0YXRpYyBzcDxNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlRXh0cmFjdG9yRnJvbVVSSShjb25zdCBjaGFyICp1cmkpIHsKLSAgICBzcDxEYXRhU291cmNlPiBzb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVyaSk7CisgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0KKyAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCB1cmkpOwogCiAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDYxLDYgKzQ2Myw3IEBACiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIuYWFjIiwgImF1ZGlvL21wNGEtbGF0bSIgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5tcDMiLCAiYXVkaW8vbXBlZyIgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci52b3JiaXMiLCAiYXVkaW8vdm9yYmlzIiB9LAorICAgICAgICB7ICJhdWRpb19kZWNvZGVyLm9wdXMiLCAiYXVkaW8vb3B1cyIgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyB9LAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmc3MTFtbGF3IiwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXIH0sCiAgICAgfTsKQEAgLTQ5Myw2ICs0OTYsNyBAQAogICAgICAgICB7ICJhdWRpby9tcGVnIiwKICAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL211c2ljL01QM180OEtIel8xMjhrYnBzX3NfMV8xN19DQlIubXAzIiB9LAogICAgICAgICB7ICJhdWRpby92b3JiaXMiLCBOVUxMIH0sCisgICAgICAgIHsgImF1ZGlvL29wdXMiLCBOVUxMIH0sCiAgICAgICAgIHsgInZpZGVvL3gtdm5kLm9uMi52cDgiLAogICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vYmlnLWJ1Y2stYnVubnlfdHJhaWxlci53ZWJtIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywgImZpbGU6Ly8vc2RjYXJkL00xRjEtQWxhdy1BRnNwLndhdiIgfSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDQ2MmMzODQuLjA5ZjUyYmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIkFSYXdBdWRpb0Fzc2VtYmxlci5oIgogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKIAotI2luY2x1ZGUgImF2Y191dGlscy5oIgorI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAKICNpbmNsdWRlIDxjdHlwZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggNDkyYmQ0YS4uZjI1NTM5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogCi0jaW5jbHVkZSAiSFRUUEJhc2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjM5LDcgKzIzOSw3IEBACiAgICAgICAgIC8vIHJpZ2h0IGhlcmUsIHNpbmNlIHdlIGN1cnJlbnRseSBoYXZlIG5vIHdheSBvZiBhc2tpbmcgdGhlIHVzZXIKICAgICAgICAgLy8gZm9yIHRoaXMgaW5mb3JtYXRpb24uCiAKLSAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBydHNwIHVybCA8VVJMIHN1cHByZXNzZWQ+Iik7CisgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgcnRzcCB1cmwgJXMiLCB1cmlEZWJ1Z1N0cmluZyh1cmwpLmNfc3RyKCkpOwogCiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgRVJST1JfTUFMRk9STUVEKTsKICAgICAgICAgcmVwbHktPnBvc3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tawppbmRleCBlNzdjNjljLi4zOWVlZGMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw3IEBACiAgICAgICAgIFNEUExvYWRlci5jcHAgICAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCSQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKIApAQCAtMzAsNiArMzAsOCBAQAogICAgIExPQ0FMX0NGTEFHUyArPSAtV25vLXBzYWJpCiBlbmRpZgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAppbmRleCBlNzU4MGMyLi5mM2RmYzU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTE5LDcgKzE5LDExIEBACiAjZGVmaW5lIE1ZX0hBTkRMRVJfSF8KIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaWZuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiTXlIYW5kbGVyIgorI2VuZGlmCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIkFQYWNrZXRTb3VyY2UuaCIKQEAgLTQyLDYgKzQ2LDEyIEBACiAKICNpbmNsdWRlICJIVFRQQmFzZS5oIgogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiAvLyBJZiBubyBhY2Nlc3MgdW5pdHMgYXJlIHJlY2VpdmVkIHdpdGhpbiA1IHNlY3MsIGFzc3VtZSB0aGF0IHRoZSBydHAKIC8vIHN0cmVhbSBoYXMgZW5kZWQgYW5kIHNpZ25hbCBlbmQgb2Ygc3RyZWFtLgogc3RhdGljIGludDY0X3Qga0FjY2Vzc1VuaXRUaW1lb3V0VXMgPSAxMDAwMDAwMGxsOwpAQCAtMTc4LDcgKzE4OCw3IEBACiAgICAgICAgIG1Db25uLT5jb25uZWN0KG1PcmlnaW5hbFNlc3Npb25VUkwuY19zdHIoKSwgcmVwbHkpOwogICAgIH0KIAotICAgIEFTdHJpbmcgZ2V0Q29udHJvbFVSTChzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiBkZXNjKSB7CisgICAgQVN0cmluZyBnZXRDb250cm9sVVJMKCkgewogICAgICAgICBBU3RyaW5nIHNlc3Npb25MZXZlbENvbnRyb2xVUkw7CiAgICAgICAgIGlmIChtU2Vzc2lvbkRlc2MtPmZpbmRBdHRyaWJ1dGUoCiAgICAgICAgICAgICAgICAgMCwKQEAgLTU1Niw3ICs1NjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmFzZVVSTCA9IHRtcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwobVNlc3Npb25EZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbkRlc2MtPmNvdW50VHJhY2tzKCkgPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gYWN0dWFsIHRyYWNrcyBpbiB0aGlzIHNlc3Npb24uCkBAIC02MDIsNyArNjEyLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWthYmxlID0gIWlzTGl2ZVN0cmVhbShtU2Vzc2lvbkRlc2MpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwobVNlc3Npb25EZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sVVJMID0gZ2V0Q29udHJvbFVSTCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlc3Npb25EZXNjLT5jb3VudFRyYWNrcygpIDwgMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gYWN0dWFsIHRyYWNrcyBpbiB0aGlzIHNlc3Npb24uCkBAIC0xODE2LDYgKzE4MjYsOCBAQAogICAgIGJvb2wgYWRkTWVkaWFUaW1lc3RhbXAoCiAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXgsIGNvbnN0IFRyYWNrSW5mbyAqdHJhY2ssCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgICAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UodHJhY2tJbmRleCk7CisKICAgICAgICAgdWludDMyX3QgcnRwVGltZTsKICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAppbmRleCA4OWZmMTdkLi40MjRiYWRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCkBAIC0xOCwzNCArMTgsMzAgQEAKICNkZWZpbmUgTE9HX1RBRyAiU0RQTG9hZGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiU0RQTG9hZGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9TRFBMb2FkZXIuaCIKIAogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKLSNpbmNsdWRlICJIVFRQQmFzZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogI2RlZmluZSBERUZBVUxUX1NEUF9TSVpFIDEwMDAwMAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLVNEUExvYWRlcjo6U0RQTG9hZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncywgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKQorU0RQTG9hZGVyOjpTRFBMb2FkZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKICAgICAgIG1GbGFncyhmbGFncyksCi0gICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAotICAgICAgbVVJRCh1aWQpLAogICAgICAgbU5ldExvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtQ2FuY2VsbGVkKGZhbHNlKSwKLSAgICAgIG1IVFRQRGF0YVNvdXJjZSgKLSAgICAgICAgICAgICAgSFRUUEJhc2U6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykKLSAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KLSAgICAgICAgICAgICAgICAgICAgOiAwKSkgewotICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgbUhUVFBEYXRhU291cmNlLT5zZXRVSUQobVVJRCk7Ci0gICAgfQotCisgICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CiAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgic2RwIG5ldCIpOwogICAgIG1OZXRMb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKQEAgLTk0LDExICs5MCw3IEBACiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMOwogICAgIG1zZy0+ZmluZFBvaW50ZXIoImhlYWRlcnMiLCAodm9pZCAqKikmaGVhZGVycyk7CiAKLSAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykpIHsKLSAgICAgICAgQUxPR1YoIm9uTG9hZCAnJXMnIiwgdXJsLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCJvbkxvYWQgPFVSTCBzdXBwcmVzc2VkPiIpOwotICAgIH0KKyAgICBBTE9HVigib25Mb2FkICVzIiwgdXJpRGVidWdTdHJpbmcodXJsLCBtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykuY19zdHIoKSk7CiAKICAgICBpZiAoIW1DYW5jZWxsZWQpIHsKICAgICAgICAgZXJyID0gbUhUVFBEYXRhU291cmNlLT5jb25uZWN0KHVybC5jX3N0cigpLCBoZWFkZXJzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcAppbmRleCA0OWZmY2Q2Li5mZDg4OWY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgogCiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KQEAgLTExMCw3ICsxMDksNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk5vIGFjdHVhbCBkaXNwbGF5LiBDaG9vc2luZyBFR0xTdXJmYWNlIGJhc2VkIG9uIFN1cmZhY2VNZWRpYVNvdXJjZSIpOwogICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gc21zID0gKG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgIGdldFN1cmZhY2VXaWR0aCgpLCBnZXRTdXJmYWNlSGVpZ2h0KCkpKS0+Z2V0QnVmZmVyUXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVdpZHRoKCksIGdldFN1cmZhY2VIZWlnaHQoKSkpLT5nZXRQcm9kdWNlcigpOwogICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3RjID0gbmV3IFN1cmZhY2Uoc21zKTsKICAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdyA9IHN0YzsKIApAQCAtMzYxLDkgKzM2MCw3IEBACiAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewogICAgICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0KLSAgICAgICAgLy8gTWFudWFsIGNhc3QgaXMgcmVxdWlyZWQgdG8gYXZvaWQgY29uc3RydWN0b3IgYW1iaWd1aXR5Ci0gICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZShzdGF0aWNfY2FzdDxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+KCBtU01TLT5nZXRCdWZmZXJRdWV1ZSgpKSk7CisgICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZShtU01TLT5nZXRQcm9kdWNlcigpKTsKICAgICAgICAgbUFOVyA9IG1TVEM7CiAgICAgfQogCkBAIC0zOTgsNyArMzk1LDcgQEAKICAgICAgICAgQUxPR1YoIlNNUy1HTFRlc3Q6OlNldFVwKCkiKTsKICAgICAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgICAgICBtU01TID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwotICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2Uoc3RhdGljX2Nhc3Q8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiggbVNNUy0+Z2V0QnVmZmVyUXVldWUoKSkpOworICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2UobVNNUy0+Z2V0UHJvZHVjZXIoKSk7CiAgICAgICAgIG1BTlcgPSBtU1RDOwogCiAgICAgICAgIC8vIERvaW5nIHRoZSBzZXR1cCByZWxhdGVkIHRvIHRoZSBHTCBTaWRlCkBAIC01MjcsNyArNTI0LDggQEAKIH0KIAogLy8gRGVxdWV1aW5nIGFuZCBxdWV1aW5nIHRoZSBidWZmZXIgd2l0aG91dCByZWFsbHkgZmlsbGluZyBpdCBpbi4KLXZvaWQgU3VyZmFjZU1lZGlhU291cmNlVGVzdDo6b25lQnVmZmVyUGFzc05vRmlsbChpbnQgd2lkdGgsIGludCBoZWlnaHQgKSB7Cit2b2lkIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6Om9uZUJ1ZmZlclBhc3NOb0ZpbGwoCisgICAgICAgIGludCAvKiB3aWR0aCAqLywgaW50IC8qIGhlaWdodCAgKi8pIHsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7CiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1BTlcuZ2V0KCksICZhbmIpKTsKICAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7CkBAIC03NDYsOSArNzQ0LDggQEAKICAgICBDSEVDSyhmZCA+PSAwKTsKIAogICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0OjpzZXRVcE1lZGlhUmVjb3JkZXIoZmQsCi0gICAgICAgICAgICBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIsCi0gICAgICAgICAgICBPVVRQVVRfRk9STUFUX01QRUdfNCwgVklERU9fRU5DT0RFUl9IMjY0LCBtWXV2VGV4V2lkdGgsCi0gICAgICAgICAgICBtWXV2VGV4SGVpZ2h0LCAzMCk7CisgICAgICAgICAgICBWSURFT19TT1VSQ0VfU1VSRkFDRSwgT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIFZJREVPX0VOQ09ERVJfSDI2NCwKKyAgICAgICAgICAgIG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCwgMzApOwogICAgIC8vIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzdXJmYWNlbWVkaWFzb3VyY2UgbGl2aW5nIGluCiAgICAgLy8gbWVkaWFzZXJ2ZXIgdGhhdCBpcyBjcmVhdGVkIGJ5IHN0YWdlZnJpZ2h0cmVjb3JkZXIKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpU1QgPSBtci0+cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2VGcm9tTWVkaWFTZXJ2ZXIoKTsKQEAgLTc4Myw3ICs3ODAsNyBAQAogICAgIEFMT0dWKCJWZXJpZnkgY3JlYXRpbmcgYSBzdXJmYWNlIHcvIHJpZ2h0IGNvbmZpZyArIGR1bW15IHdyaXRlcioqKioqKioqKiIpOwogCiAgICAgbVNNUyA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLSAgICBtU1RDID0gbmV3IFN1cmZhY2Uoc3RhdGljX2Nhc3Q8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiggbVNNUy0+Z2V0QnVmZmVyUXVldWUoKSkpOworICAgIG1TVEMgPSBuZXcgU3VyZmFjZShtU01TLT5nZXRQcm9kdWNlcigpKTsKICAgICBtQU5XID0gbVNUQzsKIAogICAgIER1bW15UmVjb3JkZXIgd3JpdGVyKG1TTVMpOwpAQCAtODgwLDcgKzg3Nyw3IEBACiAgICAgfQogICAgIENIRUNLKGZkID49IDApOwogCi0gICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBzZXRVcE1lZGlhUmVjb3JkZXIoZmQsIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiwKKyAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IHNldFVwTWVkaWFSZWNvcmRlcihmZCwgVklERU9fU09VUkNFX1NVUkZBQ0UsCiAgICAgICAgICAgICBPVVRQVVRfRk9STUFUX01QRUdfNCwgVklERU9fRU5DT0RFUl9IMjY0LCBtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQsIDMwKTsKIAogICAgIC8vIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzdXJmYWNlbWVkaWFzb3VyY2UgbGl2aW5nIGluCkBAIC05MjMsNyArOTIwLDcgQEAKICAgICB9CiAgICAgQ0hFQ0soZmQgPj0gMCk7CiAKLSAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IHNldFVwTWVkaWFSZWNvcmRlcihmZCwgVklERU9fU09VUkNFX0dSQUxMT0NfQlVGRkVSLAorICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfU1VSRkFDRSwKICAgICAgICAgICAgIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsIG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCwgMzApOwogCiAgICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKaW5kZXggMTJmZDdmNC4uNzFhYTIxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgpAQCAtNDAsOSArNDEsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogVGltZWRUZXh0RHJpdmVyOjpUaW1lZFRleHREcml2ZXIoCi0gICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyKQorICAgICAgICBjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lciwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKICAgICA6IG1Mb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbUxpc3RlbmVyKGxpc3RlbmVyKSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCiAgICAgICBtU3RhdGUoVU5JTklUSUFMSVpFRCksCiAgICAgICBtQ3VycmVudFRyYWNrSW5kZXgoVUlOVF9NQVgpIHsKICAgICBtTG9vcGVyLT5zZXROYW1lKCJUaW1lZFRleHREcml2ZXIiKTsKQEAgLTIwNyw3ICsyMTAsNyBAQAogICAgIH0KIAogICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmkpOworICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtSFRUUFNlcnZpY2UsIHVyaSk7CiAgICAgcmV0dXJuIGNyZWF0ZU91dE9mQmFuZFRleHRTb3VyY2UodHJhY2tJbmRleCwgbWltZVR5cGUsIGRhdGFTb3VyY2UpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5tawppbmRleCBhNWU3YmEyLi45YTlmZGUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsKQEAgLTIsNyArMiw2IEBACiAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyBVbml0IHRlc3RzIGZvciBsaWJzdGFnZWZyaWdodF90aW1lZHRleHQKLSMgU2VlIGFsc28gL2RldmVsb3BtZW50L3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTgsMTAgKzE3LDEzIEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoVE9QKS9leHRlcm5hbC9leHBhdC9saWIgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0CisgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0CiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmJpbmRlciBcCiAgICAgbGliZXhwYXQgXAotICAgIGxpYnN0YWdlZnJpZ2h0CisgICAgbGlic3RhZ2VmcmlnaHQgXAorICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgIGxpYnV0aWxzCiAKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDgxNDYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjMgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NQUEZMQUdTICs9IC1EX19TVERJTlRfTElNSVRTIFwKKyAgICAgICAgICAgICAgICAgIC1XZXJyb3IKKworTE9DQUxfU1JDX0ZJTEVTOj0gRWJtbFV0aWwuY3BwICAgICAgICBcCisgICAgICAgICAgICAgICAgICBXZWJtRWxlbWVudC5jcHAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFdlYm1GcmFtZS5jcHAgICAgICAgXAorICAgICAgICAgICAgICAgICAgV2VibUZyYW1lVGhyZWFkLmNwcCBcCisgICAgICAgICAgICAgICAgICBXZWJtV3JpdGVyLmNwcAorCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJzdGFnZWZyaWdodCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnV0aWxzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlibG9nCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3dlYm0KKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDlmZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB7CisKKy8vIFRhYmxlIGZvciBTZWFsJ3MgYWxnb3JpdGhtIGZvciBOdW1iZXIgb2YgVHJhaWxpbmcgWmVyb3MuIEhhY2tlcidzIERlbGlnaHQKKy8vIG9ubGluZSwgRmlndXJlIDUtMTggKGh0dHA6Ly93d3cuaGFja2Vyc2RlbGlnaHQub3JnL3JldmlzaW9ucy5wZGYpCisvLyBUaGUgZW50cmllcyB3aG9zZSB2YWx1ZSBpcyAtMSBhcmUgbmV2ZXIgcmVmZXJlbmNlZC4KK2ludCBOVFpfVEFCTEVbXSA9IHsKKyAgICAzMiwgIDAsICAxLCAxMiwgIDIsICA2LCAtMSwgMTMsICAgMywgLTEsICA3LCAtMSwgLTEsIC0xLCAtMSwgMTQsCisgICAgMTAsICA0LCAtMSwgLTEsICA4LCAtMSwgLTEsIDI1LCAgLTEsIC0xLCAtMSwgLTEsIC0xLCAyMSwgMjcsIDE1LAorICAgIDMxLCAxMSwgIDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgICA5LCAtMSwgLTEsIDI0LCAtMSwgLTEsIDIwLCAyNiwKKyAgICAzMCwgLTEsIC0xLCAtMSwgLTEsIDIzLCAtMSwgMTksICAyOSwgLTEsIDIyLCAxOCwgMjgsIDE3LCAxNiwgLTEKK307CisKK2ludCBudW1iZXJPZlRyYWlsaW5nWmVyb3MzMihpbnQzMl90IGkpIHsKKyAgICB1aW50MzJfdCB1ID0gKGkgJiAtaSkgKiAweDA0NTBGQkFGOworICAgIHJldHVybiBOVFpfVEFCTEVbKHUpID4+IDI2XTsKK30KKwordWludDY0X3QgaGlnaGVzdE9uZUJpdCh1aW50NjRfdCBuKSB7CisgICAgbiB8PSAobiA+PiAxKTsKKyAgICBuIHw9IChuID4+IDIpOworICAgIG4gfD0gKG4gPj4gNCk7CisgICAgbiB8PSAobiA+PiA4KTsKKyAgICBuIHw9IChuID4+IDE2KTsKKyAgICBuIHw9IChuID4+IDMyKTsKKyAgICByZXR1cm4gbiAtIChuID4+IDEpOworfQorCit1aW50NjRfdCBfcG93ZXJPZjIodWludDY0X3QgdSkgeworICAgIHVpbnQ2NF90IHBvd2VyT2YyID0gaGlnaGVzdE9uZUJpdCh1KTsKKyAgICByZXR1cm4gcG93ZXJPZjIgPyBwb3dlck9mMiA6IDE7Cit9CisKKy8vIEJhc2VkIG9uIExvbmcubnVtYmVyT2ZUcmFpbGluZ1plcm9zIGluIExvbmcuamF2YQoraW50IG51bWJlck9mVHJhaWxpbmdaZXJvcyh1aW50NjRfdCB1KSB7CisgICAgaW50MzJfdCBsb3cgPSB1OworICAgIHJldHVybiBsb3cgIT0wID8gbnVtYmVyT2ZUcmFpbGluZ1plcm9zMzIobG93KQorICAgICAgICAgICAgICAgICAgIDogMzIgKyBudW1iZXJPZlRyYWlsaW5nWmVyb3MzMigoaW50MzJfdCkgKHUgPj4gMzIpKTsKK30KK30KKworbmFtZXNwYWNlIHdlYm0geworCisvLyBFbmNvZGUgdGhlIGlkIGFuZC9vciBzaXplIG9mIGFuIEVCTUwgZWxlbWVudCBieXRlcyBieSBzZXR0aW5nIGEgbGVhZGluZyBsZW5ndGggZGVzY3JpcHRvciBiaXQ6CisvLworLy8gICAxeHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEtYnl0ZSB2YWx1ZXMKKy8vICAgMDF4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDF4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDF4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gLi4uCisvLyAgIDAwMDAxeHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMDAxeHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAwMDAxeCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAtCisvLyAgIDAwMDAwMDAxIHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IC0gOC1ieXRlIHZhbHVlcworLy8KKy8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgbGVhc3QgdGhlIG51bWJlciBvZiBieXRlcyBwb3NzaWJsZS4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUpIHsKKyAgICB1aW50NjRfdCBwb3dlck9mMiA9IF9wb3dlck9mMih1KTsKKyAgICBpZiAodSArIDEgPT0gcG93ZXJPZjIgPDwgMSkKKyAgICAgICAgcG93ZXJPZjIgPDw9IDE7CisgICAgaW50IHNoaWZ0V2lkdGggPSAoNyArIG51bWJlck9mVHJhaWxpbmdaZXJvcyhwb3dlck9mMikpIC8gNyAqIDc7CisgICAgbG9uZyBsZW5ndGhEZXNjcmlwdG9yID0gMSA8PCBzaGlmdFdpZHRoOworICAgIHJldHVybiBsZW5ndGhEZXNjcmlwdG9yIHwgdTsKK30KKworLy8gTGlrZSBhYm92ZSBidXQgcGFkcyB0aGUgaW5wdXQgdmFsdWUgd2l0aCBsZWFkaW5nIHplcm9zIHVwIHRvIHRoZSBzcGVjaWZpZWQgd2lkdGguIFRoZSBsZW5ndGgKKy8vIGRlc2NyaXB0b3IgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB3aWR0aC4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUsIGludCB3aWR0aCkgeworICAgIGludCBzaGlmdFdpZHRoID0gNyAqIHdpZHRoOworICAgIHVpbnQ2NF90IGxlbmd0aERlc2NyaXB0b3IgPSAxOworICAgIGxlbmd0aERlc2NyaXB0b3IgPDw9IHNoaWZ0V2lkdGg7CisgICAgcmV0dXJuIGxlbmd0aERlc2NyaXB0b3IgfCB1OworfQorCisvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgZnJvbSBpdHMgbGVuZ3RoIGRlc2NyaXB0b3IuCitpbnQgc2l6ZU9mKHVpbnQ2NF90IHUpIHsKKyAgICB1aW50NjRfdCBwb3dlck9mMiA9IF9wb3dlck9mMih1KTsKKyAgICBpbnQgdW5zaWduZWRMZW5ndGggPSBudW1iZXJPZlRyYWlsaW5nWmVyb3MocG93ZXJPZjIpIC8gOCArIDE7CisgICAgcmV0dXJuIHVuc2lnbmVkTGVuZ3RoOworfQorCisvLyBTZXJpYWxpemUgYW4gRUJNTCBjb2RlZCBpZCBvciBzaXplIGluIGJpZy1lbmRpYW4gb3JkZXIuCitpbnQgc2VyaWFsaXplQ29kZWRVbnNpZ25lZCh1aW50NjRfdCB1LCB1aW50OF90KiBiYXJ5KSB7CisgICAgaW50IHVuc2lnbmVkTGVuZ3RoID0gc2l6ZU9mKHUpOworICAgIGZvciAoaW50IGkgPSB1bnNpZ25lZExlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGJhcnlbaV0gPSB1ICYgMHhmZjsKKyAgICAgICAgdSA+Pj0gODsKKyAgICB9CisgICAgcmV0dXJuIHVuc2lnbmVkTGVuZ3RoOworfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5YzM3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBFQk1MVVRJTF9IXworI2RlZmluZSBFQk1MVVRJTF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB3ZWJtIHsKKworLy8gRW5jb2RlIHRoZSBpZCBhbmQvb3Igc2l6ZSBvZiBhbiBFQk1MIGVsZW1lbnQgYnl0ZXMgYnkgc2V0dGluZyBhIGxlYWRpbmcgbGVuZ3RoIGRlc2NyaXB0b3IgYml0OgorLy8KKy8vICAgMXh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxLWJ5dGUgdmFsdWVzCisvLyAgIDAxeHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAxeHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAxeHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIC4uLgorLy8gICAwMDAwMXh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDAwMXh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMDAwMXggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgLQorLy8gICAwMDAwMDAwMSB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAtIDgtYnl0ZSB2YWx1ZXMKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGxlYXN0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcG9zc2libGUuCit1aW50NjRfdCBlbmNvZGVVbnNpZ25lZCh1aW50NjRfdCB1KTsKKworLy8gTGlrZSBhYm92ZSBidXQgcGFkcyB0aGUgaW5wdXQgdmFsdWUgd2l0aCBsZWFkaW5nIHplcm9zIHVwIHRvIHRoZSBzcGVjaWZpZWQgd2lkdGguIFRoZSBsZW5ndGgKKy8vIGRlc2NyaXB0b3IgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB3aWR0aC4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUsIGludCB3aWR0aCk7CisKKy8vIFNlcmlhbGl6ZSBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgaW4gYmlnLWVuZGlhbiBvcmRlci4KK2ludCBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKHVpbnQ2NF90IHUsIHVpbnQ4X3QqIGJhcnkpOworCisvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgZnJvbSBpdHMgbGVuZ3RoIGRlc2NyaXB0b3IuCitpbnQgc2l6ZU9mKHVpbnQ2NF90IHUpOworCit9CisKKyNlbmRpZiAvKiBFQk1MVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9MaW5rZWRCbG9ja2luZ1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0xpbmtlZEJsb2NraW5nUXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjZhOWExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9MaW5rZWRCbG9ja2luZ1F1ZXVlLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTElOS0VEQkxPQ0tJTkdRVUVVRV9IXworI2RlZmluZSBMSU5LRURCTE9DS0lOR1FVRVVFX0hfCisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgTGlua2VkQmxvY2tpbmdRdWV1ZSB7CisgICAgTGlzdDxUPiBtTGlzdDsKKyAgICBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbnRlbnRBdmFpbGFibGVDb25kaXRpb247CisKKyAgICBUIGZyb250KGJvb2wgcmVtb3ZlKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgICAgIHdoaWxlIChtTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICBtQ29udGVudEF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICAgICAgfQorICAgICAgICBUIGUgPSAqKG1MaXN0LmJlZ2luKCkpOworICAgICAgICBpZiAocmVtb3ZlKSB7CisgICAgICAgICAgICBtTGlzdC5lcmFzZShtTGlzdC5iZWdpbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMaW5rZWRCbG9ja2luZ1F1ZXVlKTsKKworcHVibGljOgorICAgIExpbmtlZEJsb2NraW5nUXVldWUoKSB7CisgICAgfQorCisgICAgfkxpbmtlZEJsb2NraW5nUXVldWUoKSB7CisgICAgfQorCisgICAgYm9vbCBlbXB0eSgpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0LmVtcHR5KCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICAgICAgbUxpc3QuY2xlYXIoKTsKKyAgICB9CisKKyAgICBUIHBlZWsoKSB7CisgICAgICAgIHJldHVybiBmcm9udChmYWxzZSk7CisgICAgfQorCisgICAgVCB0YWtlKCkgeworICAgICAgICByZXR1cm4gZnJvbnQodHJ1ZSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoKFQgZSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgICAgICBtTGlzdC5wdXNoX2JhY2soZSk7CisgICAgICAgIG1Db250ZW50QXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKyNlbmRpZiAvKiBMSU5LRURCTE9DS0lOR1FVRVVFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Db25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUNvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2Y0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Db25zdGFudHMuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUNPTlNUQU5UU19IXworI2RlZmluZSBXRUJNQ09OU1RBTlRTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHdlYm0geworCitjb25zdCBpbnQga01pbkVibWxWb2lkU2l6ZSA9IDI7Citjb25zdCBpbnQ2NF90IGtNYXhNZXRhU2Vla1NpemUgPSA2NDsKK2NvbnN0IGludDY0X3Qga01rdlVua25vd25MZW5ndGggPSAweDAxZmZmZmZmZmZmZmZmZmZsOworCisvLyBFQk1MIGVsZW1lbnQgaWQncyBmcm9tIGh0dHA6Ly9tYXRyb3NrYS5vcmcvdGVjaG5pY2FsL3NwZWNzL2luZGV4Lmh0bWwKK2VudW0gTWt2IHsKKyAgICBrTWt2RWJtbCA9IDB4MUE0NURGQTMsCisgICAga01rdkVibWxWZXJzaW9uID0gMHg0Mjg2LAorICAgIGtNa3ZFYm1sUmVhZFZlcnNpb24gPSAweDQyRjcsCisgICAga01rdkVibWxNYXhJZGxlbmd0aCA9IDB4NDJGMiwKKyAgICBrTWt2RWJtbE1heFNpemVMZW5ndGggPSAweDQyRjMsCisgICAga01rdkRvY1R5cGUgPSAweDQyODIsCisgICAga01rdkRvY1R5cGVWZXJzaW9uID0gMHg0Mjg3LAorICAgIGtNa3ZEb2NUeXBlUmVhZFZlcnNpb24gPSAweDQyODUsCisgICAga01rdlZvaWQgPSAweEVDLAorICAgIGtNa3ZTaWduYXR1cmVTbG90ID0gMHgxQjUzODY2NywKKyAgICBrTWt2U2lnbmF0dXJlQWxnbyA9IDB4N0U4QSwKKyAgICBrTWt2U2lnbmF0dXJlSGFzaCA9IDB4N0U5QSwKKyAgICBrTWt2U2lnbmF0dXJlUHVibGljS2V5ID0gMHg3RUE1LAorICAgIGtNa3ZTaWduYXR1cmUgPSAweDdFQjUsCisgICAga01rdlNpZ25hdHVyZUVsZW1lbnRzID0gMHg3RTVCLAorICAgIGtNa3ZTaWduYXR1cmVFbGVtZW50TGlzdCA9IDB4N0U3QiwKKyAgICBrTWt2U2lnbmVkRWxlbWVudCA9IDB4NjUzMiwKKyAgICBrTWt2U2VnbWVudCA9IDB4MTg1MzgwNjcsCisgICAga01rdlNlZWtIZWFkID0gMHgxMTREOUI3NCwKKyAgICBrTWt2U2VlayA9IDB4NERCQiwKKyAgICBrTWt2U2Vla0lkID0gMHg1M0FCLAorICAgIGtNa3ZTZWVrUG9zaXRpb24gPSAweDUzQUMsCisgICAga01rdkluZm8gPSAweDE1NDlBOTY2LAorICAgIGtNa3ZUaW1lY29kZVNjYWxlID0gMHgyQUQ3QjEsCisgICAga01rdlNlZ21lbnREdXJhdGlvbiA9IDB4NDQ4OSwKKyAgICBrTWt2RGF0ZVV0YyA9IDB4NDQ2MSwKKyAgICBrTWt2TXV4aW5nQXBwID0gMHg0RDgwLAorICAgIGtNa3ZXcml0aW5nQXBwID0gMHg1NzQxLAorICAgIGtNa3ZDbHVzdGVyID0gMHgxRjQzQjY3NSwKKyAgICBrTWt2VGltZWNvZGUgPSAweEU3LAorICAgIGtNa3ZQcmV2U2l6ZSA9IDB4QUIsCisgICAga01rdkJsb2NrR3JvdXAgPSAweEEwLAorICAgIGtNa3ZCbG9jayA9IDB4QTEsCisgICAga01rdkJsb2NrQWRkaXRpb25zID0gMHg3NUExLAorICAgIGtNa3ZCbG9ja01vcmUgPSAweEE2LAorICAgIGtNa3ZCbG9ja0FkZElkID0gMHhFRSwKKyAgICBrTWt2QmxvY2tBZGRpdGlvbmFsID0gMHhBNSwKKyAgICBrTWt2QmxvY2tEdXJhdGlvbiA9IDB4OUIsCisgICAga01rdlJlZmVyZW5jZUJsb2NrID0gMHhGQiwKKyAgICBrTWt2TGFjZU51bWJlciA9IDB4Q0MsCisgICAga01rdlNpbXBsZUJsb2NrID0gMHhBMywKKyAgICBrTWt2VHJhY2tzID0gMHgxNjU0QUU2QiwKKyAgICBrTWt2VHJhY2tFbnRyeSA9IDB4QUUsCisgICAga01rdlRyYWNrTnVtYmVyID0gMHhENywKKyAgICBrTWt2VHJhY2tVaWQgPSAweDczQzUsCisgICAga01rdlRyYWNrVHlwZSA9IDB4ODMsCisgICAga01rdkZsYWdFbmFibGVkID0gMHhCOSwKKyAgICBrTWt2RmxhZ0RlZmF1bHQgPSAweDg4LAorICAgIGtNa3ZGbGFnRm9yY2VkID0gMHg1NUFBLAorICAgIGtNa3ZGbGFnTGFjaW5nID0gMHg5QywKKyAgICBrTWt2RGVmYXVsdER1cmF0aW9uID0gMHgyM0UzODMsCisgICAga01rdk1heEJsb2NrQWRkaXRpb25JZCA9IDB4NTVFRSwKKyAgICBrTWt2TmFtZSA9IDB4NTM2RSwKKyAgICBrTWt2TGFuZ3VhZ2UgPSAweDIyQjU5QywKKyAgICBrTWt2Q29kZWNJZCA9IDB4ODYsCisgICAga01rdkNvZGVjUHJpdmF0ZSA9IDB4NjNBMiwKKyAgICBrTWt2Q29kZWNOYW1lID0gMHgyNTg2ODgsCisgICAga01rdlZpZGVvID0gMHhFMCwKKyAgICBrTWt2RmxhZ0ludGVybGFjZWQgPSAweDlBLAorICAgIGtNa3ZTdGVyZW9Nb2RlID0gMHg1M0I4LAorICAgIGtNa3ZBbHBoYU1vZGUgPSAweDUzQzAsCisgICAga01rdlBpeGVsV2lkdGggPSAweEIwLAorICAgIGtNa3ZQaXhlbEhlaWdodCA9IDB4QkEsCisgICAga01rdlBpeGVsQ3JvcEJvdHRvbSA9IDB4NTRBQSwKKyAgICBrTWt2UGl4ZWxDcm9wVG9wID0gMHg1NEJCLAorICAgIGtNa3ZQaXhlbENyb3BMZWZ0ID0gMHg1NENDLAorICAgIGtNa3ZQaXhlbENyb3BSaWdodCA9IDB4NTRERCwKKyAgICBrTWt2RGlzcGxheVdpZHRoID0gMHg1NEIwLAorICAgIGtNa3ZEaXNwbGF5SGVpZ2h0ID0gMHg1NEJBLAorICAgIGtNa3ZEaXNwbGF5VW5pdCA9IDB4NTRCMiwKKyAgICBrTWt2QXNwZWN0UmF0aW9UeXBlID0gMHg1NEIzLAorICAgIGtNa3ZGcmFtZVJhdGUgPSAweDIzODNFMywKKyAgICBrTWt2QXVkaW8gPSAweEUxLAorICAgIGtNa3ZTYW1wbGluZ0ZyZXF1ZW5jeSA9IDB4QjUsCisgICAga01rdk91dHB1dFNhbXBsaW5nRnJlcXVlbmN5ID0gMHg3OEI1LAorICAgIGtNa3ZDaGFubmVscyA9IDB4OUYsCisgICAga01rdkJpdERlcHRoID0gMHg2MjY0LAorICAgIGtNa3ZDdWVzID0gMHgxQzUzQkI2QiwKKyAgICBrTWt2Q3VlUG9pbnQgPSAweEJCLAorICAgIGtNa3ZDdWVUaW1lID0gMHhCMywKKyAgICBrTWt2Q3VlVHJhY2tQb3NpdGlvbnMgPSAweEI3LAorICAgIGtNa3ZDdWVUcmFjayA9IDB4RjcsCisgICAga01rdkN1ZUNsdXN0ZXJQb3NpdGlvbiA9IDB4RjEsCisgICAga01rdkN1ZUJsb2NrTnVtYmVyID0gMHg1Mzc4Cit9OworCitlbnVtIFRyYWNrVHlwZXMgeworICAgIGtJbnZhbGlkVHlwZSA9IC0xLAorICAgIGtWaWRlb1R5cGUgPSAweDEsCisgICAga0F1ZGlvVHlwZSA9IDB4MiwKKyAgICBrQ29tcGxleFR5cGUgPSAweDMsCisgICAga0xvZ29UeXBlID0gMHgxMCwKKyAgICBrU3VidGl0bGVUeXBlID0gMHgxMSwKKyAgICBrQnV0dG9uc1R5cGUgPSAweDEyLAorICAgIGtDb250cm9sVHlwZSA9IDB4MjAKK307CisKK2VudW0gVHJhY2tOdW0geworICAgIGtWaWRlb1RyYWNrTnVtID0gMHgxLAorICAgIGtBdWRpb1RyYWNrTnVtID0gMHgyCit9OworfQorCisjZW5kaWYgLyogV0VCTUNPTlNUQU5UU19IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA4Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJXZWJtRWxlbWVudCIKKworI2luY2x1ZGUgIkVibWxVdGlsLmgiCisjaW5jbHVkZSAiV2VibUVsZW1lbnQuaCIKKyNpbmNsdWRlICJXZWJtQ29uc3RhbnRzLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSB7CisKK2ludDY0X3Qgdm9pZFNpemUoaW50NjRfdCB0b3RhbFNpemUpIHsKKyAgICBpZiAodG90YWxTaXplIDwgMikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh0b3RhbFNpemUgPCA5KSB7CisgICAgICAgIHJldHVybiB0b3RhbFNpemUgLSAyOworICAgIH0KKyAgICByZXR1cm4gdG90YWxTaXplIC0gOTsKK30KKwordWludDY0X3QgY2hpbGRyZW5TdW0oY29uc3QgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pIHsKKyAgICB1aW50NjRfdCB0b3RhbCA9IDA7CisgICAgZm9yIChMaXN0PHNwPFdlYm1FbGVtZW50PiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNoaWxkcmVuLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBjaGlsZHJlbi5lbmQoKTsgKytpdCkgeworICAgICAgICB0b3RhbCArPSAoKml0KS0+dG90YWxTaXplKCk7CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKK30KKwordm9pZCBwb3B1bGF0ZUNvbW1vblRyYWNrRW50cmllcygKKyAgICAgICAgaW50IG51bSwKKyAgICAgICAgdWludDY0X3QgdWlkLAorICAgICAgICBib29sIGxhY2luZywKKyAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgY29uc3QgY2hhciAqY29kZWMsCisgICAgICAgIFRyYWNrVHlwZXMgdHlwZSwKKyAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiAmbHMpIHsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2VHJhY2tOdW1iZXIsIG51bSkpOworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZUcmFja1VpZCwgdWlkKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkZsYWdMYWNpbmcsIGxhY2luZykpOworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2TGFuZ3VhZ2UsIGxhbmcpKTsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1TdHJpbmcoa01rdkNvZGVjSWQsIGNvZGVjKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlRyYWNrVHlwZSwgdHlwZSkpOworfQorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1dlYm1FbGVtZW50OjpXZWJtRWxlbWVudCh1aW50NjRfdCBpZCwgdWludDY0X3Qgc2l6ZSkKKyAgICA6IG1JZChpZCksIG1TaXplKHNpemUpIHsKK30KKworV2VibUVsZW1lbnQ6On5XZWJtRWxlbWVudCgpIHsKK30KKworaW50IFdlYm1FbGVtZW50OjpzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpIHsKKyAgICByZXR1cm4gc2VyaWFsaXplQ29kZWRVbnNpZ25lZChlbmNvZGVVbnNpZ25lZChtU2l6ZSksIGJ1Zik7Cit9CisKK3VpbnQ2NF90IFdlYm1FbGVtZW50OjpzZXJpYWxpemVJbnRvKHVpbnQ4X3QgKmJ1ZikgeworICAgIHVpbnQ4X3QgKmN1ciA9IGJ1ZjsKKyAgICBpbnQgaGVhZCA9IHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQobUlkLCBjdXIpOworICAgIGN1ciArPSBoZWFkOworICAgIGludCBuZWNrID0gc2VyaWFsaXplUGF5bG9hZFNpemUoY3VyKTsKKyAgICBjdXIgKz0gbmVjazsKKyAgICBzZXJpYWxpemVQYXlsb2FkKGN1cik7CisgICAgY3VyICs9IG1TaXplOworICAgIHJldHVybiBjdXIgLSBidWY7Cit9CisKK3VpbnQ2NF90IFdlYm1FbGVtZW50Ojp0b3RhbFNpemUoKSB7CisgICAgdWludDhfdCBidWZbOF07CisgICAgLy8uLi4uLi4uLi4uLi4uLi4gKyBzaXplT2YoZW5jb2RlVW5zaWduZWQoc2l6ZSkpCisgICAgcmV0dXJuIHNpemVPZihtSWQpICsgc2VyaWFsaXplUGF5bG9hZFNpemUoYnVmKSArIG1TaXplOworfQorCit1aW50OF90ICpXZWJtRWxlbWVudDo6c2VyaWFsaXplKHVpbnQ2NF90JiBzaXplKSB7CisgICAgc2l6ZSA9IHRvdGFsU2l6ZSgpOworICAgIHVpbnQ4X3QgKmJ1ZiA9IG5ldyB1aW50OF90W3NpemVdOworICAgIHNlcmlhbGl6ZUludG8oYnVmKTsKKyAgICByZXR1cm4gYnVmOworfQorCitpbnQgV2VibUVsZW1lbnQ6OndyaXRlKGludCBmZCwgdWludDY0X3QmIHNpemUpIHsKKyAgICB1aW50OF90IGJ1Zls4XTsKKyAgICBzaXplID0gdG90YWxTaXplKCk7CisgICAgb2ZmNjRfdCBvZmYgPSA6OmxzZWVrNjQoZmQsIChzaXplIC0gMSksIFNFRUtfQ1VSKSAtIChzaXplIC0gMSk7CisgICAgOjp3cml0ZShmZCwgYnVmLCAxKTsgLy8gZXh0ZW5kIGZpbGUKKworICAgIG9mZjY0X3QgY3VyT2ZmID0gb2ZmICsgc2l6ZTsKKyAgICBvZmY2NF90IGFsaWduZWRPZmYgPSBvZmYgJiB+KDo6c3lzY29uZihfU0NfUEFHRV9TSVpFKSAtIDEpOworICAgIG9mZjY0X3QgbWFwU2l6ZSA9IGN1ck9mZiAtIGFsaWduZWRPZmY7CisgICAgb2ZmNjRfdCBwYWdlT2ZmID0gb2ZmIC0gYWxpZ25lZE9mZjsKKyAgICB2b2lkICpkc3QgPSA6Om1tYXA2NChOVUxMLCBtYXBTaXplLCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgYWxpZ25lZE9mZik7CisgICAgaWYgKGRzdCA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIEFMT0dFKCJtbWFwNjQgZmFpbGVkOyBlcnJubyA9ICVkIiwgZXJybm8pOworICAgICAgICBBTE9HRSgiZmQgJWQ7IGZsYWdzOiAlbyIsIGZkLCA6OmZjbnRsKGZkLCBGX0dFVEZMLCAwKSk7CisgICAgICAgIHJldHVybiBlcnJubzsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXJpYWxpemVJbnRvKCh1aW50OF90KikgZHN0ICsgcGFnZU9mZik7CisgICAgICAgIDo6bXN5bmMoZHN0LCBtYXBTaXplLCBNU19TWU5DKTsKKyAgICAgICAgcmV0dXJuIDo6bXVubWFwKGRzdCwgbWFwU2l6ZSk7CisgICAgfQorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibVVuc2lnbmVkOjpXZWJtVW5zaWduZWQodWludDY0X3QgaWQsIHVpbnQ2NF90IHZhbHVlKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHNpemVPZih2YWx1ZSkpLCBtVmFsdWUodmFsdWUpIHsKK30KKwordm9pZCBXZWJtVW5zaWduZWQ6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgc2VyaWFsaXplQ29kZWRVbnNpZ25lZChtVmFsdWUsIGJ1Zik7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtRmxvYXQ6OldlYm1GbG9hdCh1aW50NjRfdCBpZCwgZG91YmxlIHZhbHVlKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHNpemVvZihkb3VibGUpKSwgbVZhbHVlKHZhbHVlKSB7Cit9CisKK1dlYm1GbG9hdDo6V2VibUZsb2F0KHVpbnQ2NF90IGlkLCBmbG9hdCB2YWx1ZSkKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBzaXplb2YoZmxvYXQpKSwgbVZhbHVlKHZhbHVlKSB7Cit9CisKK3ZvaWQgV2VibUZsb2F0OjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIHVpbnQ2NF90IGRhdGE7CisgICAgaWYgKG1TaXplID09IHNpemVvZihmbG9hdCkpIHsKKyAgICAgICAgZmxvYXQgZiA9IG1WYWx1ZTsKKyAgICAgICAgZGF0YSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oJmYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCo+KCZtVmFsdWUpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gbVNpemUgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICBidWZbaV0gPSBkYXRhICYgMHhmZjsKKyAgICAgICAgZGF0YSA+Pj0gODsKKyAgICB9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtQmluYXJ5OjpXZWJtQmluYXJ5KHVpbnQ2NF90IGlkLCBjb25zdCBzcDxBQnVmZmVyPiAmcmVmKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHJlZi0+c2l6ZSgpKSwgbVJlZihyZWYpIHsKK30KKwordm9pZCBXZWJtQmluYXJ5OjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIG1lbWNweShidWYsIG1SZWYtPmRhdGEoKSwgbVJlZi0+c2l6ZSgpKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1TdHJpbmc6OldlYm1TdHJpbmcodWludDY0X3QgaWQsIGNvbnN0IGNoYXIgKnN0cikKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBzdHJsZW4oc3RyKSksIG1TdHIoc3RyKSB7Cit9CisKK3ZvaWQgV2VibVN0cmluZzo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICBtZW1jcHkoYnVmLCBtU3RyLCBzdHJsZW4obVN0cikpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibVNpbXBsZUJsb2NrOjpXZWJtU2ltcGxlQmxvY2soCisgICAgICAgIGludCB0cmFja051bSwKKyAgICAgICAgaW50MTZfdCByZWxUaW1lY29kZSwKKyAgICAgICAgYm9vbCBrZXksCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+JiBvcmlnKQorICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gdHJhY2tOdW0qMSArIHRpbWVjb2RlKjIgKyBmbGFncyoxCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXgorICAgIC8vIE9ubHkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgdHJhY2tOdW0gaXMgZW5jb2RlZAorICAgIDogV2VibUVsZW1lbnQoa01rdlNpbXBsZUJsb2NrLCBvcmlnLT5zaXplKCkgKyA0KSwKKyAgICAgIG1UcmFja051bSh0cmFja051bSksCisgICAgICBtUmVsVGltZWNvZGUocmVsVGltZWNvZGUpLAorICAgICAgbUtleShrZXkpLAorICAgICAgbVJlZihvcmlnKSB7Cit9CisKK3ZvaWQgV2VibVNpbXBsZUJsb2NrOjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQoZW5jb2RlVW5zaWduZWQobVRyYWNrTnVtKSwgYnVmKTsKKyAgICBidWZbMV0gPSAobVJlbFRpbWVjb2RlICYgMHhmZjAwKSA+PiA4OworICAgIGJ1ZlsyXSA9IG1SZWxUaW1lY29kZSAmIDB4ZmY7CisgICAgYnVmWzNdID0gbUtleSA/IDB4ODAgOiAwOworICAgIG1lbWNweShidWYgKyA0LCBtUmVmLT5kYXRhKCksIG1TaXplIC0gNCk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitFYm1sVm9pZDo6RWJtbFZvaWQodWludDY0X3QgdG90YWxTaXplKQorICAgIDogV2VibUVsZW1lbnQoa01rdlZvaWQsIHZvaWRTaXplKHRvdGFsU2l6ZSkpLAorICAgICAgbVNpemVXaWR0aCh0b3RhbFNpemUgLSBzaXplT2Yoa01rdlZvaWQpIC0gdm9pZFNpemUodG90YWxTaXplKSkgeworICAgIENIRUNLX0dFKHZvaWRTaXplKHRvdGFsU2l6ZSksIDApOworfQorCitpbnQgRWJtbFZvaWQ6OnNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1ZikgeworICAgIHJldHVybiBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKGVuY29kZVVuc2lnbmVkKG1TaXplLCBtU2l6ZVdpZHRoKSwgYnVmKTsKK30KKwordm9pZCBFYm1sVm9pZDo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICA6Om1lbXNldChidWYsIDAsIG1TaXplKTsKKyAgICByZXR1cm47Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtTWFzdGVyOjpXZWJtTWFzdGVyKHVpbnQ2NF90IGlkLCBjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbikKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBjaGlsZHJlblN1bShjaGlsZHJlbikpLCBtQ2hpbGRyZW4oY2hpbGRyZW4pIHsKK30KKworV2VibU1hc3Rlcjo6V2VibU1hc3Rlcih1aW50NjRfdCBpZCkKKyAgICA6IFdlYm1FbGVtZW50KGlkLCAwKSB7Cit9CisKK2ludCBXZWJtTWFzdGVyOjpzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpIHsKKyAgICBpZiAobVNpemUgPT0gMCl7CisgICAgICAgIHJldHVybiBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKGtNa3ZVbmtub3duTGVuZ3RoLCBidWYpOworICAgIH0KKyAgICByZXR1cm4gV2VibUVsZW1lbnQ6OnNlcmlhbGl6ZVBheWxvYWRTaXplKGJ1Zik7Cit9CisKK3ZvaWQgV2VibU1hc3Rlcjo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICB1aW50NjRfdCBvZmYgPSAwOworICAgIGZvciAoTGlzdDxzcDxXZWJtRWxlbWVudD4gPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtQ2hpbGRyZW4uYmVnaW4oKTsgaXQgIT0gbUNoaWxkcmVuLmVuZCgpOworICAgICAgICAgICAgKytpdCkgeworICAgICAgICBzcDxXZWJtRWxlbWVudD4gY2hpbGQgPSAoKml0KTsKKyAgICAgICAgY2hpbGQtPnNlcmlhbGl6ZUludG8oYnVmICsgb2ZmKTsKKyAgICAgICAgb2ZmICs9IGNoaWxkLT50b3RhbFNpemUoKTsKKyAgICB9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OkN1ZVBvaW50RW50cnkodWludDY0X3QgdGltZSwgaW50IHRyYWNrLCB1aW50NjRfdCBvZmYpIHsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGN1ZVBvaW50RW50cnlGaWVsZHM7CisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2Q3VlVHJhY2ssIHRyYWNrKSk7CisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2Q3VlQ2x1c3RlclBvc2l0aW9uLCBvZmYpKTsKKyAgICBXZWJtRWxlbWVudCAqY3VlVHJhY2tQb3NpdGlvbnMgPSBuZXcgV2VibU1hc3RlcihrTWt2Q3VlVHJhY2tQb3NpdGlvbnMsIGN1ZVBvaW50RW50cnlGaWVsZHMpOworCisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5jbGVhcigpOworICAgIGN1ZVBvaW50RW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkN1ZVRpbWUsIHRpbWUpKTsKKyAgICBjdWVQb2ludEVudHJ5RmllbGRzLnB1c2hfYmFjayhjdWVUcmFja1Bvc2l0aW9ucyk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZDdWVQb2ludCwgY3VlUG9pbnRFbnRyeUZpZWxkcyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6U2Vla0VudHJ5KHVpbnQ2NF90IGlkLCB1aW50NjRfdCBvZmYpIHsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHNlZWtFbnRyeUZpZWxkczsKKyAgICBzZWVrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlNlZWtJZCwgaWQpKTsKKyAgICBzZWVrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlNlZWtQb3NpdGlvbiwgb2ZmKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZTZWVrLCBzZWVrRW50cnlGaWVsZHMpOworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OkVibWxIZWFkZXIoCisgICAgICAgIGludCB2ZXIsCisgICAgICAgIGludCByZWFkVmVyLAorICAgICAgICBpbnQgbWF4SWRMZW4sCisgICAgICAgIGludCBtYXhTaXplTGVuLAorICAgICAgICBpbnQgZG9jVmVyLAorICAgICAgICBpbnQgZG9jUmVhZFZlcikgeworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gaGVhZGVyRmllbGRzOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RWJtbFZlcnNpb24sIHZlcikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RWJtbFJlYWRWZXJzaW9uLCByZWFkVmVyKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZFYm1sTWF4SWRsZW5ndGgsIG1heElkTGVuKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZFYm1sTWF4U2l6ZUxlbmd0aCwgbWF4U2l6ZUxlbikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1TdHJpbmcoa01rdkRvY1R5cGUsICJ3ZWJtIikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RG9jVHlwZVZlcnNpb24sIGRvY1ZlcikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RG9jVHlwZVJlYWRWZXJzaW9uLCBkb2NSZWFkVmVyKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZFYm1sLCBoZWFkZXJGaWVsZHMpOworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OlNlZ21lbnRJbmZvKHVpbnQ2NF90IHNjYWxlLCBkb3VibGUgZHVyKSB7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBzZWdtZW50SW5mbzsKKyAgICAvLyBwbGFjZSBkdXJhdGlvbiBmaXJzdDsgZWFzaWVyIHRvIHBhdGNoCisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtRmxvYXQoa01rdlNlZ21lbnREdXJhdGlvbiwgZHVyKSk7CisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlRpbWVjb2RlU2NhbGUsIHNjYWxlKSk7CisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtU3RyaW5nKGtNa3ZNdXhpbmdBcHAsICJhbmRyb2lkIikpOworICAgIHNlZ21lbnRJbmZvLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2V3JpdGluZ0FwcCwgImFuZHJvaWQiKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZJbmZvLCBzZWdtZW50SW5mbyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KAorICAgICAgICBpbnQgY2hhbnMsCisgICAgICAgIGRvdWJsZSByYXRlLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLAorICAgICAgICBpbnQgYnBzLAorICAgICAgICB1aW50NjRfdCB1aWQsCisgICAgICAgIGJvb2wgbGFjaW5nLAorICAgICAgICBjb25zdCBjaGFyICpsYW5nKSB7CisgICAgaWYgKHVpZCA9PSAwKSB7CisgICAgICAgIHVpZCA9IGtBdWRpb1RyYWNrTnVtOworICAgIH0KKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gdHJhY2tFbnRyeUZpZWxkczsKKyAgICBwb3B1bGF0ZUNvbW1vblRyYWNrRW50cmllcygKKyAgICAgICAgICAgIGtBdWRpb1RyYWNrTnVtLAorICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgbGFjaW5nLAorICAgICAgICAgICAgbGFuZywKKyAgICAgICAgICAgICJBX1ZPUkJJUyIsCisgICAgICAgICAgICBrQXVkaW9UeXBlLAorICAgICAgICAgICAgdHJhY2tFbnRyeUZpZWxkcyk7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGF1ZGlvSW5mbzsKKyAgICBhdWRpb0luZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkNoYW5uZWxzLCBjaGFucykpOworICAgIGF1ZGlvSW5mby5wdXNoX2JhY2sobmV3IFdlYm1GbG9hdChrTWt2U2FtcGxpbmdGcmVxdWVuY3ksIHJhdGUpKTsKKyAgICBpZiAoYnBzKSB7CisgICAgICAgIFdlYm1FbGVtZW50ICpiaXREZXB0aCA9IG5ldyBXZWJtVW5zaWduZWQoa01rdkJpdERlcHRoLCBicHMpOworICAgICAgICBhdWRpb0luZm8ucHVzaF9iYWNrKGJpdERlcHRoKTsKKyAgICB9CisKKyAgICB0cmFja0VudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibU1hc3RlcihrTWt2QXVkaW8sIGF1ZGlvSW5mbykpOworICAgIHRyYWNrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtQmluYXJ5KGtNa3ZDb2RlY1ByaXZhdGUsIGJ1ZikpOworICAgIHJldHVybiBuZXcgV2VibU1hc3RlcihrTWt2VHJhY2tFbnRyeSwgdHJhY2tFbnRyeUZpZWxkcyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6VmlkZW9UcmFja0VudHJ5KAorICAgICAgICB1aW50NjRfdCB3aWR0aCwKKyAgICAgICAgdWludDY0X3QgaGVpZ2h0LAorICAgICAgICB1aW50NjRfdCB1aWQsCisgICAgICAgIGJvb2wgbGFjaW5nLAorICAgICAgICBjb25zdCBjaGFyICpsYW5nKSB7CisgICAgaWYgKHVpZCA9PSAwKSB7CisgICAgICAgIHVpZCA9IGtWaWRlb1RyYWNrTnVtOworICAgIH0KKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gdHJhY2tFbnRyeUZpZWxkczsKKyAgICBwb3B1bGF0ZUNvbW1vblRyYWNrRW50cmllcygKKyAgICAgICAgICAgIGtWaWRlb1RyYWNrTnVtLAorICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgbGFjaW5nLAorICAgICAgICAgICAgbGFuZywKKyAgICAgICAgICAgICJWX1ZQOCIsCisgICAgICAgICAgICBrVmlkZW9UeXBlLAorICAgICAgICAgICAgdHJhY2tFbnRyeUZpZWxkcyk7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHZpZGVvSW5mbzsKKyAgICB2aWRlb0luZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlBpeGVsV2lkdGgsIHdpZHRoKSk7CisgICAgdmlkZW9JbmZvLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZQaXhlbEhlaWdodCwgaGVpZ2h0KSk7CisKKyAgICB0cmFja0VudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibU1hc3RlcihrTWt2VmlkZW8sIHZpZGVvSW5mbykpOworICAgIHJldHVybiBuZXcgV2VibU1hc3RlcihrTWt2VHJhY2tFbnRyeSwgdHJhY2tFbnRyeUZpZWxkcyk7Cit9Cit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5OTMzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUVMRU1FTlRfSF8KKyNkZWZpbmUgV0VCTUVMRU1FTlRfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgV2VibUVsZW1lbnQgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPFdlYm1FbGVtZW50PiB7CisgICAgY29uc3QgdWludDY0X3QgbUlkLCBtU2l6ZTsKKworICAgIFdlYm1FbGVtZW50KHVpbnQ2NF90IGlkLCB1aW50NjRfdCBzaXplKTsKKyAgICB2aXJ0dWFsIH5XZWJtRWxlbWVudCgpOworCisgICAgdmlydHVhbCBpbnQgc2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpPTA7CisgICAgdWludDY0X3QgdG90YWxTaXplKCk7CisgICAgdWludDY0X3Qgc2VyaWFsaXplSW50byh1aW50OF90ICpidWYpOworICAgIHVpbnQ4X3QgKnNlcmlhbGl6ZSh1aW50NjRfdCYgc2l6ZSk7CisgICAgaW50IHdyaXRlKGludCBmZCwgdWludDY0X3QmIHNpemUpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBFYm1sSGVhZGVyKAorICAgICAgICAgICAgaW50IHZlciA9IDEsCisgICAgICAgICAgICBpbnQgcmVhZFZlciA9IDEsCisgICAgICAgICAgICBpbnQgbWF4SWRMZW4gPSA0LAorICAgICAgICAgICAgaW50IG1heFNpemVMZW4gPSA4LAorICAgICAgICAgICAgaW50IGRvY1ZlciA9IDIsCisgICAgICAgICAgICBpbnQgZG9jUmVhZFZlciA9IDIpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBTZWdtZW50SW5mbyh1aW50NjRfdCBzY2FsZSA9IDEwMDAwMDAsIGRvdWJsZSBkdXIgPSAwKTsKKworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gQXVkaW9UcmFja0VudHJ5KAorICAgICAgICAgICAgaW50IGNoYW5zLAorICAgICAgICAgICAgZG91YmxlIHJhdGUsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLAorICAgICAgICAgICAgaW50IGJwcyA9IDAsCisgICAgICAgICAgICB1aW50NjRfdCB1aWQgPSAwLAorICAgICAgICAgICAgYm9vbCBsYWNpbmcgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcgPSAidW5kIik7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFZpZGVvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIHVpbnQ2NF90IHdpZHRoLAorICAgICAgICAgICAgdWludDY0X3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDY0X3QgdWlkID0gMCwKKyAgICAgICAgICAgIGJvb2wgbGFjaW5nID0gZmFsc2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nID0gInVuZCIpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBTZWVrRW50cnkodWludDY0X3QgaWQsIHVpbnQ2NF90IG9mZik7CisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBDdWVQb2ludEVudHJ5KHVpbnQ2NF90IHRpbWUsIGludCB0cmFjaywgdWludDY0X3Qgb2ZmKTsKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFNpbXBsZUJsb2NrKAorICAgICAgICAgICAgaW50IHRyYWNrTnVtLAorICAgICAgICAgICAgaW50MTZfdCB0aW1lY29kZSwKKyAgICAgICAgICAgIGJvb2wga2V5LAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGRhdGFTaXplKTsKK307CisKK3N0cnVjdCBXZWJtVW5zaWduZWQgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIFdlYm1VbnNpZ25lZCh1aW50NjRfdCBpZCwgdWludDY0X3QgdmFsdWUpOworICAgIGNvbnN0IHVpbnQ2NF90IG1WYWx1ZTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBXZWJtRmxvYXQgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IGRvdWJsZSBtVmFsdWU7CisgICAgV2VibUZsb2F0KHVpbnQ2NF90IGlkLCBmbG9hdCB2YWx1ZSk7CisgICAgV2VibUZsb2F0KHVpbnQ2NF90IGlkLCBkb3VibGUgdmFsdWUpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1CaW5hcnkgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IHNwPEFCdWZmZXI+IG1SZWY7CisgICAgV2VibUJpbmFyeSh1aW50NjRfdCBpZCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJnJlZik7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgV2VibVN0cmluZyA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgY2hhciAqY29uc3QgbVN0cjsKKyAgICBXZWJtU3RyaW5nKHVpbnQ2NF90IGlkLCBjb25zdCBjaGFyICpzdHIpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1TaW1wbGVCbG9jayA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgaW50IG1UcmFja051bTsKKyAgICBjb25zdCBpbnQxNl90IG1SZWxUaW1lY29kZTsKKyAgICBjb25zdCBib29sIG1LZXk7CisgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gbVJlZjsKKworICAgIFdlYm1TaW1wbGVCbG9jayhpbnQgdHJhY2tOdW0sIGludDE2X3QgdGltZWNvZGUsIGJvb2wga2V5LCBjb25zdCBzcDxBQnVmZmVyPiYgb3JpZyk7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgRWJtbFZvaWQgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IHVpbnQ2NF90IG1TaXplV2lkdGg7CisgICAgRWJtbFZvaWQodWludDY0X3QgdG90YWxTaXplKTsKKyAgICBpbnQgc2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBXZWJtTWFzdGVyIDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IG1DaGlsZHJlbjsKKyAgICBXZWJtTWFzdGVyKHVpbnQ2NF90IGlkKTsKKyAgICBXZWJtTWFzdGVyKHVpbnQ2NF90IGlkLCBjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+ICZjaGlsZHJlbik7CisgICAgaW50IHNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1Zik7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisjZW5kaWYgLyogV0VCTUVMRU1FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTEzNGVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1GcmFtZSIKKworI2luY2x1ZGUgIldlYm1GcmFtZS5oIgorI2luY2x1ZGUgIldlYm1Db25zdGFudHMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSB7CitzcDxBQnVmZmVyPiB0b0FCdWZmZXIoTWVkaWFCdWZmZXIgKm1idWYpIHsKKyAgICBzcDxBQnVmZmVyPiBhYnVmID0gbmV3IEFCdWZmZXIobWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIG1lbWNweShhYnVmLT5kYXRhKCksICh1aW50OF90KikgbWJ1Zi0+ZGF0YSgpICsgbWJ1Zi0+cmFuZ2Vfb2Zmc2V0KCksIG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICByZXR1cm4gYWJ1ZjsKK30KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBzcDxXZWJtRnJhbWU+IFdlYm1GcmFtZTo6RU9TID0gbmV3IFdlYm1GcmFtZSgpOworCitXZWJtRnJhbWU6OldlYm1GcmFtZSgpCisgICAgOiBtVHlwZShrSW52YWxpZFR5cGUpLAorICAgICAgbUtleShmYWxzZSksCisgICAgICBtQWJzVGltZWNvZGUoVUlOVDY0X01BWCksCisgICAgICBtRGF0YShuZXcgQUJ1ZmZlcigwKSksCisgICAgICBtRW9zKHRydWUpIHsKK30KKworV2VibUZyYW1lOjpXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXIgKm1idWYpCisgICAgOiBtVHlwZSh0eXBlKSwKKyAgICAgIG1LZXkoa2V5KSwKKyAgICAgIG1BYnNUaW1lY29kZShhYnNUaW1lY29kZSksCisgICAgICBtRGF0YSh0b0FCdWZmZXIobWJ1ZikpLAorICAgICAgbUVvcyhmYWxzZSkgeworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUZyYW1lOjpTaW1wbGVCbG9jayh1aW50NjRfdCBiYXNlVGltZWNvZGUpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IFdlYm1TaW1wbGVCbG9jaygKKyAgICAgICAgICAgIG1UeXBlID09IGtWaWRlb1R5cGUgPyBrVmlkZW9UcmFja051bSA6IGtBdWRpb1RyYWNrTnVtLAorICAgICAgICAgICAgbUFic1RpbWVjb2RlIC0gYmFzZVRpbWVjb2RlLAorICAgICAgICAgICAgbUtleSwKKyAgICAgICAgICAgIG1EYXRhKTsKK30KKworYm9vbCBXZWJtRnJhbWU6Om9wZXJhdG9yPChjb25zdCBXZWJtRnJhbWUgJm90aGVyKSBjb25zdCB7CisgICAgaWYgKHRoaXMtPm1Fb3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAob3RoZXIubUVvcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHRoaXMtPm1BYnNUaW1lY29kZSA9PSBvdGhlci5tQWJzVGltZWNvZGUpIHsKKyAgICAgICAgaWYgKHRoaXMtPm1UeXBlID09IGtBdWRpb1R5cGUgJiYgb3RoZXIubVR5cGUgPT0ga1ZpZGVvVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMtPm1UeXBlID09IGtWaWRlb1R5cGUgJiYgb3RoZXIubVR5cGUgPT0ga0F1ZGlvVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMtPm1BYnNUaW1lY29kZSA8IG90aGVyLm1BYnNUaW1lY29kZTsKK30KK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMGIwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdFQk1GUkFNRV9IXworI2RlZmluZSBXRUJNRlJBTUVfSF8KKworI2luY2x1ZGUgIldlYm1FbGVtZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFdlYm1GcmFtZSA6IExpZ2h0UmVmQmFzZTxXZWJtRnJhbWU+IHsKK3B1YmxpYzoKKyAgICBjb25zdCBpbnQgbVR5cGU7CisgICAgY29uc3QgYm9vbCBtS2V5OworICAgIGNvbnN0IHVpbnQ2NF90IG1BYnNUaW1lY29kZTsKKyAgICBjb25zdCBzcDxBQnVmZmVyPiBtRGF0YTsKKyAgICBjb25zdCBib29sIG1Fb3M7CisKKyAgICBXZWJtRnJhbWUoKTsKKyAgICBXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXIgKmJ1Zik7CisgICAgfldlYm1GcmFtZSgpIHt9CisKKyAgICBzcDxXZWJtRWxlbWVudD4gU2ltcGxlQmxvY2sodWludDY0X3QgYmFzZVRpbWVjb2RlKSBjb25zdDsKKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFdlYm1GcmFtZSAmb3RoZXIpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0IHNwPFdlYm1GcmFtZT4gRU9TOworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXZWJtRnJhbWUpOworfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworI2VuZGlmIC8qIFdFQk1GUkFNRV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjhhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1GcmFtZVRocmVhZCIKKworI2luY2x1ZGUgIldlYm1Db25zdGFudHMuaCIKKyNpbmNsdWRlICJXZWJtRnJhbWVUaHJlYWQuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgKldlYm1GcmFtZVRocmVhZDo6d3JhcCh2b2lkICphcmcpIHsKKyAgICBXZWJtRnJhbWVUaHJlYWQgKndvcmtlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8V2VibUZyYW1lVGhyZWFkKj4oYXJnKTsKKyAgICB3b3JrZXItPnJ1bigpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVUaHJlYWQ6OnN0YXJ0KCkgeworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgV2VibUZyYW1lVGhyZWFkOjp3cmFwLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVUaHJlYWQ6OnN0b3AoKSB7CisgICAgdm9pZCAqc3RhdHVzOworICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmc3RhdHVzKTsKKyAgICByZXR1cm4gKHN0YXR1c190KShpbnRwdHJfdClzdGF0dXM7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtRnJhbWVTb3VyY2VUaHJlYWQ6OldlYm1GcmFtZVNvdXJjZVRocmVhZCgKKyAgICBpbnQgdHlwZSwKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaykKKyAgICA6IG1UeXBlKHR5cGUpLCBtU2luayhzaW5rKSB7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtRnJhbWVTaW5rVGhyZWFkOjpXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICBjb25zdCBpbnQmIGZkLAorICAgICAgICBjb25zdCB1aW50NjRfdCYgb2ZmLAorICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IHZpZGVvVGhyZWFkLAorICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IGF1ZGlvVGhyZWFkLAorICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKQorICAgIDogbUZkKGZkKSwKKyAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KG9mZiksCisgICAgICBtVmlkZW9GcmFtZXModmlkZW9UaHJlYWQtPm1TaW5rKSwKKyAgICAgIG1BdWRpb0ZyYW1lcyhhdWRpb1RocmVhZC0+bVNpbmspLAorICAgICAgbUN1ZXMoY3VlcyksCisgICAgICBtRG9uZSh0cnVlKSB7Cit9CisKK1dlYm1GcmFtZVNpbmtUaHJlYWQ6OldlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgIGNvbnN0IGludCYgZmQsCisgICAgICAgIGNvbnN0IHVpbnQ2NF90JiBvZmYsCisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiB2aWRlb1NvdXJjZSwKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGF1ZGlvU291cmNlLAorICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKQorICAgIDogbUZkKGZkKSwKKyAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KG9mZiksCisgICAgICBtVmlkZW9GcmFtZXModmlkZW9Tb3VyY2UpLAorICAgICAgbUF1ZGlvRnJhbWVzKGF1ZGlvU291cmNlKSwKKyAgICAgIG1DdWVzKGN1ZXMpLAorICAgICAgbURvbmUodHJ1ZSkgeworfQorCisvLyBJbml0aWFsaXplcyBhIHdlYm0gY2x1c3RlciB3aXRoIGl0cyBzdGFydGluZyB0aW1lY29kZS4KKy8vCisvLyBmcmFtZXM6CisvLyAgIHNlcXVlbmNlIG9mIGlucHV0IGF1ZGlvL3ZpZGVvIGZyYW1lcyByZWNlaXZlZCBmcm9tIHRoZSBzb3VyY2UuCisvLworLy8gY2x1c3RlclRpbWVjb2RlTDoKKy8vICAgdGhlIHN0YXJ0aW5nIHRpbWVjb2RlIG9mIHRoZSBjbHVzdGVyOyB0aGlzIGlzIHRoZSB0aW1lY29kZSBvZiB0aGUgZmlyc3QKKy8vICAgZnJhbWUgc2luY2UgZnJhbWVzIGFyZSBvcmRlcmVkIGJ5IHRpbWVzdGFtcC4KKy8vCisvLyBjaGlsZHJlbjoKKy8vICAgbGlzdCB0byBob2xkIGNoaWxkIGVsZW1lbnRzIGluIGEgd2VibSBjbHVzdGVyIChzdGFydCB0aW1lY29kZSBhbmQKKy8vICAgc2ltcGxlIGJsb2NrcykuCisvLworLy8gc3RhdGljCit2b2lkIFdlYm1GcmFtZVNpbmtUaHJlYWQ6OmluaXRDbHVzdGVyKAorICAgIExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBmcmFtZXMsCisgICAgdWludDY0X3QmIGNsdXN0ZXJUaW1lY29kZUwsCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pIHsKKyAgICBDSEVDSyghZnJhbWVzLmVtcHR5KCkgJiYgY2hpbGRyZW4uZW1wdHkoKSk7CisKKyAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGYgPSAqKGZyYW1lcy5iZWdpbigpKTsKKyAgICBjbHVzdGVyVGltZWNvZGVMID0gZi0+bUFic1RpbWVjb2RlOworICAgIFdlYm1VbnNpZ25lZCAqY2x1c3RlclRpbWVjb2RlID0gbmV3IFdlYm1VbnNpZ25lZChrTWt2VGltZWNvZGUsIGNsdXN0ZXJUaW1lY29kZUwpOworICAgIGNoaWxkcmVuLmNsZWFyKCk7CisgICAgY2hpbGRyZW4ucHVzaF9iYWNrKGNsdXN0ZXJUaW1lY29kZSk7Cit9CisKK3ZvaWQgV2VibUZyYW1lU2lua1RocmVhZDo6d3JpdGVDbHVzdGVyKExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKSB7CisgICAgLy8gY2hpbGRyZW4gbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBzaW1wbGVibG9jayBhbmQgaXRzIHRpbWVjb2RlCisgICAgQ0hFQ0tfR0UoY2hpbGRyZW4uc2l6ZSgpLCAyKTsKKworICAgIHVpbnQ2NF90IHNpemU7CisgICAgc3A8V2VibUVsZW1lbnQ+IGNsdXN0ZXIgPSBuZXcgV2VibU1hc3RlcihrTWt2Q2x1c3RlciwgY2hpbGRyZW4pOworICAgIGNsdXN0ZXItPndyaXRlKG1GZCwgc2l6ZSk7CisgICAgY2hpbGRyZW4uY2xlYXIoKTsKK30KKworLy8gV3JpdGUgb3V0IChwb3NzaWJseSBtdWx0aXBsZSkgd2VibSBjbHVzdGVyKHMpIGZyb20gZnJhbWVzIHNwbGl0IG9uIHZpZGVvIGtleSBmcmFtZXMuCisvLworLy8gbGFzdDoKKy8vICAgY3VycmVudCBmbHVzaCBpcyB0cmlnZ2VyZWQgYnkgRU9TIGluc3RlYWQgb2YgYSBzZWNvbmQgb3V0c3RhbmRpbmcgdmlkZW8ga2V5IGZyYW1lLgordm9pZCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpmbHVzaEZyYW1lcyhMaXN0PGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgZnJhbWVzLCBib29sIGxhc3QpIHsKKyAgICBpZiAoZnJhbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ2NF90IGNsdXN0ZXJUaW1lY29kZUw7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBjaGlsZHJlbjsKKyAgICBpbml0Q2x1c3RlcihmcmFtZXMsIGNsdXN0ZXJUaW1lY29kZUwsIGNoaWxkcmVuKTsKKworICAgIHVpbnQ2NF90IGN1ZVRpbWUgPSBjbHVzdGVyVGltZWNvZGVMOworICAgIG9mZl90IGZwb3MgPSA6OmxzZWVrKG1GZCwgMCwgU0VFS19DVVIpOworICAgIHNpemVfdCBuID0gZnJhbWVzLnNpemUoKTsKKyAgICBpZiAoIWxhc3QpIHsKKyAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBmbHVzaGluZyB0aGUgbGFzdCBzZXF1ZW5jZSBvZiBvdXRzdGFuZGluZyBmcmFtZXMsIGZsdXNoRnJhbWVzCisgICAgICAgIC8vIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCByaWdodCBhZnRlciB3ZSBoYXZlIHB1c2hlZCBhIHNlY29uZCBvdXRzdGFuZGluZyB2aWRlbyBrZXkKKyAgICAgICAgLy8gZnJhbWUgKHRoZSBsYXN0IGZyYW1lKSwgd2hpY2ggYmVsb25ncyB0byB0aGUgbmV4dCBjbHVzdGVyOyBhbHNvIGhvbGQgYmFjayBvbgorICAgICAgICAvLyBmbHVzaGluZyB0aGUgc2Vjb25kIHRvIGxhc3QgZnJhbWUgYmVmb3JlIHdlIGNoZWNrIGl0cyB0eXBlLiBBIGF1ZGlvIGZyYW1lCisgICAgICAgIC8vIHNob3VsZCBwcmVjZWRlIHRoZSBhZm9yZW1lbnRpb25lZCB2aWRlbyBrZXkgZnJhbWUgaW4gdGhlIG5leHQgc2VxdWVuY2UsIGEgdmlkZW8KKyAgICAgICAgLy8gZnJhbWUgc2hvdWxkIGJlIHRoZSBsYXN0IGZyYW1lIGluIHRoZSBjdXJyZW50ICh0by1iZS1mbHVzaGVkKSBzZXF1ZW5jZS4KKyAgICAgICAgQ0hFQ0tfR0UobiwgMik7CisgICAgICAgIG4gLT0gMjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGYgPSAqKGZyYW1lcy5iZWdpbigpKTsKKyAgICAgICAgaWYgKGYtPm1UeXBlID09IGtWaWRlb1R5cGUgJiYgZi0+bUtleSkgeworICAgICAgICAgICAgY3VlVGltZSA9IGYtPm1BYnNUaW1lY29kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmLT5tQWJzVGltZWNvZGUgLSBjbHVzdGVyVGltZWNvZGVMID4gSU5UMTZfTUFYKSB7CisgICAgICAgICAgICB3cml0ZUNsdXN0ZXIoY2hpbGRyZW4pOworICAgICAgICAgICAgaW5pdENsdXN0ZXIoZnJhbWVzLCBjbHVzdGVyVGltZWNvZGVMLCBjaGlsZHJlbik7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZXMuZXJhc2UoZnJhbWVzLmJlZ2luKCkpOworICAgICAgICBjaGlsZHJlbi5wdXNoX2JhY2soZi0+U2ltcGxlQmxvY2soY2x1c3RlclRpbWVjb2RlTCkpOworICAgIH0KKworICAgIC8vIGVxdWl2YWxlbnQgdG8gbGFzdD09ZmFsc2UKKyAgICBpZiAoIWZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgIC8vIGRlY2lkZSB3aGV0aGVyIHRvIHdyaXRlIG91dCB0aGUgc2Vjb25kIHRvIGxhc3QgZnJhbWUuCisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gc2Vjb25kTGFzdEZyYW1lID0gKihmcmFtZXMuYmVnaW4oKSk7CisgICAgICAgIGlmIChzZWNvbmRMYXN0RnJhbWUtPm1UeXBlID09IGtWaWRlb1R5cGUpIHsKKyAgICAgICAgICAgIGZyYW1lcy5lcmFzZShmcmFtZXMuYmVnaW4oKSk7CisgICAgICAgICAgICBjaGlsZHJlbi5wdXNoX2JhY2soc2Vjb25kTGFzdEZyYW1lLT5TaW1wbGVCbG9jayhjbHVzdGVyVGltZWNvZGVMKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3cml0ZUNsdXN0ZXIoY2hpbGRyZW4pOworICAgIHNwPFdlYm1FbGVtZW50PiBjdWVQb2ludCA9IFdlYm1FbGVtZW50OjpDdWVQb2ludEVudHJ5KGN1ZVRpbWUsIDEsIGZwb3MgLSBtU2VnbWVudERhdGFTdGFydCk7CisgICAgbUN1ZXMucHVzaF9iYWNrKGN1ZVBvaW50KTsKK30KKworc3RhdHVzX3QgV2VibUZyYW1lU2lua1RocmVhZDo6c3RhcnQoKSB7CisgICAgbURvbmUgPSBmYWxzZTsKKyAgICByZXR1cm4gV2VibUZyYW1lVGhyZWFkOjpzdGFydCgpOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpzdG9wKCkgeworICAgIG1Eb25lID0gdHJ1ZTsKKyAgICBtVmlkZW9GcmFtZXMucHVzaChXZWJtRnJhbWU6OkVPUyk7CisgICAgbUF1ZGlvRnJhbWVzLnB1c2goV2VibUZyYW1lOjpFT1MpOworICAgIHJldHVybiBXZWJtRnJhbWVUaHJlYWQ6OnN0b3AoKTsKK30KKwordm9pZCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpydW4oKSB7CisgICAgaW50IG51bVZpZGVvS2V5RnJhbWVzID0gMDsKKyAgICBMaXN0PGNvbnN0IHNwPFdlYm1GcmFtZT4gPiBvdXRzdGFuZGluZ0ZyYW1lczsKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIEFMT0dWKCJ3YWl0IHYgZnJhbWUiKTsKKyAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiB2aWRlb0ZyYW1lID0gbVZpZGVvRnJhbWVzLnBlZWsoKTsKKyAgICAgICAgQUxPR1YoInYgZnJhbWU6ICVwIiwgdmlkZW9GcmFtZS5nZXQoKSk7CisKKyAgICAgICAgQUxPR1YoIndhaXQgYSBmcmFtZSIpOworICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGF1ZGlvRnJhbWUgPSBtQXVkaW9GcmFtZXMucGVlaygpOworICAgICAgICBBTE9HVigiYSBmcmFtZTogJXAiLCBhdWRpb0ZyYW1lLmdldCgpKTsKKworICAgICAgICBpZiAodmlkZW9GcmFtZS0+bUVvcyAmJiBhdWRpb0ZyYW1lLT5tRW9zKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqYXVkaW9GcmFtZSA8ICp2aWRlb0ZyYW1lKSB7CisgICAgICAgICAgICBBTE9HVigidGFrZSBhIGZyYW1lIik7CisgICAgICAgICAgICBtQXVkaW9GcmFtZXMudGFrZSgpOworICAgICAgICAgICAgb3V0c3RhbmRpbmdGcmFtZXMucHVzaF9iYWNrKGF1ZGlvRnJhbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoInRha2UgdiBmcmFtZSIpOworICAgICAgICAgICAgbVZpZGVvRnJhbWVzLnRha2UoKTsKKyAgICAgICAgICAgIG91dHN0YW5kaW5nRnJhbWVzLnB1c2hfYmFjayh2aWRlb0ZyYW1lKTsKKyAgICAgICAgICAgIGlmICh2aWRlb0ZyYW1lLT5tS2V5KQorICAgICAgICAgICAgICAgIG51bVZpZGVvS2V5RnJhbWVzKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVtVmlkZW9LZXlGcmFtZXMgPT0gMikgeworICAgICAgICAgICAgZmx1c2hGcmFtZXMob3V0c3RhbmRpbmdGcmFtZXMsIC8qIGxhc3QgPSAqLyBmYWxzZSk7CisgICAgICAgICAgICBudW1WaWRlb0tleUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJmbHVzaGluZyBsYXN0IGNsdXN0ZXIgKHNpemUgJXp1KSIsIG91dHN0YW5kaW5nRnJhbWVzLnNpemUoKSk7CisgICAgZmx1c2hGcmFtZXMob3V0c3RhbmRpbmdGcmFtZXMsIC8qIGxhc3QgPSAqLyB0cnVlKTsKKyAgICBtRG9uZSA9IHRydWU7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgaW50NjRfdCBrSW5pdGlhbERlbGF5VGltZVVzID0gNzAwMDAwTEw7CisKK3ZvaWQgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OmNsZWFyRmxhZ3MoKSB7CisgICAgbURvbmUgPSBmYWxzZTsKKyAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Cit9CisKK1dlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZCgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaywKKyAgICAgICAgdWludDY0X3QgdGltZUNvZGVTY2FsZSwKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVSZWFsVXMsCisgICAgICAgIGludDMyX3Qgc3RhcnRUaW1lT2Zmc2V0TXMsCisgICAgICAgIGludCBudW1UcmFja3MsCisgICAgICAgIGJvb2wgcmVhbFRpbWVSZWNvcmRpbmcpCisgICAgOiBXZWJtRnJhbWVTb3VyY2VUaHJlYWQodHlwZSwgc2luayksCisgICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtVGltZUNvZGVTY2FsZSh0aW1lQ29kZVNjYWxlKSwKKyAgICAgIG1UcmFja0R1cmF0aW9uVXMoMCkgeworICAgIGNsZWFyRmxhZ3MoKTsKKyAgICBtU3RhcnRUaW1lVXMgPSBzdGFydFRpbWVSZWFsVXM7CisgICAgaWYgKHJlYWxUaW1lUmVjb3JkaW5nICYmIG51bVRyYWNrcyA+IDEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29waWVkIGZyb20gTVBFRzRXcml0ZXIKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBleHRyYSBkZWxheSBvZiBhY2NlcHRpbmcgaW5jb21pbmcgYXVkaW8vdmlkZW8gc2lnbmFscworICAgICAgICAgKiBoZWxwcyB0byBhbGlnbiBhL3Ygc3RhcnQgdGltZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVjb3JkaW5nCisgICAgICAgICAqIHNlc3Npb24sIGFuZCBpdCBhbHNvIGhlbHBzIGVsaW1pbmF0ZSB0aGUgInJlY29yZGluZyIgc291bmQgZm9yCisgICAgICAgICAqIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGNsaWVudCBkb2VzIG5vdCBzZXQgdGhlIHN0YXJ0IHRpbWUgb2Zmc2V0LCB3ZSBmYWxsIGJhY2sgdG8KKyAgICAgICAgICogdXNlIHRoZSBkZWZhdWx0IGluaXRpYWwgZGVsYXkgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZU9mZnNldFVzID0gc3RhcnRUaW1lT2Zmc2V0TXMgKiAxMDAwTEw7CisgICAgICAgIGlmIChzdGFydFRpbWVPZmZzZXRVcyA8IDApIHsgIC8vIFN0YXJ0IHRpbWUgb2Zmc2V0IHdhcyBub3Qgc2V0CisgICAgICAgICAgICBzdGFydFRpbWVPZmZzZXRVcyA9IGtJbml0aWFsRGVsYXlUaW1lVXM7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXJ0VGltZVVzICs9IHN0YXJ0VGltZU9mZnNldFVzOworICAgICAgICBBTE9HSSgiU3RhcnQgdGltZSBvZmZzZXQ6ICUiIFBSSWQ2NCAiIHVzIiwgc3RhcnRUaW1lT2Zmc2V0VXMpOworICAgIH0KK30KKworc3RhdHVzX3QgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnN0YXJ0KCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBtU3RhcnRUaW1lVXMpOworICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KG1ldGEuZ2V0KCkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbURvbmUgPSB0cnVlOworICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gV2VibUZyYW1lVGhyZWFkOjpzdGFydCgpOworICAgIH0KK30KKworc3RhdHVzX3QgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnJlc3VtZSgpIHsKKyAgICBpZiAoIW1Eb25lICYmIG1QYXVzZWQpIHsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICBtUmVzdW1lZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnBhdXNlKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6c3RvcCgpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbURvbmUgPSB0cnVlOworICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIHJldHVybiBXZWJtRnJhbWVUaHJlYWQ6OnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpydW4oKSB7CisgICAgaW50MzJfdCBjb3VudCA9IDA7CisgICAgaW50NjRfdCB0aW1lc3RhbXBVcyA9IDB4ZGVhZGJlZWY7CisgICAgaW50NjRfdCBsYXN0VGltZXN0YW1wVXMgPSAwOyAvLyBQcmV2aW91cyBzYW1wbGUgdGltZSBzdGFtcAorICAgIGludDY0X3QgbGFzdER1cmF0aW9uVXMgPSAwOyAvLyBQcmV2aW91cyBzYW1wbGUgZHVyYXRpb24KKyAgICBpbnQ2NF90IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyA9IDA7CisKKyAgICBjb25zdCB1aW50NjRfdCBrVW5pbml0aWFsaXplZCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkw7CisgICAgbVN0YXJ0VGltZVVzID0ga1VuaW5pdGlhbGl6ZWQ7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIHdoaWxlICghbURvbmUgJiYgKGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlciwgTlVMTCkpID09IE9LKSB7CisgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWV0YURhdGE+IG1kID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQ0hFQ0sobWQtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CisgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPT0ga1VuaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcFVzIC09IG1TdGFydFRpbWVVczsKKworICAgICAgICBpZiAobVBhdXNlZCAmJiAhbVJlc3VtZWQpIHsKKyAgICAgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CisgICAgICAgICAgICBsYXN0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsrY291bnQ7CisKKyAgICAgICAgLy8gYWRqdXN0IHRpbWUtc3RhbXBzIGFmdGVyIHBhdXNlL3Jlc3VtZQorICAgICAgICBpZiAobVJlc3VtZWQpIHsKKyAgICAgICAgICAgIGludDY0X3QgZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzID0gdGltZXN0YW1wVXMgLSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgICAgICBDSEVDS19HRShkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMsIDBsbCk7CisgICAgICAgICAgICBpbnQ2NF90IHBhdXNlZER1cmF0aW9uVXMgPSBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgLSBtVHJhY2tEdXJhdGlvblVzOworICAgICAgICAgICAgQ0hFQ0tfR0UocGF1c2VkRHVyYXRpb25VcywgbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzICs9IHBhdXNlZER1cmF0aW9uVXMgLSBsYXN0RHVyYXRpb25VczsKKyAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOworICAgICAgICBDSEVDS19HRSh0aW1lc3RhbXBVcywgMGxsKTsKKworICAgICAgICBpbnQzMl90IGlzU3luYyA9IGZhbHNlOworICAgICAgICBtZC0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYyk7CisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gZiA9IG5ldyBXZWJtRnJhbWUoCisgICAgICAgICAgICBtVHlwZSwKKyAgICAgICAgICAgIGlzU3luYywKKyAgICAgICAgICAgIHRpbWVzdGFtcFVzICogMTAwMCAvIG1UaW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgYnVmZmVyKTsKKyAgICAgICAgbVNpbmsucHVzaChmKTsKKworICAgICAgICBBTE9HVigKKyAgICAgICAgICAgICIlcyAlcyBmcmFtZSBhdCAlIiBQUklkNjQgIiBzaXplICV6dVxuIiwKKyAgICAgICAgICAgIG1UeXBlID09IGtWaWRlb1R5cGUgPyAidmlkZW8iIDogImF1ZGlvIiwKKyAgICAgICAgICAgIGlzU3luYyA/ICJJIiA6ICJQIiwKKyAgICAgICAgICAgIHRpbWVzdGFtcFVzICogMTAwMCAvIG1UaW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbVRyYWNrRHVyYXRpb25VcykgeworICAgICAgICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CisgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIH0KKworICAgIG1UcmFja0R1cmF0aW9uVXMgKz0gbGFzdER1cmF0aW9uVXM7CisgICAgbVNpbmsucHVzaChXZWJtRnJhbWU6OkVPUyk7Cit9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjVkOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUZSQU1FVEhSRUFEX0hfCisjZGVmaW5lIFdFQk1GUkFNRVRIUkVBRF9IXworCisjaW5jbHVkZSAiV2VibUZyYW1lLmgiCisjaW5jbHVkZSAiTGlua2VkQmxvY2tpbmdRdWV1ZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgV2VibUZyYW1lVGhyZWFkIDogcHVibGljIExpZ2h0UmVmQmFzZTxXZWJtRnJhbWVUaHJlYWQ+IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBydW5uaW5nKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpIHsgcmV0dXJuIE9LOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKSB7IHJldHVybiBPSzsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgfldlYm1GcmFtZVRocmVhZCgpIHsgc3RvcCgpOyB9CisgICAgc3RhdGljIHZvaWQgKndyYXAodm9pZCAqYXJnKTsKKworcHJvdGVjdGVkOgorICAgIFdlYm1GcmFtZVRocmVhZCgpCisgICAgICAgIDogbVRocmVhZCgwKSB7CisgICAgfQorCitwcml2YXRlOgorICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdlYm1GcmFtZVRocmVhZCk7Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgV2VibUZyYW1lU291cmNlVGhyZWFkOworY2xhc3MgV2VibUZyYW1lU2lua1RocmVhZCA6IHB1YmxpYyBXZWJtRnJhbWVUaHJlYWQgeworcHVibGljOgorICAgIFdlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBpbnQmIGZkLAorICAgICAgICAgICAgY29uc3QgdWludDY0X3QmIG9mZiwKKyAgICAgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gdmlkZW9UaHJlYWQsCisgICAgICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IGF1ZGlvVGhyZWFkLAorICAgICAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY3Vlcyk7CisKKyAgICBXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICAgICAgY29uc3QgaW50JiBmZCwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90JiBvZmYsCisgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgdmlkZW9Tb3VyY2UsCisgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKTsKKworICAgIHZvaWQgcnVuKCk7CisgICAgYm9vbCBydW5uaW5nKCkgeworICAgICAgICByZXR1cm4gIW1Eb25lOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGFydCgpOworICAgIHN0YXR1c190IHN0b3AoKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQmIG1GZDsKKyAgICBjb25zdCB1aW50NjRfdCYgbVNlZ21lbnREYXRhU3RhcnQ7CisgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIG1WaWRlb0ZyYW1lczsKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgbUF1ZGlvRnJhbWVzOworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIG1DdWVzOworCisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKworICAgIHN0YXRpYyB2b2lkIGluaXRDbHVzdGVyKAorICAgICAgICAgICAgTGlzdDxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGZyYW1lcywKKyAgICAgICAgICAgIHVpbnQ2NF90JiBjbHVzdGVyVGltZWNvZGVMLAorICAgICAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pOworICAgIHZvaWQgd3JpdGVDbHVzdGVyKExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKTsKKyAgICB2b2lkIGZsdXNoRnJhbWVzKExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBmcmFtZXMsIGJvb2wgbGFzdCk7Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgV2VibUZyYW1lU291cmNlVGhyZWFkIDogcHVibGljIFdlYm1GcmFtZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lU291cmNlVGhyZWFkKGludCB0eXBlLCBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luayk7CisgICAgdmlydHVhbCBpbnQ2NF90IGdldER1cmF0aW9uVXMoKSA9IDA7Citwcm90ZWN0ZWQ6CisgICAgY29uc3QgaW50IG1UeXBlOworICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBtU2luazsKKworICAgIGZyaWVuZCBjbGFzcyBXZWJtRnJhbWVTaW5rVGhyZWFkOworfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFdlYm1GcmFtZUVtcHR5U291cmNlVGhyZWFkIDogcHVibGljIFdlYm1GcmFtZVNvdXJjZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lRW1wdHlTb3VyY2VUaHJlYWQoaW50IHR5cGUsIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rKQorICAgICAgICA6IFdlYm1GcmFtZVNvdXJjZVRocmVhZCh0eXBlLCBzaW5rKSB7CisgICAgfQorICAgIHZvaWQgcnVuKCkgeyBtU2luay5wdXNoKFdlYm1GcmFtZTo6RU9TKTsgfQorICAgIGludDY0X3QgZ2V0RHVyYXRpb25VcygpIHsgcmV0dXJuIDA7IH0KK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDogcHVibGljIFdlYm1GcmFtZVNvdXJjZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHNpbmssCisgICAgICAgICAgICB1aW50NjRfdCB0aW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVSZWFsVXMsCisgICAgICAgICAgICBpbnQzMl90IHN0YXJ0VGltZU9mZnNldE1zLAorICAgICAgICAgICAgaW50IG51bVBlZXJzLAorICAgICAgICAgICAgYm9vbCByZWFsVGltZVJlY29yZGluZyk7CisKKyAgICB2b2lkIHJ1bigpOworICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgc3RhdHVzX3QgcmVzdW1lKCk7CisgICAgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICBzdGF0dXNfdCBzdG9wKCk7CisgICAgaW50NjRfdCBnZXREdXJhdGlvblVzKCkgeworICAgICAgICByZXR1cm4gbVRyYWNrRHVyYXRpb25VczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgY29uc3QgdWludDY0X3QgbVRpbWVDb2RlU2NhbGU7CisgICAgdWludDY0X3QgbVN0YXJ0VGltZVVzOworCisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKyAgICB2b2xhdGlsZSBib29sIG1QYXVzZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtUmVzdW1lZDsKKyAgICB2b2xhdGlsZSBib29sIG1TdGFydGVkOworICAgIHZvbGF0aWxlIGJvb2wgbVJlYWNoZWRFT1M7CisgICAgaW50NjRfdCBtVHJhY2tEdXJhdGlvblVzOworCisgICAgdm9pZCBjbGVhckZsYWdzKCk7Cit9OworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworCisjZW5kaWYgLyogV0VCTUZSQU1FVEhSRUFEX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2NmOTJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcApAQCAtMCwwICsxLDU1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1Xcml0ZXIiCisKKyNpbmNsdWRlICJFYm1sVXRpbC5oIgorI2luY2x1ZGUgIldlYm1Xcml0ZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2Ugeworc2l6ZV90IFhpcGhMYWNlQ29kZUxlbihzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBzaXplIC8gMHhmZiArIDE7Cit9CisKK3NpemVfdCBYaXBoTGFjZUVuYyh1aW50OF90ICpidWYsIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgc2l6ZSA+PSAweGZmOyArK2ksIHNpemUgLT0gMHhmZikgeworICAgICAgICBidWZbaV0gPSAweGZmOworICAgIH0KKyAgICBidWZbaSsrXSA9IHNpemU7CisgICAgcmV0dXJuIGk7Cit9Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludDY0X3Qga01pblN0cmVhbWFibGVGaWxlU2l6ZUluQnl0ZXMgPSA1ICogMTAyNCAqIDEwMjQ7CisKK1dlYm1Xcml0ZXI6OldlYm1Xcml0ZXIoaW50IGZkKQorICAgIDogbUZkKGR1cChmZCkpLAorICAgICAgbUluaXRDaGVjayhtRmQgPCAwID8gTk9fSU5JVCA6IE9LKSwKKyAgICAgIG1UaW1lQ29kZVNjYWxlKDEwMDAwMDApLAorICAgICAgbVN0YXJ0VGltZXN0YW1wVXMoMCksCisgICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMoMCksCisgICAgICBtU2VnbWVudE9mZnNldCgwKSwKKyAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KDApLAorICAgICAgbUluZm9PZmZzZXQoMCksCisgICAgICBtSW5mb1NpemUoMCksCisgICAgICBtVHJhY2tzT2Zmc2V0KDApLAorICAgICAgbUN1ZXNPZmZzZXQoMCksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKGZhbHNlKSwKKyAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nKGZhbHNlKSwKKyAgICAgIG1TdHJlYW1hYmxlRmlsZSh0cnVlKSwKKyAgICAgIG1Fc3RpbWF0ZWRDdWVzU2l6ZSgwKSB7CisgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdID0gV2VibVN0cmVhbShrQXVkaW9UeXBlLCAiQXVkaW8iLCAmV2VibVdyaXRlcjo6YXVkaW9UcmFjayk7CisgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdID0gV2VibVN0cmVhbShrVmlkZW9UeXBlLCAiVmlkZW8iLCAmV2VibVdyaXRlcjo6dmlkZW9UcmFjayk7CisgICAgbVNpbmtUaHJlYWQgPSBuZXcgV2VibUZyYW1lU2lua1RocmVhZCgKKyAgICAgICAgICAgIG1GZCwKKyAgICAgICAgICAgIG1TZWdtZW50RGF0YVN0YXJ0LAorICAgICAgICAgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1TaW5rLAorICAgICAgICAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1TaW5rLAorICAgICAgICAgICAgbUN1ZVBvaW50cyk7Cit9CisKK1dlYm1Xcml0ZXI6OldlYm1Xcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbVRpbWVDb2RlU2NhbGUoMTAwMDAwMCksCisgICAgICBtU3RhcnRUaW1lc3RhbXBVcygwKSwKKyAgICAgIG1TdGFydFRpbWVPZmZzZXRNcygwKSwKKyAgICAgIG1TZWdtZW50T2Zmc2V0KDApLAorICAgICAgbVNlZ21lbnREYXRhU3RhcnQoMCksCisgICAgICBtSW5mb09mZnNldCgwKSwKKyAgICAgIG1JbmZvU2l6ZSgwKSwKKyAgICAgIG1UcmFja3NPZmZzZXQoMCksCisgICAgICBtQ3Vlc09mZnNldCgwKSwKKyAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQoZmFsc2UpLAorICAgICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcoZmFsc2UpLAorICAgICAgbVN0cmVhbWFibGVGaWxlKHRydWUpLAorICAgICAgbUVzdGltYXRlZEN1ZXNTaXplKDApIHsKKyAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIEFMT0dWKCJmZCAlZDsgZmxhZ3M6ICVvIiwgbUZkLCBmY250bChtRmQsIEZfR0VURkwsIDApKTsKKyAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgIH0KKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0gPSBXZWJtU3RyZWFtKGtBdWRpb1R5cGUsICJBdWRpbyIsICZXZWJtV3JpdGVyOjphdWRpb1RyYWNrKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0gPSBXZWJtU3RyZWFtKGtWaWRlb1R5cGUsICJWaWRlbyIsICZXZWJtV3JpdGVyOjp2aWRlb1RyYWNrKTsKKyAgICBtU2lua1RocmVhZCA9IG5ldyBXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICAgICAgbUZkLAorICAgICAgICAgICAgbVNlZ21lbnREYXRhU3RhcnQsCisgICAgICAgICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVNpbmssCisgICAgICAgICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVNpbmssCisgICAgICAgICAgICBtQ3VlUG9pbnRzKTsKK30KKworLy8gc3RhdGljCitzcDxXZWJtRWxlbWVudD4gV2VibVdyaXRlcjo6dmlkZW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIENIRUNLKG1kLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKKyAgICBDSEVDSyhtZC0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICByZXR1cm4gV2VibUVsZW1lbnQ6OlZpZGVvVHJhY2tFbnRyeSh3aWR0aCwgaGVpZ2h0KTsKK30KKworLy8gc3RhdGljCitzcDxXZWJtRWxlbWVudD4gV2VibVdyaXRlcjo6YXVkaW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKSB7CisgICAgaW50MzJfdCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGU7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMTsKKyAgICBjb25zdCBjaGFyIGhlYWRlckRhdGEyW10gPSB7IDMsICd2JywgJ28nLCAncicsICdiJywgJ2knLCAncycsIDcsIDAsIDAsIDAsCisgICAgICAgICAgICAnYScsICduJywgJ2QnLCAncicsICdvJywgJ2knLCAnZCcsIDAsIDAsIDAsIDAsIDEgfTsKKyAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMzsKKyAgICBzaXplX3QgaGVhZGVyU2l6ZTEsIGhlYWRlclNpemUyID0gc2l6ZW9mKGhlYWRlckRhdGEyKSwgaGVhZGVyU2l6ZTM7CisKKyAgICBDSEVDSyhtZC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpKTsKKyAgICBDSEVDSyhtZC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpOworICAgIENIRUNLKG1kLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZoZWFkZXJEYXRhMSwgJmhlYWRlclNpemUxKSk7CisgICAgQ0hFQ0sobWQtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSk7CisKKyAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDE7CisgICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTEpOworICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUyKTsKKyAgICBjb2RlY1ByaXZhdGVTaXplICs9IGhlYWRlclNpemUxICsgaGVhZGVyU2l6ZTIgKyBoZWFkZXJTaXplMzsKKworICAgIG9mZl90IG9mZiA9IDA7CisgICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7CisgICAgdWludDhfdCAqY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOworICAgIGNvZGVjUHJpdmF0ZURhdGFbb2ZmKytdID0gMjsKKworICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMSk7CisgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUyKTsKKworICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMSwgaGVhZGVyU2l6ZTEpOworICAgIG9mZiArPSBoZWFkZXJTaXplMTsKKyAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTIsIGhlYWRlclNpemUyKTsKKyAgICBvZmYgKz0gaGVhZGVyU2l6ZTI7CisgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEzLCBoZWFkZXJTaXplMyk7CisKKyAgICBzcDxXZWJtRWxlbWVudD4gZW50cnkgPSBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KAorICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgIGNvZGVjUHJpdmF0ZUJ1Zik7CisgICAgcmV0dXJuIGVudHJ5OworfQorCitzaXplX3QgV2VibVdyaXRlcjo6bnVtVHJhY2tzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisKKyAgICBzaXplX3QgbnVtVHJhY2tzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG51bVRyYWNrcysrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bVRyYWNrczsKK30KKwordWludDY0X3QgV2VibVdyaXRlcjo6ZXN0aW1hdGVDdWVzU2l6ZShpbnQzMl90IGJpdFJhdGUpIHsKKyAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGVzdGltYXRlTW9vdkJveFNpemUgaW4gTVBFRzRXcml0ZXIuCisgICAgLy8KKyAgICAvLyBTdGF0aXN0aWNhbCBhbmFseXNpcyBzaG93cyB0aGF0IG1ldGFkYXRhIHVzdWFsbHkgYWNjb3VudHMKKyAgICAvLyBmb3IgYSBzbWFsbCBwb3J0aW9uIG9mIHRoZSB0b3RhbCBmaWxlIHNpemUsIHVzdWFsbHkgPCAwLjYlLgorCisgICAgLy8gVGhlIGRlZmF1bHQgTUlOX01PT1ZfQk9YX1NJWkUgaXMgc2V0IHRvIDAuNiUgeCAxTUIgLyAyLAorICAgIC8vIHdoZXJlIDFNQiBpcyB0aGUgY29tbW9uIGZpbGUgc2l6ZSBsaW1pdCBmb3IgTU1TIGFwcGxpY2F0aW9uLgorICAgIC8vIFRoZSBkZWZhdWx0IE1BWCBfTU9PVl9CT1hfU0laRSB2YWx1ZSBpcyBiYXNlZCBvbiBhYm91dCAzCisgICAgLy8gbWludXRlIHZpZGVvIHJlY29yZGluZyB3aXRoIGEgYml0IHJhdGUgYWJvdXQgMyBNYnBzLCBiZWNhdXNlCisgICAgLy8gc3RhdGlzdGljcyBhbHNvIHNob3cgdGhhdCBtb3N0IG9mIHRoZSB2aWRlbyBjYXB0dXJlZCBhcmUgZ29pbmcKKyAgICAvLyB0byBiZSBsZXNzIHRoYW4gMyBtaW51dGVzLgorCisgICAgLy8gSWYgdGhlIGVzdGltYXRpb24gaXMgd3JvbmcsIHdlIHdpbGwgcGF5IHRoZSBwcmljZSBvZiB3YXN0aW5nCisgICAgLy8gc29tZSByZXNlcnZlZCBzcGFjZS4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBzbyBvZnRlbiBzdGF0aXN0aWNhbGx5LgorICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGZhY3RvciA9IDI7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgTUlOX0NVRVNfU0laRSA9IDMgKiAxMDI0OyAgLy8gMyBLQgorICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE1BWF9DVUVTX1NJWkUgPSAoMTgwICogMzAwMDAwMCAqIDZMTCAvIDgwMDApOworICAgIGludDY0X3Qgc2l6ZSA9IE1JTl9DVUVTX1NJWkU7CisKKyAgICAvLyBNYXggZmlsZSBzaXplIGxpbWl0IGlzIHNldAorICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzICE9IDAgJiYgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQpIHsKKyAgICAgICAgc2l6ZSA9IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgKiA2IC8gMTAwMDsKKyAgICB9CisKKyAgICAvLyBNYXggZmlsZSBkdXJhdGlvbiBsaW1pdCBpcyBzZXQKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgIT0gMCkgeworICAgICAgICBpZiAoYml0UmF0ZSA+IDApIHsKKyAgICAgICAgICAgIGludDY0X3Qgc2l6ZTIgPSAoKG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzICogYml0UmF0ZSAqIDYpIC8gMTAwMCAvIDgwMDAwMDApOworICAgICAgICAgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgIT0gMCAmJiBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCkgeworICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBmaWxlIHNpemUgYW5kIGR1cmF0aW9uIGxpbWl0cyBhcmUgc2V0LAorICAgICAgICAgICAgICAgIC8vIHdlIHVzZSB0aGUgc21hbGxlciBsaW1pdCBvZiB0aGUgdHdvLgorICAgICAgICAgICAgICAgIGlmIChzaXplID4gc2l6ZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT25seSBtYXggZmlsZSBkdXJhdGlvbiBsaW1pdCBpcyBzZXQKKyAgICAgICAgICAgICAgICBzaXplID0gc2l6ZTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8IE1JTl9DVUVTX1NJWkUpIHsKKyAgICAgICAgc2l6ZSA9IE1JTl9DVUVTX1NJWkU7CisgICAgfQorCisgICAgLy8gQW55IGxvbmcgZHVyYXRpb24gcmVjb3JkaW5nIHdpbGwgYmUgcHJvYmFibHkgZW5kIHVwIHdpdGgKKyAgICAvLyBub24tc3RyZWFtYWJsZSB3ZWJtIGZpbGUuCisgICAgaWYgKHNpemUgPiBNQVhfQ1VFU19TSVpFKSB7CisgICAgICAgIHNpemUgPSBNQVhfQ1VFU19TSVpFOworICAgIH0KKworICAgIEFMT0dWKCJsaW1pdHM6ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIGJ5dGVzL3VzLCIKKyAgICAgICAgICAgICIgYml0IHJhdGU6ICVkIGJwcyBhbmQgdGhlIGVzdGltYXRlZCBjdWVzIHNpemUgJSIgUFJJZDY0ICIgYnl0ZXMiLAorICAgICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMsIGJpdFJhdGUsIHNpemUpOworICAgIHJldHVybiBmYWN0b3IgKiBzaXplOworfQorCit2b2lkIFdlYm1Xcml0ZXI6OmluaXRTdHJlYW0oc2l6ZV90IGlkeCkgeworICAgIGlmIChtU3RyZWFtc1tpZHhdLm1UaHJlYWQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtU3RyZWFtc1tpZHhdLm1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiYWRkaW5nIGR1bW15IHNvdXJjZSAuLi4gIik7CisgICAgICAgIG1TdHJlYW1zW2lkeF0ubVRocmVhZCA9IG5ldyBXZWJtRnJhbWVFbXB0eVNvdXJjZVRocmVhZCgKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1UeXBlLCBtU3RyZWFtc1tpZHhdLm1TaW5rKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiYWRkaW5nIHNvdXJjZSAlcCIsIG1TdHJlYW1zW2lkeF0ubVNvdXJjZS5nZXQoKSk7CisgICAgICAgIG1TdHJlYW1zW2lkeF0ubVRocmVhZCA9IG5ldyBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZCgKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1Tb3VyY2UsCisgICAgICAgICAgICAgICAgbVN0cmVhbXNbaWR4XS5tVHlwZSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1TaW5rLAorICAgICAgICAgICAgICAgIG1UaW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgIG1TdGFydFRpbWVPZmZzZXRNcywKKyAgICAgICAgICAgICAgICBudW1UcmFja3MoKSwKKyAgICAgICAgICAgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyk7CisgICAgfQorfQorCit2b2lkIFdlYm1Xcml0ZXI6OnJlbGVhc2UoKSB7CisgICAgY2xvc2UobUZkKTsKKyAgICBtRmQgPSAtMTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjpyZXNldCgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgcmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaW50NjRfdCBtYXhEdXJhdGlvblVzID0gMDsKKyAgICBpbnQ2NF90IG1pbkR1cmF0aW9uVXMgPSAweDdmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UaHJlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtc1tpXS5tVGhyZWFkLT5zdG9wKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBtU3RyZWFtc1tpXS5tVGhyZWFkLT5nZXREdXJhdGlvblVzKCk7CisgICAgICAgIGlmIChkdXJhdGlvblVzID4gbWF4RHVyYXRpb25VcykgeworICAgICAgICAgICAgbWF4RHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1cmF0aW9uVXMgPCBtaW5EdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtaW5EdXJhdGlvblVzID0gZHVyYXRpb25VczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW1UcmFja3MoKSA+IDEpIHsKKyAgICAgICAgQUxPR0QoIkR1cmF0aW9uIGZyb20gdHJhY2tzIHJhbmdlIGlzIFslIiBQUklkNjQgIiwgJSIgUFJJZDY0ICJdIHVzIiwgbWluRHVyYXRpb25VcywgbWF4RHVyYXRpb25Vcyk7CisgICAgfQorCisgICAgbVNpbmtUaHJlYWQtPnN0b3AoKTsKKworICAgIC8vIERvIG5vdCB3cml0ZSBvdXQgbW92aWUgaGVhZGVyIG9uIGVycm9yLgorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmVsZWFzZSgpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHNwPFdlYm1FbGVtZW50PiBjdWVzID0gbmV3IFdlYm1NYXN0ZXIoa01rdkN1ZXMsIG1DdWVQb2ludHMpOworICAgIHVpbnQ2NF90IGN1ZXNTaXplID0gY3Vlcy0+dG90YWxTaXplKCk7CisgICAgLy8gVFJJQ0tZIEV2ZW4gd2hlbiB0aGUgY3VlcyBkbyBmaXQgaW4gdGhlIHNwYWNlIHdlIHJlc2VydmVkLCBpZiB0aGV5IGRvIG5vdCBmaXQKKyAgICAvLyBwZXJmZWN0bHksIHdlIHN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoICJleHRyYSBzcGFjZSIgdG8gd3JpdGUgYW4KKyAgICAvLyBFQk1MIHZvaWQgZWxlbWVudC4KKyAgICBpZiAoY3Vlc1NpemUgIT0gbUVzdGltYXRlZEN1ZXNTaXplICYmIGN1ZXNTaXplID4gbUVzdGltYXRlZEN1ZXNTaXplIC0ga01pbkVibWxWb2lkU2l6ZSkgeworICAgICAgICBtQ3Vlc09mZnNldCA9IDo6bHNlZWsobUZkLCAwLCBTRUVLX0NVUik7CisgICAgICAgIGN1ZXMtPndyaXRlKG1GZCwgY3Vlc1NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ2NF90IHNwYWNlU2l6ZTsKKyAgICAgICAgOjpsc2VlayhtRmQsIG1DdWVzT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIGN1ZXMtPndyaXRlKG1GZCwgY3Vlc1NpemUpOworICAgICAgICBzcDxXZWJtRWxlbWVudD4gc3BhY2UgPSBuZXcgRWJtbFZvaWQobUVzdGltYXRlZEN1ZXNTaXplIC0gY3Vlc1NpemUpOworICAgICAgICBzcGFjZS0+d3JpdGUobUZkLCBzcGFjZVNpemUpOworICAgIH0KKworICAgIG1DdWVQb2ludHMuY2xlYXIoKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVNpbmsuY2xlYXIoKTsKKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVNpbmsuY2xlYXIoKTsKKworICAgIHVpbnQ4X3QgYmFyeVtzaXplb2YodWludDY0X3QpXTsKKyAgICB1aW50NjRfdCB0b3RhbFNpemUgPSA6OmxzZWVrKG1GZCwgMCwgU0VFS19FTkQpOworICAgIHVpbnQ2NF90IHNlZ21lbnRTaXplID0gdG90YWxTaXplIC0gbVNlZ21lbnREYXRhU3RhcnQ7CisgICAgOjpsc2VlayhtRmQsIG1TZWdtZW50T2Zmc2V0ICsgc2l6ZU9mKGtNa3ZTZWdtZW50KSwgU0VFS19TRVQpOworICAgIHVpbnQ2NF90IHNlZ21lbnRTaXplQ29kZWQgPSBlbmNvZGVVbnNpZ25lZChzZWdtZW50U2l6ZSwgc2l6ZU9mKGtNa3ZVbmtub3duTGVuZ3RoKSk7CisgICAgc2VyaWFsaXplQ29kZWRVbnNpZ25lZChzZWdtZW50U2l6ZUNvZGVkLCBiYXJ5KTsKKyAgICA6OndyaXRlKG1GZCwgYmFyeSwgc2l6ZU9mKGtNa3ZVbmtub3duTGVuZ3RoKSk7CisKKyAgICB1aW50NjRfdCBzaXplOworICAgIHVpbnQ2NF90IGR1cmF0aW9uT2Zmc2V0ID0gbUluZm9PZmZzZXQgKyBzaXplT2Yoa01rdkluZm8pICsgc2l6ZU9mKG1JbmZvU2l6ZSkKKyAgICAgICAgKyBzaXplT2Yoa01rdlNlZ21lbnREdXJhdGlvbikgKyBzaXplT2Yoc2l6ZW9mKGRvdWJsZSkpOworICAgIHNwPFdlYm1FbGVtZW50PiBkdXJhdGlvbiA9IG5ldyBXZWJtRmxvYXQoCisgICAgICAgICAgICBrTWt2U2VnbWVudER1cmF0aW9uLAorICAgICAgICAgICAgKGRvdWJsZSkgKG1heER1cmF0aW9uVXMgKiAxMDAwIC8gbVRpbWVDb2RlU2NhbGUpKTsKKyAgICBkdXJhdGlvbi0+c2VyaWFsaXplUGF5bG9hZChiYXJ5KTsKKyAgICA6OmxzZWVrKG1GZCwgZHVyYXRpb25PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICA6OndyaXRlKG1GZCwgYmFyeSwgc2l6ZW9mKGRvdWJsZSkpOworCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBzZWVrRW50cmllczsKKyAgICBzZWVrRW50cmllcy5wdXNoX2JhY2soV2VibUVsZW1lbnQ6OlNlZWtFbnRyeShrTWt2SW5mbywgbUluZm9PZmZzZXQgLSBtU2VnbWVudERhdGFTdGFydCkpOworICAgIHNlZWtFbnRyaWVzLnB1c2hfYmFjayhXZWJtRWxlbWVudDo6U2Vla0VudHJ5KGtNa3ZUcmFja3MsIG1UcmFja3NPZmZzZXQgLSBtU2VnbWVudERhdGFTdGFydCkpOworICAgIHNlZWtFbnRyaWVzLnB1c2hfYmFjayhXZWJtRWxlbWVudDo6U2Vla0VudHJ5KGtNa3ZDdWVzLCBtQ3Vlc09mZnNldCAtIG1TZWdtZW50RGF0YVN0YXJ0KSk7CisgICAgc3A8V2VibUVsZW1lbnQ+IHNlZWtIZWFkID0gbmV3IFdlYm1NYXN0ZXIoa01rdlNlZWtIZWFkLCBzZWVrRW50cmllcyk7CisKKyAgICB1aW50NjRfdCBtZXRhU2Vla1NpemU7CisgICAgOjpsc2VlayhtRmQsIG1TZWdtZW50RGF0YVN0YXJ0LCBTRUVLX1NFVCk7CisgICAgc2Vla0hlYWQtPndyaXRlKG1GZCwgbWV0YVNlZWtTaXplKTsKKworICAgIHVpbnQ2NF90IHNwYWNlU2l6ZTsKKyAgICBzcDxXZWJtRWxlbWVudD4gc3BhY2UgPSBuZXcgRWJtbFZvaWQoa01heE1ldGFTZWVrU2l6ZSAtIG1ldGFTZWVrU2l6ZSk7CisgICAgc3BhY2UtPndyaXRlKG1GZCwgc3BhY2VTaXplKTsKKworICAgIHJlbGVhc2UoKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIEFMT0dFKCJBdHRlbXB0IHRvIGFkZCBzb3VyY2UgQUZURVIgcmVjb3JkaW5nIGlzIHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gQXQgbW9zdCAyIHRyYWNrcyBjYW4gYmUgc3VwcG9ydGVkLgorICAgIGlmIChtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRyYWNrRW50cnkgIT0gTlVMTAorICAgICAgICAgICAgJiYgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlRvbyBtYW55IHRyYWNrcyAoMikgdG8gYWRkIik7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7CisKKyAgICAvLyBBIHRyYWNrIG9mIHR5cGUgb3RoZXIgdGhhbiB2aWRlbyBvciBhdWRpbyBpcyBub3Qgc3VwcG9ydGVkLgorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgY29uc3QgY2hhciAqdnA4ID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OworICAgIGNvbnN0IGNoYXIgKnZvcmJpcyA9IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUzsKKworICAgIHNpemVfdCBzdHJlYW1JbmRleDsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZwOCwgc3RybGVuKHZwOCkpKSB7CisgICAgICAgIHN0cmVhbUluZGV4ID0ga1ZpZGVvSW5kZXg7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgdm9yYmlzLCBzdHJsZW4odm9yYmlzKSkpIHsKKyAgICAgICAgc3RyZWFtSW5kZXggPSBrQXVkaW9JbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzIG9yICVzIGlzIG5vdCBzdXBwb3J0ZWQiLCBtaW1lLCB2cDgsIHZvcmJpcyk7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLyBObyBtb3JlIHRoYW4gb25lIHZpZGVvIG9yIG9uZSBhdWRpbyB0cmFjayBpcyBzdXBwb3J0ZWQuCisgICAgaWYgKG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tVHJhY2tFbnRyeSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlcyB0cmFjayBhbHJlYWR5IGV4aXN0cyIsIG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tTmFtZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0cmFjayBvZiBlaXRoZXIgYXVkaW8gb3IgdmlkZW8uCisgICAgLy8gR28gYWhlYWQgdG8gYWRkIHRoZSB0cmFjay4KKyAgICBtU3RyZWFtc1tzdHJlYW1JbmRleF0ubVNvdXJjZSA9IHNvdXJjZTsKKyAgICBtU3RyZWFtc1tzdHJlYW1JbmRleF0ubVRyYWNrRW50cnkgPSBtU3RyZWFtc1tzdHJlYW1JbmRleF0ubU1ha2VUcmFjayhzb3VyY2UtPmdldEZvcm1hdCgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV2VibVdyaXRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRyYWNrRW50cnkgPT0gTlVMTAorICAgICAgICAgICAgJiYgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1UcmFja0VudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5vIHNvdXJjZSBhZGRlZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgIT0gMCkgeworICAgICAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBpbnQzMl90IGlzUmVhbFRpbWVSZWNvcmRpbmc7CisgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKGtLZXlSZWFsVGltZVJlY29yZGluZywgJmlzUmVhbFRpbWVSZWNvcmRpbmcpOworICAgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyA9IGlzUmVhbFRpbWVSZWNvcmRpbmc7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVRocmVhZC0+cmVzdW1lKCk7CisgICAgICAgICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRocmVhZC0+cmVzdW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgaW50MzJfdCB0Y3NsOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoa0tleVRpbWVTY2FsZSwgJnRjc2wpKSB7CisgICAgICAgICAgICBtVGltZUNvZGVTY2FsZSA9IHRjc2w7CisgICAgICAgIH0KKyAgICB9CisgICAgQ0hFQ0tfR1QobVRpbWVDb2RlU2NhbGUsIDApOworICAgIEFMT0dWKCJtb3ZpZSB0aW1lIHNjYWxlOiAlIiBQUkl1NjQsIG1UaW1lQ29kZVNjYWxlKTsKKworICAgIC8qCisgICAgICogV2hlbiB0aGUgcmVxdWVzdGVkIGZpbGUgc2l6ZSBsaW1pdCBpcyBzbWFsbCwgdGhlIHByaW9yaXR5CisgICAgICogaXMgdG8gbWVldCB0aGUgZmlsZSBzaXplIGxpbWl0IHJlcXVpcmVtZW50LCByYXRoZXIgdGhhbgorICAgICAqIHRvIG1ha2UgdGhlIGZpbGUgc3RyZWFtYWJsZS4gbVN0cmVhbWFibGVGaWxlIGRvZXMgbm90IHRlbGwKKyAgICAgKiB3aGV0aGVyIHRoZSBhY3R1YWwgcmVjb3JkZWQgZmlsZSBpcyBzdHJlYW1hYmxlIG9yIG5vdC4KKyAgICAgKi8KKyAgICBtU3RyZWFtYWJsZUZpbGUgPSAoIW1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMpCisgICAgICAgIHx8IChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID49IGtNaW5TdHJlYW1hYmxlRmlsZVNpemVJbkJ5dGVzKTsKKworICAgIC8qCisgICAgICogV3JpdGUgdmFyaW91cyBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBzcDxXZWJtRWxlbWVudD4gZWJtbCwgc2VnbWVudCwgaW5mbywgc2Vla0hlYWQsIHRyYWNrcywgY3VlczsKKyAgICBlYm1sID0gV2VibUVsZW1lbnQ6OkVibWxIZWFkZXIoKTsKKyAgICBzZWdtZW50ID0gbmV3IFdlYm1NYXN0ZXIoa01rdlNlZ21lbnQpOworICAgIHNlZWtIZWFkID0gbmV3IEVibWxWb2lkKGtNYXhNZXRhU2Vla1NpemUpOworICAgIGluZm8gPSBXZWJtRWxlbWVudDo6U2VnbWVudEluZm8obVRpbWVDb2RlU2NhbGUsIDApOworCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBjaGlsZHJlbjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhtU3RyZWFtc1tpXS5tVHJhY2tFbnRyeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdHJhY2tzID0gbmV3IFdlYm1NYXN0ZXIoa01rdlRyYWNrcywgY2hpbGRyZW4pOworCisgICAgaWYgKCFtU3RyZWFtYWJsZUZpbGUpIHsKKyAgICAgICAgY3VlcyA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCBiaXRSYXRlID0gLTE7CisgICAgICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0UmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUVzdGltYXRlZEN1ZXNTaXplID0gZXN0aW1hdGVDdWVzU2l6ZShiaXRSYXRlKTsKKyAgICAgICAgQ0hFQ0tfR0UobUVzdGltYXRlZEN1ZXNTaXplLCA4KTsKKyAgICAgICAgY3VlcyA9IG5ldyBFYm1sVm9pZChtRXN0aW1hdGVkQ3Vlc1NpemUpOworICAgIH0KKworICAgIHNwPFdlYm1FbGVtZW50PiBlbGVtc1tdID0geyBlYm1sLCBzZWdtZW50LCBzZWVrSGVhZCwgaW5mbywgdHJhY2tzLCBjdWVzIH07CisgICAgc2l6ZV90IG5FbGVtcyA9IHNpemVvZihlbGVtcykgLyBzaXplb2YoZWxlbXNbMF0pOworICAgIHVpbnQ2NF90IG9mZnNldHNbbkVsZW1zXTsKKyAgICB1aW50NjRfdCBzaXplc1tuRWxlbXNdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuRWxlbXM7IGkrKykgeworICAgICAgICBXZWJtRWxlbWVudCAqZSA9IGVsZW1zW2ldLmdldCgpOworICAgICAgICBpZiAoIWUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdWludDY0X3Qgc2l6ZTsKKyAgICAgICAgb2Zmc2V0c1tpXSA9IDo6bHNlZWsobUZkLCAwLCBTRUVLX0NVUik7CisgICAgICAgIHNpemVzW2ldID0gZS0+bVNpemU7CisgICAgICAgIGUtPndyaXRlKG1GZCwgc2l6ZSk7CisgICAgfQorCisgICAgbVNlZ21lbnRPZmZzZXQgPSBvZmZzZXRzWzFdOworICAgIG1TZWdtZW50RGF0YVN0YXJ0ID0gb2Zmc2V0c1syXTsKKyAgICBtSW5mb09mZnNldCA9IG9mZnNldHNbM107CisgICAgbUluZm9TaXplID0gc2l6ZXNbM107CisgICAgbVRyYWNrc09mZnNldCA9IG9mZnNldHNbNF07CisgICAgbUN1ZXNPZmZzZXQgPSBvZmZzZXRzWzVdOworCisgICAgLy8gc3RhcnQgdGhyZWFkcworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgcGFyYW1zLT5maW5kSW50NjQoa0tleVRpbWUsICZtU3RhcnRUaW1lc3RhbXBVcyk7CisgICAgfQorCisgICAgaW5pdFN0cmVhbShrQXVkaW9JbmRleCk7CisgICAgaW5pdFN0cmVhbShrVmlkZW9JbmRleCk7CisKKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVRocmVhZC0+c3RhcnQoKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRocmVhZC0+c3RhcnQoKTsKKyAgICBtU2lua1RocmVhZC0+c3RhcnQoKTsKKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdlYm1Xcml0ZXI6OnBhdXNlKCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgbVBhdXNlZCA9IHRydWU7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXS5tVGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW1zW2ldLm1UaHJlYWQtPnBhdXNlKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjpzdG9wKCkgeworICAgIHJldHVybiByZXNldCgpOworfQorCitib29sIFdlYm1Xcml0ZXI6OnJlYWNoZWRFT1MoKSB7CisgICAgcmV0dXJuICFtU2lua1RocmVhZC0+cnVubmluZygpOworfQorfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjlkZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdFQk1XUklURVJfSF8KKyNkZWZpbmUgV0VCTVdSSVRFUl9IXworCisjaW5jbHVkZSAiV2VibUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIldlYm1GcmFtZVRocmVhZC5oIgorI2luY2x1ZGUgIkxpbmtlZEJsb2NraW5nUXVldWUuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFdlYm1Xcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgeworcHVibGljOgorICAgIFdlYm1Xcml0ZXIoaW50IGZkKTsKKyAgICBXZWJtV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICB+V2VibVdyaXRlcigpIHsgcmVzZXQoKTsgfQorCisKKyAgICBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbSA9IE5VTEwpOworICAgIHN0YXR1c190IHN0b3AoKTsKKyAgICBzdGF0dXNfdCBwYXVzZSgpOworICAgIGJvb2wgcmVhY2hlZEVPUygpOworCisgICAgdm9pZCBzZXRTdGFydFRpbWVPZmZzZXRNcyhpbnQgbXMpIHsgbVN0YXJ0VGltZU9mZnNldE1zID0gbXM7IH0KKyAgICBpbnQzMl90IGdldFN0YXJ0VGltZU9mZnNldE1zKCkgY29uc3QgeyByZXR1cm4gbVN0YXJ0VGltZU9mZnNldE1zOyB9CisKK3ByaXZhdGU6CisgICAgaW50IG1GZDsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgdWludDY0X3QgbVRpbWVDb2RlU2NhbGU7CisgICAgaW50NjRfdCBtU3RhcnRUaW1lc3RhbXBVczsKKyAgICBpbnQzMl90IG1TdGFydFRpbWVPZmZzZXRNczsKKworICAgIHVpbnQ2NF90IG1TZWdtZW50T2Zmc2V0OworICAgIHVpbnQ2NF90IG1TZWdtZW50RGF0YVN0YXJ0OworICAgIHVpbnQ2NF90IG1JbmZvT2Zmc2V0OworICAgIHVpbnQ2NF90IG1JbmZvU2l6ZTsKKyAgICB1aW50NjRfdCBtVHJhY2tzT2Zmc2V0OworICAgIHVpbnQ2NF90IG1DdWVzT2Zmc2V0OworCisgICAgYm9vbCBtUGF1c2VkOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZDsKKyAgICBib29sIG1Jc1JlYWxUaW1lUmVjb3JkaW5nOworICAgIGJvb2wgbVN0cmVhbWFibGVGaWxlOworICAgIHVpbnQ2NF90IG1Fc3RpbWF0ZWRDdWVzU2l6ZTsKKworICAgIE11dGV4IG1Mb2NrOworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gbUN1ZVBvaW50czsKKworICAgIGVudW0geworICAgICAgICBrQXVkaW9JbmRleCAgICAgPSAgMCwKKyAgICAgICAga1ZpZGVvSW5kZXggICAgID0gIDEsCisgICAgICAgIGtNYXhTdHJlYW1zICAgICA9ICAyLAorICAgIH07CisKKyAgICBzdHJ1Y3QgV2VibVN0cmVhbSB7CisgICAgICAgIGludCBtVHlwZTsKKyAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiAoKm1NYWtlVHJhY2spKGNvbnN0IHNwPE1ldGFEYXRhPiYpOworCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgICAgICBzcDxXZWJtRWxlbWVudD4gbVRyYWNrRW50cnk7CisgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gbVRocmVhZDsKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4gbVNpbms7CisKKyAgICAgICAgV2VibVN0cmVhbSgpCisgICAgICAgICAgICA6IG1UeXBlKGtJbnZhbGlkVHlwZSksCisgICAgICAgICAgICAgIG1OYW1lKCJJbnZhbGlkIiksCisgICAgICAgICAgICAgIG1NYWtlVHJhY2soTlVMTCkgeworICAgICAgICB9CisKKyAgICAgICAgV2VibVN0cmVhbShpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgc3A8V2VibUVsZW1lbnQ+ICgqbWFrZVRyYWNrKShjb25zdCBzcDxNZXRhRGF0YT4mKSkKKyAgICAgICAgICAgIDogbVR5cGUodHlwZSksCisgICAgICAgICAgICAgIG1OYW1lKG5hbWUpLAorICAgICAgICAgICAgICBtTWFrZVRyYWNrKG1ha2VUcmFjaykgeworICAgICAgICB9CisKKyAgICAgICAgV2VibVN0cmVhbSAmb3BlcmF0b3I9KGNvbnN0IFdlYm1TdHJlYW0gJm90aGVyKSB7CisgICAgICAgICAgICBtVHlwZSA9IG90aGVyLm1UeXBlOworICAgICAgICAgICAgbU5hbWUgPSBvdGhlci5tTmFtZTsKKyAgICAgICAgICAgIG1NYWtlVHJhY2sgPSBvdGhlci5tTWFrZVRyYWNrOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgfTsKKyAgICBXZWJtU3RyZWFtIG1TdHJlYW1zW2tNYXhTdHJlYW1zXTsKKworICAgIHNwPFdlYm1GcmFtZVNpbmtUaHJlYWQ+IG1TaW5rVGhyZWFkOworCisgICAgc2l6ZV90IG51bVRyYWNrcygpOworICAgIHVpbnQ2NF90IGVzdGltYXRlQ3Vlc1NpemUoaW50MzJfdCBiaXRSYXRlKTsKKyAgICB2b2lkIGluaXRTdHJlYW0oc2l6ZV90IGlkeCk7CisgICAgdm9pZCByZWxlYXNlKCk7CisgICAgc3RhdHVzX3QgcmVzZXQoKTsKKworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gdmlkZW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKTsKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IGF1ZGlvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXZWJtV3JpdGVyKTsKK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKyNlbmRpZiAvKiBXRUJNV1JJVEVSX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAKaW5kZXggMjg2ZWExMy4uMmNiNDc4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0lIRENQLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNzQ5LDcgKzc1MCw4IEBACiAKICAgICBtRXh0cmFjdG9yID0gbmV3IE51TWVkaWFFeHRyYWN0b3I7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1NZWRpYVBhdGguY19zdHIoKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1NZWRpYVBhdGguY19zdHIoKSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC0xMDUzLDcgKzEwNTUsNyBAQAogICAgIGVyciA9IHNvdXJjZS0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChudW1JbnB1dEJ1ZmZlcnMpOwogICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIAotICAgIG1CdWZmZXJRdWV1ZSA9IHNvdXJjZS0+Z2V0QnVmZmVyUXVldWUoKTsKKyAgICBtUHJvZHVjZXIgPSBzb3VyY2UtPmdldFByb2R1Y2VyKCk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMDc3LDcgKzEwNzksNyBAQAogfQogCiBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpnZXRTdXJmYWNlVGV4dHVyZSgpIHsKLSAgICByZXR1cm4gbUJ1ZmZlclF1ZXVlOworICAgIHJldHVybiBtUHJvZHVjZXI7CiB9CiAKIHZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cmVxdWVzdElEUkZyYW1lKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmgKaW5kZXggNWM4ZWU5NC4uMjgyNDE0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5oCkBAIC0yNSw3ICsyNSw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwotc3RydWN0IEJ1ZmZlclF1ZXVlOwogc3RydWN0IElIRENQOwogc3RydWN0IElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiBzdHJ1Y3QgTWVkaWFQdWxsZXI7CkBAIC0xMTEsNyArMTEwLDcgQEAKIAogICAgIGludDY0X3QgbUxhc3RMaWZlc2lnblVzOwogCi0gICAgc3A8QnVmZmVyUXVldWU+IG1CdWZmZXJRdWV1ZTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CiAKICAgICBLZXllZFZlY3RvcjxzaXplX3QsIHNwPFRyYWNrPiA+IG1UcmFja3M7CiAgICAgc3NpemVfdCBtVmlkZW9UcmFja0luZGV4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmNwcAppbmRleCBjYzhkZWUzLi41OWQ3ZTZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmNwcApAQCAtNzksNiArNzksOCBAQAogCiAgICAgQUxPR1YoInN0b3BwaW5nIik7CiAKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7CisKICAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CiAgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKICAgICAgICAgbUxvb3Blci5jbGVhcigpOwpAQCAtOTIsNyArOTQsNiBAQAogICAgICAgICBtQnVmZmVyID0gTlVMTDsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7CiAKICAgICBBTE9HVigic3RvcHBlZCIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCmluZGV4IGIzZjdiMWIuLmJiODZkZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCkBAIC0xMiw1ICsxMiw3IEBACiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF95dXYKIAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCmluZGV4IDdiOTAwMGIuLmJiM2UyZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApAQCAtMjI2LDggKzIyNiw4IEBACiAgICAgICAgICAgICAmeVNyY09mZnNldEluY3JlbWVudCwgJnVTcmNPZmZzZXRJbmNyZW1lbnQsICZ2U3JjT2Zmc2V0SW5jcmVtZW50KTsKIAogICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7Ci0gICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKLSAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdURlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOwogICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKICAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOwogCkBAIC0zMDksNyArMzA5LDcgQEAKIAogICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CiAgICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKLSAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOwogICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKICAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOwogCkBAIC0zOTMsOSArMzkzLDkgQEAKICAgICBmcHJpbnRmKGZwLCAiMjU1XG4iKTsKICAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtSGVpZ2h0OyArK3kpIHsKICAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVdpZHRoOyArK3gpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlOwotICAgICAgICAgICAgdWludDhfdCB1VmFsdWU7Ci0gICAgICAgICAgICB1aW50OF90IHZWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlID0gMHU7CisgICAgICAgICAgICB1aW50OF90IHVWYWx1ZSA9IDB1OworICAgICAgICAgICAgdWludDhfdCB2VmFsdWUgPSAwdTsKICAgICAgICAgICAgIGdldFBpeGVsVmFsdWUoeCwgeSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJiB2VmFsdWUpOwogCiAgICAgICAgICAgICB1aW50OF90IHJWYWx1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCmluZGV4IGQwN2JjOTkuLmQzZTU0NmEgMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMTUsNiArMTUsOCBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhdWRpb2ZsaW5nZXIgXAorCWxpYmF1ZGlvcG9saWN5IFwKKwlsaWJjYW1lcmFfbWV0YWRhdGFcCiAJbGliY2FtZXJhc2VydmljZSBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKIAlsaWJjdXRpbHMgXApAQCAtMzIsNiArMzQsNyBAQAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhbG9nIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZQogCiBMT0NBTF9NT0RVTEU6PSBtZWRpYXNlcnZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAppbmRleCBkNTIwN2Q1Li5hMzQ3OTUxIDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcApAQCAtMzcsNyArMzcsNyBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoraW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIqKiBhcmd2KQogewogICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcAppbmRleCAzNzVlZDlhLi5jNTAwOTAxIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCisrKyBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiTXRwUHJvcGVydHkiCiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKICNpbmNsdWRlICJNdHBEZWJ1Zy5oIgogI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCkBAIC0xOTAsOSArMTkxLDkgQEAKICAgICAgICAgICAgIGlmIChkZXZpY2VQcm9wKQogICAgICAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtQ3VycmVudFZhbHVlKTsKICAgICB9Ci0gICAgcGFja2V0LnB1dFVJbnQzMihtR3JvdXBDb2RlKTsKICAgICBpZiAoIWRldmljZVByb3ApCi0gICAgICAgIHBhY2tldC5wdXRVSW50OChtRm9ybUZsYWcpOworICAgICAgICBwYWNrZXQucHV0VUludDMyKG1Hcm91cENvZGUpOworICAgIHBhY2tldC5wdXRVSW50OChtRm9ybUZsYWcpOwogICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgewogICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NaW5pbXVtVmFsdWUpOwogICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NYXhpbXVtVmFsdWUpOwpAQCAtNTE4LDggKzUxOSwxNCBAQAogCiBNdHBQcm9wZXJ0eVZhbHVlKiBNdHBQcm9wZXJ0eTo6cmVhZEFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwgaW50JiBsZW5ndGgpIHsKICAgICBsZW5ndGggPSBwYWNrZXQuZ2V0VUludDMyKCk7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKQorICAgIC8vIEZhaWwgaWYgcmVzdWx0aW5nIGFycmF5IGlzIG92ZXIgMkdCLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBtYXhpbXVtIGFycmF5CisgICAgLy8gc2l6ZSBtYXkgYmUgbGVzcyB0aGFuIFNJWkVfTUFYIG9uIHNvbWUgcGxhdGZvcm1zLgorICAgIGlmICggQ0NfVU5MSUtFTFkoCisgICAgICAgICAgICBsZW5ndGggPT0gMCB8fAorICAgICAgICAgICAgbGVuZ3RoID49IElOVDMyX01BWCAvIHNpemVvZihNdHBQcm9wZXJ0eVZhbHVlKSkgKSB7CisgICAgICAgIGxlbmd0aCA9IDA7CiAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBNdHBQcm9wZXJ0eVZhbHVlKiByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHlWYWx1ZVtsZW5ndGhdOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCiAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIHJlc3VsdFtpXSk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCmluZGV4IDE1NWY2NDUuLjE1N2YyY2UgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC05NCw2ICs5NCw3IEBACiAgICAgTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVELAogICAgIE1UUF9FVkVOVF9TVE9SRV9BRERFRCwKICAgICBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCwKKyAgICBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwKIH07CiAKIE10cFNlcnZlcjo6TXRwU2VydmVyKGludCBmZCwgTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBib29sIHB0cCwKQEAgLTI2Miw2ICsyNjMsMTEgQEAKICAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX1NUT1JFX1JFTU9WRUQsIGlkKTsKIH0KIAordm9pZCBNdHBTZXJ2ZXI6OnNlbmREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICBBTE9HVigic2VuZERldmljZVByb3BlcnR5Q2hhbmdlZCAlZFxuIiwgcHJvcGVydHkpOworICAgIHNlbmRFdmVudChNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwgcHJvcGVydHkpOworfQorCiB2b2lkIE10cFNlcnZlcjo6c2VuZEV2ZW50KE10cEV2ZW50Q29kZSBjb2RlLCB1aW50MzJfdCBwYXJhbTEpIHsKICAgICBpZiAobVNlc3Npb25PcGVuKSB7CiAgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoY29kZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggZGZhODI1OC4uYjNhMTFlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMTA0LDYgKzEwNCw3IEBACiAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZERldmljZVByb3BlcnR5Q2hhbmdlZChNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSk7CiAKIHByaXZhdGU6CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kU3RvcmVBZGRlZChNdHBTdG9yYWdlSUQgaWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawppbmRleCBiODk1MDI3Li44ZDBhNzA1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawpAQCAtMTMsMTggKzEzLDI3IEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIFNlcnZpY2VVdGlsaXRpZXMuY3BwCisKKyMgRklYTUUgTW92ZSB0aGlzIGxpYnJhcnkgdG8gZnJhbWV3b3Jrcy9uYXRpdmUKK0xPQ0FMX01PRFVMRSA6PSBsaWJzZXJ2aWNldXRpbGl0eQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKICAgICBBdWRpb0ZsaW5nZXIuY3BwICAgICAgICAgICAgXAogICAgIFRocmVhZHMuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgVHJhY2tzLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICBFZmZlY3RzLmNwcCAgICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvTWl4ZXIuY3BwLmFybSAgICAgICAgICBcCi0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCAgICAgIFwKLSAgICBTZXJ2aWNlVXRpbGl0aWVzLmNwcCAgICAgICAgXAogCiBMT0NBTF9TUkNfRklMRVMgKz0gU3RhdGVRdWV1ZS5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKQEAgLTQ2LDEyICs1NSwxNCBAQAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGlic2NoZWR1bGluZ19wb2xpY3kgXAogICAgIGxpYmNwdXN0YXRzIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYnNlcnZpY2V1dGlsaXR5CiAKIExPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvZmxpbmdlcgogTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQogCiBMT0NBTF9TUkNfRklMRVMgKz0gRmFzdE1peGVyLmNwcCBGYXN0TWl4ZXJTdGF0ZS5jcHAgQXVkaW9XYXRjaGRvZy5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSBGYXN0VGhyZWFkLmNwcCBGYXN0VGhyZWFkU3RhdGUuY3BwCiAKIExPQ0FMX0NGTEFHUyArPSAtRFNUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPSciU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCInCiAKQEAgLTcyLDEwICs4MywyMSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotCXRlc3QtcmVzYW1wbGUuY3BwIAkJCVwKKyAgICB0ZXN0LXJlc2FtcGxlLmNwcCAgICAgICAgICAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYnNuZGZpbGUKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9yZXNhbXBsZXIgXAorICAgIGxpYmF1ZGlvdXRpbHMgXAorICAgIGxpYmRsIFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJsb2cKIAogTE9DQUxfTU9EVUxFOj0gdGVzdC1yZXNhbXBsZQogCkBAIC04OCw3ICsxMTAsOCBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogICAgIEF1ZGlvUmVzYW1wbGVyLmNwcC5hcm0gXAogICAgIEF1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwLmFybSBcCi0gICAgQXVkaW9SZXNhbXBsZXJTaW5jLmNwcC5hcm0KKyAgICBBdWRpb1Jlc2FtcGxlclNpbmMuY3BwLmFybSBcCisgICAgQXVkaW9SZXNhbXBsZXJEeW4uY3BwLmFybQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjdXRpbHMgXApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCBjMGMzNGY3Li43NTVkNDgwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMTA0LDYgKzEwNCwyNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK2NvbnN0IGNoYXIgKmZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHN3aXRjaChmb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fU1VCXzhfQklUOiByZXR1cm4gInBjbTgiOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9TVUJfMTZfQklUOiByZXR1cm4gInBjbTE2IjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fU1VCXzMyX0JJVDogcmV0dXJuICJwY20zMiI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX1NVQl84XzI0X0JJVDogcmV0dXJuICJwY204LjI0IjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fU1VCXzI0X0JJVF9QQUNLRUQ6IHJldHVybiAicGNtMjQiOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9TVUJfRkxPQVQ6IHJldHVybiAicGNtZmxvYXQiOworICAgIGNhc2UgQVVESU9fRk9STUFUX01QMzogcmV0dXJuICJtcDMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FNUl9OQjogcmV0dXJuICJhbXItbmIiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FNUl9XQjogcmV0dXJuICJhbXItd2IiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FBQzogcmV0dXJuICJhYWMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0hFX0FBQ19WMTogcmV0dXJuICJoZS1hYWMtdjEiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0hFX0FBQ19WMjogcmV0dXJuICJoZS1hYWMtdjIiOworICAgIGNhc2UgQVVESU9fRk9STUFUX1ZPUkJJUzogcmV0dXJuICJ2b3JiaXMiOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gInVua25vd24iOworfQorCiBzdGF0aWMgaW50IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQogewogICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7CkBAIC0xMzgsNiArMTU5LDcgQEAKIEF1ZGlvRmxpbmdlcjo6QXVkaW9GbGluZ2VyKCkKICAgICA6IEJuQXVkaW9GbGluZ2VyKCksCiAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2KE5VTEwpLAorICAgICAgbUF1ZGlvSHdEZXZzKE5VTEwpLAogICAgICAgbUhhcmR3YXJlU3RhdHVzKEFVRElPX0hXX0lETEUpLAogICAgICAgbU1hc3RlclZvbHVtZSgxLjBmKSwKICAgICAgIG1NYXN0ZXJNdXRlKGZhbHNlKSwKQEAgLTE1Miw3ICsxNzQsNyBAQAogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBib29sIGRvTG9nID0gKHByb3BlcnR5X2dldCgicm8udGVzdF9oYXJuZXNzIiwgdmFsdWUsICIwIikgPiAwKSAmJiAoYXRvaSh2YWx1ZSkgPT0gMSk7CiAgICAgaWYgKGRvTG9nKSB7Ci0gICAgICAgIG1Mb2dNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTG9nV3JpdGVycyIpOworICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiLCBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZKTsKICAgICB9CiAjaWZkZWYgVEVFX1NJTksKICAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJyby5kZWJ1Z2dhYmxlIiwgdmFsdWUsICIwIik7CkBAIC0xNjIsMTIgKzE4NCwxNiBAQAogICAgICAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJhZi50ZWUiLCB2YWx1ZSwgIjAiKTsKICAgICAgICAgdGVlRW5hYmxlZCA9IGF0b2kodmFsdWUpOwogICAgIH0KLSAgICBpZiAodGVlRW5hYmxlZCAmIDEpCisgICAgLy8gRklYTUUgc3ltYm9saWMgY29uc3RhbnRzIGhlcmUKKyAgICBpZiAodGVlRW5hYmxlZCAmIDEpIHsKICAgICAgICAgbVRlZVNpbmtJbnB1dEVuYWJsZWQgPSB0cnVlOwotICAgIGlmICh0ZWVFbmFibGVkICYgMikKKyAgICB9CisgICAgaWYgKHRlZUVuYWJsZWQgJiAyKSB7CiAgICAgICAgIG1UZWVTaW5rT3V0cHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiA0KQorICAgIH0KKyAgICBpZiAodGVlRW5hYmxlZCAmIDQpIHsKICAgICAgICAgbVRlZVNpbmtUcmFja0VuYWJsZWQgPSB0cnVlOworICAgIH0KICNlbmRpZgogfQogCkBAIC0yMTAsNiArMjM2LDE4IEBACiAgICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZShtQXVkaW9Id0RldnMudmFsdWVBdChpKS0+aHdEZXZpY2UoKSk7CiAgICAgICAgIGRlbGV0ZSBtQXVkaW9Id0RldnMudmFsdWVBdChpKTsKICAgICB9CisKKyAgICAvLyBUZWxsIG1lZGlhLmxvZyBzZXJ2aWNlIGFib3V0IGFueSBvbGQgd3JpdGVycyB0aGF0IHN0aWxsIG5lZWQgdG8gYmUgdW5yZWdpc3RlcmVkCisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmxvZyIpKTsKKyAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgc3A8SU1lZGlhTG9nU2VydmljZT4gbWVkaWFMb2dTZXJ2aWNlKGludGVyZmFjZV9jYXN0PElNZWRpYUxvZ1NlcnZpY2U+KGJpbmRlcikpOworICAgICAgICBmb3IgKHNpemVfdCBjb3VudCA9IG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnNpemUoKTsgY291bnQgPiAwOyBjb3VudC0tKSB7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBpTWVtb3J5KG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnRvcCgpLT5nZXRJTWVtb3J5KCkpOworICAgICAgICAgICAgbVVucmVnaXN0ZXJlZFdyaXRlcnMucG9wKCk7CisgICAgICAgICAgICBtZWRpYUxvZ1NlcnZpY2UtPnVucmVnaXN0ZXJXcml0ZXIoaU1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9CisKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdWRpb19pbnRlcmZhY2VzW10gPSB7CkBAIC0yNDksNyArMjg3LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0yNzEsMTcgKzMwOSwxNyBAQAogICAgIH0KIAogICAgIHJlc3VsdC5hcHBlbmQoIkdsb2JhbCBzZXNzaW9uIHJlZnM6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgc2Vzc2lvbiBwaWQgY291bnRcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgc2Vzc2lvbiAgIHBpZCBjb3VudFxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7IGkrKykgewogICAgICAgICBBdWRpb1Nlc3Npb25SZWYgKnIgPSBtQXVkaW9TZXNzaW9uUmVmc1tpXTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICU3ZCAlM2QgJTNkXG4iLCByLT5tU2Vzc2lvbmlkLCByLT5tUGlkLCByLT5tQ250KTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAlN2QgJTVkICU1ZFxuIiwgci0+bVNlc3Npb25pZCwgci0+bVBpZCwgci0+bUNudCk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB9CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwpAQCAtMjk2LDcgKzMzNCw3IEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwpAQCAtNDAzLDE2ICs0NDEsNDQgQEAKIAogc3A8TkJMb2c6OldyaXRlcj4gQXVkaW9GbGluZ2VyOjpuZXdXcml0ZXJfbChzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKKyAgICAvLyBJZiB0aGVyZSBpcyBubyBtZW1vcnkgYWxsb2NhdGVkIGZvciBsb2dzLCByZXR1cm4gYSBkdW1teSB3cml0ZXIgdGhhdCBkb2VzIG5vdGhpbmcKICAgICBpZiAobUxvZ01lbW9yeURlYWxlciA9PSAwKSB7CiAgICAgICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcigpOwogICAgIH0KLSAgICBzcDxJTWVtb3J5PiBzaGFyZWQgPSBtTG9nTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkpOwotICAgIHNwPE5CTG9nOjpXcml0ZXI+IHdyaXRlciA9IG5ldyBOQkxvZzo6V3JpdGVyKHNpemUsIHNoYXJlZCk7CiAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmxvZyIpKTsKLSAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhTG9nU2VydmljZT4oYmluZGVyKS0+cmVnaXN0ZXJXcml0ZXIoc2hhcmVkLCBzaXplLCBuYW1lKTsKKyAgICAvLyBTaW1pbGFybHkgaWYgd2UgY2FuJ3QgY29udGFjdCB0aGUgbWVkaWEubG9nIHNlcnZpY2UsIGFsc28gcmV0dXJuIGEgZHVtbXkgd3JpdGVyCisgICAgaWYgKGJpbmRlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcigpOwogICAgIH0KLSAgICByZXR1cm4gd3JpdGVyOworICAgIHNwPElNZWRpYUxvZ1NlcnZpY2U+IG1lZGlhTG9nU2VydmljZShpbnRlcmZhY2VfY2FzdDxJTWVkaWFMb2dTZXJ2aWNlPihiaW5kZXIpKTsKKyAgICBzcDxJTWVtb3J5PiBzaGFyZWQgPSBtTG9nTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkpOworICAgIC8vIElmIGFsbG9jYXRpb24gZmFpbHMsIGNvbnN1bHQgdGhlIHZlY3RvciBvZiBwcmV2aW91c2x5IHVucmVnaXN0ZXJlZCB3cml0ZXJzCisgICAgLy8gYW5kIGdhcmJhZ2UtY29sbGVjdCBvbmUgb3IgbW9yZSB0aGVtIHVudGlsIGFuIGFsbG9jYXRpb24gc3VjY2VlZHMKKyAgICBpZiAoc2hhcmVkID09IDApIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VbnJlZ2lzdGVyZWRXcml0ZXJzTG9jayk7CisgICAgICAgIGZvciAoc2l6ZV90IGNvdW50ID0gbVVucmVnaXN0ZXJlZFdyaXRlcnMuc2l6ZSgpOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBQaWNrIHRoZSBvbGRlc3Qgc3RhbGUgd3JpdGVyIHRvIGdhcmJhZ2UtY29sbGVjdAorICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IGlNZW1vcnkobVVucmVnaXN0ZXJlZFdyaXRlcnNbMF0tPmdldElNZW1vcnkoKSk7CisgICAgICAgICAgICAgICAgbVVucmVnaXN0ZXJlZFdyaXRlcnMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgbWVkaWFMb2dTZXJ2aWNlLT51bnJlZ2lzdGVyV3JpdGVyKGlNZW1vcnkpOworICAgICAgICAgICAgICAgIC8vIE5vdyB0aGUgbWVkaWEubG9nIHJlbW90ZSByZWZlcmVuY2UgdG8gSU1lbW9yeSBpcyBnb25lLiAgV2hlbiBvdXIgbGFzdCBsb2NhbAorICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byBJTWVtb3J5IGFsc28gZHJvcHMgdG8gemVybyBhdCBlbmQgb2YgdGhpcyBibG9jaywKKyAgICAgICAgICAgICAgICAvLyB0aGUgSU1lbW9yeSBkZXN0cnVjdG9yIHdpbGwgZGVhbGxvY2F0ZSB0aGUgcmVnaW9uIGZyb20gbUxvZ01lbW9yeURlYWxlci4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJlLWF0dGVtcHQgdGhlIGFsbG9jYXRpb24KKyAgICAgICAgICAgIHNoYXJlZCA9IG1Mb2dNZW1vcnlEZWFsZXItPmFsbG9jYXRlKE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKSk7CisgICAgICAgICAgICBpZiAoc2hhcmVkICE9IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRXZlbiBhZnRlciBnYXJiYWdlLWNvbGxlY3RpbmcgYWxsIG9sZCB3cml0ZXJzLCB0aGVyZSBpcyBzdGlsbCBub3QgZW5vdWdoIG1lbW9yeSwKKyAgICAgICAgLy8gc28gcmV0dXJuIGEgZHVtbXkgd3JpdGVyCisgICAgICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcigpOworICAgIH0KK3N1Y2Nlc3M6CisgICAgbWVkaWFMb2dTZXJ2aWNlLT5yZWdpc3RlcldyaXRlcihzaGFyZWQsIHNpemUsIG5hbWUpOworICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcihzaXplLCBzaGFyZWQpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6dW5yZWdpc3RlcldyaXRlcihjb25zdCBzcDxOQkxvZzo6V3JpdGVyPiYgd3JpdGVyKQpAQCAtNDI0LDEzICs0OTAsMTAgQEAKICAgICBpZiAoaU1lbW9yeSA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmxvZyIpKTsKLSAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhTG9nU2VydmljZT4oYmluZGVyKS0+dW5yZWdpc3RlcldyaXRlcihpTWVtb3J5KTsKLSAgICAgICAgLy8gTm93IHRoZSBtZWRpYS5sb2cgcmVtb3RlIHJlZmVyZW5jZSB0byBJTWVtb3J5IGlzIGdvbmUuCi0gICAgICAgIC8vIFdoZW4gb3VyIGxhc3QgbG9jYWwgcmVmZXJlbmNlIHRvIElNZW1vcnkgYWxzbyBkcm9wcyB0byB6ZXJvLAotICAgICAgICAvLyB0aGUgSU1lbW9yeSBkZXN0cnVjdG9yIHdpbGwgZGVhbGxvY2F0ZSB0aGUgcmVnaW9uIGZyb20gbU1lbW9yeURlYWxlci4KLSAgICB9CisgICAgLy8gUmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlIHdyaXRlciBpbW1lZGlhdGVseSwgYXBwZW5kIGl0IHRvIGEgcXVldWUgb2Ygb2xkIHdyaXRlcnMgdG8KKyAgICAvLyBiZSBnYXJiYWdlLWNvbGxlY3RlZCBsYXRlci4gIFRoaXMgYWxsb3dzIHVzIHRvIGNvbnRpbnVlIHRvIHZpZXcgb2xkIGxvZ3MgZm9yIGEgd2hpbGUuCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VbnJlZ2lzdGVyZWRXcml0ZXJzTG9jayk7CisgICAgbVVucmVnaXN0ZXJlZFdyaXRlcnMucHVzaCh3cml0ZXIpOwogfQogCiAvLyBJQXVkaW9GbGluZ2VyIGludGVyZmFjZQpAQCAtNDQxLDEzICs1MDQsMTIgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCAqZnJhbWVDb3VudCwKICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICBpbnQgKnNlc3Npb25JZCwKLSAgICAgICAgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKQEAgLTQ2NSwxMCArNTI3LDMxIEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICAvLyBmdXJ0aGVyIHNhbXBsZSByYXRlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVRyYWNrX2woKSBkZXBlbmRpbmcgb24gdGhlIHRocmVhZCB0eXBlCisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIHNhbXBsZSByYXRlICV1Iiwgc2FtcGxlUmF0ZSk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBmdXJ0aGVyIGNoYW5uZWwgbWFzayBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVUcmFja19sKCkgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWQgdHlwZQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKwogICAgIC8vIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgY29udmVyc2lvbiBvZiA4LWJpdCBQQ00gdG8gMTYtYml0IFBDTSwKICAgICAvLyBhbmQgd2UgZG9uJ3QgeWV0IHN1cHBvcnQgOC4yNCBvciAzMi1iaXQgUENNCi0gICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBmb3JtYXQgJWQiLCBmb3JtYXQpOworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwKKyAgICAgICAgICAgIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwICYmIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgc2hhcmVkQnVmZmVyIGlzIG5vbi0wIGJ1dCBoYXMgTlVMTCBwb2ludGVyKCkiKTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KQEAgLTQ3Niw3ICs1NTksNiBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOwotICAgICAgICBQbGF5YmFja1RocmVhZCAqZWZmZWN0VGhyZWFkID0gTlVMTDsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgibm8gcGxheWJhY2sgdGhyZWFkIGZvdW5kIGZvciBvdXRwdXQgaGFuZGxlICVkIiwgb3V0cHV0KTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CkBAIC00ODQsMjQgKzU2NiwyMyBAQAogICAgICAgICB9CiAKICAgICAgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotCiAgICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkX2wocGlkKTsKIAotICAgICAgICBBTE9HVigiY3JlYXRlVHJhY2soKSBzZXNzaW9uSWQ6ICVkIiwgKHNlc3Npb25JZCA9PSBOVUxMKSA/IC0yIDogKnNlc3Npb25JZCk7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBQbGF5YmFja1RocmVhZCAqZWZmZWN0VGhyZWFkID0gTlVMTDsKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgeworICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CiAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbiBlZmZlY3QgY2hhaW4gd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGlzIHByZXNlbnQgb24gYW5vdGhlcgogICAgICAgICAgICAgLy8gb3V0cHV0IHRocmVhZCBhbmQgbW92ZSBpdCBoZXJlLgogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IHQgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSkgIT0gb3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25zID0gdC0+aGFzQXVkaW9TZXNzaW9uKCpzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXNzaW9ucyA9IHQtPmhhc0F1ZGlvU2Vzc2lvbihsU2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25zICYgUGxheWJhY2tUaHJlYWQ6OkVGRkVDVF9TRVNTSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RUaHJlYWQgPSB0LmdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGlmIG5vIGF1ZGlvIHNlc3Npb24gaWQgaXMgcHJvdmlkZWQsIGNyZWF0ZSBvbmUgaGVyZQogICAgICAgICAgICAgbFNlc3Npb25JZCA9IG5leHRVbmlxdWVJZCgpOwpAQCAtNTE5LDYgKzYwMCw3IEBACiAgICAgICAgIC8vIG1vdmUgZWZmZWN0IGNoYWluIHRvIHRoaXMgb3V0cHV0IHRocmVhZCBpZiBhbiBlZmZlY3Qgb24gc2FtZSBzZXNzaW9uIHdhcyB3YWl0aW5nCiAgICAgICAgIC8vIGZvciBhIHRyYWNrIHRvIGJlIGNyZWF0ZWQKICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IgJiYgZWZmZWN0VGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIG5vIHJpc2sgb2YgZGVhZGxvY2sgYmVjYXVzZSBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGlzIGhlbGQKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfZGwodGhyZWFkLT5tTG9jayk7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX3NsKGVmZmVjdFRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgbW92ZUVmZmVjdENoYWluX2wobFNlc3Npb25JZCwgZWZmZWN0VGhyZWFkLCB0aHJlYWQsIHRydWUpOwpAQCAtNTM4LDIzICs2MjAsMjIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgLy8gcyBmb3Igc2VydmVyJ3MgcGlkLCBuIGZvciBub3JtYWwgbWl4ZXIgbmFtZSwgZiBmb3IgZmFzdCBpbmRleAotICAgICAgICBuYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJzOiVkO246JWQ7ZjolZCIsIGdldHBpZF9jYWNoZWQsIHRyYWNrLT5uYW1lKCkgLSBBdWRpb01peGVyOjpUUkFDSzAsCi0gICAgICAgICAgICAgICAgdHJhY2stPmZhc3RJbmRleCgpKTsKLSAgICAgICAgdHJhY2tIYW5kbGUgPSBuZXcgVHJhY2tIYW5kbGUodHJhY2spOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCBiZWZvcmUgZGVsZXRpbmcgdGhlIFRyYWNrIHNvIHRoYXQgdGhlIENsaWVudAotICAgICAgICAvLyBkZXN0cnVjdG9yIGlzIGNhbGxlZCBieSB0aGUgVHJhY2tCYXNlIGRlc3RydWN0b3Igd2l0aCBtTG9jayBoZWxkCi0gICAgICAgIGNsaWVudC5jbGVhcigpOwotICAgICAgICB0cmFjay5jbGVhcigpOworCiAgICAgfQogCi1FeGl0OgotICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewotICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKKyAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBUcmFjayBzbyB0aGF0IHRoZQorICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBpcyBjYWxsZWQgYnkgdGhlIFRyYWNrQmFzZSBkZXN0cnVjdG9yIHdpdGggbUxvY2sgaGVsZAorICAgICAgICBjbGllbnQuY2xlYXIoKTsKKyAgICAgICAgdHJhY2suY2xlYXIoKTsKKyAgICAgICAgZ290byBFeGl0OwogICAgIH0KKworICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CisgICAgdHJhY2tIYW5kbGUgPSBuZXcgVHJhY2tIYW5kbGUodHJhY2spOworCitFeGl0OgorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFja0hhbmRsZTsKIH0KIApAQCAtNzk2LDcgKzg3Nyw3IEBACiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IE5VTEw7Ci0gICAgaWYgKG91dHB1dCkgeworICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTg0NSw3ICs5MjYsNyBAQAogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGZsb2F0IHZvbHVtZTsKLSAgICBpZiAob3V0cHV0KSB7CisgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIDAuMGY7CkBAIC04NzgsOCArOTU5LDggQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIC8vIGlvSGFuZGxlID09IDAgbWVhbnMgdGhlIHBhcmFtZXRlcnMgYXJlIGdsb2JhbCB0byB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlCi0gICAgaWYgKGlvSGFuZGxlID09IDApIHsKKyAgICAvLyBBVURJT19JT19IQU5ETEVfTk9ORSBtZWFucyB0aGUgcGFyYW1ldGVycyBhcmUgZ2xvYmFsIHRvIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UKKyAgICBpZiAoaW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgc3RhdHVzX3QgZmluYWxfcmVzdWx0ID0gTk9fRVJST1I7CiAgICAgICAgIHsKQEAgLTk2MSw3ICsxMDQyLDcgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBpZiAoaW9IYW5kbGUgPT0gMCkgeworICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBTdHJpbmc4IG91dF9zODsKIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgewpAQCAtMTIxMiw3ICsxMjkzLDcgQEAKIHsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok5vdGlmaWNhdGlvbkNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok5vdGlmaWNhdGlvbkNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4ga2VlcCh0aGlzKTsKICAgICBtQXVkaW9GbGluZ2VyLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVBpZCk7CkBAIC0xMjMwLDcgKzEzMTEsNyBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90ICpmcmFtZUNvdW50LAogICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICBpbnQgKnNlc3Npb25JZCwKQEAgLTEyNDAsOCArMTMyMSw2IEBACiAgICAgc3A8UmVjb3JkSGFuZGxlPiByZWNvcmRIYW5kbGU7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQ7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKLSAgICBSZWNvcmRUaHJlYWQgKnRocmVhZDsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50OwogICAgIGludCBsU2Vzc2lvbklkOwogCiAgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucwpAQCAtMTI1MSwxNiArMTMzMCwzMSBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgZm9ybWF0ICVkIiwgZm9ybWF0KTsKKyAgICAvLyBmdXJ0aGVyIHNhbXBsZSByYXRlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVJlY29yZFRyYWNrX2woKQorICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBpbnZhbGlkIHNhbXBsZSByYXRlICV1Iiwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyBhZGQgY2xpZW50IHRvIGxpc3QKLSAgICB7IC8vIHNjb3BlIGZvciBtTG9jaworICAgIC8vIHdlIGRvbid0IHlldCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gMTYtYml0IFBDTQorICAgIGlmICghKGF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpICYmCisgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSkgeworICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBmdXJ0aGVyIGNoYW5uZWwgbWFzayBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVSZWNvcmRUcmFja19sKCkKKyAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgaW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICB0aHJlYWQgPSBjaGVja1JlY29yZFRocmVhZF9sKGlucHV0KTsKKyAgICAgICAgUmVjb3JkVGhyZWFkICp0aHJlYWQgPSBjaGVja1JlY29yZFRocmVhZF9sKGlucHV0KTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGNoZWNrUmVjb3JkVGhyZWFkX2wgZmFpbGVkIik7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtMTI3NywxNyArMTM3MSwxNyBAQAogICAgICAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkX2wocGlkKTsKIAotICAgICAgICAvLyBJZiBubyBhdWRpbyBzZXNzaW9uIGlkIGlzIHByb3ZpZGVkLCBjcmVhdGUgb25lIGhlcmUKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gbmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqc2Vzc2lvbklkID0gbFNlc3Npb25JZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBjcmVhdGUgbmV3IHJlY29yZCB0cmFjay4KLSAgICAgICAgLy8gVGhlIHJlY29yZCB0cmFjayB1c2VzIG9uZSB0cmFjayBpbiBtSGFyZHdhcmVNaXhlclRocmVhZCBieSBjb252ZW50aW9uLgorICAgICAgICBBTE9HVigib3BlblJlY29yZCgpIGxTZXNzaW9uSWQ6ICVkIiwgbFNlc3Npb25JZCk7CisKICAgICAgICAgLy8gVE9ETzogdGhlIHVpZCBzaG91bGQgYmUgcGFzc2VkIGluIGFzIGEgcGFyYW1ldGVyIHRvIG9wZW5SZWNvcmQKICAgICAgICAgcmVjb3JkVHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVJlY29yZFRyYWNrX2woY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBsU2Vzc2lvbklkLApAQCAtMTI5NSw2ICsxMzg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHRpZCwgJmxTdGF0dXMpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChsU3RhdHVzID09IE5PX0VSUk9SKSAmJiAocmVjb3JkVHJhY2sgPT0gMCkpOwogICAgIH0KKwogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCBiZWZvcmUgZGVsZXRpbmcgdGhlIFJlY29yZFRyYWNrIHNvIHRoYXQgdGhlCiAgICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIGlzIGNhbGxlZCBieSB0aGUgVHJhY2tCYXNlIGRlc3RydWN0b3Igd2l0aCBtTG9jayBoZWxkCkBAIC0xMzAzLDE0ICsxMzk4LDExIEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyByZXR1cm4gdG8gaGFuZGxlIHRvIGNsaWVudAorICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CiAgICAgcmVjb3JkSGFuZGxlID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7Ci0gICAgbFN0YXR1cyA9IE5PX0VSUk9SOwogCiBFeGl0OgotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiByZWNvcmRIYW5kbGU7CiB9CiAKQEAgLTE0NTEsMTggKzE1NDMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCiB7Ci0gICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IE5VTEw7CiAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyBjb25maWc7CisgICAgbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSAocFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSA/ICpwU2FtcGxpbmdSYXRlIDogMDsKICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gKHBDaGFubmVsTWFzayAhPSBOVUxMKSA/ICpwQ2hhbm5lbE1hc2sgOiAwOwogICAgIGNvbmZpZy5mb3JtYXQgPSAocEZvcm1hdCAhPSBOVUxMKSA/ICpwRm9ybWF0IDogQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgaWYgKG9mZmxvYWRJbmZvKSB7CisgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKICAgICB9CiAKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm91dFN0cmVhbSA9IE5VTEw7Ci0gICAgQXVkaW9Id0RldmljZSAqb3V0SHdEZXY7Ci0KICAgICBBTE9HVigib3Blbk91dHB1dCgpLCBtb2R1bGUgJWQgRGV2aWNlICV4LCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgQ2hhbm5lbHMgJXgsIGZsYWdzICV4IiwKICAgICAgICAgICAgICAgbW9kdWxlLAogICAgICAgICAgICAgICAocERldmljZXMgIT0gTlVMTCkgPyAqcERldmljZXMgOiAwLApAQCAtMTQ3MSwyMyArMTU2MCwyNSBAQAogICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrLAogICAgICAgICAgICAgICBmbGFncyk7CiAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSwgb2ZmbG9hZEluZm8gJXAgdmVyc2lvbiAweCUwNHgiLAotICAgICAgICAgIG9mZmxvYWRJbmZvLCBvZmZsb2FkSW5mbyA9PSBOVUxMID8gLTEgOiBvZmZsb2FkSW5mby0+dmVyc2lvbiApOworICAgICAgICAgIG9mZmxvYWRJbmZvLCBvZmZsb2FkSW5mbyA9PSBOVUxMID8gLTEgOiBvZmZsb2FkSW5mby0+dmVyc2lvbik7CiAKLSAgICBpZiAocERldmljZXMgPT0gTlVMTCB8fCAqcERldmljZXMgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocERldmljZXMgPT0gTlVMTCB8fCAqcERldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBvdXRId0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCAqcERldmljZXMpOwotICAgIGlmIChvdXRId0RldiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKKyAgICBBdWRpb0h3RGV2aWNlICpvdXRId0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCAqcERldmljZXMpOworICAgIGlmIChvdXRId0RldiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CiAKICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZIYWwgPSBvdXRId0Rldi0+aHdEZXZpY2UoKTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCA9IG5leHRVbmlxdWVJZCgpOwogCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfT1VUUFVUX09QRU47CiAKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm91dFN0cmVhbSA9IE5VTEw7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaHdEZXZIYWwtPm9wZW5fb3V0cHV0X3N0cmVhbShod0RldkhhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXZpY2VzLApAQCAtMTUwNyw2ICsxNTk4LDcgQEAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG91dFN0cmVhbSAhPSBOVUxMKSB7CiAgICAgICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXQgPSBuZXcgQXVkaW9TdHJlYW1PdXQob3V0SHdEZXYsIG91dFN0cmVhbSwgZmxhZ3MpOwogCisgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQ7CiAgICAgICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKICAgICAgICAgICAgIHRocmVhZCA9IG5ldyBPZmZsb2FkVGhyZWFkKHRoaXMsIG91dHB1dCwgaWQsICpwRGV2aWNlcyk7CiAgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dCgpIGNyZWF0ZWQgb2ZmbG9hZCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwpAQCAtMTU1MCw3ICsxNjQyLDcgQEAKICAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKIH0KIAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCkBAIC0xNTYzLDcgKzE2NTUsNyBAQAogICAgIGlmICh0aHJlYWQxID09IE5VTEwgfHwgdGhyZWFkMiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJvcGVuRHVwbGljYXRlT3V0cHV0KCkgd3Jvbmcgb3V0cHV0IG1peGVyIHR5cGUgZm9yIG91dHB1dCAlZCBvciAlZCIsIG91dHB1dDEsCiAgICAgICAgICAgICAgICAgb3V0cHV0Mik7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgfQogCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSBuZXh0VW5pcXVlSWQoKTsKQEAgLTE2NzQsMzUgKzE3NjYsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgUmVjb3JkVGhyZWFkICp0aHJlYWQgPSBOVUxMOwogICAgIHN0cnVjdCBhdWRpb19jb25maWcgY29uZmlnOworICAgIG1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CiAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgPyAqcFNhbXBsaW5nUmF0ZSA6IDA7CiAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgPyAqcENoYW5uZWxNYXNrIDogMDsKICAgICBjb25maWcuZm9ybWF0ID0gKHBGb3JtYXQgIT0gTlVMTCkgPyAqcEZvcm1hdCA6IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwogCiAgICAgdWludDMyX3QgcmVxU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwogICAgIGF1ZGlvX2Zvcm1hdF90IHJlcUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcmVxQ2hhbm5lbHMgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICppblN0cmVhbSA9IE5VTEw7Ci0gICAgQXVkaW9Id0RldmljZSAqaW5Id0RldjsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCByZXFDaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CiAKLSAgICBpZiAocERldmljZXMgPT0gTlVMTCB8fCAqcERldmljZXMgPT0gMCkgeworICAgIGlmIChwRGV2aWNlcyA9PSBOVUxMIHx8ICpwRGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCAqcERldmljZXMpOwotICAgIGlmIChpbkh3RGV2ID09IE5VTEwpCisgICAgQXVkaW9Id0RldmljZSAqaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCAqcERldmljZXMpOworICAgIGlmIChpbkh3RGV2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmluSHdIYWwgPSBpbkh3RGV2LT5od0RldmljZSgpOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkID0gbmV4dFVuaXF1ZUlkKCk7CiAKLSAgICBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuX2lucHV0X3N0cmVhbShpbkh3SGFsLCBpZCwgKnBEZXZpY2VzLCAmY29uZmlnLAorICAgIGF1ZGlvX3N0cmVhbV9pbl90ICppblN0cmVhbSA9IE5VTEw7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgaWQsICpwRGV2aWNlcywgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHJlYW0pOwotICAgIEFMT0dWKCJvcGVuSW5wdXQoKSBvcGVuSW5wdXRTdHJlYW0gcmV0dXJuZWQgaW5wdXQgJXAsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICVkLCBDaGFubmVscyAleCwgIgorICAgIEFMT0dWKCJvcGVuSW5wdXQoKSBvcGVuSW5wdXRTdHJlYW0gcmV0dXJuZWQgaW5wdXQgJXAsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICUjeCwgQ2hhbm5lbHMgJXgsICIKICAgICAgICAgICAgICJzdGF0dXMgJWQiLAogICAgICAgICAgICAgaW5TdHJlYW0sCiAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCkBAIC0xNzE2LDEwICsxODA3LDEyIEBACiAgICAgaWYgKHN0YXR1cyA9PSBCQURfVkFMVUUgJiYKICAgICAgICAgcmVxRm9ybWF0ID09IGNvbmZpZy5mb3JtYXQgJiYgY29uZmlnLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgogICAgICAgICAoY29uZmlnLnNhbXBsZV9yYXRlIDw9IDIgKiByZXFTYW1wbGluZ1JhdGUpICYmCi0gICAgICAgIChwb3Bjb3VudChjb25maWcuY2hhbm5lbF9tYXNrKSA8PSBGQ0NfMikgJiYgKHBvcGNvdW50KHJlcUNoYW5uZWxzKSA8PSBGQ0NfMikpIHsKKyAgICAgICAgKHBvcGNvdW50KGNvbmZpZy5jaGFubmVsX21hc2spIDw9IEZDQ18yKSAmJiAocG9wY291bnQocmVxQ2hhbm5lbE1hc2spIDw9IEZDQ18yKSkgeworICAgICAgICAvLyBGSVhNRSBkZXNjcmliZSB0aGUgY2hhbmdlIHByb3Bvc2VkIGJ5IEhBTCAoc2F2ZSBvbGQgdmFsdWVzIHNvIHdlIGNhbiBsb2cgdGhlbSBoZXJlKQogICAgICAgICBBTE9HVigib3BlbklucHV0KCkgcmVvcGVuaW5nIHdpdGggcHJvcG9zZWQgc2FtcGxpbmcgcmF0ZSBhbmQgY2hhbm5lbCBtYXNrIik7CiAgICAgICAgIGluU3RyZWFtID0gTlVMTDsKICAgICAgICAgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgaWQsICpwRGV2aWNlcywgJmNvbmZpZywgJmluU3RyZWFtKTsKKyAgICAgICAgLy8gRklYTUUgbG9nIHRoaXMgbmV3IHN0YXR1czsgSEFMIHNob3VsZCBub3QgcHJvcG9zZSBhbnkgZnVydGhlciBjaGFuZ2VzCiAgICAgfQogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBpblN0cmVhbSAhPSBOVUxMKSB7CkBAIC0xNzM3LDEzICsxODMwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wY291bnQoaW5TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJmluU3RyZWFtLT5jb21tb24pKSk7CiAgICAgICAgIGlmICghbVRlZVNpbmtJbnB1dEVuYWJsZWQpIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpIHsKKyAgICAgICAgfSBlbHNlIGlmICghRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwogICAgICAgICB9IGVsc2UgaWYgKG1SZWNvcmRUZWVTaW5rID09IDApIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19ORVc7CiAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmstPmdldFN0cm9uZ0NvdW50KCkgIT0gMSkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIG1SZWNvcmRUZWVTaW5rLT5mb3JtYXQoKSkpIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19PTEQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTkVXOwpAQCAtMTc3OCwxMCArMTg3MSw4IEBACiAgICAgICAgIC8vIFN0YXJ0IHJlY29yZCB0aHJlYWQKICAgICAgICAgLy8gUmVjb3JkVGhyZWFkIHJlcXVpcmVzIGJvdGggaW5wdXQgYW5kIG91dHB1dCBkZXZpY2UgaW5kaWNhdGlvbiB0byBmb3J3YXJkIHRvIGF1ZGlvCiAgICAgICAgIC8vIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKLSAgICAgICAgdGhyZWFkID0gbmV3IFJlY29yZFRocmVhZCh0aGlzLAorICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCA9IG5ldyBSZWNvcmRUaHJlYWQodGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXZpY2VzCkBAIC0xNzk4LDcgKzE4ODksNyBAQAogICAgICAgICAgICAgKnBGb3JtYXQgPSBjb25maWcuZm9ybWF0OwogICAgICAgICB9CiAgICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBDaGFubmVsTWFzayA9IHJlcUNoYW5uZWxzOworICAgICAgICAgICAgKnBDaGFubmVsTWFzayA9IHJlcUNoYW5uZWxNYXNrOwogICAgICAgICB9CiAKICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBpbnB1dCBjcmVhdGlvbgpAQCAtMTg0MywxMCArMTkzNCwxMCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRTdHJlYW1PdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6aW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dWKCJzZXRTdHJlYW1PdXRwdXQoKSBzdHJlYW0gJWQgdG8gb3V0cHV0ICVkIiwgc3RyZWFtLCBvdXRwdXQpOworICAgIEFMT0dWKCJpbnZhbGlkYXRlU3RyZWFtKCkgc3RyZWFtICVkIiwgc3RyZWFtKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLmdldCgpOwpAQCAtMTg2MiwxOCArMTk1MywyMSBAQAogICAgIHJldHVybiBuZXh0VW5pcXVlSWQoKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQordm9pZCBBdWRpb0ZsaW5nZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgQUxPR1YoImFjcXVpcmluZyAlZCBmcm9tICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOworICAgIEFMT0dWKCJhY3F1aXJpbmcgJWQgZnJvbSAlZCwgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7CisgICAgaWYgKHBpZCAhPSAtMSAmJiAoY2FsbGVyID09IGdldHBpZF9jYWNoZWQpKSB7CisgICAgICAgIGNhbGxlciA9IHBpZDsKKyAgICB9CiAKICAgICAvLyBJZ25vcmUgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBwcm9jZXNzZXMgbm90IGtub3duIGFzIG5vdGlmaWNhdGlvbiBjbGllbnQuIFRoZSByZXF1ZXN0CiAgICAgLy8gaXMgbGlrZWx5IHByb3hpZWQgYnkgbWVkaWFzZXJ2ZXIgKGUuZyBDYW1lcmFTZXJ2aWNlKSBhbmQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKCkgY2FuIGJlCiAgICAgLy8gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcGlkIGxlYXZpbmcgYSBzdGFsZSBzZXNzaW9uIHJlZmVyZW5jZS4gIEFsc28gd2UgZG9uJ3Qga25vdyBob3cKICAgICAvLyB0byBjbGVhciB0aGlzIHJlZmVyZW5jZSBpZiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KICAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleShjYWxsZXIpIDwgMCkgewotICAgICAgICBBTE9HVigiYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKCkgdW5rbm93biBjbGllbnQgJWQgZm9yIHNlc3Npb24gJWQiLCBjYWxsZXIsIGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIEFMT0dXKCJhY3F1aXJlQXVkaW9TZXNzaW9uSWQoKSB1bmtub3duIGNsaWVudCAlZCBmb3Igc2Vzc2lvbiAlZCIsIGNhbGxlciwgYXVkaW9TZXNzaW9uKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTg5MCwxMSArMTk4NCwxNCBAQAogICAgIEFMT0dWKCIgYWRkZWQgbmV3IGVudHJ5IGZvciAlZCIsIGF1ZGlvU2Vzc2lvbik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikKK3ZvaWQgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIEFMT0dWKCJyZWxlYXNpbmcgJWQgZnJvbSAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKKyAgICBBTE9HVigicmVsZWFzaW5nICVkIGZyb20gJWQgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7CisgICAgaWYgKHBpZCAhPSAtMSAmJiAoY2FsbGVyID09IGdldHBpZF9jYWNoZWQpKSB7CisgICAgICAgIGNhbGxlciA9IHBpZDsKKyAgICB9CiAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaTwgbnVtOyBpKyspIHsKICAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyZWYgPSBtQXVkaW9TZXNzaW9uUmVmcy5pdGVtQXQoaSk7CkBAIC0xOTU2LDcgKzIwNTMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCAodC0+bUxvY2spOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHQtPm1Mb2NrKTsKICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgZWZmZWN0cyBmcm9tIHRoZSBjaGFpbgogICAgICAgICAgICAgd2hpbGUgKGVjLT5tRWZmZWN0cy5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IGVjLT5tRWZmZWN0c1swXTsKQEAgLTE5OTMsNyArMjA5MCw3IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6bmV4dFVuaXF1ZUlkKCkKIHsKLSAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKKyAgICByZXR1cm4gKHVpbnQzMl90KSBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOwogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpBdWRpb0ZsaW5nZXI6OnByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkgY29uc3QKQEAgLTIwMjMsNyArMjEyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdGVuZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19ldmVudF9jYWxsYmFja190IGNhbGxCYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8UmVmQmFzZT4gY29va2llKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKQEAgLTIxODUsNyArMjI4Miw3IEBACiAKICAgICAgICAgLy8gcmV0dXJuIGVmZmVjdCBkZXNjcmlwdG9yCiAgICAgICAgICpwRGVzYyA9IGRlc2M7Ci0gICAgICAgIGlmIChpbyA9PSAwICYmIHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FICYmIHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKICAgICAgICAgICAgIC8vIGlmIHRoZSBvdXRwdXQgcmV0dXJuZWQgYnkgZ2V0T3V0cHV0Rm9yRWZmZWN0KCkgaXMgcmVtb3ZlZCBiZWZvcmUgd2UgbG9jayB0aGUKICAgICAgICAgICAgIC8vIG11dGV4IGJlbG93LCB0aGUgY2FsbCB0byBjaGVja1BsYXliYWNrVGhyZWFkX2woaW8pIGJlbG93IHdpbGwgZGV0ZWN0IGl0CiAgICAgICAgICAgICAvLyBhbmQgd2Ugd2lsbCBleGl0IHNhZmVseQpAQCAtMjIwMCw3ICsyMjk3LDcgQEAKICAgICAgICAgLy8gSWYgb3V0cHV0IGlzIDAgaGVyZSwgc2Vzc2lvbklkIGlzIG5laXRoZXIgU0VTU0lPTl9PVVRQVVRfU1RBR0Ugbm9yIFNFU1NJT05fT1VUUFVUX01JWAogICAgICAgICAvLyBiZWNhdXNlIG9mIGNvZGUgY2hlY2tpbmcgb3V0cHV0IHdoZW4gZW50ZXJpbmcgdGhlIGZ1bmN0aW9uLgogICAgICAgICAvLyBOb3RlOiBpbyBpcyBuZXZlciAwIHdoZW4gY3JlYXRpbmcgYW4gZWZmZWN0IG9uIGFuIGlucHV0Ci0gICAgICAgIGlmIChpbyA9PSAwKSB7CisgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgewogICAgICAgICAgICAgICAgIC8vIG91dHB1dCBtdXN0IGJlIHNwZWNpZmllZCBieSBBdWRpb1BvbGljeU1hbmFnZXIgd2hlbiB1c2luZyBzZXNzaW9uCiAgICAgICAgICAgICAgICAgLy8gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UKQEAgLTIyMjUsNyArMjMyMiw3IEBACiAgICAgICAgICAgICAvLyBJZiBubyBvdXRwdXQgdGhyZWFkIGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCwgZGVmYXVsdCB0bwogICAgICAgICAgICAgLy8gZmlyc3Qgb3V0cHV0LiBUaGUgZWZmZWN0IGNoYWluIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNvcnJlY3Qgb3V0cHV0CiAgICAgICAgICAgICAvLyB0aHJlYWQgd2hlbiBhIHRyYWNrIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRCBpcyBjcmVhdGVkCi0gICAgICAgICAgICBpZiAoaW8gPT0gMCAmJiBtUGxheWJhY2tUaHJlYWRzLnNpemUoKSkgeworICAgICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FICYmIG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgICAgIGlvID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdCgwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVFZmZlY3QoKSBnb3QgaW8gJWQgZm9yIGVmZmVjdCAlcyIsIGlvLCBkZXNjLm5hbWUpOwpAQCAtMjI1MSw5ICsyMzQ4LDcgQEAKICAgICB9CiAKIEV4aXQ6Ci0gICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggNzMyMDE0NC4uZWMzMmVkZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtNjAsOCArNjAsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKLWNsYXNzIGVmZmVjdF9wYXJhbV9jYmxrX3Q7CitzdHJ1Y3QgYXVkaW9fdHJhY2tfY2Jsa190Oworc3RydWN0IGVmZmVjdF9wYXJhbV9jYmxrX3Q7CiBjbGFzcyBBdWRpb01peGVyOwogY2xhc3MgQXVkaW9CdWZmZXI7CiBjbGFzcyBBdWRpb1Jlc2FtcGxlcjsKQEAgLTEwMiwyNiArMTAyLDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLyk7CiAKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CkBAIC0xODIsNyArMTgxLDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwogCkBAIC0xOTMsOSArMTkyLDkgQEAKIAogICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pOworICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKIAotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbik7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpIGNvbnN0OwogCkBAIC0yMTAsNyArMjA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKTsKIApAQCAtMjM1LDggKzIzNCwxMiBAQAogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgbmV3V3JpdGVyX2woc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgdW5yZWdpc3RlcldyaXRlcihjb25zdCBzcDxOQkxvZzo6V3JpdGVyPiYgd3JpdGVyKTsKIHByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTG9nTWVtb3J5U2l6ZSA9IDEwICogMTAyNDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtMb2dNZW1vcnlTaXplID0gNDAgKiAxMDI0OwogICAgIHNwPE1lbW9yeURlYWxlcj4gICAgbUxvZ01lbW9yeURlYWxlcjsgICAvLyA9PSAwIHdoZW4gTkJMb2cgaXMgZGlzYWJsZWQKKyAgICAvLyBXaGVuIGEgbG9nIHdyaXRlciBpcyB1bnJlZ2lzdGVyZWQsIGl0IGlzIGRvbmUgbGF6aWx5IHNvIHRoYXQgbWVkaWEubG9nIGNhbiBjb250aW51ZSB0byBzZWUgaXQKKyAgICAvLyBmb3IgYXMgbG9uZyBhcyBwb3NzaWJsZS4gIFRoZSBtZW1vcnkgaXMgb25seSBmcmVlZCB3aGVuIGl0IGlzIG5lZWRlZCBmb3IgYW5vdGhlciBsb2cgd3JpdGVyLgorICAgIFZlY3Rvcjwgc3A8TkJMb2c6OldyaXRlcj4gPiBtVW5yZWdpc3RlcmVkV3JpdGVyczsKKyAgICBNdXRleCAgICAgICAgICAgICAgIG1VbnJlZ2lzdGVyZWRXcml0ZXJzTG9jazsKIHB1YmxpYzoKIAogICAgIGNsYXNzIFN5bmNFdmVudDsKQEAgLTI0OSw3ICsyNTIsNyBAQAogICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgaW50IGxpc3RlbmVyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgIHN5bmNfZXZlbnRfY2FsbGJhY2tfdCBjYWxsQmFjaywKLSAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKKyAgICAgICAgICAgICAgICAgIHdwPFJlZkJhc2U+IGNvb2tpZSkKICAgICAgICAgOiBtVHlwZSh0eXBlKSwgbVRyaWdnZXJTZXNzaW9uKHRyaWdnZXJTZXNzaW9uKSwgbUxpc3RlbmVyU2Vzc2lvbihsaXN0ZW5lclNlc3Npb24pLAogICAgICAgICAgIG1DYWxsYmFjayhjYWxsQmFjayksIG1Db29raWUoY29va2llKQogICAgICAgICB7fQpAQCAtMjYyLDE0ICsyNjUsMTQgQEAKICAgICAgICAgQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVRyaWdnZXJTZXNzaW9uOyB9CiAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtTGlzdGVuZXJTZXNzaW9uOyB9Ci0gICAgICAgIHZvaWQgKmNvb2tpZSgpIGNvbnN0IHsgcmV0dXJuIG1Db29raWU7IH0KKyAgICAgICAgd3A8UmVmQmFzZT4gY29va2llKCkgY29uc3QgeyByZXR1cm4gbUNvb2tpZTsgfQogCiAgICAgcHJpdmF0ZToKICAgICAgICAgICBjb25zdCBBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IG1UeXBlOwogICAgICAgICAgIGNvbnN0IGludCBtVHJpZ2dlclNlc3Npb247CiAgICAgICAgICAgY29uc3QgaW50IG1MaXN0ZW5lclNlc3Npb247CiAgICAgICAgICAgc3luY19ldmVudF9jYWxsYmFja190IG1DYWxsYmFjazsKLSAgICAgICAgICB2b2lkICogY29uc3QgbUNvb2tpZTsKKyAgICAgICAgICBjb25zdCB3cDxSZWZCYXNlPiBtQ29va2llOwogICAgICAgICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CiAgICAgfTsKIApAQCAtMjc3LDcgKzI4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19ldmVudF9jYWxsYmFja190IGNhbGxCYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8UmVmQmFzZT4gY29va2llKTsKIAogcHJpdmF0ZToKICAgICBjbGFzcyBBdWRpb0h3RGV2aWNlOyAgICAvLyBmd2QgZGVjbGFyYXRpb24gZm9yIGZpbmRTdWl0YWJsZUh3RGV2X2wKQEAgLTQ1MSw3ICs0NTQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lOyB9CiAgICAgICAgICAgICAgIHZvaWQgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKTsKIAotICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBhbiBhdWRpb19pb19oYW5kbGVfdCwgc2Vzc2lvbiBJRCwgb3IgZWZmZWN0IElECisgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIGFuIGF1ZGlvX2lvX2hhbmRsZV90LCBzZXNzaW9uIElELCBlZmZlY3QgSUQsIG9yIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4KKyAgICAgICAgICAgICAgLy8gVGhleSBhbGwgc2hhcmUgdGhlIHNhbWUgSUQgc3BhY2UsIGJ1dCB0aGUgbmFtZXNwYWNlcyBhcmUgYWN0dWFsbHkgaW5kZXBlbmRlbnQKKyAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgc2VwYXJhdGUgS2V5ZWRWZWN0b3JzIGZvciBlYWNoIGtpbmQgb2YgSUQuCisgICAgICAgICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgdWludDMyX3QsIGJ1dCBpcyBjYXN0IHRvIHNpZ25lZCBmb3Igc29tZSBJRHMuCisgICAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgQVBJIGRvZXMgbm90IGhhbmRsZSByb2xsb3ZlciB0byB6ZXJvIChmb3IgdW5zaWduZWQgSURzKSwKKyAgICAgICAgICAgICAgLy8gICAgICAgb3IgZnJvbSBwb3NpdGl2ZSB0byBuZWdhdGl2ZSAoZm9yIHNpZ25lZCBJRHMpLgorICAgICAgICAgICAgICAvLyAgICAgICBUaHVzIGl0IG1heSBmYWlsIGJ5IHJldHVybmluZyBhbiBJRCBvZiB0aGUgd3Jvbmcgc2lnbiwKKyAgICAgICAgICAgICAgLy8gICAgICAgb3IgYnkgcmV0dXJuaW5nIGEgbm9uLXVuaXF1ZSBJRC4KICAgICAgICAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CiAKICAgICAgICAgICAgICAgc3RhdHVzX3QgbW92ZUVmZmVjdENoYWluX2woaW50IHNlc3Npb25JZCwKQEAgLTQ5OSw3ICs1MDksNyBAQAogICAgIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBtTW9kdWxlTmFtZTsKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKiBjb25zdCBtSHdEZXZpY2U7Ci0gICAgICAgIEZsYWdzIG1GbGFnczsKKyAgICAgICAgY29uc3QgRmxhZ3MgbUZsYWdzOwogICAgIH07CiAKICAgICAvLyBBdWRpb1N0cmVhbU91dCBhbmQgQXVkaW9TdHJlYW1JbiBhcmUgaW1tdXRhYmxlLCBzbyB0aGVpciBmaWVsZHMgYXJlIGNvbnN0LgpAQCAtNTA5LDcgKzUxOSw3IEBACiAgICAgc3RydWN0IEF1ZGlvU3RyZWFtT3V0IHsKICAgICAgICAgQXVkaW9Id0RldmljZSogY29uc3QgYXVkaW9Id0RldjsKICAgICAgICAgYXVkaW9fc3RyZWFtX291dF90KiBjb25zdCBzdHJlYW07Ci0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOworICAgICAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKIAogICAgICAgICBhdWRpb19od19kZXZpY2VfdCogaHdEZXYoKSBjb25zdCB7IHJldHVybiBhdWRpb0h3RGV2LT5od0RldmljZSgpOyB9CiAKQEAgLTU4Nyw3ICs1OTcsMTEgQEAKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxSZWNvcmRUaHJlYWQ+ID4gICAgbVJlY29yZFRocmVhZHM7CiAKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHBpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CisKICAgICAgICAgICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtTmV4dFVuaXF1ZUlkOyAgLy8gdXBkYXRlZCBieSBhbmRyb2lkX2F0b21pY19pbmMKKyAgICAgICAgICAgICAgICAvLyBuZXh0VW5pcXVlSWQoKSByZXR1cm5zIHVpbnQzMl90LCBidXQgdGhpcyBpcyBkZWNsYXJlZCBpbnQzMl90CisgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgYXRvbWljIG9wZXJhdGlvbnMgcmVxdWlyZSBhbiBpbnQzMl90CisKICAgICAgICAgICAgICAgICBhdWRpb19tb2RlX3QgICAgICAgICAgICAgICAgICAgICAgICBtTW9kZTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnROcmVjSXNPZmY7CiAKQEAgLTYzNCw3ICs2NDgsNyBAQAogICAgIC8vIDB4MjAwMDAwIHN0ZXJlbyAxNi1iaXQgUENNIGZyYW1lcyA9IDQ3LjUgc2Vjb25kcyBhdCA0NC4xIGtIeiwgOCBtZWdhYnl0ZXMKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0ID0gMHgxMDAwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKICNlbmRpZgogCiAgICAgLy8gVGhpcyBtZXRob2QgcmVhZHMgZnJvbSBhIHZhcmlhYmxlIHdpdGhvdXQgbUxvY2ssIGJ1dCB0aGUgdmFyaWFibGUgaXMgdXBkYXRlZCB1bmRlciBtTG9jay4gIFNvCkBAIC02NTEsNiArNjY1LDggQEAKIAogI3VuZGVmIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICiAKK2NvbnN0IGNoYXIgKmZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAppbmRleCBmOTI0MjFlLi4yZDY3ZWZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCkBAIC01OCw3ICs1OCw3IEBACiBzdGF0dXNfdCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsCiAgICAgICAgIGludDY0X3QgcHRzKSB7CiAgICAgLy9BTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoKSIpOwotICAgIGlmICh0aGlzLT5tVHJhY2tCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgaWYgKG1UcmFja0J1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKICAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIocEJ1ZmZlciwgcHRzKTsKICAgICAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBwQnVmZmVyLT5mcmFtZUNvdW50OwpAQCAtODEsNyArODEsNyBAQAogCiB2b2lkIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikgewogICAgIC8vQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKCkiKTsKLSAgICBpZiAodGhpcy0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgIGlmIChtVHJhY2tCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CiAgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKHBCdWZmZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcigpIGVycm9yOiBOVUxMIHRyYWNrIGJ1ZmZlciBwcm92aWRlciIpOwpAQCAtOTAsOSArOTAsOSBAQAogCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJvb2wgQXVkaW9NaXhlcjo6aXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gZmFsc2U7Citib29sIEF1ZGlvTWl4ZXI6OnNJc011bHRpY2hhbm5lbENhcGFibGUgPSBmYWxzZTsKIAotZWZmZWN0X2Rlc2NyaXB0b3JfdCBBdWRpb01peGVyOjpkd25tRnhEZXNjOworZWZmZWN0X2Rlc2NyaXB0b3JfdCBBdWRpb01peGVyOjpzRHdubUZ4RGVzYzsKIAogLy8gRW5zdXJlIG1Db25maWd1cmVkTmFtZXMgYml0bWFzayBpcyBpbml0aWFsaXplZCBwcm9wZXJseSBvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KIC8vIFRoZSB2YWx1ZSBvZiAxIDw8IHggaXMgdW5kZWZpbmVkIGluIEMgd2hlbiB4ID49IDMyLgpAQCAtMTEzLDggKzExMyw2IEBACiAgICAgLy8gQXVkaW9NaXhlciBpcyBub3QgeWV0IGNhcGFibGUgb2YgbXVsdGktY2hhbm5lbCBvdXRwdXQgYmV5b25kIHN0ZXJlbwogICAgIEFMT0dfQVNTRVJUKDIgPT0gTUFYX05VTV9DSEFOTkVMUywgImJhZCBNQVhfTlVNX0NIQU5ORUxTICVkIiwgTUFYX05VTV9DSEFOTkVMUyk7CiAKLSAgICBMb2NhbENsb2NrIGxjOwotCiAgICAgcHRocmVhZF9vbmNlKCZzT25jZUNvbnRyb2wsICZzSW5pdFJvdXRpbmUpOwogCiAgICAgbVN0YXRlLmVuYWJsZWRUcmFja3M9IDA7CkBAIC0xMzYsMjcgKzEzNCw2IEBACiAgICAgICAgIHQrKzsKICAgICB9CiAKLSAgICAvLyBmaW5kIG11bHRpY2hhbm5lbCBkb3dubWl4IGVmZmVjdCBpZiB3ZSBoYXZlIHRvIHBsYXkgbXVsdGljaGFubmVsIGNvbnRlbnQKLSAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKLSAgICBpbnQgcmV0ID0gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKLSAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXIoKSBlcnJvciAlZCBxdWVyeWluZyBudW1iZXIgb2YgZWZmZWN0cyIsIHJldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQUxPR1YoIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpIG51bUVmZmVjdHM9JWQiLCBudW1FZmZlY3RzKTsKLQotICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgbnVtRWZmZWN0cyA7IGkrKykgewotICAgICAgICBpZiAoRWZmZWN0UXVlcnlFZmZlY3QoaSwgJmR3bm1GeERlc2MpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJlZmZlY3QgJWQgaXMgY2FsbGVkICVzIiwgaSwgZHdubUZ4RGVzYy5uYW1lKTsKLSAgICAgICAgICAgIGlmIChtZW1jbXAoJmR3bm1GeERlc2MudHlwZSwgRUZGRUNUX1VJSURfRE9XTk1JWCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIGVmZmVjdCBcIiVzXCIgZnJvbSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkd25tRnhEZXNjLm5hbWUsIGR3bm1GeERlc2MuaW1wbGVtZW50b3IpOwotICAgICAgICAgICAgICAgIGlzTXVsdGljaGFubmVsQ2FwYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR0VfSUYoIWlzTXVsdGljaGFubmVsQ2FwYWJsZSwgInVuYWJsZSB0byBmaW5kIGRvd25taXggZWZmZWN0Iik7CiB9CiAKIEF1ZGlvTWl4ZXI6On5BdWRpb01peGVyKCkKQEAgLTIxNiw2ICsxOTMsNyBAQAogICAgICAgICB0LT5tYWluQnVmZmVyID0gTlVMTDsKICAgICAgICAgdC0+YXV4QnVmZmVyID0gTlVMTDsKICAgICAgICAgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICB0LT5tTWl4ZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKIAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0VHJhY2tEb3dubWl4KCZtU3RhdGUudHJhY2tzW25dLCBuLCBjaGFubmVsTWFzayk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKQEAgLTIyOSw3ICsyMDcsNyBAQAogCiB2b2lkIEF1ZGlvTWl4ZXI6OmludmFsaWRhdGVTdGF0ZSh1aW50MzJfdCBtYXNrKQogewotICAgIGlmIChtYXNrKSB7CisgICAgaWYgKG1hc2sgIT0gMCkgewogICAgICAgICBtU3RhdGUubmVlZHNDaGFuZ2VkIHw9IG1hc2s7CiAgICAgICAgIG1TdGF0ZS5ob29rID0gcHJvY2Vzc19fdmFsaWRhdGU7CiAgICAgfQpAQCAtMjUyLDcgKzIzMCw3IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKSB7Cit2b2lkIEF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUgX191bnVzZWQpIHsKICAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KCVkKSIsIHRyYWNrTmFtZSk7CiAKICAgICBpZiAocFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CkBAIC0yNzYsMTMgKzI1NCwxMyBAQAogICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKiBwRGJwID0gbmV3IERvd25taXhlckJ1ZmZlclByb3ZpZGVyKCk7CiAgICAgaW50MzJfdCBzdGF0dXM7CiAKLSAgICBpZiAoIWlzTXVsdGljaGFubmVsQ2FwYWJsZSkgeworICAgIGlmICghc0lzTXVsdGljaGFubmVsQ2FwYWJsZSkgewogICAgICAgICBBTE9HRSgicHJlcGFyZVRyYWNrRm9yRG93bm1peCglZCkgZmFpbHM6IG1peGVyIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aWNoYW5uZWwgY29udGVudCIsCiAgICAgICAgICAgICAgICAgdHJhY2tOYW1lKTsKICAgICAgICAgZ290byBub0Rvd25taXhGb3JBY3RpdmVUcmFjazsKICAgICB9CiAKLSAgICBpZiAoRWZmZWN0Q3JlYXRlKCZkd25tRnhEZXNjLnV1aWQsCisgICAgaWYgKEVmZmVjdENyZWF0ZSgmc0R3bm1GeERlc2MudXVpZCwKICAgICAgICAgICAgIHBUcmFjay0+c2Vzc2lvbklkIC8qc2Vzc2lvbklkKi8sIC0yIC8qaW9JZCBub3QgcmVsZXZhbnQgaGVyZSwgdXNpbmcgcmFuZG9tIHZhbHVlKi8sCiAgICAgICAgICAgICAmcERicC0+bURvd25taXhIYW5kbGUvKnBIYW5kbGUqLykgIT0gMCkgewogICAgICAgICBBTE9HRSgicHJlcGFyZVRyYWNrRm9yRG93bm1peCglZCkgZmFpbHM6IGVycm9yIGNyZWF0aW5nIGRvd25taXhlciBlZmZlY3QiLCB0cmFja05hbWUpOwpAQCAtNDYzLDggKzQ0MSwxNSBAQAogICAgICAgICAvLyAgICAgICAgIGZvciBhIHNwZWNpZmljIHRyYWNrPyBvciBwZXIgbWl4ZXI/CiAgICAgICAgIC8qIGNhc2UgRE9XTk1JWF9UWVBFOgogICAgICAgICAgICAgYnJlYWsgICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBNSVhFUl9GT1JNQVQ6IHsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90Pih2YWx1ZUludCk7CisgICAgICAgICAgICBpZiAodHJhY2subU1peGVyRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgICAgIHRyYWNrLm1NaXhlckZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9GT1JNQVQsICUjeCkiLCBmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgiYmFkIHBhcmFtIik7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdHJhY2s6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIApAQCAtNDg5LDcgKzQ3NCw3IEBACiAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJiYWQgcGFyYW0iKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciByZXNhbXBsZTogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCkBAIC01MzcsMTIgKzUyMiwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoImJhZCBwYXJhbSIpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHZvbHVtZTogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0ZBVEFMKCJiYWQgdGFyZ2V0Iik7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlcjogYmFkIHRhcmdldCAlZCIsIHRhcmdldCk7CiAgICAgfQogfQogCkBAIC01NjAsMTQgKzU0NSwxNCBAQAogICAgICAgICAgICAgICAgIC8vIFNob3VsZCBoYXZlIGEgd2F5IHRvIGRpc3Rpbmd1aXNoIHRyYWNrcyB3aXRoIHN0YXRpYyByYXRpb3MgdnMuIGR5bmFtaWMgcmF0aW9zLgogICAgICAgICAgICAgICAgIGlmICghKCh2YWx1ZSA9PSA0NDEwMCAmJiBkZXZTYW1wbGVSYXRlID09IDQ4MDAwKSB8fAogICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PSA0ODAwMCAmJiBkZXZTYW1wbGVSYXRlID09IDQ0MTAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpMT1dfUVVBTElUWTsKKyAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpERUZBVUxUX1FVQUxJVFk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzYW1wbGVyIHNlZXMgdGhlIG51bWJlciBvZiBjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyLCBpZiBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgPyBNQVhfTlVNX0NIQU5ORUxTIDogY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgPyBNQVhfTlVNX0NIQU5ORUxTIDogY2hhbm5lbENvdW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgIGRldlNhbXBsZVJhdGUsIHF1YWxpdHkpOwogICAgICAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0TG9jYWxUaW1lRnJlcShzTG9jYWxUaW1lRnJlcSk7CiAgICAgICAgICAgICB9CkBAIC02NjgsMjcgKzY1MywyOSBAQAogICAgICAgICBjb3VudEFjdGl2ZVRyYWNrcysrOwogICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICAgICAgdWludDMyX3QgbiA9IDA7CisgICAgICAgIC8vIEZJWE1FIGNhbiBvdmVyZmxvdyAobWFzayBpcyBvbmx5IDMgYml0cykKICAgICAgICAgbiB8PSBORUVEU19DSEFOTkVMXzEgKyB0LmNoYW5uZWxDb3VudCAtIDE7Ci0gICAgICAgIG4gfD0gTkVFRFNfRk9STUFUXzE2OwotICAgICAgICBuIHw9IHQuZG9lc1Jlc2FtcGxlKCkgPyBORUVEU19SRVNBTVBMRV9FTkFCTEVEIDogTkVFRFNfUkVTQU1QTEVfRElTQUJMRUQ7CisgICAgICAgIGlmICh0LmRvZXNSZXNhbXBsZSgpKSB7CisgICAgICAgICAgICBuIHw9IE5FRURTX1JFU0FNUExFOworICAgICAgICB9CiAgICAgICAgIGlmICh0LmF1eExldmVsICE9IDAgJiYgdC5hdXhCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbiB8PSBORUVEU19BVVhfRU5BQkxFRDsKKyAgICAgICAgICAgIG4gfD0gTkVFRFNfQVVYOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHQudm9sdW1lSW5jWzBdfHQudm9sdW1lSW5jWzFdKSB7CiAgICAgICAgICAgICB2b2x1bWVSYW1wID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmICghdC5kb2VzUmVzYW1wbGUoKSAmJiB0LnZvbHVtZVJMID09IDApIHsKLSAgICAgICAgICAgIG4gfD0gTkVFRFNfTVVURV9FTkFCTEVEOworICAgICAgICAgICAgbiB8PSBORUVEU19NVVRFOwogICAgICAgICB9CiAgICAgICAgIHQubmVlZHMgPSBuOwogCi0gICAgICAgIGlmICgobiAmIE5FRURTX01VVEVfX01BU0spID09IE5FRURTX01VVEVfRU5BQkxFRCkgeworICAgICAgICBpZiAobiAmIE5FRURTX01VVEUpIHsKICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX19ub3A7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKG4gJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSB7CisgICAgICAgICAgICBpZiAobiAmIE5FRURTX0FVWCkgewogICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobiAmIE5FRURTX1JFU0FNUExFX19NQVNLKSA9PSBORUVEU19SRVNBTVBMRV9FTkFCTEVEKSB7CisgICAgICAgICAgICBpZiAobiAmIE5FRURTX1JFU0FNUExFKSB7CiAgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHJlc2FtcGxpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX19nZW5lcmljUmVzYW1wbGU7CkBAIC03MTAsNyArNjk3LDcgQEAKIAogICAgIC8vIHNlbGVjdCB0aGUgcHJvY2Vzc2luZyBob29rcwogICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fbm9wOwotICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcykgeworICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA+IDApIHsKICAgICAgICAgaWYgKHJlc2FtcGxpbmcpIHsKICAgICAgICAgICAgIGlmICghc3RhdGUtPm91dHB1dFRlbXApIHsKICAgICAgICAgICAgICAgICBzdGF0ZS0+b3V0cHV0VGVtcCA9IG5ldyBpbnQzMl90W01BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudF07CkBAIC03NDYsMTYgKzczMywxNSBAQAogCiAgICAgLy8gTm93IHRoYXQgdGhlIHZvbHVtZSByYW1wIGhhcyBiZWVuIGRvbmUsIHNldCBvcHRpbWFsIHN0YXRlIGFuZAogICAgIC8vIHRyYWNrIGhvb2tzIGZvciBzdWJzZXF1ZW50IG1peGVyIHByb2Nlc3MKLSAgICBpZiAoY291bnRBY3RpdmVUcmFja3MpIHsKKyAgICBpZiAoY291bnRBY3RpdmVUcmFja3MgPiAwKSB7CiAgICAgICAgIGJvb2wgYWxsTXV0ZWQgPSB0cnVlOwogICAgICAgICB1aW50MzJfdCBlbiA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwogICAgICAgICB3aGlsZSAoZW4pIHsKICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKICAgICAgICAgICAgIGVuICY9IH4oMTw8aSk7CiAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICAgICAgICAgIGlmICghdC5kb2VzUmVzYW1wbGUoKSAmJiB0LnZvbHVtZVJMID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdC5uZWVkcyB8PSBORUVEU19NVVRFX0VOQUJMRUQ7CisgICAgICAgICAgICBpZiAoIXQuZG9lc1Jlc2FtcGxlKCkgJiYgdC52b2x1bWVSTCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdC5uZWVkcyB8PSBORUVEU19NVVRFOwogICAgICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX19ub3A7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGFsbE11dGVkID0gZmFsc2U7CkBAIC04MDYsOCArNzkyLDggQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLAotICAgICAgICBpbnQzMl90KiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19ub3AodHJhY2tfdCogdCBfX3VudXNlZCwgaW50MzJfdCogb3V0IF9fdW51c2VkLAorICAgICAgICBzaXplX3Qgb3V0RnJhbWVDb3VudCBfX3VudXNlZCwgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4IF9fdW51c2VkKQogewogfQogCkBAIC04ODMsOCArODY5LDggQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLAotICAgICAgICBpbnQzMl90KiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4KQogewogICAgIGNvbnN0IGludDE2X3QgKmluID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCAqPih0LT5pbik7CiAKQEAgLTk3NCw4ICs5NjAsOCBAQAogICAgIHQtPmluID0gaW47CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c01vbm8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwKLSAgICAgICAgaW50MzJfdCogYXV4KQordm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzTW9ubyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXgpCiB7CiAgICAgY29uc3QgaW50MTZfdCAqaW4gPSBzdGF0aWNfY2FzdDxpbnQxNl90IGNvbnN0ICo+KHQtPmluKTsKIApAQCAtMTA2NSw3ICsxMDUxLDcgQEAKIHZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9wKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cykKIHsKICAgICB1aW50MzJfdCBlMCA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwotICAgIHNpemVfdCBidWZTaXplID0gc3RhdGUtPmZyYW1lQ291bnQgKiBzaXplb2YoaW50MTZfdCkgKiBNQVhfTlVNX0NIQU5ORUxTOworICAgIHNpemVfdCBzYW1wbGVDb3VudCA9IHN0YXRlLT5mcmFtZUNvdW50ICogTUFYX05VTV9DSEFOTkVMUzsKICAgICB3aGlsZSAoZTApIHsKICAgICAgICAgLy8gcHJvY2VzcyBieSBncm91cCBvZiB0cmFja3Mgd2l0aCBzYW1lIG91dHB1dCBidWZmZXIgdG8KICAgICAgICAgLy8gYXZvaWQgbXVsdGlwbGUgbWVtc2V0KCkgb24gc2FtZSBidWZmZXIKQEAgLTEwODQsNyArMTA3MCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlMCAmPSB+KGUxKTsKIAotICAgICAgICAgICAgbWVtc2V0KHQxLm1haW5CdWZmZXIsIDAsIGJ1ZlNpemUpOworICAgICAgICAgICAgbWVtc2V0KHQxLm1haW5CdWZmZXIsIDAsIHNhbXBsZUNvdW50CisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0MS5tTWl4ZXJGb3JtYXQpKTsKICAgICAgICAgfQogCiAgICAgICAgIHdoaWxlIChlMSkgewpAQCAtMTE1NCw3ICsxMTQxLDcgQEAKICAgICAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gQkxPQ0tTSVpFOwogICAgICAgICAgICAgICAgIGludDMyX3QgKmF1eCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKCh0Lm5lZWRzICYgTkVFRFNfQVVYX19NQVNLKSA9PSBORUVEU19BVVhfRU5BQkxFRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC5uZWVkcyAmIE5FRURTX0FVWCkpIHsKICAgICAgICAgICAgICAgICAgICAgYXV4ID0gdC5hdXhCdWZmZXIgKyBudW1GcmFtZXM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdoaWxlIChvdXRGcmFtZXMpIHsKQEAgLTExNjYsNyArMTE1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5GcmFtZXMgPSAodC5mcmFtZUNvdW50ID4gb3V0RnJhbWVzKT9vdXRGcmFtZXM6dC5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluRnJhbWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wICsgKEJMT0NLU0laRS1vdXRGcmFtZXMpKk1BWF9OVU1fQ0hBTk5FTFMsIGluRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgdC5mcmFtZUNvdW50IC09IGluRnJhbWVzOwpAQCAtMTE5Miw4ICsxMTc5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIEJMT0NLU0laRSk7Ci0gICAgICAgICAgICBvdXQgKz0gQkxPQ0tTSVpFOworICAgICAgICAgICAgc3dpdGNoICh0MS5tTWl4ZXJGb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9xNF8yNyhyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KG91dCksIG91dFRlbXAsIEJMT0NLU0laRSAqIDIpOworICAgICAgICAgICAgICAgIG91dCArPSBCTE9DS1NJWkUgKiAyOyAvLyBvdXRwdXQgaXMgMiBmbG9hdHMvZnJhbWUuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKG91dCwgb3V0VGVtcCwgQkxPQ0tTSVpFKTsKKyAgICAgICAgICAgICAgICBvdXQgKz0gQkxPQ0tTSVpFOyAvLyBvdXRwdXQgaXMgMSBpbnQzMl90ICgyIGludDE2X3Qgc2FtcGxlcykvZnJhbWUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyIGZvcm1hdDogJWQiLCB0MS5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbnVtRnJhbWVzICs9IEJMT0NLU0laRTsKICAgICAgICAgfSB3aGlsZSAobnVtRnJhbWVzIDwgc3RhdGUtPmZyYW1lQ291bnQpOwogICAgIH0KQEAgLTEyNDIsMTQgKzEyMzksMTQgQEAKICAgICAgICAgICAgIGUxICY9IH4oMTw8aSk7CiAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICAgICAgICAgIGludDMyX3QgKmF1eCA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoKHQubmVlZHMgJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSkgeworICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQubmVlZHMgJiBORUVEU19BVVgpKSB7CiAgICAgICAgICAgICAgICAgYXV4ID0gdC5hdXhCdWZmZXI7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBsaXR0bGUgZ29vZnksIG9uIHRoZSByZXNhbXBsaW5nIGNhc2Ugd2UgZG9uJ3QKICAgICAgICAgICAgIC8vIGFjcXVpcmUvcmVsZWFzZSB0aGUgYnVmZmVycyBiZWNhdXNlIGl0J3MgZG9uZSBieQogICAgICAgICAgICAgLy8gdGhlIHJlc2FtcGxlci4KLSAgICAgICAgICAgIGlmICgodC5uZWVkcyAmIE5FRURTX1JFU0FNUExFX19NQVNLKSA9PSBORUVEU19SRVNBTVBMRV9FTkFCTEVEKSB7CisgICAgICAgICAgICBpZiAodC5uZWVkcyAmIE5FRURTX1JFU0FNUExFKSB7CiAgICAgICAgICAgICAgICAgdC5yZXNhbXBsZXItPnNldFBUUyhwdHMpOwogICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCwgbnVtRnJhbWVzLCBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEyNzUsNyArMTI3MiwxNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIG51bUZyYW1lcyk7CisgICAgICAgIHN3aXRjaCAodDEubU1peGVyRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3E0XzI3KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihvdXQpLCBvdXRUZW1wLCBudW1GcmFtZXMqMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKG91dCwgb3V0VGVtcCwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyIGZvcm1hdDogJWQiLCB0MS5tTWl4ZXJGb3JtYXQpOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC0xMzE2LDI3ICsxMzIyLDQ2IEBACiAgICAgICAgIH0KICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IGIuZnJhbWVDb3VudDsKIAotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodWludDMyX3QodmwpID4gVU5JVFlfR0FJTiB8fCB1aW50MzJfdCh2cikgPiBVTklUWV9HQUlOKSkgewotICAgICAgICAgICAgLy8gdm9sdW1lIGlzIGJvb3N0ZWQsIHNvIHdlIG1pZ2h0IG5lZWQgdG8gY2xhbXAgZXZlbiB0aG91Z2gKLSAgICAgICAgICAgIC8vIHdlIHByb2Nlc3Mgb25seSBvbmUgdHJhY2suCisgICAgICAgIHN3aXRjaCAodC5tTWl4ZXJGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOiB7CisgICAgICAgICAgICBmbG9hdCAqZm91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihvdXQpOwogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOwogICAgICAgICAgICAgICAgIGluICs9IDI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgLy8gY2xhbXBpbmcuLi4KLSAgICAgICAgICAgICAgICBsID0gY2xhbXAxNihsKTsKLSAgICAgICAgICAgICAgICByID0gY2xhbXAxNihyKTsKLSAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOworICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpOworICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpOworICAgICAgICAgICAgICAgICpmb3V0KysgPSBmbG9hdF9mcm9tX3E0XzI3KGwpOworICAgICAgICAgICAgICAgICpmb3V0KysgPSBmbG9hdF9mcm9tX3E0XzI3KHIpOworICAgICAgICAgICAgICAgIC8vIE5vdGU6IEluIGNhc2Ugb2YgbGF0ZXIgaW50MTZfdCBzaW5rIG91dHB1dCwKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJzaW9uIGFuZCBjbGFtcGluZyBpcyBkb25lIGJ5IG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgpLgogICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOwotICAgICAgICAgICAgICAgIGluICs9IDI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodWludDMyX3QodmwpID4gVU5JVFlfR0FJTiB8fCB1aW50MzJfdCh2cikgPiBVTklUWV9HQUlOKSkgeworICAgICAgICAgICAgICAgIC8vIHZvbHVtZSBpcyBib29zdGVkLCBzbyB3ZSBtaWdodCBuZWVkIHRvIGNsYW1wIGV2ZW4gdGhvdWdoCisgICAgICAgICAgICAgICAgLy8gd2UgcHJvY2VzcyBvbmx5IG9uZSB0cmFjay4KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOworICAgICAgICAgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsYW1waW5nLi4uCisgICAgICAgICAgICAgICAgICAgIGwgPSBjbGFtcDE2KGwpOworICAgICAgICAgICAgICAgICAgICByID0gY2xhbXAxNihyKTsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7CisgICAgICAgICAgICAgICAgICAgIGluICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlciBmb3JtYXQ6ICVkIiwgdC5tTWl4ZXJGb3JtYXQpOwogICAgICAgICB9CiAgICAgICAgIG51bUZyYW1lcyAtPSBiLmZyYW1lQ291bnQ7CiAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIpOwpAQCAtMTQ0OSw4ICsxNDc0LDkgQEAKIGludDY0X3QgQXVkaW9NaXhlcjo6Y2FsY3VsYXRlT3V0cHV0UFRTKGNvbnN0IHRyYWNrX3QmIHQsIGludDY0X3QgYmFzZVBUUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRGcmFtZUluZGV4KQogewotICAgIGlmIChBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyA9PSBiYXNlUFRTKQorICAgIGlmIChBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyA9PSBiYXNlUFRTKSB7CiAgICAgICAgIHJldHVybiBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKKyAgICB9CiAKICAgICByZXR1cm4gYmFzZVBUUyArICgob3V0cHV0RnJhbWVJbmRleCAqIHNMb2NhbFRpbWVGcmVxKSAvIHQuc2FtcGxlUmF0ZSk7CiB9CkBAIC0xNDYyLDYgKzE0ODgsMjggQEAKIHsKICAgICBMb2NhbENsb2NrIGxjOwogICAgIHNMb2NhbFRpbWVGcmVxID0gbGMuZ2V0TG9jYWxGcmVxKCk7CisKKyAgICAvLyBmaW5kIG11bHRpY2hhbm5lbCBkb3dubWl4IGVmZmVjdCBpZiB3ZSBoYXZlIHRvIHBsYXkgbXVsdGljaGFubmVsIGNvbnRlbnQKKyAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKKyAgICBpbnQgcmV0ID0gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXIoKSBlcnJvciAlZCBxdWVyeWluZyBudW1iZXIgb2YgZWZmZWN0cyIsIHJldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpIG51bUVmZmVjdHM9JWQiLCBudW1FZmZlY3RzKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgbnVtRWZmZWN0cyA7IGkrKykgeworICAgICAgICBpZiAoRWZmZWN0UXVlcnlFZmZlY3QoaSwgJnNEd25tRnhEZXNjKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiZWZmZWN0ICVkIGlzIGNhbGxlZCAlcyIsIGksIHNEd25tRnhEZXNjLm5hbWUpOworICAgICAgICAgICAgaWYgKG1lbWNtcCgmc0R3bm1GeERlc2MudHlwZSwgRUZGRUNUX1VJSURfRE9XTk1JWCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIGVmZmVjdCBcIiVzXCIgZnJvbSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBzRHdubUZ4RGVzYy5uYW1lLCBzRHdubUZ4RGVzYy5pbXBsZW1lbnRvcik7CisgICAgICAgICAgICAgICAgc0lzTXVsdGljaGFubmVsQ2FwYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1dfSUYoIXNJc011bHRpY2hhbm5lbENhcGFibGUsICJ1bmFibGUgdG8gZmluZCBkb3dubWl4IGVmZmVjdCIpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAppbmRleCA0M2FlYjg2Li5lNWUxMjBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKQEAgLTc3LDYgKzc3LDcgQEAKICAgICAgICAgTUFJTl9CVUZGRVIgICAgID0gMHg0MDAyLAogICAgICAgICBBVVhfQlVGRkVSICAgICAgPSAweDQwMDMsCiAgICAgICAgIERPV05NSVhfVFlQRSAgICA9IDBYNDAwNCwKKyAgICAgICAgTUlYRVJfRk9STUFUICAgID0gMHg0MDA1LCAvLyBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCiAgICAgICAgIC8vIGZvciB0YXJnZXQgUkVTQU1QTEUKICAgICAgICAgU0FNUExFX1JBVEUgICAgID0gMHg0MTAwLCAvLyBDb25maWd1cmUgc2FtcGxlIHJhdGUgY29udmVyc2lvbiBvbiB0aGlzIHRyYWNrIG5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgdGhlIG5ldyBzYW1wbGUgcmF0ZSBpbiBIei4KQEAgLTEyMCwyNyArMTIxLDE5IEBACiBwcml2YXRlOgogCiAgICAgZW51bSB7CisgICAgICAgIC8vIEZJWE1FIHRoaXMgcmVwcmVzZW50YXRpb24gcGVybWl0cyB1cCB0byA4IGNoYW5uZWxzCiAgICAgICAgIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0sgICA9IDB4MDAwMDAwMDcsCi0gICAgICAgIE5FRURTX0ZPUk1BVF9fTUFTSyAgICAgICAgICA9IDB4MDAwMDAwRjAsCi0gICAgICAgIE5FRURTX01VVEVfX01BU0sgICAgICAgICAgICA9IDB4MDAwMDAxMDAsCi0gICAgICAgIE5FRURTX1JFU0FNUExFX19NQVNLICAgICAgICA9IDB4MDAwMDEwMDAsCi0gICAgICAgIE5FRURTX0FVWF9fTUFTSyAgICAgICAgICAgICA9IDB4MDAwMTAwMDAsCiAgICAgfTsKIAogICAgIGVudW0gewotICAgICAgICBORUVEU19DSEFOTkVMXzEgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBORUVEU19DSEFOTkVMXzIgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICAgICAgICBORUVEU19DSEFOTkVMXzEgICAgICAgICAgICAgPSAweDAwMDAwMDAwLCAgIC8vIG1vbm8KKyAgICAgICAgTkVFRFNfQ0hBTk5FTF8yICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwgICAvLyBzdGVyZW8KIAotICAgICAgICBORUVEU19GT1JNQVRfMTYgICAgICAgICAgICAgPSAweDAwMDAwMDEwLAorICAgICAgICAvLyBzYW1wbGUgZm9ybWF0IGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCwgYW5kIGlzIGFzc3VtZWQgdG8gYmUgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKIAotICAgICAgICBORUVEU19NVVRFX0RJU0FCTEVEICAgICAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBORUVEU19NVVRFX0VOQUJMRUQgICAgICAgICAgPSAweDAwMDAwMTAwLAotCi0gICAgICAgIE5FRURTX1JFU0FNUExFX0RJU0FCTEVEICAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgIE5FRURTX1JFU0FNUExFX0VOQUJMRUQgICAgICA9IDB4MDAwMDEwMDAsCi0KLSAgICAgICAgTkVFRFNfQVVYX0RJU0FCTEVEICAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgIE5FRURTX0FVWF9FTkFCTEVEICAgICAgPSAweDAwMDEwMDAwLAorICAgICAgICBORUVEU19NVVRFICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMTAwLAorICAgICAgICBORUVEU19SRVNBTVBMRSAgICAgICAgICAgICAgPSAweDAwMDAxMDAwLAorICAgICAgICBORUVEU19BVVggICAgICAgICAgICAgICAgICAgPSAweDAwMDEwMDAwLAogICAgIH07CiAKICAgICBzdHJ1Y3Qgc3RhdGVfdDsKQEAgLTIwMSw3ICsxOTQsOSBAQAogCiAgICAgICAgIGludDMyX3QgICAgIHNlc3Npb25JZDsKIAotICAgICAgICBpbnQzMl90ICAgICBwYWRkaW5nWzJdOworICAgICAgICBhdWRpb19mb3JtYXRfdCBtTWl4ZXJGb3JtYXQ7IC8vIGF0IHRoaXMgdGltZTogQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQorCisgICAgICAgIGludDMyX3QgICAgIHBhZGRpbmdbMV07CiAKICAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQogCkBAIC0yMjQsNyArMjE5LDcgQEAKICAgICAgICAgTkJMb2c6OldyaXRlciogIG1Mb2c7CiAgICAgICAgIGludDMyX3QgICAgICAgICByZXNlcnZlZFsxXTsKICAgICAgICAgLy8gRklYTUUgYWxsb2NhdGUgZHluYW1pY2FsbHkgdG8gc2F2ZSBzb21lIG1lbW9yeSB3aGVuIG1heE51bVRyYWNrcyA8IE1BWF9OVU1fVFJBQ0tTCi0gICAgICAgIHRyYWNrX3QgICAgICAgICB0cmFja3NbTUFYX05VTV9UUkFDS1NdOyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworICAgICAgICB0cmFja190ICAgICAgICAgdHJhY2tzW01BWF9OVU1fVFJBQ0tTXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwogICAgIH07CiAKICAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIHRoYXQgd3JhcHMgYSB0cmFjayBBdWRpb0J1ZmZlclByb3ZpZGVyIGJ5IGEgY2FsbCB0byBhIGRvd25taXggZWZmZWN0CkBAIC0yNTYsOSArMjUxLDkgQEAKICAgICBzdGF0ZV90ICAgICAgICAgbVN0YXRlIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CiAKICAgICAvLyBlZmZlY3QgZGVzY3JpcHRvciBmb3IgdGhlIGRvd25taXhlciB1c2VkIGJ5IHRoZSBtaXhlcgotICAgIHN0YXRpYyBlZmZlY3RfZGVzY3JpcHRvcl90IGR3bm1GeERlc2M7CisgICAgc3RhdGljIGVmZmVjdF9kZXNjcmlwdG9yX3Qgc0R3bm1GeERlc2M7CiAgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgYSBkb3dubWl4IGVmZmVjdCBoYXMgYmVlbiBmb3VuZCBhbmQgaXMgdXNhYmxlIGJ5IHRoaXMgbWl4ZXIKLSAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICAgICBpc011bHRpY2hhbm5lbENhcGFibGU7CisgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgICAgc0lzTXVsdGljaGFubmVsQ2FwYWJsZTsKIAogICAgIC8vIENhbGwgYWZ0ZXIgY2hhbmdpbmcgZWl0aGVyIHRoZSBlbmFibGVkIHN0YXR1cyBvZiBhIHRyYWNrLCBvciBwYXJhbWV0ZXJzIG9mIGFuIGVuYWJsZWQgdHJhY2suCiAgICAgLy8gT0sgdG8gY2FsbCBtb3JlIG9mdGVuIHRoYW4gdGhhdCwgYnV0IHVubmVjZXNzYXJ5LgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKaW5kZXggZTVjY2ViMS4uNTYyYzRlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlclNpbmMuaCIKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckN1YmljLmgiCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJEeW4uaCIKIAogI2lmZGVmIF9fYXJtX18KICNpbmNsdWRlIDxtYWNoaW5lL2NwdS1mZWF0dXJlcy5oPgpAQCAtNzcsNiArNzgsOSBAQAogICAgIGludCBtWDBSOwogfTsKIAorLypzdGF0aWMqLworY29uc3QgZG91YmxlIEF1ZGlvUmVzYW1wbGVyOjprUGhhc2VNdWx0aXBsaWVyID0gMUwgPDwgQXVkaW9SZXNhbXBsZXI6OmtOdW1QaGFzZUJpdHM7CisKIGJvb2wgQXVkaW9SZXNhbXBsZXI6OnF1YWxpdHlJc1N1cHBvcnRlZChzcmNfcXVhbGl0eSBxdWFsaXR5KQogewogICAgIHN3aXRjaCAocXVhbGl0eSkgewpAQCAtODUsNiArODksOSBAQAogICAgIGNhc2UgTUVEX1FVQUxJVFk6CiAgICAgY2FzZSBISUdIX1FVQUxJVFk6CiAgICAgY2FzZSBWRVJZX0hJR0hfUVVBTElUWToKKyAgICBjYXNlIERZTl9MT1dfUVVBTElUWToKKyAgICBjYXNlIERZTl9NRURfUVVBTElUWToKKyAgICBjYXNlIERZTl9ISUdIX1FVQUxJVFk6CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEwNSw3ICsxMTIsNyBAQAogICAgICAgICBpZiAoKmVuZHB0ciA9PSAnXDAnKSB7CiAgICAgICAgICAgICBkZWZhdWx0UXVhbGl0eSA9IChzcmNfcXVhbGl0eSkgbDsKICAgICAgICAgICAgIEFMT0dEKCJmb3JjaW5nIEF1ZGlvUmVzYW1wbGVyIHF1YWxpdHkgdG8gJWQiLCBkZWZhdWx0UXVhbGl0eSk7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdFF1YWxpdHkgPCBERUZBVUxUX1FVQUxJVFkgfHwgZGVmYXVsdFF1YWxpdHkgPiBWRVJZX0hJR0hfUVVBTElUWSkgeworICAgICAgICAgICAgaWYgKGRlZmF1bHRRdWFsaXR5IDwgREVGQVVMVF9RVUFMSVRZIHx8IGRlZmF1bHRRdWFsaXR5ID4gRFlOX0hJR0hfUVVBTElUWSkgewogICAgICAgICAgICAgICAgIGRlZmF1bHRRdWFsaXR5ID0gREVGQVVMVF9RVUFMSVRZOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMjUsNiArMTMyLDEyIEBACiAgICAgICAgIHJldHVybiAyMDsKICAgICBjYXNlIFZFUllfSElHSF9RVUFMSVRZOgogICAgICAgICByZXR1cm4gMzQ7CisgICAgY2FzZSBEWU5fTE9XX1FVQUxJVFk6CisgICAgICAgIHJldHVybiA0OworICAgIGNhc2UgRFlOX01FRF9RVUFMSVRZOgorICAgICAgICByZXR1cm4gNjsKKyAgICBjYXNlIERZTl9ISUdIX1FVQUxJVFk6CisgICAgICAgIHJldHVybiAxMjsKICAgICB9CiB9CiAKQEAgLTE0OCw2ICsxNjEsMTYgQEAKICAgICAgICAgYXRGaW5hbFF1YWxpdHkgPSB0cnVlOwogICAgIH0KIAorICAgIC8qIGlmIHRoZSBjYWxsZXIgcmVxdWVzdHMgREVGQVVMVF9RVUFMSVRZIGFuZCBhZi5yZXNhbXBsZXIucHJvcGVydHkKKyAgICAgKiBoYXMgbm90IGJlZW4gc2V0LCB0aGUgdGFyZ2V0IHJlc2FtcGxlciBxdWFsaXR5IGlzIHNldCB0byBEWU5fTUVEX1FVQUxJVFksCisgICAgICogYW5kIGFsbG93ZWQgdG8gInRocm90dGxlIiBkb3duIHRvIERZTl9MT1dfUVVBTElUWSBpZiBuZWNlc3NhcnkKKyAgICAgKiBkdWUgdG8gZXN0aW1hdGVkIENQVSBsb2FkIG9mIGhhdmluZyB0b28gbWFueSBhY3RpdmUgcmVzYW1wbGVycworICAgICAqICh0aGUgY29kZSBiZWxvdyB0aGUgaWYpLgorICAgICAqLworICAgIGlmIChxdWFsaXR5ID09IERFRkFVTFRfUVVBTElUWSkgeworICAgICAgICBxdWFsaXR5ID0gRFlOX01FRF9RVUFMSVRZOworICAgIH0KKwogICAgIC8vIG5haXZlIGltcGxlbWVudGF0aW9uIG9mIENQVSBsb2FkIHRocm90dGxpbmcgZG9lc24ndCBhY2NvdW50IGZvciB3aGV0aGVyIHJlc2FtcGxlciBpcyBhY3RpdmUKICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKICAgICBmb3IgKDs7KSB7CkBAIC0xNjIsNyArMTg1LDYgQEAKICAgICAgICAgLy8gbm90IGVub3VnaCBDUFUgYXZhaWxhYmxlIGZvciBwcm9wb3NlZCBxdWFsaXR5IGxldmVsLCBzbyB0cnkgbmV4dCBsb3dlc3QgbGV2ZWwKICAgICAgICAgc3dpdGNoIChxdWFsaXR5KSB7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNhc2UgREVGQVVMVF9RVUFMSVRZOgogICAgICAgICBjYXNlIExPV19RVUFMSVRZOgogICAgICAgICAgICAgYXRGaW5hbFF1YWxpdHkgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNzUsNiArMTk3LDE1IEBACiAgICAgICAgIGNhc2UgVkVSWV9ISUdIX1FVQUxJVFk6CiAgICAgICAgICAgICBxdWFsaXR5ID0gSElHSF9RVUFMSVRZOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFlOX0xPV19RVUFMSVRZOgorICAgICAgICAgICAgYXRGaW5hbFF1YWxpdHkgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFlOX01FRF9RVUFMSVRZOgorICAgICAgICAgICAgcXVhbGl0eSA9IERZTl9MT1dfUVVBTElUWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERZTl9ISUdIX1FVQUxJVFk6CisgICAgICAgICAgICBxdWFsaXR5ID0gRFlOX01FRF9RVUFMSVRZOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKQEAgLTE4Myw3ICsyMTQsNiBAQAogCiAgICAgc3dpdGNoIChxdWFsaXR5KSB7CiAgICAgZGVmYXVsdDoKLSAgICBjYXNlIERFRkFVTFRfUVVBTElUWToKICAgICBjYXNlIExPV19RVUFMSVRZOgogICAgICAgICBBTE9HVigiQ3JlYXRlIGxpbmVhciBSZXNhbXBsZXIiKTsKICAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyT3JkZXIxKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CkBAIC0yMDAsNiArMjMwLDIxIEBACiAgICAgICAgIEFMT0dWKCJDcmVhdGUgVkVSWV9ISUdIX1FVQUxJVFkgc2luYyBSZXNhbXBsZXIgPSAlZCIsIHF1YWxpdHkpOwogICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJTaW5jKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFlOX0xPV19RVUFMSVRZOgorICAgIGNhc2UgRFlOX01FRF9RVUFMSVRZOgorICAgIGNhc2UgRFlOX0hJR0hfUVVBTElUWToKKyAgICAgICAgQUxPR1YoIkNyZWF0ZSBkeW5hbWljIFJlc2FtcGxlciA9ICVkIiwgcXVhbGl0eSk7CisgICAgICAgIGlmIChiaXREZXB0aCA9PSAzMikgeyAvKiBiaXREZXB0aCA9PSAzMiBzaWduYWxzIGZsb2F0IHByZWNpc2lvbiAqLworICAgICAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyRHluPGZsb2F0LCBmbG9hdCwgZmxvYXQ+KGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgIH0gZWxzZSBpZiAocXVhbGl0eSA9PSBEWU5fSElHSF9RVUFMSVRZKSB7CisgICAgICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJEeW48aW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD4oYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBxdWFsaXR5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlckR5bjxpbnQxNl90LCBpbnQxNl90LCBpbnQzMl90PihiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIC8vIGluaXRpYWxpemUgcmVzYW1wbGVyCkBAIC0zMDUsNyArMzUwLDcgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOwotICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gZ2V0SW5GcmFtZUNvdW50UmVxdWlyZWQob3V0RnJhbWVDb3VudCk7CiAKICAgICAvLyBBTE9HRSgic3RhcnRpbmcgcmVzYW1wbGUgJWQgZnJhbWVzLCBpbnB1dEluZGV4PSVkLCBwaGFzZUZyYWN0aW9uPSVkLCBwaGFzZUluY3JlbWVudD0lZCIsCiAgICAgLy8gICAgICBvdXRGcmFtZUNvdW50LCBpbnB1dEluZGV4LCBwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7CkBAIC0zMzksOCArMzg0LDkgQEAKICAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2bCAqIEludGVycChtWDBMLCBpblswXSwgcGhhc2VGcmFjdGlvbik7CiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdnIgKiBJbnRlcnAobVgwUiwgaW5bMV0sIHBoYXNlRnJhY3Rpb24pOwogICAgICAgICAgICAgQWR2YW5jZSgmaW5wdXRJbmRleCwgJnBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKLSAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PSBvdXRwdXRTYW1wbGVDb3VudCkKKyAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PSBvdXRwdXRTYW1wbGVDb3VudCkgewogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gcHJvY2VzcyBpbnB1dCBzYW1wbGVzCkBAIC00MDIsNyArNDQ4LDcgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOwotICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gZ2V0SW5GcmFtZUNvdW50UmVxdWlyZWQob3V0RnJhbWVDb3VudCk7CiAKICAgICAvLyBBTE9HRSgic3RhcnRpbmcgcmVzYW1wbGUgJWQgZnJhbWVzLCBpbnB1dEluZGV4PSVkLCBwaGFzZUZyYWN0aW9uPSVkLCBwaGFzZUluY3JlbWVudD0lZCIsCiAgICAgLy8gICAgICBvdXRGcmFtZUNvdW50LCBpbnB1dEluZGV4LCBwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7CkBAIC00MzQsOCArNDgwLDkgQEAKICAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2bCAqIHNhbXBsZTsKICAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2ciAqIHNhbXBsZTsKICAgICAgICAgICAgIEFkdmFuY2UoJmlucHV0SW5kZXgsICZwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0SW5kZXggPT0gb3V0cHV0U2FtcGxlQ291bnQpCisgICAgICAgICAgICBpZiAob3V0cHV0SW5kZXggPT0gb3V0cHV0U2FtcGxlQ291bnQpIHsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIHByb2Nlc3MgaW5wdXQgc2FtcGxlcwpAQCAtNTE0LDYgKzU2MSwxNiBAQAogICAgICAgICAgICAgc2l6ZV90ICZvdXRwdXRJbmRleCwgaW50MzJfdCogb3V0LCBzaXplX3QgJmlucHV0SW5kZXgsIGludDMyX3QgdmwsIGludDMyX3QgdnIsCiAgICAgICAgICAgICB1aW50MzJfdCAmcGhhc2VGcmFjdGlvbiwgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQpCiB7CisgICAgKHZvaWQpbWF4T3V0UHQ7IC8vIHJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyIHdhcm5pbmdzCisgICAgKHZvaWQpbWF4SW5JZHg7CisgICAgKHZvaWQpb3V0cHV0SW5kZXg7CisgICAgKHZvaWQpb3V0OworICAgICh2b2lkKWlucHV0SW5kZXg7CisgICAgKHZvaWQpdmw7CisgICAgKHZvaWQpdnI7CisgICAgKHZvaWQpcGhhc2VGcmFjdGlvbjsKKyAgICAodm9pZClwaGFzZUluY3JlbWVudDsKKyAgICAodm9pZClpbjsKICNkZWZpbmUgTU9fUEFSQU01ICAgIjM2IiAgICAgICAgLy8gb2Zmc2V0IG9mIHBhcmFtZXRlciA1IChvdXRwdXRJbmRleCkKIAogICAgIGFzbSgKQEAgLTYyNSw2ICs2ODIsMTYgQEAKICAgICAgICAgICAgIHNpemVfdCAmb3V0cHV0SW5kZXgsIGludDMyX3QqIG91dCwgc2l6ZV90ICZpbnB1dEluZGV4LCBpbnQzMl90IHZsLCBpbnQzMl90IHZyLAogICAgICAgICAgICAgdWludDMyX3QgJnBoYXNlRnJhY3Rpb24sIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50KQogeworICAgICh2b2lkKW1heE91dFB0OyAvLyByZW1vdmUgdW51c2VkIHBhcmFtZXRlciB3YXJuaW5ncworICAgICh2b2lkKW1heEluSWR4OworICAgICh2b2lkKW91dHB1dEluZGV4OworICAgICh2b2lkKW91dDsKKyAgICAodm9pZClpbnB1dEluZGV4OworICAgICh2b2lkKXZsOworICAgICh2b2lkKXZyOworICAgICh2b2lkKXBoYXNlRnJhY3Rpb247CisgICAgKHZvaWQpcGhhc2VJbmNyZW1lbnQ7CisgICAgKHZvaWQpaW47CiAjZGVmaW5lIFNUX1BBUkFNNSAgICAiNDAiICAgICAvLyBvZmZzZXQgb2YgcGFyYW1ldGVyIDUgKG91dHB1dEluZGV4KQogICAgIGFzbSgKICAgICAgICAgInN0bWZkICBzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCBscn1cbiIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKaW5kZXggMzNlNjRjZS4uYjg0NTY3ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKQEAgLTQxLDYgKzQxLDkgQEAKICAgICAgICAgTUVEX1FVQUxJVFk9MiwKICAgICAgICAgSElHSF9RVUFMSVRZPTMsCiAgICAgICAgIFZFUllfSElHSF9RVUFMSVRZPTQsCisgICAgICAgIERZTl9MT1dfUVVBTElUWT01LAorICAgICAgICBEWU5fTUVEX1FVQUxJVFk9NiwKKyAgICAgICAgRFlOX0hJR0hfUVVBTElUWT03LAogICAgIH07CiAKICAgICBzdGF0aWMgQXVkaW9SZXNhbXBsZXIqIGNyZWF0ZShpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwKQEAgLTYwLDcgKzYzLDcgQEAKICAgICAvLyBBIG1vbm8gcHJvdmlkZXIgZGVsaXZlcnMgYSBzZXF1ZW5jZSBvZiBzYW1wbGVzLgogICAgIC8vIEEgc3RlcmVvIHByb3ZpZGVyIGRlbGl2ZXJzIGEgc2VxdWVuY2Ugb2YgaW50ZXJsZWF2ZWQgcGFpcnMgb2Ygc2FtcGxlcy4KICAgICAvLyBNdWx0aS1jaGFubmVsIHByb3ZpZGVycyBhcmUgbm90IHN1cHBvcnRlZC4KLSAgICAvLyBJbiBlaXRoZXIgY2FzZSwgJ291dCcgaG9sZHMgaW50ZXJsZWF2ZWQgcGFpcnMgb2YgZml4ZWQtcG9pbnQgc2lnbmVkIFExOS4xMi4KKyAgICAvLyBJbiBlaXRoZXIgY2FzZSwgJ291dCcgaG9sZHMgaW50ZXJsZWF2ZWQgcGFpcnMgb2YgZml4ZWQtcG9pbnQgUTQuMjcuCiAgICAgLy8gVGhhdCBpcywgZm9yIGEgbW9ubyBwcm92aWRlciwgdGhlcmUgaXMgYW4gaW1wbGljaXQgdXAtY2hhbm5lbGluZy4KICAgICAvLyBTaW5jZSB0aGlzIG1ldGhvZCBhY2N1bXVsYXRlcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xlYXJpbmcgJ291dCcgaW5pdGlhbGx5LgogICAgIC8vIEZJWE1FIGFzc3VtZXMgcHJvdmlkZXIgaXMgYWx3YXlzIHN1Y2Nlc3NmdWw7IGl0IHNob3VsZCByZXR1cm4gdGhlIGFjdHVhbCBmcmFtZSBjb3VudC4KQEAgLTgxLDcgKzg0LDcgQEAKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1BoYXNlTWFzayA9ICgxTFU8PGtOdW1QaGFzZUJpdHMpLTE7CiAKICAgICAvLyBtdWx0aXBsaWVyIHRvIGNhbGN1bGF0ZSBmaXhlZCBwb2ludCBwaGFzZSBpbmNyZW1lbnQKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtQaGFzZU11bHRpcGxpZXIgPSAxTCA8PCBrTnVtUGhhc2VCaXRzOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUga1BoYXNlTXVsdGlwbGllcjsKIAogICAgIEF1ZGlvUmVzYW1wbGVyKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpOwogCkBAIC0xMDcsNiArMTEwLDM4IEBACiAgICAgdWludDY0X3QgbUxvY2FsVGltZUZyZXE7CiAgICAgaW50NjRfdCBtUFRTOwogCisgICAgLy8gcmV0dXJucyB0aGUgaW5GcmFtZUNvdW50IHJlcXVpcmVkIHRvIGdlbmVyYXRlIG91dEZyYW1lQ291bnQgZnJhbWVzLgorICAgIC8vCisgICAgLy8gUGxhY2VkIGhlcmUgdG8gYmUgYSBjb25zaXN0ZW50IGZvciBhbGwgcmVzYW1wbGVycy4KKyAgICAvLworICAgIC8vIFJpZ2h0IG5vdywgd2UgdXNlIHRoZSB1cHBlciBib3VuZCB3aXRob3V0IHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisgICAgLy8gaW5wdXQgYnVmZmVyIHVzaW5nIGludGVnZXIgYXJpdGhtZXRpYywgYXMgZm9sbG93czoKKyAgICAvLworICAgIC8vIChzdGF0aWNfY2FzdDx1aW50NjRfdD4ob3V0RnJhbWVDb3VudCkqbUluU2FtcGxlUmF0ZSArIChtU2FtcGxlUmF0ZSAtIDEpKS9tU2FtcGxlUmF0ZTsKKyAgICAvLworICAgIC8vIFRoZSBkb3VibGUgcHJlY2lzaW9uIGVxdWl2YWxlbnQgKGZsb2F0IG1heSBub3QgYmUgcHJlY2lzZSBlbm91Z2gpOgorICAgIC8vIGNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihvdXRGcmFtZUNvdW50KSAqIG1JblNhbXBsZVJhdGUgLyBtU2FtcGxlUmF0ZSk7CisgICAgLy8KKyAgICAvLyB0aGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHRoZSBtUGhhc2VJbmNyZW1lbnQgaXMgcm91bmRlZCBkb3duIGZyb20KKyAgICAvLyAjcGhhc2VzICogbUluU2FtcGxlUmF0ZS9tU2FtcGxlUmF0ZSBhbmQgdGhlIGZhY3QgdGhhdCBTdW0oRmxvb3IoeCkpIDw9IEZsb29yKFN1bSh4KSkuCisgICAgLy8gaHR0cDovL3d3dy5wcm9vZndpa2kub3JnL3dpa2kvU3VtX29mX0Zsb29yc19Ob3RfR3JlYXRlcl9UaGFuX0Zsb29yX29mX1N1bXMKKyAgICAvLworICAgIC8vIChzbyBsb25nIGFzIGRvdWJsZSBwcmVjaXNpb24gaXMgY29tcHV0ZWQgYWNjdXJhdGVseSBlbm91Z2ggdG8gYmUgY29uc2lkZXJlZAorICAgIC8vIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgRmxvb3IoeCkgdmFsdWUgaW4gaW50MzJfdCBhcml0aG1ldGljOyB0aHVzIHRoaXMKKyAgICAvLyB3aWxsIG5vdCBuZWNlc3NhcmlseSBob2xkIGZvciBmbG9hdHMpLgorICAgIC8vCisgICAgLy8gVE9ETzoKKyAgICAvLyBHcmVhdGVyIGFjY3VyYWN5IGFuZCBhIHRpZ2h0IGJvdW5kIGlzIG9idGFpbmVkIGJ5OgorICAgIC8vIDEpIHN1YnRyYWN0IGFuZCBhZGp1c3QgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBBdWRpb0J1ZmZlclByb3ZpZGVyIGJ1ZmZlci4KKyAgICAvLyAyKSB1c2luZyB0aGUgZXhhY3QgaW50ZWdlciBmb3JtdWxhIHdoZXJlIChpZ25vcmluZyA2NGIgY2FzdGluZykKKyAgICAvLyAgaW5GcmFtZUNvdW50ID0gKG1QaGFzZUluY3JlbWVudCAqIChvdXRGcmFtZUNvdW50IC0gMSkgKyBtUGhhc2VGcmFjdGlvbikgLyBwaGFzZVdyYXBMaW1pdDsKKyAgICAvLyAgcGhhc2VXcmFwTGltaXQgaXMgdGhlIHdyYXBhcm91bmQgKDEgPDwga051bVBoYXNlQml0cyksIGlmIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseS4KKyAgICAvLworICAgIGlubGluZSBzaXplX3QgZ2V0SW5GcmFtZUNvdW50UmVxdWlyZWQoc2l6ZV90IG91dEZyYW1lQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50NjRfdD4ob3V0RnJhbWVDb3VudCkqbUluU2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgICsgKG1TYW1wbGVSYXRlIC0gMSkpL21TYW1wbGVSYXRlOworICAgIH0KKwogcHJpdmF0ZToKICAgICBjb25zdCBzcmNfcXVhbGl0eSBtUXVhbGl0eTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwCmluZGV4IDE4ZTU5ZTkuLjhmMTRmZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKQEAgLTYwLDE0ICs2MCwxNSBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChvdXRGcmFtZUNvdW50KTsKIAogICAgIC8vIGZldGNoIGZpcnN0IGJ1ZmZlcgogICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBtUFRTKTsKLSAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCisgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgLy8gQUxPR1coIk5ldyBidWZmZXI6IG9mZnNldD0lcCwgZnJhbWVzPSVkbiIsIG1CdWZmZXIucmF3LCBtQnVmZmVyLmZyYW1lQ291bnQpOwogICAgIH0KICAgICBpbnQxNl90ICppbiA9IG1CdWZmZXIuaTE2OwpAQCAtOTcsOCArOTgsOSBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVPdXRwdXRQVFMob3V0cHV0SW5kZXggLyAyKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCisgICAgICAgICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBzYXZlX3N0YXRlOyAgLy8gdWdseSwgYnV0IGVmZmljaWVudAorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbiA9IG1CdWZmZXIuaTE2OwogICAgICAgICAgICAgICAgIC8vIEFMT0dXKCJOZXcgYnVmZmVyOiBvZmZzZXQ9JXAsIGZyYW1lcz0lZCIsIG1CdWZmZXIucmF3LCBtQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICAgICAgfQpAQCAtMTI2LDE0ICsxMjgsMTUgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOwotICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gZ2V0SW5GcmFtZUNvdW50UmVxdWlyZWQob3V0RnJhbWVDb3VudCk7CiAKICAgICAvLyBmZXRjaCBmaXJzdCBidWZmZXIKICAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwgbVBUUyk7Ci0gICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKQorICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIC8vIEFMT0dXKCJOZXcgYnVmZmVyOiBvZmZzZXQ9JXAsIGZyYW1lcz0lZCIsIG1CdWZmZXIucmF3LCBtQnVmZmVyLmZyYW1lQ291bnQpOwogICAgIH0KICAgICBpbnQxNl90ICppbiA9IG1CdWZmZXIuaTE2OwpAQCAtMTYzLDggKzE2Niw5IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU91dHB1dFBUUyhvdXRwdXRJbmRleCAvIDIpKTsKLSAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBnb3RvIHNhdmVfc3RhdGU7ICAvLyB1Z2x5LCBidXQgZWZmaWNpZW50CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIEFMT0dXKCJOZXcgYnVmZmVyOiBvZmZzZXQ9JXAsIGZyYW1lcz0lZG4iLCBtQnVmZmVyLnJhdywgbUJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICBpbiA9IG1CdWZmZXIuaTE2OwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiZThmZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKQEAgLTAsMCArMSw1NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUmVzYW1wbGVyRHluIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckZpck9wcy5oIiAvLyBVU0VfTkVPTiBhbmQgVVNFX0lOTElORV9BU1NFTUJMWSBkZWZpbmVkIGhlcmUKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaCIKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmgiCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJGaXJHZW4uaCIgLy8gcmVxdWlyZXMgbWF0aC5oCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJEeW4uaCIKKworLy8jZGVmaW5lIERFQlVHX1JFU0FNUExFUgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGdlbmVyYXRlIGEgdW5pcXVlIHJlc2FtcGxlIHR5cGUgY29tcGlsZS10aW1lIGNvbnN0YW50IChjb25zdGV4cHIpCisjZGVmaW5lIFJFU0FNUExFVFlQRShDSEFOTkVMUywgTE9DS0VELCBTVFJJREUpIFwKKyAgICAoKCgoQ0hBTk5FTFMpLTEpJjEpIHwgISEoTE9DS0VEKTw8MSBcCisgICAgfCAoKFNUUklERSk9PTggPyAxIDogKFNUUklERSk9PTE2ID8gMiA6IDApPDwyKQorCisvKgorICogSW5CdWZmZXIgaXMgYSB0eXBlIGFnbm9zdGljIGlucHV0IGJ1ZmZlci4KKyAqCisgKiBMYXlvdXQgb2YgdGhlIHN0YXRlIGJ1ZmZlciBmb3IgaGFsZk51bUNvZWZzPTguCisgKgorICogW3JycnJycnBwcHBwcHBwbm5ubm5ubm5ycnJycnJycnJycnJycnJycnJyLi4uLiBycnJycnJyXQorICogIFMgICAgICAgICAgICBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSCisgKgorICogUyA9IG1TdGF0ZQorICogSSA9IG1JbXB1bHNlCisgKiBSID0gbVJpbmdGdWxsCisgKiBwID0gcGFzdCBzYW1wbGVzLCBjb252b2x1dGVkIHdpdGggdGhlIChwKW9zaXRpdmUgc2lkZSBvZiBzaW5jKCkKKyAqIG4gPSBmdXR1cmUgc2FtcGxlcywgY29udm9sdXRlZCB3aXRoIHRoZSAobillZ2F0aXZlIHNpZGUgb2Ygc2luYygpCisgKiByID0gZXh0cmEgc3BhY2UgZm9yIGltcGxlbWVudGluZyB0aGUgcmluZyBidWZmZXIKKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjpJbkJ1ZmZlcigpCisgICAgOiBtU3RhdGUoTlVMTCksIG1JbXB1bHNlKE5VTEwpLCBtUmluZ0Z1bGwoTlVMTCksIG1TdGF0ZUNvdW50KDApCit7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6On5JbkJ1ZmZlcigpCit7CisgICAgaW5pdCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6OmluaXQoKQoreworICAgIGZyZWUobVN0YXRlKTsKKyAgICBtU3RhdGUgPSBOVUxMOworICAgIG1JbXB1bHNlID0gTlVMTDsKKyAgICBtUmluZ0Z1bGwgPSBOVUxMOworICAgIG1TdGF0ZUNvdW50ID0gMDsKK30KKworLy8gcmVzaXplcyB0aGUgc3RhdGUgYnVmZmVyIHRvIGFjY29tbW9kYXRlIHRoZSBhcHByb3ByaWF0ZSBmaWx0ZXIgbGVuZ3RoCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6OnJlc2l6ZShpbnQgQ0hBTk5FTFMsIGludCBoYWxmTnVtQ29lZnMpCit7CisgICAgLy8gY2FsY3VsYXRlIGRlc2lyZWQgc3RhdGUgc2l6ZQorICAgIGludCBzdGF0ZUNvdW50ID0gaGFsZk51bUNvZWZzICogQ0hBTk5FTFMgKiAyICoga1N0YXRlU2l6ZU11bHRpcGxlT2ZGaWx0ZXJMZW5ndGg7CisKKyAgICAvLyBjaGVjayBpZiBidWZmZXIgbmVlZHMgcmVzaXppbmcKKyAgICBpZiAobVN0YXRlCisgICAgICAgICAgICAmJiBzdGF0ZUNvdW50ID09IG1TdGF0ZUNvdW50CisgICAgICAgICAgICAmJiBtUmluZ0Z1bGwtbVN0YXRlID09IG1TdGF0ZUNvdW50LWhhbGZOdW1Db2VmcypDSEFOTkVMUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY3JlYXRlIG5ldyBidWZmZXIKKyAgICBUSSogc3RhdGU7CisgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24ocmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZzdGF0ZSksIDMyLCBzdGF0ZUNvdW50KnNpemVvZigqc3RhdGUpKTsKKyAgICBtZW1zZXQoc3RhdGUsIDAsIHN0YXRlQ291bnQqc2l6ZW9mKCpzdGF0ZSkpOworCisgICAgLy8gYXR0ZW1wdCB0byBwcmVzZXJ2ZSBzdGF0ZQorICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgVEkqIHNyY0xvID0gbUltcHVsc2UgLSBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7CisgICAgICAgIFRJKiBzcmNIaSA9IG1JbXB1bHNlICsgaGFsZk51bUNvZWZzKkNIQU5ORUxTOworICAgICAgICBUSSogZHN0ID0gc3RhdGU7CisKKyAgICAgICAgaWYgKHNyY0xvIDwgbVN0YXRlKSB7CisgICAgICAgICAgICBkc3QgKz0gbVN0YXRlLXNyY0xvOworICAgICAgICAgICAgc3JjTG8gPSBtU3RhdGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY0hpID4gbVN0YXRlICsgbVN0YXRlQ291bnQpIHsKKyAgICAgICAgICAgIHNyY0hpID0gbVN0YXRlICsgbVN0YXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjTG8sIChzcmNIaSAtIHNyY0xvKSAqIHNpemVvZigqc3JjTG8pKTsKKyAgICAgICAgZnJlZShtU3RhdGUpOworICAgIH0KKworICAgIC8vIHNldCBjbGFzcyBtZW1iZXIgdmFycworICAgIG1TdGF0ZSA9IHN0YXRlOworICAgIG1TdGF0ZUNvdW50ID0gc3RhdGVDb3VudDsKKyAgICBtSW1wdWxzZSA9IHN0YXRlICsgaGFsZk51bUNvZWZzKkNIQU5ORUxTOyAvLyBhY3R1YWxseSBvbmUgc2FtcGxlIGdyZWF0ZXIgdGhhbiBuZWVkZWQKKyAgICBtUmluZ0Z1bGwgPSBzdGF0ZSArIG1TdGF0ZUNvdW50IC0gaGFsZk51bUNvZWZzKkNIQU5ORUxTOworfQorCisvLyBjb3B5IGluIHRoZSBpbnB1dCBkYXRhIGludG8gdGhlIGhlYWQgKGltcHVsc2UraGFsZk51bUNvZWZzKSBvZiB0aGUgYnVmZmVyLgordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3RlbXBsYXRlPGludCBDSEFOTkVMUz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjpyZWFkQWdhaW4oVEkqJiBpbXB1bHNlLCBjb25zdCBpbnQgaGFsZk51bUNvZWZzLAorICAgICAgICBjb25zdCBUSSogY29uc3QgaW4sIGNvbnN0IHNpemVfdCBpbnB1dEluZGV4KQoreworICAgIFRJKiBoZWFkID0gaW1wdWxzZSArIGhhbGZOdW1Db2VmcypDSEFOTkVMUzsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPENIQU5ORUxTIDsgaSsrKSB7CisgICAgICAgIGhlYWRbaV0gPSBpbltpbnB1dEluZGV4KkNIQU5ORUxTICsgaV07CisgICAgfQorfQorCisvLyBhZHZhbmNlIHRoZSBpbXB1bHNlIHBvaW50ZXIsIGFuZCBsb2FkIGluIGRhdGEgaW50byB0aGUgaGVhZCAoaW1wdWxzZStoYWxmTnVtQ29lZnMpCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordGVtcGxhdGU8aW50IENIQU5ORUxTPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6OnJlYWRBZHZhbmNlKFRJKiYgaW1wdWxzZSwgY29uc3QgaW50IGhhbGZOdW1Db2VmcywKKyAgICAgICAgY29uc3QgVEkqIGNvbnN0IGluLCBjb25zdCBzaXplX3QgaW5wdXRJbmRleCkKK3sKKyAgICBpbXB1bHNlICs9IENIQU5ORUxTOworCisgICAgaWYgKENDX1VOTElLRUxZKGltcHVsc2UgPj0gbVJpbmdGdWxsKSkgeworICAgICAgICBjb25zdCBzaXplX3Qgc2hpZnREb3duID0gbVJpbmdGdWxsIC0gbVN0YXRlIC0gaGFsZk51bUNvZWZzKkNIQU5ORUxTOworICAgICAgICBtZW1jcHkobVN0YXRlLCBtU3RhdGUrc2hpZnREb3duLCBoYWxmTnVtQ29lZnMqQ0hBTk5FTFMqMipzaXplb2YoVEkpKTsKKyAgICAgICAgaW1wdWxzZSAtPSBzaGlmdERvd247CisgICAgfQorICAgIHJlYWRBZ2FpbjxDSEFOTkVMUz4oaW1wdWxzZSwgaGFsZk51bUNvZWZzLCBpbiwgaW5wdXRJbmRleCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpDb25zdGFudHM6OnNldCgKKyAgICAgICAgaW50IEwsIGludCBoYWxmTnVtQ29lZnMsIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlKQoreworICAgIGludCBiaXRzID0gMDsKKyAgICBpbnQgbHNjYWxlID0gaW5TYW1wbGVSYXRlL291dFNhbXBsZVJhdGUgPCAyID8gTCAtIDEgOgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTCkqaW5TYW1wbGVSYXRlL291dFNhbXBsZVJhdGUpOworICAgIGZvciAoaW50IGk9bHNjYWxlOyBpOyArK2JpdHMsIGk+Pj0xKQorICAgICAgICA7CisgICAgbUwgPSBMOworICAgIG1TaGlmdCA9IGtOdW1QaGFzZUJpdHMgLSBiaXRzOworICAgIG1IYWxmTnVtQ29lZnMgPSBoYWxmTnVtQ29lZnM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6QXVkaW9SZXNhbXBsZXJEeW4oaW50IGJpdERlcHRoLAorICAgICAgICBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSkKKyAgICA6IEF1ZGlvUmVzYW1wbGVyKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgcXVhbGl0eSksCisgICAgICBtUmVzYW1wbGVGdW5jKDApLCBtRmlsdGVyU2FtcGxlUmF0ZSgwKSwgbUZpbHRlclF1YWxpdHkoREVGQVVMVF9RVUFMSVRZKSwKKyAgICBtQ29lZkJ1ZmZlcihOVUxMKQoreworICAgIG1Wb2x1bWVTaW1kWzBdID0gbVZvbHVtZVNpbWRbMV0gPSAwOworICAgIC8vIFRoZSBBdWRpb1Jlc2FtcGxlciBiYXNlIGNsYXNzIGFzc3VtZXMgd2UgYXJlIGFsd2F5cyByZWFkeSBmb3IgMToxIHJlc2FtcGxpbmcuCisgICAgLy8gV2UgcmVzZXQgbUluU2FtcGxlUmF0ZSB0byAwLCBzbyBzZXRTYW1wbGVSYXRlKCkgd2lsbCBjYWxjdWxhdGUgZmlsdGVycyBmb3IKKyAgICAvLyBzZXRTYW1wbGVSYXRlKCkgZm9yIDE6MS4gKE1heSBiZSByZW1vdmVkIGlmIHByZWNhbGN1bGF0ZWQgZmlsdGVycyBhcmUgdXNlZC4pCisgICAgbUluU2FtcGxlUmF0ZSA9IDA7CisgICAgbUNvbnN0YW50cy5zZXQoMTI4LCA4LCBtU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOyAvLyBUT0RPOiBzZXQgYmV0dGVyCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6fkF1ZGlvUmVzYW1wbGVyRHluKCkKK3sKKyAgICBmcmVlKG1Db2VmQnVmZmVyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OmluaXQoKQoreworICAgIG1GaWx0ZXJTYW1wbGVSYXRlID0gMDsgLy8gYWx3YXlzIHRyaWdnZXIgbmV3IGZpbHRlciBnZW5lcmF0aW9uCisgICAgbUluQnVmZmVyLmluaXQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnNldFZvbHVtZShpbnQxNl90IGxlZnQsIGludDE2X3QgcmlnaHQpCit7CisgICAgQXVkaW9SZXNhbXBsZXI6OnNldFZvbHVtZShsZWZ0LCByaWdodCk7CisgICAgLy8gdm9sdW1lIGlzIGFwcGxpZWQgb24gdGhlIG91dHB1dCB0eXBlLgorICAgIGlmIChpc19zYW1lPFRPLCBmbG9hdD46OnZhbHVlIHx8IGlzX3NhbWU8VE8sIGRvdWJsZT46OnZhbHVlKSB7CisgICAgICAgIGNvbnN0IFRPIHNjYWxlID0gMS4gLyAoMVVMIDw8IDEyKTsKKyAgICAgICAgbVZvbHVtZVNpbWRbMF0gPSBzdGF0aWNfY2FzdDxUTz4obGVmdCkgKiBzY2FsZTsKKyAgICAgICAgbVZvbHVtZVNpbWRbMV0gPSBzdGF0aWNfY2FzdDxUTz4ocmlnaHQpICogc2NhbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVZvbHVtZVNpbWRbMF0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihsZWZ0KSA8PCAxNjsKKyAgICAgICAgbVZvbHVtZVNpbWRbMV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihyaWdodCkgPDwgMTY7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIG1heChUIGEsIFQgYikge3JldHVybiBhID4gYiA/IGEgOiBiO30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBhYnNkaWZmKFQgYSwgVCBiKSB7cmV0dXJuIGEgPiBiID8gYSAtIGIgOiBiIC0gYTt9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpjcmVhdGVLYWlzZXJGaXIoQ29uc3RhbnRzICZjLAorICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbiwgaW50IGluU2FtcGxlUmF0ZSwgaW50IG91dFNhbXBsZVJhdGUsIGRvdWJsZSB0YndDaGVhdCkKK3sKKyAgICBUQyogYnVmOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgYXR0ZW4gPSAwLjk5OTg7ICAgLy8gdG8gYXZvaWQgcmlwcGxlIG92ZXJmbG93CisgICAgZG91YmxlIGZjcjsKKyAgICBkb3VibGUgdGJ3ID0gZmlyS2Fpc2VyVGJ3KGMubUhhbGZOdW1Db2Vmcywgc3RvcEJhbmRBdHRlbik7CisKKyAgICAodm9pZClwb3NpeF9tZW1hbGlnbihyZWludGVycHJldF9jYXN0PHZvaWQqKj4oJmJ1ZiksIDMyLCAoYy5tTCsxKSpjLm1IYWxmTnVtQ29lZnMqc2l6ZW9mKFRDKSk7CisgICAgaWYgKGluU2FtcGxlUmF0ZSA8IG91dFNhbXBsZVJhdGUpIHsgLy8gdXBzYW1wbGUKKyAgICAgICAgZmNyID0gbWF4KDAuNSp0YndDaGVhdCAtIHRidy8yLCB0YncvMik7CisgICAgfSBlbHNlIHsgLy8gZG93bnNhbXBsZQorICAgICAgICBmY3IgPSBtYXgoMC41KnRid0NoZWF0Km91dFNhbXBsZVJhdGUvaW5TYW1wbGVSYXRlIC0gdGJ3LzIsIHRidy8yKTsKKyAgICB9CisgICAgLy8gY3JlYXRlIGFuZCBzZXQgZmlsdGVyCisgICAgZmlyS2Fpc2VyR2VuKGJ1ZiwgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuLCBmY3IsIGF0dGVuKTsKKyAgICBjLm1GaXJDb2VmcyA9IGJ1ZjsKKyAgICBpZiAobUNvZWZCdWZmZXIpIHsKKyAgICAgICAgZnJlZShtQ29lZkJ1ZmZlcik7CisgICAgfQorICAgIG1Db2VmQnVmZmVyID0gYnVmOworI2lmZGVmIERFQlVHX1JFU0FNUExFUgorICAgIC8vIHByaW50IGJhc2ljIGZpbHRlciBzdGF0cworICAgIHByaW50ZigiTDolZCAgaG5jOiVkICBzdG9wQmFuZEF0dGVuOiVsZiAgZmNyOiVsZiAgYXR0ZW46JWxmICB0Ync6JWxmXG4iLAorICAgICAgICAgICAgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuLCBmY3IsIGF0dGVuLCB0YncpOworICAgIC8vIHRlc3QgdGhlIGZpbHRlciBhbmQgcmVwb3J0IHJlc3VsdHMKKyAgICBkb3VibGUgZnAgPSAoZmNyIC0gdGJ3LzIpL2MubUw7CisgICAgZG91YmxlIGZzID0gKGZjciArIHRidy8yKS9jLm1MOworICAgIGRvdWJsZSBwYXNzTWluLCBwYXNzTWF4LCBwYXNzUmlwcGxlOworICAgIGRvdWJsZSBzdG9wTWF4LCBzdG9wUmlwcGxlOworICAgIHRlc3RGaXIoYnVmLCBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIGZwLCBmcywgLypwYXNzU3RlcHMqLyAxMDAwLCAvKnN0b3BTdGVwcyovIDEwMDAwMCwKKyAgICAgICAgICAgIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUsIHN0b3BNYXgsIHN0b3BSaXBwbGUpOworICAgIHByaW50ZigicGFzc2JhbmQoJWxmLCAlbGYpOiAlLjhsZiAlLjhsZiAlLjhsZlxuIiwgMC4sIGZwLCBwYXNzTWluLCBwYXNzTWF4LCBwYXNzUmlwcGxlKTsKKyAgICBwcmludGYoInN0b3BiYW5kKCVsZiwgJWxmKTogJS44bGYgJS4zbGZcbiIsIGZzLCAwLjUsIHN0b3BNYXgsIHN0b3BSaXBwbGUpOworI2VuZGlmCit9CisKKy8vIHJlY3Vyc2l2ZSBnY2QuIFVzaW5nIG9iamR1bXAsIGl0IGFwcGVhcnMgdGhlIHRhaWwgcmVjdXJzaW9uIGlzIGNvbnZlcnRlZCB0byBhIHdoaWxlIGxvb3AuCitzdGF0aWMgaW50IGdjZChpbnQgbiwgaW50IG0pCit7CisgICAgaWYgKG0gPT0gMCkgeworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisgICAgcmV0dXJuIGdjZChtLCBuICUgbSk7Cit9CisKK3N0YXRpYyBib29sIGlzQ2xvc2UoaW50MzJfdCBuZXdTYW1wbGVSYXRlLCBpbnQzMl90IHByZXZTYW1wbGVSYXRlLAorICAgICAgICBpbnQzMl90IGZpbHRlclNhbXBsZVJhdGUsIGludDMyX3Qgb3V0U2FtcGxlUmF0ZSkKK3sKKworICAgIC8vIGRpZmZlcmVudCB1cHNhbXBsaW5nIHJhdGlvcyBkbyBub3QgbmVlZCBhIGZpbHRlciBjaGFuZ2UuCisgICAgaWYgKGZpbHRlclNhbXBsZVJhdGUgIT0gMAorICAgICAgICAgICAgJiYgZmlsdGVyU2FtcGxlUmF0ZSA8IG91dFNhbXBsZVJhdGUKKyAgICAgICAgICAgICYmIG5ld1NhbXBsZVJhdGUgPCBvdXRTYW1wbGVSYXRlKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIGNoZWNrIGRlc2lnbiBjcml0ZXJpYSBhZ2FpbiBpZiBkb3duc2FtcGxpbmcgaXMgZGV0ZWN0ZWQuCisgICAgaW50IHBkaWZmID0gYWJzZGlmZihuZXdTYW1wbGVSYXRlLCBwcmV2U2FtcGxlUmF0ZSk7CisgICAgaW50IGFkaWZmID0gYWJzZGlmZihuZXdTYW1wbGVSYXRlLCBmaWx0ZXJTYW1wbGVSYXRlKTsKKworICAgIC8vIGFsbG93IHVwIHRvIDYlIHJlbGF0aXZlIGNoYW5nZSBpbmNyZW1lbnRzLgorICAgIC8vIGFsbG93IHVwIHRvIDEyJSBhYnNvbHV0ZSBjaGFuZ2UgaW5jcmVtZW50cyAoZnJvbSBmaWx0ZXIgZGVzaWduKQorICAgIHJldHVybiBwZGlmZiA8IHByZXZTYW1wbGVSYXRlPj40ICYmIGFkaWZmIDwgZmlsdGVyU2FtcGxlUmF0ZT4+MzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnNldFNhbXBsZVJhdGUoaW50MzJfdCBpblNhbXBsZVJhdGUpCit7CisgICAgaWYgKG1JblNhbXBsZVJhdGUgPT0gaW5TYW1wbGVSYXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCBvbGRTYW1wbGVSYXRlID0gbUluU2FtcGxlUmF0ZTsKKyAgICBpbnQzMl90IG9sZEhhbGZOdW1Db2VmcyA9IG1Db25zdGFudHMubUhhbGZOdW1Db2VmczsKKyAgICB1aW50MzJfdCBvbGRQaGFzZVdyYXBMaW1pdCA9IG1Db25zdGFudHMubUwgPDwgbUNvbnN0YW50cy5tU2hpZnQ7CisgICAgYm9vbCB1c2VTMzIgPSBmYWxzZTsKKworICAgIG1JblNhbXBsZVJhdGUgPSBpblNhbXBsZVJhdGU7CisKKyAgICAvLyBUT0RPOiBBZGQgcHJlY2FsY3VsYXRlZCBFcXVpcmlwcGxlIGZpbHRlcnMKKworICAgIGlmIChtRmlsdGVyUXVhbGl0eSAhPSBnZXRRdWFsaXR5KCkgfHwKKyAgICAgICAgICAgICFpc0Nsb3NlKGluU2FtcGxlUmF0ZSwgb2xkU2FtcGxlUmF0ZSwgbUZpbHRlclNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKSkgeworICAgICAgICBtRmlsdGVyU2FtcGxlUmF0ZSA9IGluU2FtcGxlUmF0ZTsKKyAgICAgICAgbUZpbHRlclF1YWxpdHkgPSBnZXRRdWFsaXR5KCk7CisKKyAgICAgICAgLy8gQmVnaW4gS2Fpc2VyIEZpbHRlciBjb21wdXRhdGlvbgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgcXVhbnRpemF0aW9uIGZsb29yIGZvciBTMTYgaXMgYWJvdXQgOTZkYiAtIDEwKmxvZ18xMCgjbGVuZ3RoKSArIDNkQi4KKyAgICAgICAgLy8gS2VlcCB0aGUgc3RvcCBiYW5kIGF0dGVudWF0aW9uIG5vIGdyZWF0ZXIgdGhhbiA4NC04NWRCIGZvciAzMiBsZW5ndGggUzE2IGZpbHRlcnMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9yIHMzMiB3ZSBrZWVwIHRoZSBzdG9wIGJhbmQgYXR0ZW51YXRpb24gYXQgdGhlIHNhbWUgYXMgMTZiIHJlc29sdXRpb24sIGFib3V0CisgICAgICAgIC8vIDk2LTk4ZEIKKyAgICAgICAgLy8KKworICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbjsKKyAgICAgICAgZG91YmxlIHRid0NoZWF0ID0gMS47IC8vIGhvdyBtdWNoIHdlICJjaGVhdCIgaW50byBhbGlhc2luZworICAgICAgICBpbnQgaGFsZkxlbmd0aDsKKyAgICAgICAgaWYgKG1GaWx0ZXJRdWFsaXR5ID09IERZTl9ISUdIX1FVQUxJVFkpIHsKKyAgICAgICAgICAgIC8vIDMyYiBjb2VmZmljaWVudHMsIDY0IGxlbmd0aAorICAgICAgICAgICAgdXNlUzMyID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA5OC47CisgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA0ODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA0MDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDMyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1GaWx0ZXJRdWFsaXR5ID09IERZTl9MT1dfUVVBTElUWSkgeworICAgICAgICAgICAgLy8gMTZiIGNvZWZmaWNpZW50cywgMTYtMzIgbGVuZ3RoCisgICAgICAgICAgICB1c2VTMzIgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA4MC47CisgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAyNDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjA1OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIERZTl9NRURfUVVBTElUWQorICAgICAgICAgICAgLy8gMTZiIGNvZWZmaWNpZW50cywgMzItNjQgbGVuZ3RoCisgICAgICAgICAgICAvLyBub3RlOiA+IDY0IGxlbmd0aCBmaWx0ZXJzIHdpdGggMTZiIGNvZWZzIGNhbiBoYXZlIHF1YW50aXphdGlvbiBub2lzZSBwcm9ibGVtcworICAgICAgICAgICAgdXNlUzMyID0gZmFsc2U7CisgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gODQuOworICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDQpIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMzI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMjQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHBvbHlwaGFzZXMgaW4gdGhlIGZpbHRlcmJhbmsuCisgICAgICAgIC8vIGZvciAxNmIsIGl0IGlzIGRlc2lyYWJsZSB0byBoYXZlIDJeKDE2LzIpID0gMjU2IHBoYXNlcy4KKyAgICAgICAgLy8gaHR0cHM6Ly9jY3JtYS5zdGFuZm9yZC5lZHUvfmpvcy9yZXNhbXBsZS9SZWxhdGlvbl9JbnRlcnBvbGF0aW9uX0Vycm9yX1F1YW50aXphdGlvbi5odG1sCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIGFyZSBhIGJpdCBtb3JlIGxheCBvbiB0aGlzLgorCisgICAgICAgIGludCBwaGFzZXMgPSBtU2FtcGxlUmF0ZSAvIGdjZChtU2FtcGxlUmF0ZSwgaW5TYW1wbGVSYXRlKTsKKworICAgICAgICAvLyBUT0RPOiBPbmNlIGR5bmFtaWMgc2FtcGxlIHJhdGUgY2hhbmdlIGlzIGFuIG9wdGlvbiwgdGhlIGNvZGUgYmVsb3cKKyAgICAgICAgLy8gc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGV4ZWN1dGUgb25seSB3aGVuIGR5bmFtaWMgc2FtcGxlIHJhdGUgY2hhbmdlIGlzIGVuYWJsZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIGFzIGFib3ZlLCAjcGhhc2VzIGxlc3MgdGhhbiA2MyBpcyB0b28gZmV3IHBoYXNlcyBmb3IgYWNjdXJhdGUgbGluZWFyIGludGVycG9sYXRpb24uCisgICAgICAgIC8vIHdlIGluY3JlYXNlIHRoZSBwaGFzZXMgdG8gY29tcGVuc2F0ZSwgYnV0IG1vcmUgcGhhc2VzIG1lYW5zIG1vcmUgbWVtb3J5IHBlcgorICAgICAgICAvLyBmaWx0ZXIgYW5kIG1vcmUgdGltZSB0byBjb21wdXRlIHRoZSBmaWx0ZXIuCisgICAgICAgIC8vCisgICAgICAgIC8vIGlmIHdlIGtub3cgdGhhdCB0aGUgZmlsdGVyIHdpbGwgYmUgdXNlZCBmb3IgZHluYW1pYyBzYW1wbGUgcmF0ZSBjaGFuZ2VzLAorICAgICAgICAvLyB0aGF0IHdvdWxkIGFsbG93IHVzIHNraXAgdGhpcyBwYXJ0IGZvciBmaXhlZCBzYW1wbGUgcmF0ZSByZXNhbXBsZXJzLgorICAgICAgICAvLworICAgICAgICB3aGlsZSAocGhhc2VzPDYzKSB7CisgICAgICAgICAgICBwaGFzZXMgKj0gMjsgLy8gdGhpcyBjb2RlIG9ubHkgbmVlZGVkIHRvIHN1cHBvcnQgZHluYW1pYyByYXRlIGNoYW5nZXMKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwaGFzZXM+PTI1NikgeyAgLy8gdG9vIG1hbnkgcGhhc2VzLCBhbHdheXMgaW50ZXJwb2xhdGUKKyAgICAgICAgICAgIHBoYXNlcyA9IDEyNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsdGVyCisgICAgICAgIG1Db25zdGFudHMuc2V0KHBoYXNlcywgaGFsZkxlbmd0aCwgaW5TYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgIGNyZWF0ZUthaXNlckZpcihtQ29uc3RhbnRzLCBzdG9wQmFuZEF0dGVuLAorICAgICAgICAgICAgICAgIGluU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsIHRid0NoZWF0KTsKKyAgICB9IC8vIEVuZCBLYWlzZXIgZmlsdGVyCisKKyAgICAvLyB1cGRhdGUgcGhhc2UgYW5kIHN0YXRlIGJhc2VkIG9uIHRoZSBuZXcgZmlsdGVyLgorICAgIGNvbnN0IENvbnN0YW50cyYgYyhtQ29uc3RhbnRzKTsKKyAgICBtSW5CdWZmZXIucmVzaXplKG1DaGFubmVsQ291bnQsIGMubUhhbGZOdW1Db2Vmcyk7CisgICAgY29uc3QgdWludDMyX3QgcGhhc2VXcmFwTGltaXQgPSBjLm1MIDw8IGMubVNoaWZ0OworICAgIC8vIHRyeSB0byBwcmVzZXJ2ZSBhcyBtdWNoIG9mIHRoZSBwaGFzZSBmcmFjdGlvbiBhcyBwb3NzaWJsZSBmb3Igb24tdGhlLWZseSBjaGFuZ2VzCisgICAgbVBoYXNlRnJhY3Rpb24gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KG1QaGFzZUZyYWN0aW9uKQorICAgICAgICAgICAgKiBwaGFzZVdyYXBMaW1pdCAvIG9sZFBoYXNlV3JhcExpbWl0OworICAgIG1QaGFzZUZyYWN0aW9uICU9IHBoYXNlV3JhcExpbWl0OyAvLyBzaG91bGQgbm90IGRvIGFueXRoaW5nLCBidXQganVzdCBpbiBjYXNlLgorICAgIG1QaGFzZUluY3JlbWVudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDxkb3VibGU+KHBoYXNlV3JhcExpbWl0KQorICAgICAgICAgICAgKiBpblNhbXBsZVJhdGUgLyBtU2FtcGxlUmF0ZSk7CisKKyAgICAvLyBkZXRlcm1pbmUgd2hpY2ggcmVzYW1wbGVyIHRvIHVzZQorICAgIC8vIGNoZWNrIGlmIGxvY2tlZCBwaGFzZSAod29ya3Mgb25seSBpZiBtUGhhc2VJbmNyZW1lbnQgaGFzIG5vICJmcmFjdGlvbmFsIHBoYXNlIGJpdHMiKQorICAgIGludCBsb2NrZWQgPSAobVBoYXNlSW5jcmVtZW50IDw8IChzaXplb2YobVBoYXNlSW5jcmVtZW50KSo4IC0gYy5tU2hpZnQpKSA9PSAwOworICAgIGludCBzdHJpZGUgPSAoYy5tSGFsZk51bUNvZWZzJjcpPT0wID8gMTYgOiAoYy5tSGFsZk51bUNvZWZzJjMpPT0wID8gOCA6IDI7CisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBtUGhhc2VGcmFjdGlvbiA9IG1QaGFzZUZyYWN0aW9uID4+IGMubVNoaWZ0IDw8IGMubVNoaWZ0OyAvLyByZW1vdmUgZnJhY3Rpb25hbCBwaGFzZQorICAgIH0KKworICAgIHNldFJlc2FtcGxlcihSRVNBTVBMRVRZUEUobUNoYW5uZWxDb3VudCwgbG9ja2VkLCBzdHJpZGUpKTsKKyNpZmRlZiBERUJVR19SRVNBTVBMRVIKKyAgICBwcmludGYoImNoYW5uZWxzOiVkICAlcyAgc3RyaWRlOiVkICAlcyAgY29lZjolZCAgc2hpZnQ6JWRcbiIsCisgICAgICAgICAgICBtQ2hhbm5lbENvdW50LCBsb2NrZWQgPyAibG9ja2VkIiA6ICJpbnRlcnBvbGF0ZWQiLAorICAgICAgICAgICAgc3RyaWRlLCB1c2VTMzIgPyAiUzMyIiA6ICJTMTYiLCAyKmMubUhhbGZOdW1Db2VmcywgYy5tU2hpZnQpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpCit7CisgICAgKHRoaXMtPiptUmVzYW1wbGVGdW5jKShyZWludGVycHJldF9jYXN0PFRPKj4ob3V0KSwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6c2V0UmVzYW1wbGVyKHVuc2lnbmVkIHJlc2FtcGxlVHlwZSkKK3sKKyAgICAvLyBzdHJpZGUgMTYgKGZhbGxzIGJhY2sgdG8gc3RyaWRlIDIgZm9yIG1hY2hpbmVzIHRoYXQgZG8gbm90IHN1cHBvcnQgTkVPTikKKyAgICBzd2l0Y2ggKHJlc2FtcGxlVHlwZSkgeworICAgIGNhc2UgUkVTQU1QTEVUWVBFKDEsIHRydWUsIDE2KToKKyAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MSwgdHJ1ZSwgMTY+OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBSRVNBTVBMRVRZUEUoMiwgdHJ1ZSwgMTYpOgorICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwyLCB0cnVlLCAxNj47CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFJFU0FNUExFVFlQRSgxLCBmYWxzZSwgMTYpOgorICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwxLCBmYWxzZSwgMTY+OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBSRVNBTVBMRVRZUEUoMiwgZmFsc2UsIDE2KToKKyAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MiwgZmFsc2UsIDE2PjsKKyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgcmVzYW1wbGVyIHR5cGU6ICV1IiwgcmVzYW1wbGVUeXBlKTsKKyAgICAgICAgbVJlc2FtcGxlRnVuYyA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFMsIGJvb2wgTE9DS0VELCBpbnQgU1RSSURFPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKQoreworICAgIGNvbnN0IENvbnN0YW50cyYgYyhtQ29uc3RhbnRzKTsKKyAgICBjb25zdCBUQyogY29uc3QgY29lZnMgPSBtQ29uc3RhbnRzLm1GaXJDb2VmczsKKyAgICBUSSogaW1wdWxzZSA9IG1JbkJ1ZmZlci5nZXRJbXB1bHNlKCk7CisgICAgc2l6ZV90IGlucHV0SW5kZXggPSBtSW5wdXRJbmRleDsKKyAgICB1aW50MzJfdCBwaGFzZUZyYWN0aW9uID0gbVBoYXNlRnJhY3Rpb247CisgICAgY29uc3QgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CisgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKKyAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsgICAvLyBzdGVyZW8gb3V0cHV0CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOworICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlV3JhcExpbWl0ID0gYy5tTCA8PCBjLm1TaGlmdDsKKworICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgorICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCisgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCisgICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorCisgICAgLy8gdGhlIGZvbGxvd2luZyBsb2dpYyBpcyBhIGJpdCBjb252b2x1dGVkIHRvIGtlZXAgdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wCisgICAgLy8gYXMgdGlnaHQgYXMgcG9zc2libGUgd2l0aCByZWdpc3RlciBhbGxvY2F0aW9uLgorICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSB7CisgICAgICAgIC8vIGJ1ZmZlciBpcyBlbXB0eSwgZmV0Y2ggYSBuZXcgb25lCisgICAgICAgIHdoaWxlIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OworICAgICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU91dHB1dFBUUyhvdXRwdXRJbmRleCAvIDIpKTsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ290byByZXNhbXBsZV9leGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBoYXNlRnJhY3Rpb24gPj0gcGhhc2VXcmFwTGltaXQpIHsgLy8gcmVhZCBpbiBkYXRhCisgICAgICAgICAgICAgICAgbUluQnVmZmVyLnRlbXBsYXRlIHJlYWRBZHZhbmNlPENIQU5ORUxTPigKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcHVsc2UsIGMubUhhbGZOdW1Db2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VEkqPihtQnVmZmVyLnJhdyksIGlucHV0SW5kZXgpOworICAgICAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24gLT0gcGhhc2VXcmFwTGltaXQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKHBoYXNlRnJhY3Rpb24gPj0gcGhhc2VXcmFwTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBtQnVmZmVyLmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXggLT0gbUJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUluQnVmZmVyLnRlbXBsYXRlIHJlYWRBZHZhbmNlPENIQU5ORUxTPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXB1bHNlLCBjLm1IYWxmTnVtQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxUSSo+KG1CdWZmZXIucmF3KSwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24gLT0gcGhhc2VXcmFwTGltaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IFRJKiBjb25zdCBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVEkqPihtQnVmZmVyLnJhdyk7CisgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gbUJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICBjb25zdCBpbnQgY29lZlNoaWZ0ID0gYy5tU2hpZnQ7CisgICAgICAgIGNvbnN0IGludCBoYWxmTnVtQ29lZnMgPSBjLm1IYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRPKiBjb25zdCB2b2x1bWVTaW1kID0gbVZvbHVtZVNpbWQ7CisKKyAgICAgICAgLy8gcmVyZWFkIHRoZSBsYXN0IGlucHV0IGluLgorICAgICAgICBtSW5CdWZmZXIudGVtcGxhdGUgcmVhZEFnYWluPENIQU5ORUxTPihpbXB1bHNlLCBoYWxmTnVtQ29lZnMsIGluLCBpbnB1dEluZGV4KTsKKworICAgICAgICAvLyBtYWluIHByb2Nlc3NpbmcgbG9vcAorICAgICAgICB3aGlsZSAoQ0NfTElLRUxZKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQpKSB7CisgICAgICAgICAgICAvLyBjYXV0aW9uOiBmaXIoKSBpcyBpbmxpbmVkIGFuZCBtYXkgYmUgbGFyZ2UuCisgICAgICAgICAgICAvLyBvdXRwdXQgd2lsbCBiZSBsb2FkZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZnJvbSB0aGUgaW5wdXQgc2FtcGxlcyBpbiBpbXB1bHNlWy1oYWxmTnVtQ29lZnMrMV0uLi4gaW1wdWxzZVtoYWxmTnVtQ29lZnNdCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBwb2x5cGhhc2UgZmlsdGVyIG9mIChwaGFzZUZyYWN0aW9uIC8gcGhhc2VXcmFwTGltaXQpIGluIGNvZWZzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZpcjxDSEFOTkVMUywgTE9DS0VELCBTVFJJREU+KAorICAgICAgICAgICAgICAgICAgICAmb3V0W291dHB1dEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgcGhhc2VGcmFjdGlvbiwgcGhhc2VXcmFwTGltaXQsCisgICAgICAgICAgICAgICAgICAgIGNvZWZTaGlmdCwgaGFsZk51bUNvZWZzLCBjb2VmcywKKyAgICAgICAgICAgICAgICAgICAgaW1wdWxzZSwgdm9sdW1lU2ltZCk7CisgICAgICAgICAgICBvdXRwdXRJbmRleCArPSAyOworCisgICAgICAgICAgICBwaGFzZUZyYWN0aW9uICs9IHBoYXNlSW5jcmVtZW50OworICAgICAgICAgICAgd2hpbGUgKHBoYXNlRnJhY3Rpb24gPj0gcGhhc2VXcmFwTGltaXQpIHsKKyAgICAgICAgICAgICAgICBpbnB1dEluZGV4Kys7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0SW5kZXggPj0gZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7ICAvLyBuZWVkIGEgbmV3IGJ1ZmZlcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtSW5CdWZmZXIudGVtcGxhdGUgcmVhZEFkdmFuY2U8Q0hBTk5FTFM+KGltcHVsc2UsIGhhbGZOdW1Db2VmcywgaW4sIGlucHV0SW5kZXgpOworICAgICAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24gLT0gcGhhc2VXcmFwTGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK2RvbmU6CisgICAgICAgIC8vIG9mdGVuIGFycml2ZXMgaGVyZSB3aGVuIGlucHV0IGJ1ZmZlciBydW5zIG91dAorICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICBpbnB1dEluZGV4IC09IGZyYW1lQ291bnQ7CisgICAgICAgICAgICBwcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgICAgICAvLyBtQnVmZmVyLmZyYW1lQ291bnQgTVVTVCBiZSB6ZXJvIGhlcmUuCisgICAgICAgIH0KKyAgICB9CisKK3Jlc2FtcGxlX2V4aXQ6CisgICAgbUluQnVmZmVyLnNldEltcHVsc2UoaW1wdWxzZSk7CisgICAgbUlucHV0SW5kZXggPSBpbnB1dEluZGV4OworICAgIG1QaGFzZUZyYWN0aW9uID0gcGhhc2VGcmFjdGlvbjsKK30KKworLyogaW5zdGFudGlhdGUgdGVtcGxhdGVzIHVzZWQgYnkgQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSAqLwordGVtcGxhdGUgY2xhc3MgQXVkaW9SZXNhbXBsZXJEeW48ZmxvYXQsIGZsb2F0LCBmbG9hdD47Cit0ZW1wbGF0ZSBjbGFzcyBBdWRpb1Jlc2FtcGxlckR5bjxpbnQxNl90LCBpbnQxNl90LCBpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEF1ZGlvUmVzYW1wbGVyRHluPGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzU2MzE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0RZTl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0RZTl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIEF1ZGlvUmVzYW1wbGVyRHluCisgKgorICogVGhpcyBjbGFzcyB0ZW1wbGF0ZSBpcyB1c2VkIGZvciBmbG9hdGluZyBwb2ludCBhbmQgaW50ZWdlciByZXNhbXBsZXJzLgorICoKKyAqIFR5cGUgdmFyaWFibGVzOgorICogVEMgPSBmaWx0ZXIgY29lZmZpY2llbnQgdHlwZSAob25lIG9mIGludDE2X3QsIGludDMyX3QsIG9yIGZsb2F0KQorICogVEkgPSBpbnB1dCBkYXRhIHR5cGUgKG9uZSBvZiBpbnQxNl90IG9yIGZsb2F0KQorICogVE8gPSBvdXRwdXQgZGF0YSB0eXBlIChvbmUgb2YgaW50MzJfdCBvciBmbG9hdCkKKyAqCisgKiBGb3IgaW50ZWdlciBpbnB1dCBkYXRhIHR5cGVzIFRJLCB0aGUgY29lZmZpY2llbnQgdHlwZSBUQyBpcyBlaXRoZXIgaW50MTZfdCBvciBpbnQzMl90LgorICogRm9yIGZsb2F0IGlucHV0IGRhdGEgdHlwZXMgVEksIHRoZSBjb2VmZmljaWVudCB0eXBlIFRDIGlzIGZsb2F0LgorICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitjbGFzcyBBdWRpb1Jlc2FtcGxlckR5bjogcHVibGljIEF1ZGlvUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICBBdWRpb1Jlc2FtcGxlckR5bihpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSk7CisKKyAgICB2aXJ0dWFsIH5BdWRpb1Jlc2FtcGxlckR5bigpOworCisgICAgdmlydHVhbCB2b2lkIGluaXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRTYW1wbGVSYXRlKGludDMyX3QgaW5TYW1wbGVSYXRlKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoaW50MTZfdCBsZWZ0LCBpbnQxNl90IHJpZ2h0KTsKKworICAgIHZpcnR1YWwgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOworCitwcml2YXRlOgorCisgICAgY2xhc3MgQ29uc3RhbnRzIHsgLy8gc3RvcmVzIHRoZSBmaWx0ZXIgY29uc3RhbnRzLgorICAgIHB1YmxpYzoKKyAgICAgICAgQ29uc3RhbnRzKCkgOgorICAgICAgICAgICAgbUwoMCksIG1TaGlmdCgwKSwgbUhhbGZOdW1Db2VmcygwKSwgbUZpckNvZWZzKE5VTEwpCisgICAgICAgIHt9CisgICAgICAgIHZvaWQgc2V0KGludCBMLCBpbnQgaGFsZk51bUNvZWZzLAorICAgICAgICAgICAgICAgIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgICAgICBpbnQgbUw7ICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGlvbiBwaGFzZXMgaW4gdGhlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgaW50IG1TaGlmdDsgICAgICAgIC8vIHJpZ2h0IHNoaWZ0IHRvIGdldCBwb2x5cGhhc2UgaW5kZXgKKyAgICAgICAgdW5zaWduZWQgaW50IG1IYWxmTnVtQ29lZnM7IC8vIGZpbHRlciBoYWxmICNjb2VmcworICAgICAgICAgICBjb25zdCBUQyogbUZpckNvZWZzOyAgICAgLy8gcG9seXBoYXNlIGZpbHRlciBiYW5rCisgICAgfTsKKworICAgIGNsYXNzIEluQnVmZmVyIHsgLy8gYnVmZmVyIG1hbmFnZW1lbnQgZm9yIGlucHV0IHR5cGUgVEkKKyAgICBwdWJsaWM6CisgICAgICAgIEluQnVmZmVyKCk7CisgICAgICAgIH5JbkJ1ZmZlcigpOworICAgICAgICB2b2lkIGluaXQoKTsKKworICAgICAgICB2b2lkIHJlc2l6ZShpbnQgQ0hBTk5FTFMsIGludCBoYWxmTnVtQ29lZnMpOworCisgICAgICAgIC8vIHVzZWQgZm9yIGRpcmVjdCBtYW5hZ2VtZW50IG9mIHRoZSBtSW1wdWxzZSBwb2ludGVyCisgICAgICAgIGlubGluZSBUSSogZ2V0SW1wdWxzZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW1wdWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldEltcHVsc2UoVEkgKmltcHVsc2UpIHsKKyAgICAgICAgICAgIG1JbXB1bHNlID0gaW1wdWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KKyAgICAgICAgaW5saW5lIHZvaWQgcmVhZEFnYWluKFRJKiYgaW1wdWxzZSwgY29uc3QgaW50IGhhbGZOdW1Db2VmcywKKyAgICAgICAgICAgICAgICBjb25zdCBUSSogY29uc3QgaW4sIGNvbnN0IHNpemVfdCBpbnB1dEluZGV4KTsKKworICAgICAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CisgICAgICAgIGlubGluZSB2b2lkIHJlYWRBZHZhbmNlKFRJKiYgaW1wdWxzZSwgY29uc3QgaW50IGhhbGZOdW1Db2VmcywKKyAgICAgICAgICAgICAgICBjb25zdCBUSSogY29uc3QgaW4sIGNvbnN0IHNpemVfdCBpbnB1dEluZGV4KTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIHR1bmluZyBwYXJhbWV0ZXIgZ3VpZGVsaW5lczogMiA8PSBtdWx0aXBsZSA8PSA4CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga1N0YXRlU2l6ZU11bHRpcGxlT2ZGaWx0ZXJMZW5ndGggPSA0OworCisgICAgICAgIC8vIGluIGdlbmVyYWwsIG1SaW5nRnVsbCA9IG1TdGF0ZSArIG1TdGF0ZVNpemUgLSBoYWxmTnVtQ29lZnMqQ0hBTk5FTFMuCisgICAgICAgICAgIFRJKiBtU3RhdGU7ICAgICAgLy8gYmFzZSBwb2ludGVyIGZvciB0aGUgaW5wdXQgYnVmZmVyIHN0b3JhZ2UKKyAgICAgICAgICAgVEkqIG1JbXB1bHNlOyAgICAvLyBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBpbXB1bHNlIHJlc3BvbnNlIChjZW50ZXJlZCkKKyAgICAgICAgICAgVEkqIG1SaW5nRnVsbDsgICAvLyBtU3RhdGUgPD0gbUltcHVsc2UgPCBtUmluZ0Z1bGwKKyAgICAgICAgc2l6ZV90IG1TdGF0ZUNvdW50OyAvLyBzaXplIG9mIHN0YXRlIGluIHVuaXRzIG9mIFRJLgorICAgIH07CisKKyAgICB2b2lkIGNyZWF0ZUthaXNlckZpcihDb25zdGFudHMgJmMsIGRvdWJsZSBzdG9wQmFuZEF0dGVuLAorICAgICAgICAgICAgaW50IGluU2FtcGxlUmF0ZSwgaW50IG91dFNhbXBsZVJhdGUsIGRvdWJsZSB0YndDaGVhdCk7CisKKyAgICB2b2lkIHNldFJlc2FtcGxlcih1bnNpZ25lZCByZXNhbXBsZVR5cGUpOworCisgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTLCBib29sIExPQ0tFRCwgaW50IFNUUklERT4KKyAgICB2b2lkIHJlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CisKKyAgICAvLyBkZWNsYXJlIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gZm9yIHJlc2FtcGxlCisgICAgdHlwZWRlZiB2b2lkIChBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6KnJlc2FtcGxlX0FCUF90KShUTyogb3V0LAorICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lQ291bnQsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKKworICAgIC8vIGRhdGEgLSB0aGUgY29udGlndW91cyBzdG9yYWdlIGFuZCBsYXlvdXQgb2YgdGhlc2UgaXMgaW1wb3J0YW50LgorICAgICAgICAgICBJbkJ1ZmZlciBtSW5CdWZmZXI7CisgICAgICAgICAgQ29uc3RhbnRzIG1Db25zdGFudHM7ICAgICAgICAvLyBjdXJyZW50IHNldCBvZiBjb2VmZmljaWVudCBwYXJhbWV0ZXJzCisgICAgVE8gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDgpKSkgbVZvbHVtZVNpbWRbMl07IC8vIG11c3QgYmUgYWxpZ25lZCBvciBORU9OIG1heSBjcmFzaAorICAgICByZXNhbXBsZV9BQlBfdCBtUmVzYW1wbGVGdW5jOyAgICAgLy8gY2FsbGVkIGZ1bmN0aW9uIGZvciByZXNhbXBsaW5nCisgICAgICAgICAgICBpbnQzMl90IG1GaWx0ZXJTYW1wbGVSYXRlOyAvLyBkZXNpZ25lZCBmaWx0ZXIgc2FtcGxlIHJhdGUuCisgICAgICAgIHNyY19xdWFsaXR5IG1GaWx0ZXJRdWFsaXR5OyAgICAvLyBkZXNpZ25lZCBmaWx0ZXIgcXVhbGl0eS4KKyAgICAgICAgICAgICAgdm9pZCogbUNvZWZCdWZmZXI7ICAgICAgIC8vIGlmIGEgZmlsdGVyIGlzIGNyZWF0ZWQsIHRoaXMgaXMgbm90IG51bGwKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0RZTl9IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyNGIyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCkBAIC0wLDAgKzEsNzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfR0VOX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX0dFTl9ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyAqIGdlbmVyYXRlcyBhIHNpbmUgd2F2ZSBhdCBlcXVhbCBzdGVwcy4KKyAqCisgKiBBcyBtb3N0IG9mIG91ciBmdW5jdGlvbnMgdXNlIHNpbmUgb3IgY29zaW5lIGF0IGVxdWFsIHN0ZXBzLAorICogaXQgaXMgdmVyeSBlZmZpY2llbnQgdG8gY29tcHV0ZSB0aGVtIHRoYXQgd2F5IChzaW5nbGUgbXVsdGlwbHkgYW5kIHN1YnRyYWN0KSwKKyAqIHJhdGhlciB0aGFuIGludm9raW5nIHRoZSBtYXRoIGxpYnJhcnkgc2luKCkgb3IgY29zKCkgZWFjaCB0aW1lLgorICoKKyAqIFNpbmVHZW4gdXNlcyBHb2VydHplbCdzIEFsZ29yaXRobSAoYXMgYSBnZW5lcmF0b3Igbm90IGEgZmlsdGVyKQorICogdG8gY2FsY3VsYXRlIHNpbmUod3N0YXJ0ICsgbiAqIHdzdGVwKSBvciBjb3NpbmUod3N0YXJ0ICsgbiAqIHdzdGVwKQorICogYnkgc3RlcHBpbmcgdGhyb3VnaCAwLCAxLCAuLi4gbi4KKyAqCisgKiBlXmkod3N0YXJ0K3dzdGVwKSA9IDJjb3Mod3N0ZXApICogZV5pKHdzdGFydCkgLSBlXmkod3N0YXJ0LXdzdGVwKQorICoKKyAqIG9yIGxvb2tpbmcgYXQganVzdCB0aGUgaW1hZ2luYXJ5IHNpbmUgdGVybSwgYXMgdGhlIGNvc2luZSBmb2xsb3dzIGlkZW50aWNhbGx5OgorICoKKyAqIHNpbih3c3RhcnQrd3N0ZXApID0gMmNvcyh3c3RlcCkgKiBzaW4od3N0YXJ0KSAtIHNpbih3c3RhcnQtd3N0ZXApCisgKgorICogR29lcnR6ZWwncyBhbGdvcml0aG0gaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgYW5nbGUgYWRkaXRpb24gZm9ybXVsYSwKKyAqIGVeaSh3c3RhcnQrd3N0ZXApID0gZV5pKHdzdGFydCkgKiBlXmkod3N0ZXApLCB3aGljaCB0YWtlcyB1cCB0bworICogNCBtdWx0aXBsaWVzIGFuZCAyIGFkZHMgKG9yIDMqIGFuZCAzKykgYW5kIHJlcXVpcmVzIGJvdGggc2luZSBhbmQKKyAqIGNvc2luZSBnZW5lcmF0aW9uIGR1ZSB0byB0aGUgY29tcGxleCAqIGNvbXBsZXggbXVsdGlwbHkgKGZ1bGwgcm90YXRpb24pLgorICoKKyAqIFNlZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Hb2VydHplbF9hbGdvcml0aG0KKyAqCisgKi8KKworY2xhc3MgU2luZUdlbiB7CitwdWJsaWM6CisgICAgU2luZUdlbihkb3VibGUgd3N0YXJ0LCBkb3VibGUgd3N0ZXAsIGJvb2wgY29zaW5lID0gZmFsc2UpIHsKKyAgICAgICAgaWYgKGNvc2luZSkgeworICAgICAgICAgICAgbUN1cnJlbnQgPSBjb3Mod3N0YXJ0KTsKKyAgICAgICAgICAgIG1QcmV2aW91cyA9IGNvcyh3c3RhcnQgLSB3c3RlcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ3VycmVudCA9IHNpbih3c3RhcnQpOworICAgICAgICAgICAgbVByZXZpb3VzID0gc2luKHdzdGFydCAtIHdzdGVwKTsKKyAgICAgICAgfQorICAgICAgICBtVHdvQ29zID0gMi4qY29zKHdzdGVwKTsKKyAgICB9CisgICAgU2luZUdlbihkb3VibGUgZXhwTm93LCBkb3VibGUgZXhwUHJldiwgZG91YmxlIHR3b0Nvc1N0ZXApIHsKKyAgICAgICAgbUN1cnJlbnQgPSBleHBOb3c7CisgICAgICAgIG1QcmV2aW91cyA9IGV4cFByZXY7CisgICAgICAgIG1Ud29Db3MgPSB0d29Db3NTdGVwOworICAgIH0KKyAgICBpbmxpbmUgZG91YmxlIHZhbHVlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUN1cnJlbnQ7CisgICAgfQorICAgIGlubGluZSB2b2lkIGFkdmFuY2UoKSB7CisgICAgICAgIGRvdWJsZSB0bXAgPSBtQ3VycmVudDsKKyAgICAgICAgbUN1cnJlbnQgPSBtQ3VycmVudCptVHdvQ29zIC0gbVByZXZpb3VzOworICAgICAgICBtUHJldmlvdXMgPSB0bXA7CisgICAgfQorICAgIGlubGluZSBkb3VibGUgdmFsdWVBZHZhbmNlKCkgeworICAgICAgICBkb3VibGUgdG1wID0gbUN1cnJlbnQ7CisgICAgICAgIG1DdXJyZW50ID0gbUN1cnJlbnQqbVR3b0NvcyAtIG1QcmV2aW91czsKKyAgICAgICAgbVByZXZpb3VzID0gdG1wOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKworcHJpdmF0ZToKKyAgICBkb3VibGUgbUN1cnJlbnQ7IC8vIGN1cnJlbnQgdmFsdWUgb2Ygc2luZS9jb3NpbmUKKyAgICBkb3VibGUgbVByZXZpb3VzOyAvLyBwcmV2aW91cyB2YWx1ZSBvZiBzaW5lL2Nvc2luZQorICAgIGRvdWJsZSBtVHdvQ29zOyAvLyBzdGVwcGluZyBmYWN0b3IKK307CisKKy8qCisgKiBnZW5lcmF0ZXMgYSBzZXJpZXMgb2Ygc2luZSBnZW5lcmF0b3JzLCBwaGFzZSBvZmZzZXQgYnkgZml4ZWQgc3RlcHMuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIGdlbmVyYXRlIHBvbHlwaGFzZSBzaW5lIGdlbmVyYXRvcnMsIG9uZSBwZXIgcG9seXBoYXNlCisgKiBpbiB0aGUgZmlsdGVyIGNvZGUgYmVsb3cuCisgKgorICogVGhlIFNpbmVHZW4gcmV0dXJuZWQgYnkgdmFsdWUoKSBzdGFydHMgYXQgaW5uZXJTdGFydCA9IG91dGVyU3RhcnQgKyBuKm91dGVyU3RlcDsKKyAqIGluY3JlbWVudHMgYnkgaW5uZXJTdGVwLgorICoKKyAqLworCitjbGFzcyBTaW5lR2VuR2VuIHsKK3B1YmxpYzoKKyAgICBTaW5lR2VuR2VuKGRvdWJsZSBvdXRlclN0YXJ0LCBkb3VibGUgb3V0ZXJTdGVwLCBkb3VibGUgaW5uZXJTdGVwLCBib29sIGNvc2luZSA9IGZhbHNlKQorICAgICAgICAgICAgOiBtU2luZUlubmVyQ3VyKG91dGVyU3RhcnQsIG91dGVyU3RlcCwgY29zaW5lKSwKKyAgICAgICAgICAgICAgbVNpbmVJbm5lclByZXYob3V0ZXJTdGFydC1pbm5lclN0ZXAsIG91dGVyU3RlcCwgY29zaW5lKQorICAgIHsKKyAgICAgICAgbVR3b0NvcyA9IDIuKmNvcyhpbm5lclN0ZXApOworICAgIH0KKyAgICBpbmxpbmUgU2luZUdlbiB2YWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIFNpbmVHZW4obVNpbmVJbm5lckN1ci52YWx1ZSgpLCBtU2luZUlubmVyUHJldi52YWx1ZSgpLCBtVHdvQ29zKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgYWR2YW5jZSgpIHsKKyAgICAgICAgbVNpbmVJbm5lckN1ci5hZHZhbmNlKCk7CisgICAgICAgIG1TaW5lSW5uZXJQcmV2LmFkdmFuY2UoKTsKKyAgICB9CisgICAgaW5saW5lIFNpbmVHZW4gdmFsdWVBZHZhbmNlKCkgeworICAgICAgICByZXR1cm4gU2luZUdlbihtU2luZUlubmVyQ3VyLnZhbHVlQWR2YW5jZSgpLCBtU2luZUlubmVyUHJldi52YWx1ZUFkdmFuY2UoKSwgbVR3b0Nvcyk7CisgICAgfQorCitwcml2YXRlOgorICAgIFNpbmVHZW4gbVNpbmVJbm5lckN1cjsgLy8gZ2VuZXJhdGUgdGhlIGlubmVyIHNpbmUgdmFsdWVzIChzdGVwcGVkIGJ5IG91dGVyU3RlcCkuCisgICAgU2luZUdlbiBtU2luZUlubmVyUHJldjsgLy8gZ2VuZXJhdGUgdGhlIGlubmVyIHNpbmUgcHJldmlvdXMgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGJlaGluZCBieSBpbm5lclN0ZXAsIHN0ZXBwZWQgYnkgb3V0ZXJTdGVwKS4KKyAgICBkb3VibGUgbVR3b0NvczsgLy8gdGhlIGlubmVyIHN0ZXBwaW5nIGZhY3RvciBmb3IgdGhlIHJldHVybmVkIFNpbmVHZW4uCit9OworCitzdGF0aWMgaW5saW5lIGRvdWJsZSBzcXIoZG91YmxlIHgpIHsKKyAgICByZXR1cm4geCAqIHg7Cit9CisKKy8qCisgKiByb3VuZHMgYSBkb3VibGUgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBmb3IgRklSIGNvZWZmaWNpZW50cy4KKyAqCisgKiBPbmUgdmFyaWFudCB1c2VzIG5vaXNlIHNoYXBpbmcsIHdoaWNoIG11c3Qga2VlcCBlcnJvciBoaXN0b3J5CisgKiB0byB3b3JrICh0aGUgZXJyIHBhcmFtZXRlciwgaW5pdGlhbGl6ZWQgdG8gMCkuCisgKiBUaGUgb3RoZXIgdmFyaWFudCBpcyBhIG5vbi1ub2lzZSBzaGFwZWQgdmVyc2lvbiBmb3IKKyAqIFMzMiBjb2VmZmljaWVudHMgKG5vaXNlIHNoYXBpbmcgZG9lc24ndCBnYWluIG11Y2gpLgorICoKKyAqIENhdXRpb246IE5vIGJvdW5kcyBzYXR1cmF0aW9uIGlzIGFwcGxpZWQsIGJ1dCBpc24ndCBuZWVkZWQgaW4gdGhpcyBjYXNlLgorICoKKyAqIEBwYXJhbSB4IGlzIHRoZSB2YWx1ZSB0byByb3VuZC4KKyAqCisgKiBAcGFyYW0gbWF4dmFsIGlzIHRoZSBtYXhpbXVtIGludGVnZXIgc2NhbGUgZmFjdG9yIGV4cHJlc3NlZCBhcyBhbiBpbnQ2NCAoZm9yIGhlYWRyb29tKS4KKyAqIFR5cGljYWxseSB0aGlzIG1heSBiZSB0aGUgbWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyKzEgKHVzaW5nIHRoZSBmYWN0IHRoYXQgZG91YmxlIHByZWNpc2lvbgorICogRklSIGNvZWZmaWNpZW50cyBnZW5lcmF0ZWQgaGVyZSBhcmUgbmV2ZXIgdGhhdCBjbG9zZSB0byAxLjAgdG8gcG9zZSBhbiBvdmVyZmxvdyBjb25kaXRpb24pLgorICoKKyAqIEBwYXJhbSBlcnIgaXMgdGhlIHByZXZpb3VzIGVycm9yIChhY3R1YWwgLSByb3VuZGVkKSBmb3IgdGhlIHByZXZpb3VzIHJvdW5kaW5nIG9wLgorICogRm9yIDE2YiBjb2VmZmljaWVudHMgdGhpcyBjYW4gaW1wcm92ZSBzdG9wYmFuZCBkQiBwZXJmb3JtYW5jZSBieSB1cCB0byAyZEIuCisgKgorICogTWFueSB2YXJpYW50cyBleGlzdCBmb3IgdGhlIG5vaXNlIHNoYXBpbmc6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTm9pc2Vfc2hhcGluZworICoKKyAqLworCitzdGF0aWMgaW5saW5lIGludDY0X3QgdG9pbnQoZG91YmxlIHgsIGludDY0X3QgbWF4dmFsLCBkb3VibGUmIGVycikgeworICAgIGRvdWJsZSB2YWwgPSB4ICogbWF4dmFsOworICAgIGRvdWJsZSBpdmFsID0gZmxvb3IodmFsICsgMC41ICsgZXJyKjAuMik7CisgICAgZXJyID0gdmFsIC0gaXZhbDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaXZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCB0b2ludChkb3VibGUgeCwgaW50NjRfdCBtYXh2YWwpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZmxvb3IoeCAqIG1heHZhbCArIDAuNSkpOworfQorCisvKgorICogTW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kCisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jlc3NlbF9mdW5jdGlvbgorICoKKyAqIFRoZSBmb3JtdWxhcyBhcmUgdGFrZW4gZnJvbSBBYnJhbW93aXR6IGFuZCBTdGVndW4sCisgKiBfSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9uc18gKGxpbmtzIGJlbG93KToKKyAqCisgKiBodHRwOi8vcGVvcGxlLm1hdGguc2Z1LmNhL35jYm0vYWFuZHMvcGFnZV8zNzUuaHRtCisgKiBodHRwOi8vcGVvcGxlLm1hdGguc2Z1LmNhL35jYm0vYWFuZHMvcGFnZV8zNzguaHRtCisgKgorICogaHR0cDovL2RsbWYubmlzdC5nb3YvMTAuMjUKKyAqIGh0dHA6Ly9kbG1mLm5pc3QuZ292LzEwLjQwCisgKgorICogTm90ZSB3ZSBhc3N1bWUgeCBpcyBub25uZWdhdGl2ZSAodGhlIGZ1bmN0aW9uIGlzIHN5bW1ldHJpYywKKyAqIHBhc3MgaW4gdGhlIGFic29sdXRlIHZhbHVlIGFzIG5lZWRlZCkuCisgKgorICogQ29uc3RhbnRzIGFyZSBjb21waWxlIHRpbWUgZGVyaXZlZCB3aXRoIHRlbXBsYXRlcyBJMFRlcm08PiBhbmQKKyAqIEkwQVRlcm08PiB0byB0aGUgcHJlY2lzaW9uIG9mIHRoZSBjb21waWxlci4gIFRoZSBzZXJpZXMgY2FuIGJlIGV4cGFuZGVkCisgKiB0byBhbnkgcHJlY2lzaW9uIG5lZWRlZCwgYnV0IGN1cnJlbnRseSBzZXQgYXJvdW5kIDI0YiBwcmVjaXNpb24uCisgKgorICogV2UgdXNlIGEgYml0IG9mIHRlbXBsYXRlIG1hdGggaGVyZSwgY29uc3RleHByIHdvdWxkIHByb2JhYmx5IGJlCisgKiBtb3JlIGFwcHJvcHJpYXRlIGZvciBhIEMrKzExIGNvbXBpbGVyLgorICoKKyAqIEZvciB0aGUgaW50ZXJtZWRpYXRlIHJhbmdlIDMuNzUgPCB4IDwgMTUsIHdlIHVzZSBtaW5pbWF4IHBvbHlub21pYWwgZml0LgorICoKKyAqLworCit0ZW1wbGF0ZSA8aW50IE4+CitzdHJ1Y3QgSTBUZXJtIHsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHZhbHVlID0gSTBUZXJtPE4tMT46OnZhbHVlIC8gKDQuICogTiAqIE4pOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBJMFRlcm08MD4geworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgdmFsdWUgPSAxLjsKK307CisKK3RlbXBsYXRlIDxpbnQgTj4KK3N0cnVjdCBJMEFUZXJtIHsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHZhbHVlID0gSTBBVGVybTxOLTE+Ojp2YWx1ZSAqICgyLipOLTEuKSAqICgyLipOLTEuKSAvICg4LiAqIE4pOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBJMEFUZXJtPDA+IHsgLy8gMS9zcXJ0KDIqUEkpOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgdmFsdWUgPSAwLjM5ODk0MjI4MDQwMTQzMjY3NzkzOTk0NjA1OTkzNDM4MTg2ODQ3NTg1ODYzMTE2NDkzNDY1NzY2NTkyNTsKK307CisKKyNpZiBVU0VfSE9STkVSU19NRVRIT0QKKy8qIFBvbHlub21pYWwgZXZhbHVhdGlvbiBvZiBBICsgQnggKyBDeF4yICsgRHheMyArIC4uLgorICogdXNpbmcgSG9ybmVyJ3MgTWV0aG9kOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hvcm5lcidzX21ldGhvZAorICoKKyAqIFRoaXMgaGFzIGZld2VyIG11bHRpcGxpY2F0aW9ucyB0aGFuIEVzdHJpbidzIG1ldGhvZCBiZWxvdywgYnV0IGhhcyBiYWNrIHRvIGJhY2sKKyAqIGZsb2F0aW5nIHBvaW50IGRlcGVuZGVuY2llcy4KKyAqCisgKiBPbiBBUk0gdGhpcyBhcHBlYXJzIHRvIHdvcmsgc2xvd2VyLCBzbyBVU0VfSE9STkVSU19NRVRIT0QgaXMgbm90IGRlZmF1bHQgZW5hYmxlZC4KKyAqLworCitpbmxpbmUgZG91YmxlIFBvbHkyKGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIHgpIHsKKyAgICByZXR1cm4gQSArIHggKiBCOworfQorCitpbmxpbmUgZG91YmxlIFBvbHk0KGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSBELCBkb3VibGUgeCkgeworICAgIHJldHVybiBBICsgeCAqIChCICsgeCAqIChDICsgeCAqIChEKSkpOworfQorCitpbmxpbmUgZG91YmxlIFBvbHk3KGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSBELCBkb3VibGUgRSwgZG91YmxlIEYsIGRvdWJsZSBHLAorICAgICAgICBkb3VibGUgeCkgeworICAgIHJldHVybiBBICsgeCAqIChCICsgeCAqIChDICsgeCAqIChEICsgeCAqIChFICsgeCAqIChGICsgeCAqIChHKSkpKSkpOworfQorCitpbmxpbmUgZG91YmxlIFBvbHk5KGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSBELCBkb3VibGUgRSwgZG91YmxlIEYsIGRvdWJsZSBHLAorICAgICAgICBkb3VibGUgSCwgZG91YmxlIEksIGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIEEgKyB4ICogKEIgKyB4ICogKEMgKyB4ICogKEQgKyB4ICogKEUgKyB4ICogKEYgKyB4ICogKEcgKyB4ICogKEggKyB4ICogKEkpKSkpKSkpKTsKK30KKworI2Vsc2UKKy8qIFBvbHlub21pYWwgZXZhbHVhdGlvbiBvZiBBICsgQnggKyBDeF4yICsgRHheMyArIC4uLgorICogdXNpbmcgRXN0cmluJ3MgTWV0aG9kOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VzdHJpbidzX3NjaGVtZQorICoKKyAqIFRoaXMgaXMgdHlwaWNhbGx5IGZhc3RlciwgcGVyaGFwcyBnYWlucyBhYm91dCA1LTEwJSBvdmVyYWxsIG9uIEFSTSBwcm9jZXNzb3JzCisgKiBvdmVyIEhvcm5lcidzIG1ldGhvZCBhYm92ZS4KKyAqLworCitpbmxpbmUgZG91YmxlIFBvbHkyKGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIHgpIHsKKyAgICByZXR1cm4gQSArIEIgKiB4OworfQorCitpbmxpbmUgZG91YmxlIFBvbHkzKGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSB4LCBkb3VibGUgeDIpIHsKKyAgICByZXR1cm4gUG9seTIoQSwgQiwgeCkgKyBDICogeDI7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTMoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIHgpIHsKKyAgICByZXR1cm4gUG9seTIoQSwgQiwgeCkgKyBDICogeCAqIHg7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTQoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIEQsIGRvdWJsZSB4LCBkb3VibGUgeDIpIHsKKyAgICByZXR1cm4gUG9seTIoQSwgQiwgeCkgKyBQb2x5MihDLCBELCB4KSAqIHgyOyAvLyBzYW1lIGFzIHBvbHkyKHBvbHkyLCBwb2x5MiwgeDIpOworfQorCitpbmxpbmUgZG91YmxlIFBvbHk0KGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSBELCBkb3VibGUgeCkgeworICAgIHJldHVybiBQb2x5NChBLCBCLCBDLCBELCB4LCB4ICogeCk7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTcoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIEQsIGRvdWJsZSBFLCBkb3VibGUgRiwgZG91YmxlIEcsCisgICAgICAgIGRvdWJsZSB4KSB7CisgICAgZG91YmxlIHgyID0geCAqIHg7CisgICAgcmV0dXJuIFBvbHk0KEEsIEIsIEMsIEQsIHgsIHgyKSArIFBvbHkzKEUsIEYsIEcsIHgsIHgyKSAqICh4MiAqIHgyKTsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5OChkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIEUsIGRvdWJsZSBGLCBkb3VibGUgRywKKyAgICAgICAgZG91YmxlIEgsIGRvdWJsZSB4LCBkb3VibGUgeDIsIGRvdWJsZSB4NCkgeworICAgIHJldHVybiBQb2x5NChBLCBCLCBDLCBELCB4LCB4MikgKyBQb2x5NChFLCBGLCBHLCBILCB4LCB4MikgKiB4NDsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5OShkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIEUsIGRvdWJsZSBGLCBkb3VibGUgRywKKyAgICAgICAgZG91YmxlIEgsIGRvdWJsZSBJLCBkb3VibGUgeCkgeworICAgIGRvdWJsZSB4MiA9IHggKiB4OworI2lmIDEKKyAgICAvLyBJdCBkb2VzIG5vdCBzZWVtIGZhc3RlciB0byBleHBsaWNpdGx5IGRlY29tcG9zZSBQb2x5OCBpbnRvIFBvbHk0LCBidXQKKyAgICAvLyBjb3VsZCBkZXBlbmQgb24gY29tcGlsZXIgZmxvYXRpbmcgcG9pbnQgc2NoZWR1bGluZy4KKyAgICBkb3VibGUgeDQgPSB4MiAqIHgyOworICAgIHJldHVybiBQb2x5OChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCB4LCB4MiwgeDQpICsgSSAqICh4NCAqIHg0KTsKKyNlbHNlCisgICAgZG91YmxlIHZhbCA9IFBvbHk0KEEsIEIsIEMsIEQsIHgsIHgyKTsKKyAgICBkb3VibGUgeDQgPSB4MiAqIHgyOworICAgIHJldHVybiB2YWwgKyBQb2x5NChFLCBGLCBHLCBILCB4LCB4MikgKiB4NCArIEkgKiAoeDQgKiB4NCk7CisjZW5kaWYKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGRvdWJsZSBJMChkb3VibGUgeCkgeworICAgIGlmICh4IDwgMy43NSkgeworICAgICAgICB4ICo9IHg7CisgICAgICAgIHJldHVybiBQb2x5NyhJMFRlcm08MD46OnZhbHVlLCBJMFRlcm08MT46OnZhbHVlLAorICAgICAgICAgICAgICAgIEkwVGVybTwyPjo6dmFsdWUsIEkwVGVybTwzPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgSTBUZXJtPDQ+Ojp2YWx1ZSwgSTBUZXJtPDU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBJMFRlcm08Nj46OnZhbHVlLCB4KTsgLy8gZSA8IDEuNmUtNworICAgIH0KKyAgICBpZiAoMSkgeworICAgICAgICAvKgorICAgICAgICAgKiBTZXJpZXMgZXhwYW5zaW9uIGNvZWZzIGFyZSBlYXN5IHRvIGNhbGN1bGF0ZSwgYnV0IGFyZSBleHBhbmRlZCBhcm91bmQgMCwKKyAgICAgICAgICogc28gZXJyb3IgaXMgdW5lcXVhbCBvdmVyIHRoZSBpbnRlcnZhbCAwIDwgeCA8IDMuNzUsIHRoZSBlcnJvciBiZWluZworICAgICAgICAgKiBzaWduaWZpY2FudGx5IGJldHRlciBuZWFyIDAuCisgICAgICAgICAqCisgICAgICAgICAqIEEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHVzZSBwcmVjaXNlIG1pbmltYXggcG9seW5vbWlhbCBmaXRzLgorICAgICAgICAgKgorICAgICAgICAgKiBXZSB1c2UgYSBzbGlnaHRseSBtb3JlIGNvbXBsaWNhdGVkIHNvbHV0aW9uIGZvciAzLjc1IDwgeCA8IDE1LCBiYXNlZCBvbgorICAgICAgICAgKiB0aGUgdGFibGVzIGluIEJsYWlyIGFuZCBFZHdhcmRzLCAiU3RhYmxlIFJhdGlvbmFsIE1pbmltYXggQXBwcm94aW1hdGlvbnMKKyAgICAgICAgICogdG8gdGhlIE1vZGlmaWVkIEJlc3NlbCBGdW5jdGlvbnMgSTAoeCkgYW5kIEkxKHgpIiwgQ2hhbGsgSGlsbCBOdWNsZWFyIExhYm9yYXRvcnksCisgICAgICAgICAqIEFFQ0wtNDkyOC4KKyAgICAgICAgICoKKyAgICAgICAgICogaHR0cDovL3d3dy5pYWVhLm9yZy9pbmlzL2NvbGxlY3Rpb24vTkNMQ29sbGVjdGlvblN0b3JlL19QdWJsaWMvMDYvMTc4LzYxNzg2NjcucGRmCisgICAgICAgICAqCisgICAgICAgICAqIFNlZSBUYWJsZSAxMSBmb3IgMCA8IHggPCAxNTsgZSA8IDEwXigtNy4xMykuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IEJldGEgY2Fubm90IGV4Y2VlZCAxNSAoaGVuY2UgU3RvcGJhbmQgY2Fubm90IGV4Y2VlZCAxNDRkQiA9IDI0YikuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgc3BlZWRzIHVwIG92ZXJhbGwgY29tcHV0YXRpb24gYnkgYWJvdXQgNDAlIG92ZXIgdXNpbmcgdGhlIGVsc2UgY2xhdXNlIGJlbG93LAorICAgICAgICAgKiB3aGljaCByZXF1aXJlcyBzcXJ0IGFuZCBleHAuCisgICAgICAgICAqCisgICAgICAgICAqLworCisgICAgICAgIHggKj0geDsKKyAgICAgICAgZG91YmxlIG51bSA9IFBvbHk5KC0wLjEzNTQ0OTM4NDMwZTksIC0wLjMzMTUzNzU0NTEyZTgsCisgICAgICAgICAgICAgICAgLTAuMTk0MDY2MzE5NDZlNywgLTAuNDgwNTgzMTg3ODNlNSwKKyAgICAgICAgICAgICAgICAtMC42MzI2OTc4MzM2MGUzLCAtMC40OTUyMDc3OTA3MGUxLAorICAgICAgICAgICAgICAgIC0wLjI0OTcwOTEwMzcwZS0xLCAtMC43NDc0MTE1OTU1MGUtNCwKKyAgICAgICAgICAgICAgICAtMC4xODI1NzYxMjQ2MGUtNiwgeCk7CisgICAgICAgIGRvdWJsZSB5ID0geCAtIDIyNS47IC8vIHJlZmxlY3Rpb24gYXJvdW5kIDE1IChzcXVhcmVkKQorICAgICAgICBkb3VibGUgZGVuID0gUG9seTQoLTAuMzQ1OTg3MzcxOTZlOCwgMC4yMzg1MjY0MzE4MWU2LAorICAgICAgICAgICAgICAgIC0wLjcwNjk5Mzg3NjIwZTMsIDAuMTAwMDAwMDAwMDBlMSwgeSk7CisgICAgICAgIHJldHVybiBudW0gLyBkZW47CisKKyNpZiBJT19FWFRFTkRFRF9CRVRBCisgICAgICAgIC8qIFRhYmxlIDQyIGZvciB4ID4gMTU7IGUgPCAxMF4oLTguMTEpLgorICAgICAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIEJldGE+MTUsIGJ1dCBpcyBkaXNhYmxlZCBoZXJlIGFzCisgICAgICAgICAqIHdlIG5ldmVyIHVzZSBCZXRhIHRoYXQgaGlnaC4KKyAgICAgICAgICoKKyAgICAgICAgICogTk9URTogVGhpcyBzaG91bGQgYmUgZW5hYmxlZCBvbmx5IGZvciB4ID4gMTUuCisgICAgICAgICAqLworCisgICAgICAgIGRvdWJsZSB5ID0gMS4veDsKKyAgICAgICAgZG91YmxlIHogPSB5IC0gKDEuLzE1KTsKKyAgICAgICAgZG91YmxlIG51bSA9IFBvbHkyKDAuNDE1MDc5ODYxNzQ2ZTEsIC0wLjUxNDkwOTI0OTZlMSwgeik7CisgICAgICAgIGRvdWJsZSBkZW4gPSBQb2x5MygwLjEwMzE1MDc2MzgyM2UyLCAtMC4xNDE4MTY4NzQxM2UyLAorICAgICAgICAgICAgICAgIDAuMTAwMDAwMDAwMGUxLCB6KTsKKyAgICAgICAgcmV0dXJuIGV4cCh4KSAqIHNxcnQoeSkgKiBudW0gLyBkZW47CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiBOT1QgVVNFRCwgYnV0IHJlZmVyZW5jZSBmb3IgbGFyZ2UgQmV0YS4KKyAgICAgICAgICoKKyAgICAgICAgICogQWJyYW1vd2l0eiBhbmQgU3RlZ3VuIGFzeW1wdG90aWMgZm9ybXVsYS4KKyAgICAgICAgICogd29ya3MgZm9yIHggPiAzLjc1LgorICAgICAgICAgKi8KKyAgICAgICAgZG91YmxlIHkgPSAxLi94OworICAgICAgICByZXR1cm4gZXhwKHgpICogc3FydCh5KSAqCisgICAgICAgICAgICAgICAgLy8gbm90ZTogcmVjaXByb2NhbCBzcXVhcmVyb290IG1heSBiZSBlYXNpZXIhCisgICAgICAgICAgICAgICAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GYXN0X2ludmVyc2Vfc3F1YXJlX3Jvb3QKKyAgICAgICAgICAgICAgICBQb2x5OShJMEFUZXJtPDA+Ojp2YWx1ZSwgSTBBVGVybTwxPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBJMEFUZXJtPDI+Ojp2YWx1ZSwgSTBBVGVybTwzPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBJMEFUZXJtPDQ+Ojp2YWx1ZSwgSTBBVGVybTw1Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBJMEFUZXJtPDY+Ojp2YWx1ZSwgSTBBVGVybTw3Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBJMEFUZXJtPDg+Ojp2YWx1ZSwgeSk7IC8vICguLi4gZSkgPCAxLjllLTcKKyAgICB9Cit9CisKKy8qIEEgc3BlZWQgb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIE1vZGlmaWVkIEJlc3NlbCBJMCgpIHdoaWNoIGluY29ycG9yYXRlcworICogdGhlIHNxcnQgYW5kIG51bWVyYXRvciBtdWx0aXBseSBhbmQgZGVub21pbmF0b3IgZGl2aWRlIGludG8gdGhlIGNvbXB1dGF0aW9uLgorICogVGhpcyBzcGVlZHMgdXAgZmlsdGVyIGNvbXB1dGF0aW9uIGJ5IGFib3V0IDEwLTE1JS4KKyAqLworc3RhdGljIGlubGluZSBkb3VibGUgSTBTcXJSYXQoZG91YmxlIHgyLCBkb3VibGUgbnVtLCBkb3VibGUgZGVuKSB7CisgICAgaWYgKHgyIDwgKDMuNzUgKiAzLjc1KSkgeworICAgICAgICByZXR1cm4gUG9seTcoSTBUZXJtPDA+Ojp2YWx1ZSwgSTBUZXJtPDE+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBJMFRlcm08Mj46OnZhbHVlLCBJMFRlcm08Mz46OnZhbHVlLAorICAgICAgICAgICAgICAgIEkwVGVybTw0Pjo6dmFsdWUsIEkwVGVybTw1Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgSTBUZXJtPDY+Ojp2YWx1ZSwgeDIpICogbnVtIC8gZGVuOyAvLyBlIDwgMS42ZS03CisgICAgfQorICAgIG51bSAqPSBQb2x5OSgtMC4xMzU0NDkzODQzMGU5LCAtMC4zMzE1Mzc1NDUxMmU4LAorICAgICAgICAgICAgLTAuMTk0MDY2MzE5NDZlNywgLTAuNDgwNTgzMTg3ODNlNSwKKyAgICAgICAgICAgIC0wLjYzMjY5NzgzMzYwZTMsIC0wLjQ5NTIwNzc5MDcwZTEsCisgICAgICAgICAgICAtMC4yNDk3MDkxMDM3MGUtMSwgLTAuNzQ3NDExNTk1NTBlLTQsCisgICAgICAgICAgICAtMC4xODI1NzYxMjQ2MGUtNiwgeDIpOyAvLyBlIDwgMTBeKC03LjEzKS4KKyAgICBkb3VibGUgeSA9IHgyIC0gMjI1LjsgLy8gcmVmbGVjdGlvbiBhcm91bmQgMTUgKHNxdWFyZWQpCisgICAgZGVuICo9IFBvbHk0KC0wLjM0NTk4NzM3MTk2ZTgsIDAuMjM4NTI2NDMxODFlNiwKKyAgICAgICAgICAgIC0wLjcwNjk5Mzg3NjIwZTMsIDAuMTAwMDAwMDAwMDBlMSwgeSk7CisgICAgcmV0dXJuIG51bSAvIGRlbjsKK30KKworLyoKKyAqIGNhbGN1bGF0ZXMgdGhlIHRyYW5zaXRpb24gYmFuZHdpZHRoIGZvciBhIEthaXNlciBmaWx0ZXIKKyAqCisgKiBGb3JtdWxhIDMuMi44LCBWYWlkeWFuYXRoYW4sIF9NdWx0aXJhdGUgU3lzdGVtcyBhbmQgRmlsdGVyIEJhbmtzXywgcC4gNDgKKyAqIEZvcm11bGEgNy43NiwgT3BwZW5oZWltIGFuZCBTY2hhZmVyLCBfRGlzY3JldGUtdGltZSBTaWduYWwgUHJvY2Vzc2luZywgM2VfLCBwLiA1NDIKKyAqCisgKiBAcGFyYW0gaGFsZk51bUNvZWYgaXMgaGFsZiB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBwZXIgZmlsdGVyIHBoYXNlLgorICoKKyAqIEBwYXJhbSBzdG9wQmFuZEF0dGVuIGlzIHRoZSBzdG9wIGJhbmQgYXR0ZW51YXRpb24gZGVzaXJlZC4KKyAqCisgKiBAcmV0dXJuIHRoZSB0cmFuc2l0aW9uIGJhbmR3aWR0aCBpbiBub3JtYWxpemVkIGZyZXF1ZW5jeSAoMCA8PSBmIDw9IDAuNSkKKyAqLworc3RhdGljIGlubGluZSBkb3VibGUgZmlyS2Fpc2VyVGJ3KGludCBoYWxmTnVtQ29lZiwgZG91YmxlIHN0b3BCYW5kQXR0ZW4pIHsKKyAgICByZXR1cm4gKHN0b3BCYW5kQXR0ZW4gLSA3Ljk1KS8oKDIuKjE0LjM2KSpoYWxmTnVtQ29lZik7Cit9CisKKy8qCisgKiBjYWxjdWxhdGVzIHRoZSBmaXIgdHJhbnNmZXIgcmVzcG9uc2Ugb2YgdGhlIG92ZXJhbGwgcG9seXBoYXNlIGZpbHRlciBhdCB3LgorICoKKyAqIENhbGN1bGF0ZXMgdGhlIERURlQgdHJhbnNmZXIgY29lZmZpY2llbnQgSCh3KSBmb3IgMCA8PSB3IDw9IFBJLCB1dGlsaXppbmcgdGhlCisgKiBmYWN0IHRoYXQgaFtuXSBpcyBzeW1tZXRyaWMgKGNvc2luZXMgb25seSwgbm8gY29tcGxleCBhcml0aG1ldGljKS4KKyAqCisgKiBXZSB1c2UgR29lcnR6ZWwncyBhbGdvcml0aG0gdG8gYWNjZWxlcmF0ZSB0aGUgY29tcHV0YXRpb24gdG8gZXNzZW50aWFsbHkKKyAqIGEgc2luZ2xlIG11bHRpcGx5IGFuZCAyIGFkZHMgcGVyIGZpbHRlciBjb2VmZmljaWVudCBoW10uCisgKgorICogQmUgY2FyZWZ1bCBiZSBjYXJlZnVsIHRvIGNvbnNpZGVyIHRoYXQgaFtuXSBpcyB0aGUgb3ZlcmFsbCBwb2x5cGhhc2UgZmlsdGVyLAorICogd2l0aCBMIHBoYXNlcywgc28gcmVzY2FsaW5nIEgodykvTCBpcyBwcm9iYWJseSB3aGF0IHlvdSBleHBlY3QgZm9yICJ1bml0eSBnYWluIiwKKyAqIGFzIHlvdSBvbmx5IHVzZSBvbmUgb2YgdGhlIHBvbHlwaGFzZXMgYXQgYSB0aW1lLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgZG91YmxlIGZpclRyYW5zZmVyKGNvbnN0IFQqIGNvZWYsIGludCBMLCBpbnQgaGFsZk51bUNvZWYsIGRvdWJsZSB3KSB7CisgICAgZG91YmxlIGFjY3VtID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihjb2VmWzBdKSowLjU7ICAvLyAiY2VudGVyIGNvZWZmaWNpZW50IiBmcm9tIGZpcnN0IGJhbmsKKyAgICBjb2VmICs9IGhhbGZOdW1Db2VmOyAgICAvLyBza2lwIGZpcnN0IGZpbHRlcmJhbmsgKHBpY2tlZCB1cCBieSB0aGUgbGFzdCBmaWx0ZXJiYW5rKS4KKyNpZiBTTE9XX0ZJUlRSQU5TRkVSCisgICAgLyogT3JpZ2luYWwgY29kZSBmb3IgcmVmZXJlbmNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBjb2RlIGJlbG93LCBidXQgc2xvd2VyLiAqLworICAgIGZvciAoaW50IGk9MSA7IGk8PUwgOyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQgaj0wLCBpeD1pIDsgajxoYWxmTnVtQ29lZiA7ICsraiwgaXgrPUwpIHsKKyAgICAgICAgICAgIGFjY3VtICs9IGNvcyhpeCp3KSpzdGF0aWNfY2FzdDxkb3VibGU+KCpjb2VmKyspOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICAvKgorICAgICAqIE91ciBvdmVyYWxsIGZpbHRlciBpcyBzdG9yZWQgc3RyaXBlZCBieSBwb2x5cGhhc2VzLCBub3QgYSBjb250aWd1b3VzIGhbbl0uCisgICAgICogV2UgY291bGQgZmV0Y2ggY29lZmZpY2llbnRzIGluIGEgbm9uLWNvbnRpZ3VvdXMgZmFzaGlvbgorICAgICAqIGJ1dCB0aGF0IHdpbGwgbm90IHNjYWxlIHRvIHZlY3RvciBwcm9jZXNzaW5nLgorICAgICAqCisgICAgICogV2UgYXBwbHkgR29lcnR6ZWwncyBhbGdvcml0aG0gZGlyZWN0bHkgdG8gZWFjaCBwb2x5cGhhc2UgZmlsdGVyIGJhbmsgaW5zdGVhZCBvZgorICAgICAqIHVzaW5nIGNvc2luZSBnZW5lcmF0aW9uL211bHRpcGxpY2F0aW9uLCB0aGVyZWJ5IHNhdmluZyBvbmUgbXVsdGlwbHkgcGVyIGlubmVyIGxvb3AuCisgICAgICoKKyAgICAgKiBTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR29lcnR6ZWxfYWxnb3JpdGhtCisgICAgICogQWxzbzogT3BwZW5oZWltIGFuZCBTY2hhZmVyLCBfRGlzY3JldGUgVGltZSBTaWduYWwgUHJvY2Vzc2luZywgM2VfLCBwLiA3MjAuCisgICAgICoKKyAgICAgKiBXZSB1c2UgdGhlIGJhc2ljIHJlY3Vyc2lvbiB0byBpbmNvcnBvcmF0ZSB0aGUgY29zaW5lIHN0ZXBzIGludG8gcmVhbCBzZXF1ZW5jZSB4W25dOgorICAgICAqIHNbbl0gPSB4W25dICsgKDJjb3N3KSpzW24tMV0gKyBzW24tMl0KKyAgICAgKgorICAgICAqIHlbbl0gPSBzW25dIC0gZV4oaXcpc1tuLTFdCisgICAgICogICAgICA9IHN1bV97az0tXGluZnR5fV57bn0geFtrXWVeKC1pdyhuLWspKQorICAgICAqICAgICAgPSBlXigtaXduKSBzdW1fe2s9MH1ee259IHhba11lXihpd2spCisgICAgICoKKyAgICAgKiBUaGUgc3VtbWF0aW9uIGNvbnRhaW5zIHRoZSBmcmVxdWVuY3kgc3RlcHMgd2Ugd2FudCBtdWx0aXBsaWVkIGJ5IHRoZSBzb3VyY2UKKyAgICAgKiAoc2ltaWxhciB0byBhIERURlQpLgorICAgICAqCisgICAgICogVXNpbmcgc3ltbWV0cnksIGFuZCBqdXN0IHRoZSByZWFsIHBhcnQgKGJlIGNhcmVmdWwsIHRoaXMgbXVzdCBoYXBwZW4KKyAgICAgKiBhZnRlciBhbnkgaW50ZXJuYWwgY29tcGxleCBtdWx0aXBsaWNhdGlvbnMpLCB0aGUgcG9seXBoYXNlIGZpbHRlcmJhbmsKKyAgICAgKiB0cmFuc2ZlciBmdW5jdGlvbiBpczoKKyAgICAgKgorICAgICAqIEhwcFtuLCB3LCB3XzBdID0gc3VtX3trPTB9XntufSB4W2tdICogY29zKHdrICsgd18wKQorICAgICAqICAgICAgICAgICAgICAgID0gUmV7IGVeKGl3biArIGl3XzApIHlbbl19CisgICAgICogICAgICAgICAgICAgICAgPSBjb3Mod24rd18wKSAqIHNbbl0gLSBjb3ModyhuKzEpK3dfMCkgKiBzW24tMV0KKyAgICAgKgorICAgICAqIHVzaW5nIHRoZSBmYWN0IHRoYXQgc1tuXSBvZiByZWFsIHhbbl0gaXMgcmVhbC4KKyAgICAgKgorICAgICAqLworICAgIGRvdWJsZSBkY29zID0gMi4gKiBjb3MoTCp3KTsKKyAgICBpbnQgc3RhcnQgPSAoKGhhbGZOdW1Db2VmKSpMICsgMSk7CisgICAgU2luZUdlbiBjYygoc3RhcnQgLSBMKSAqIHcsIHcsIHRydWUpOyAvLyBjb3NpbmUKKyAgICBTaW5lR2VuIGNwKHN0YXJ0ICogdywgdywgdHJ1ZSk7IC8vIGNvc2luZQorICAgIGZvciAoaW50IGk9MSA7IGk8PUwgOyArK2kpIHsKKyAgICAgICAgZG91YmxlIHNjID0gMDsKKyAgICAgICAgZG91YmxlIHNwID0gMDsKKyAgICAgICAgZm9yIChpbnQgaj0wIDsgajxoYWxmTnVtQ29lZiA7ICsraikgeworICAgICAgICAgICAgZG91YmxlIHRtcCA9IHNjOworICAgICAgICAgICAgc2MgID0gc3RhdGljX2Nhc3Q8ZG91YmxlPigqY29lZisrKSArIGRjb3Mqc2MgLSBzcDsKKyAgICAgICAgICAgIHNwID0gdG1wOworICAgICAgICB9CisgICAgICAgIC8vIElmIHdlIGFyZSBhd2Z1bGx5IGNsZXZlciwgd2UgY2FuIGFwcGx5IEdvZXJ0emVsJ3MgYWxnb3JpdGhtCisgICAgICAgIC8vIGFnYWluIG9uIHRoZSBzYyBhbmQgc3Agc2VxdWVuY2VzIHJldHVybmVkIGhlcmUuCisgICAgICAgIGFjY3VtICs9IGNjLnZhbHVlQWR2YW5jZSgpICogc2MgLSBjcC52YWx1ZUFkdmFuY2UoKSAqIHNwOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBhY2N1bSoyLjsKK30KKworLyoKKyAqIGV2YWx1YXRlcyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB8SChmKXwgYm91bmQgaW4gYSBiYW5kIHJlZ2lvbi4KKyAqCisgKiBUaGlzIGlzIHVzdWFsbHkgZG9uZSB3aXRoIGVxdWFsbHkgc3BhY2VkIGluY3JlbWVudHMgaW4gdGhlIHRhcmdldCBiYW5kIGluIHF1ZXN0aW9uLgorICogVGhlIHBhc3NiYW5kIGlzIG9mdGVuIHZlcnkgc21hbGwsIGFuZCBzYW1wbGVkIHRoYXQgd2F5LiBUaGUgc3RvcGJhbmQgaXMgb2Z0ZW4gbXVjaAorICogbGFyZ2VyLgorICoKKyAqIFdlIHVzZSB0aGUgZmFjdCB0aGF0IHRoZSBvdmVyYWxsIHBvbHlwaGFzZSBmaWx0ZXIgaGFzIGFuIGFkZGl0aW9uYWwgYmFuayBhdCB0aGUgZW5kCisgKiBmb3IgaW50ZXJwb2xhdGlvbjsgaGVuY2UgaXQgaXMgb3ZlcnNwZWNpZmllZCBmb3IgdGhlIEgoZikgY29tcHV0YXRpb24uICBUaHVzIHRoZQorICogZmlyc3QgcG9seXBoYXNlIGlzIG5ldmVyIGFjdHVhbGx5IGNoZWNrZWQsIGV4Y2VwdGluZyBpdHMgZmlyc3QgdGVybS4KKyAqCisgKiBJbiB0aGlzIGNvZGUgd2UgdXNlIHRoZSBmaXJUcmFuc2ZlcigpIGV2YWx1YXRvciBhYm92ZSwgd2hpY2ggdXNlcyBHb2VydHplbCdzCisgKiBhbGdvcml0aG0gdG8gY2FsY3VsYXRlIHRoZSB0cmFuc2ZlciBmdW5jdGlvbiBhdCBlYWNoIHBvaW50LgorICoKKyAqIFRPRE86IEFuIGFsdGVybmF0aXZlIHdpdGggZXF1YWwgc3BhY2luZyBpcyB0aGUgRkZUL0RGVC4gIEFuIGFsdGVybmF0aXZlIHdpdGggdW5lcXVhbAorICogc3BhY2luZyBpcyBhIGNoaXJwIHRyYW5zZm9ybS4KKyAqCisgKiBAcGFyYW0gY29lZiBpcyB0aGUgZGVzaWduZWQgcG9seXBoYXNlIGZpbHRlciBiYW5rcworICoKKyAqIEBwYXJhbSBMIGlzIHRoZSBudW1iZXIgb2YgcGhhc2VzIChmb3IgaW50ZXJwb2xhdGlvbikKKyAqCisgKiBAcGFyYW0gaGFsZk51bUNvZWYgc2hvdWxkIGJlIGhhbGYgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgZm9yIGEgc2luZ2xlCisgKiBwb2x5cGhhc2UuCisgKgorICogQHBhcmFtIGZzdGFydCBpcyB0aGUgbm9ybWFsaXplZCBmcmVxdWVuY3kgc3RhcnQuCisgKgorICogQHBhcmFtIGZlbmQgaXMgdGhlIG5vcm1hbGl6ZWQgZnJlcXVlbmN5IGVuZC4KKyAqCisgKiBAcGFyYW0gc3RlcHMgaXMgdGhlIG51bWJlciBvZiBzdGVwcyB0byB0YWtlIChzYW1wbGluZykgYmV0d2VlbiBmcmVxdWVuY3kgc3RhcnQgYW5kIGVuZAorICoKKyAqIEBwYXJhbSBmaXJNaW4gcmV0dXJucyB0aGUgbWluaW11bSB0cmFuc2ZlciB8SChmKXwgZm91bmQKKyAqCisgKiBAcGFyYW0gZmlyTWF4IHJldHVybnMgdGhlIG1heGltdW0gdHJhbnNmZXIgfEgoZil8IGZvdW5kCisgKgorICogMCA8PSBmIDw9IDAuNS4KKyAqIFRoaXMgaXMgdXNlZCB0byB0ZXN0IHBhc3NiYW5kIGFuZCBzdG9wYmFuZCBwZXJmb3JtYW5jZS4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCB0ZXN0RmlyKGNvbnN0IFQqIGNvZWYsIGludCBMLCBpbnQgaGFsZk51bUNvZWYsCisgICAgICAgIGRvdWJsZSBmc3RhcnQsIGRvdWJsZSBmZW5kLCBpbnQgc3RlcHMsIGRvdWJsZSAmZmlyTWluLCBkb3VibGUgJmZpck1heCkgeworICAgIGRvdWJsZSB3c3RhcnQgPSBmc3RhcnQqKDIuKk1fUEkpOworICAgIGRvdWJsZSB3ZW5kID0gZmVuZCooMi4qTV9QSSk7CisgICAgZG91YmxlIHdzdGVwID0gKHdlbmQgLSB3c3RhcnQpL3N0ZXBzOworICAgIGRvdWJsZSBmbWF4LCBmbWluOworICAgIGRvdWJsZSB0cmYgPSBmaXJUcmFuc2Zlcihjb2VmLCBMLCBoYWxmTnVtQ29lZiwgd3N0YXJ0KTsKKyAgICBpZiAodHJmPDApIHsKKyAgICAgICAgdHJmID0gLXRyZjsKKyAgICB9CisgICAgZm1pbiA9IGZtYXggPSB0cmY7CisgICAgd3N0YXJ0ICs9IHdzdGVwOworICAgIGZvciAoaW50IGk9MTsgaTxzdGVwczsgKytpKSB7CisgICAgICAgIHRyZiA9IGZpclRyYW5zZmVyKGNvZWYsIEwsIGhhbGZOdW1Db2VmLCB3c3RhcnQpOworICAgICAgICBpZiAodHJmPDApIHsKKyAgICAgICAgICAgIHRyZiA9IC10cmY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyZj5mbWF4KSB7CisgICAgICAgICAgICBmbWF4ID0gdHJmOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRyZjxmbWluKSB7CisgICAgICAgICAgICBmbWluID0gdHJmOworICAgICAgICB9CisgICAgICAgIHdzdGFydCArPSB3c3RlcDsKKyAgICB9CisgICAgLy8gcmVub3JtYWxpemUgLSB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBpbnRlZ2VyIGZpbHRlciB0eXBlcworICAgIGRvdWJsZSBub3JtID0gMS4vKCgxVUxMPDwoc2l6ZW9mKFQpKjgtMSkpKkwpOworCisgICAgZmlyTWluID0gZm1pbiAqIG5vcm07CisgICAgZmlyTWF4ID0gZm1heCAqIG5vcm07Cit9CisKKy8qCisgKiBldmFsdWF0ZXMgdGhlIHxIKGYpfCBsb3dwYXNzIGJhbmQgY2hhcmFjdGVyaXN0aWNzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdGVzdHMgdGhlIGxvd3Bhc3MgY2hhcmFjdGVyaXN0aWNzIGZvciB0aGUgb3ZlcmFsbCBwb2x5cGhhc2UgZmlsdGVyLAorICogYW5kIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBkZXNpZ24uICBGb3IgdGhpcyBjYXNlLCBmcCBzaG91bGQgYmUgc2V0IHRvIHRoZQorICogcGFzc2JhbmQgbm9ybWFsaXplZCBmcmVxdWVuY3kgZnJvbSAwIHRvIDAuNSBmb3IgdGhlIG92ZXJhbGwgZmlsdGVyICh0aHVzIGl0CisgKiBpcyB0aGUgZGVzaWduZWQgcG9seXBoYXNlIGJhbmsgdmFsdWUgLyBMKS4gIExpa2V3aXNlIGZvciBmcy4KKyAqCisgKiBAcGFyYW0gY29lZiBpcyB0aGUgZGVzaWduZWQgcG9seXBoYXNlIGZpbHRlciBiYW5rcworICoKKyAqIEBwYXJhbSBMIGlzIHRoZSBudW1iZXIgb2YgcGhhc2VzIChmb3IgaW50ZXJwb2xhdGlvbikKKyAqCisgKiBAcGFyYW0gaGFsZk51bUNvZWYgc2hvdWxkIGJlIGhhbGYgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgZm9yIGEgc2luZ2xlCisgKiBwb2x5cGhhc2UuCisgKgorICogQHBhcmFtIGZwIGlzIHRoZSBwYXNzYmFuZCBub3JtYWxpemVkIGZyZXF1ZW5jeSwgMCA8IGZwIDwgZnMgPCAwLjUuCisgKgorICogQHBhcmFtIGZzIGlzIHRoZSBzdG9wYmFuZCBub3JtYWxpemVkIGZyZXF1ZW5jeSwgMCA8IGZwIDwgZnMgPCAwLjUuCisgKgorICogQHBhcmFtIHBhc3NTdGVwcyBpcyB0aGUgbnVtYmVyIG9mIHBhc3NiYW5kIHNhbXBsaW5nIHN0ZXBzLgorICoKKyAqIEBwYXJhbSBzdG9wU3RlcHMgaXMgdGhlIG51bWJlciBvZiBzdG9wYmFuZCBzYW1wbGluZyBzdGVwcy4KKyAqCisgKiBAcGFyYW0gcGFzc01pbiBpcyB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgcGFzc2JhbmQKKyAqCisgKiBAcGFyYW0gcGFzc01heCBpcyB0aGUgbWF4aW11bSB2YWx1ZSBpbiB0aGUgcGFzc2JhbmQgKHVzZWZ1bCBmb3Igc2NhbGluZykuICBUaGlzIHNob3VsZAorICogYmUgbGVzcyB0aGFuIDEuLCB0byBhdm9pZCBzaW5lIHdhdmUgdGVzdCBvdmVyZmxvdy4KKyAqCisgKiBAcGFyYW0gcGFzc1JpcHBsZSBpcyB0aGUgcGFzc2JhbmQgcmlwcGxlLiAgVHlwaWNhbGx5IHRoaXMgc2hvdWxkIGJlIGxlc3MgdGhhbiAwLjEgZm9yCisgKiBhbiBhdWRpbyBmaWx0ZXIuICBHZW5lcmFsbHkgc3BlYWtlci9oZWFkcGhvbmUgZGV2aWNlIGNoYXJhY3RlcmlzdGljcyB3aWxsIGRvbWluYXRlCisgKiB0aGUgcGFzc2JhbmQgdGVybS4KKyAqCisgKiBAcGFyYW0gc3RvcE1heCBpcyB0aGUgbWF4aW11bSB2YWx1ZSBpbiB0aGUgc3RvcGJhbmQuCisgKgorICogQHBhcmFtIHN0b3BSaXBwbGUgaXMgdGhlIHN0b3BiYW5kIHJpcHBsZSwgYWxzbyBrbm93biBhcyBzdG9wYmFuZCBhdHRlbnVhdGlvbi4KKyAqIFR5cGljYWxseSB0aGlzIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gfjgwZEIgZm9yIGxvdyBxdWFsaXR5LCBhbmQgZ3JlYXRlciB0aGFuCisgKiB+MTAwZEIgZm9yIGZ1bGwgMTZiIHF1YWxpdHksIG90aGVyd2lzZSBhbGlhc2luZyBtYXkgYmVjb21lIG5vdGljZWFibGUuCisgKgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIHRlc3RGaXIoY29uc3QgVCogY29lZiwgaW50IEwsIGludCBoYWxmTnVtQ29lZiwKKyAgICAgICAgZG91YmxlIGZwLCBkb3VibGUgZnMsIGludCBwYXNzU3RlcHMsIGludCBzdG9wU3RlcHMsCisgICAgICAgIGRvdWJsZSAmcGFzc01pbiwgZG91YmxlICZwYXNzTWF4LCBkb3VibGUgJnBhc3NSaXBwbGUsCisgICAgICAgIGRvdWJsZSAmc3RvcE1heCwgZG91YmxlICZzdG9wUmlwcGxlKSB7CisgICAgZG91YmxlIGZtaW4sIGZtYXg7CisgICAgdGVzdEZpcihjb2VmLCBMLCBoYWxmTnVtQ29lZiwgMC4sIGZwLCBwYXNzU3RlcHMsIGZtaW4sIGZtYXgpOworICAgIGRvdWJsZSBkMSA9IChmbWF4IC0gZm1pbikvMi47CisgICAgcGFzc01pbiA9IGZtaW47CisgICAgcGFzc01heCA9IGZtYXg7CisgICAgcGFzc1JpcHBsZSA9IC0yMC4qbG9nMTAoMS4gLSBkMSk7IC8vIHBhc3NiYW5kIHJpcHBsZQorICAgIHRlc3RGaXIoY29lZiwgTCwgaGFsZk51bUNvZWYsIGZzLCAwLjUsIHN0b3BTdGVwcywgZm1pbiwgZm1heCk7CisgICAgLy8gZm1pbiBpcyByZWFsbHkgbm90IGltcG9ydGFudCBmb3IgdGhlIHN0b3BiYW5kLgorICAgIHN0b3BNYXggPSBmbWF4OworICAgIHN0b3BSaXBwbGUgPSAtMjAuKmxvZzEwKGZtYXgpOyAvLyBzdG9wYmFuZCByaXBwbGUvYXR0ZW51YXRpb24KK30KKworLyoKKyAqIENhbGN1bGF0ZXMgdGhlIG92ZXJhbGwgcG9seXBoYXNlIGZpbHRlciBiYXNlZCBvbiBhIHdpbmRvd2VkIHNpbmMgZnVuY3Rpb24uCisgKgorICogVGhlIHdpbmRvd2VkIHNpbmMgaXMgYW4gb2RkIGxlbmd0aCBzeW1tZXRyaWMgZmlsdGVyIG9mIGV4YWN0bHkgTCpoYWxmTnVtQ29lZioyKzEKKyAqIHRhcHMgZm9yIHRoZSBlbnRpcmUga2VybmVsLiAgVGhpcyBpcyB0aGVuIGRlY29tcG9zZWQgaW50byBMKzEgcG9seXBoYXNlIGZpbHRlcmJhbmtzLgorICogVGhlIGxhc3QgZmlsdGVyYmFuayBpcyB1c2VkIGZvciBpbnRlcnBvbGF0aW9uIHB1cnBvc2VzIChhbmQgaXMgbW9zdGx5IGNvbXBvc2VkCisgKiBvZiB0aGUgZmlyc3QgYmFuayBzaGlmdGVkIGJ5IG9uZSBzYW1wbGUpLCBhbmQgaXMgdW5uZWNlc3NhcnkgaWYgb25lIGRvZXMKKyAqIG5vdCBkbyBpbnRlcnBvbGF0aW9uLgorICoKKyAqIFdlIHVzZSB0aGUgbGFzdCBmaWx0ZXJiYW5rIGZvciBzb21lIHRyYW5zZmVyIGZ1bmN0aW9uIGNhbGN1bGF0aW9uIHB1cnBvc2VzLAorICogc28gaXQgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIGFueXdheXMuCisgKgorICogQHBhcmFtIGNvZWYgaXMgdGhlIGNhbGxlciBhbGxvY2F0ZWQgc3BhY2UgZm9yIGNvZWZmaWNpZW50cy4gIFRoaXMgc2hvdWxkIGJlCisgKiBleGFjdGx5IChMKzEpKmhhbGZOdW1Db2VmIGluIHNpemUuCisgKgorICogQHBhcmFtIEwgaXMgdGhlIG51bWJlciBvZiBwaGFzZXMgKGZvciBpbnRlcnBvbGF0aW9uKQorICoKKyAqIEBwYXJhbSBoYWxmTnVtQ29lZiBzaG91bGQgYmUgaGFsZiB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBmb3IgYSBzaW5nbGUKKyAqIHBvbHlwaGFzZS4KKyAqCisgKiBAcGFyYW0gc3RvcEJhbmRBdHRlbiBpcyB0aGUgc3RvcGJhbmQgdmFsdWUsIHNob3VsZCBiZSA+NTBkQi4KKyAqCisgKiBAcGFyYW0gZmNyIGlzIGN1dG9mZiBmcmVxdWVuY3kvc2FtcGxpbmcgcmF0ZSAoPDAuNSkuICBBdCB0aGlzIHBvaW50LCB0aGUgZW5lcmd5CisgKiBzaG91bGQgYmUgNmRCIGxlc3MuIChmY3IgaXMgd2hlcmUgdGhlIGFtcGxpdHVkZSBkcm9wcyBieSBoYWxmKS4gIFVzZSB0aGUKKyAqIGZpckthaXNlclRidygpIHRvIGNhbGN1bGF0ZSB0aGUgdHJhbnNpdGlvbiBiYW5kd2lkdGguICBmY3IgaXMgdGhlIG1pZHBvaW50CisgKiBiZXR3ZWVuIHRoZSBzdG9wIGJhbmQgYW5kIHRoZSBwYXNzIGJhbmQgKGZzdG9wK2ZwYXNzKS8yLgorICoKKyAqIEBwYXJhbSBhdHRlbiBpcyB0aGUgYXR0ZW51YXRpb24gKGdlbmVyYWxseSBzbGlnaHRseSBsZXNzIHRoYW4gMSkuCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIHZvaWQgZmlyS2Fpc2VyR2VuKFQqIGNvZWYsIGludCBMLCBpbnQgaGFsZk51bUNvZWYsCisgICAgICAgIGRvdWJsZSBzdG9wQmFuZEF0dGVuLCBkb3VibGUgZmNyLCBkb3VibGUgYXR0ZW4pIHsKKyAgICAvLworICAgIC8vIEZvcm11bGEgMy4yLjUsIDMuMi43LCBWYWlkeWFuYXRoYW4sIF9NdWx0aXJhdGUgU3lzdGVtcyBhbmQgRmlsdGVyIEJhbmtzXywgcC4gNDgKKyAgICAvLyBGb3JtdWxhIDcuNzUsIE9wcGVuaGVpbSBhbmQgU2NoYWZlciwgX0Rpc2NyZXRlLXRpbWUgU2lnbmFsIFByb2Nlc3NpbmcsIDNlXywgcC4gNTQyCisgICAgLy8KKyAgICAvLyBTZWUgYWxzbzogaHR0cDovL21lbG9kaS5lZS53YXNoaW5ndG9uLmVkdS9jb3Vyc2VzL2VlNTE4L25vdGVzL2xlYzE3LnBkZgorICAgIC8vCisgICAgLy8gS2Fpc2VyIHdpbmRvdyBhbmQgYmV0YSBwYXJhbWV0ZXIKKyAgICAvLworICAgIC8vICAgICAgICAgfCAwLjExMDIqKEEgLSA4LjcpICAgICAgICAgICAgICAgICAgICAgICAgIEEgPiA1MAorICAgIC8vICBiZXRhID0gfCAwLjU4NDIqKEEgLSAyMSleMC40ICsgMC4wNzg4NiooQSAtIDIxKSAgIDIxIDw9IEEgPD0gNTAKKyAgICAvLyAgICAgICAgIHwgMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIDwgMjEKKyAgICAvLworICAgIC8vIHdpdGggQSBpcyB0aGUgZGVzaXJlZCBzdG9wLWJhbmQgYXR0ZW51YXRpb24gaW4gZEJGUworICAgIC8vCisgICAgLy8gICAgMzAgZEIgICAgMi4yMTAKKyAgICAvLyAgICA0MCBkQiAgICAzLjM4NAorICAgIC8vICAgIDUwIGRCICAgIDQuNTM4CisgICAgLy8gICAgNjAgZEIgICAgNS42NTgKKyAgICAvLyAgICA3MCBkQiAgICA2Ljc2NAorICAgIC8vICAgIDgwIGRCICAgIDcuODY1CisgICAgLy8gICAgOTAgZEIgICAgOC45NjAKKyAgICAvLyAgIDEwMCBkQiAgIDEwLjA1NgorCisgICAgY29uc3QgaW50IE4gPSBMICogaGFsZk51bUNvZWY7IC8vIG5vbi1uZWdhdGl2ZSBoYWxmCisgICAgY29uc3QgZG91YmxlIGJldGEgPSAwLjExMDIgKiAoc3RvcEJhbmRBdHRlbiAtIDguNyk7IC8vID49IDUwZEIgYWx3YXlzCisgICAgY29uc3QgZG91YmxlIHhzdGVwID0gKDIuICogTV9QSSkgKiBmY3IgLyBMOworICAgIGNvbnN0IGRvdWJsZSB4ZnJhYyA9IDEuIC8gTjsKKyAgICBjb25zdCBkb3VibGUgeXNjYWxlID0gYXR0ZW4gKiBMIC8gKEkwKGJldGEpICogTV9QSSk7CisgICAgY29uc3QgZG91YmxlIHNxcmJldGEgPSBzcXIoYmV0YSk7CisKKyAgICAvLyBXZSB1c2Ugc2luZSBnZW5lcmF0b3JzLCB3aGljaCBjb21wdXRlcyBzaW5lcyBvbiByZWd1bGFyIHN0ZXAgaW50ZXJ2YWxzLgorICAgIC8vIFRoaXMgc3BlZWRzIHVwIG92ZXJhbGwgY29tcHV0YXRpb24gYWJvdXQgNDAlIGZyb20gY29tcHV0aW5nIHRoZSBzaW5lIGRpcmVjdGx5LgorCisgICAgU2luZUdlbkdlbiBzZ2coMC4sIHhzdGVwLCBMKnhzdGVwKTsgLy8gZ2VuZXJhdGVzIHNpbmUgZ2VuZXJhdG9ycyAob25lIHBlciBwb2x5cGhhc2UpCisKKyAgICBmb3IgKGludCBpPTAgOyBpPD1MIDsgKytpKSB7IC8vIGdlbmVyYXRlIGFuIGV4dHJhIHNldCBvZiBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorCisgICAgICAgIC8vIGNvbXB1dGF0aW9uIGZvciBhIHNpbmdsZSBwb2x5cGhhc2Ugb2YgdGhlIG92ZXJhbGwgZmlsdGVyLgorICAgICAgICBTaW5lR2VuIHNnID0gc2dnLnZhbHVlQWR2YW5jZSgpOyAvLyBjdXJyZW50IHNpbmUgZ2VuZXJhdG9yIGZvciAiaiIgaW5uZXIgbG9vcC4KKyAgICAgICAgZG91YmxlIGVyciA9IDA7IC8vIGZvciBub2lzZSBzaGFwaW5nIG9uIGludDE2X3QgY29lZmZpY2llbnRzIChvdmVyIGVhY2ggcG9seXBoYXNlKQorCisgICAgICAgIGZvciAoaW50IGo9MCwgaXg9aSA7IGo8aGFsZk51bUNvZWYgOyArK2osIGl4Kz1MKSB7CisgICAgICAgICAgICBkb3VibGUgeTsKKyAgICAgICAgICAgIGlmIChDQ19MSUtFTFkoaXgpKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIHggPSBzdGF0aWNfY2FzdDxkb3VibGU+KGl4KTsKKworICAgICAgICAgICAgICAgIC8vIHNpbmUgZ2VuZXJhdG9yOiBzZy52YWx1ZUFkdmFuY2UoKSByZXR1cm5zIHNpbihpeCp4c3RlcCk7CisgICAgICAgICAgICAgICAgLy8geSA9IEkwKGJldGEgKiBzcXJ0KDEuMCAtIHNxcih4ICogeGZyYWMpKSkgKiB5c2NhbGUgKiBzZy52YWx1ZUFkdmFuY2UoKSAvIHg7CisgICAgICAgICAgICAgICAgeSA9IEkwU3FyUmF0KHNxcmJldGEgKiAoMS4wIC0gc3FyKHggKiB4ZnJhYykpLCB5c2NhbGUgKiBzZy52YWx1ZUFkdmFuY2UoKSwgeCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHkgPSAyLiAqIGF0dGVuICogZmNyOyAvLyBjZW50ZXIgb2YgZmlsdGVyLCBzaW5jKDApID0gMS4KKyAgICAgICAgICAgICAgICBzZy5hZHZhbmNlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc19zYW1lPFQsIGludDE2X3Q+Ojp2YWx1ZSkgeyAvLyBpbnQxNl90IG5lZWRzIG5vaXNlIHNoYXBpbmcKKyAgICAgICAgICAgICAgICAqY29lZisrID0gc3RhdGljX2Nhc3Q8VD4odG9pbnQoeSwgMVVMTDw8KHNpemVvZihUKSo4LTEpLCBlcnIpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNfc2FtZTxULCBpbnQzMl90Pjo6dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAqY29lZisrID0gc3RhdGljX2Nhc3Q8VD4odG9pbnQoeSwgMVVMTDw8KHNpemVvZihUKSo4LTEpKSk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBhc3N1bWVkIGZsb2F0IG9yIGRvdWJsZQorICAgICAgICAgICAgICAgICpjb2VmKysgPSBzdGF0aWNfY2FzdDxUPih5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX0dFTl9IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpck9wcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyT3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyMTYzZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpck9wcy5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfT1BTX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX09QU19ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorI2RlZmluZSBVU0VfSU5MSU5FX0FTU0VNQkxZICh0cnVlKQorI2Vsc2UKKyNkZWZpbmUgVVNFX0lOTElORV9BU1NFTUJMWSAoZmFsc2UpCisjZW5kaWYKKworI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkgJiYgZGVmaW5lZChfX0FSTV9ORU9OX18pCisjZGVmaW5lIFVTRV9ORU9OICh0cnVlKQorI2luY2x1ZGUgPGFybV9uZW9uLmg+CisjZWxzZQorI2RlZmluZSBVU0VfTkVPTiAoZmFsc2UpCisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBpc19zYW1lCit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfc2FtZTxULCBUPiAgLy8gcGFydGlhbCBzcGVjaWFsaXphdGlvbgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKK3N0YXRpYyBpbmxpbmUKK2ludDMyX3QgbXVsUkwoaW50IGxlZnQsIGludDMyX3QgaW4sIHVpbnQzMl90IHZSTCkKK3sKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZCisgICAgaW50MzJfdCBvdXQ7CisgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgYXNtKCAic211bHRiICVbb3V0XSwgJVtpbl0sICVbdlJMXSBcbiIKKyAgICAgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICAgICAgOiBbaW5dIiVyIihpbiksIFt2UkxdInIiKHZSTCkKKyAgICAgICAgICAgICA6ICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNtKCAic211bHR0ICVbb3V0XSwgJVtpbl0sICVbdlJMXSBcbiIKKyAgICAgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICAgICAgOiBbaW5dIiVyIihpbiksIFt2UkxdInIiKHZSTCkKKyAgICAgICAgICAgICA6ICk7CisgICAgfQorICAgIHJldHVybiBvdXQ7CisjZWxzZQorICAgIGludDE2X3QgdiA9IGxlZnQgPyBzdGF0aWNfY2FzdDxpbnQxNl90Pih2UkwpIDogc3RhdGljX2Nhc3Q8aW50MTZfdD4odlJMPj4xNik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KChzdGF0aWNfY2FzdDxpbnQ2NF90PihpbikgKiB2KSA+PiAxNik7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZQoraW50MzJfdCBtdWxBZGQoaW50MTZfdCBpbiwgaW50MTZfdCB2LCBpbnQzMl90IGEpCit7CisjaWYgVVNFX0lOTElORV9BU1NFTUJMWQorICAgIGludDMyX3Qgb3V0OworICAgIGFzbSggInNtbGFiYiAlW291dF0sICVbdl0sICVbaW5dLCAlW2FdIFxuIgorICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgOiBbaW5dIiVyIihpbiksIFt2XSJyIih2KSwgW2FdInIiKGEpCisgICAgICAgICA6ICk7CisgICAgcmV0dXJuIG91dDsKKyNlbHNlCisgICAgcmV0dXJuIGEgKyB2ICogaW47CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZQoraW50MzJfdCBtdWxBZGQoaW50MTZfdCBpbiwgaW50MzJfdCB2LCBpbnQzMl90IGEpCit7CisjaWYgVVNFX0lOTElORV9BU1NFTUJMWQorICAgIGludDMyX3Qgb3V0OworICAgIGFzbSggInNtbGF3YiAlW291dF0sICVbdl0sICVbaW5dLCAlW2FdIFxuIgorICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgOiBbaW5dIiVyIihpbiksIFt2XSJyIih2KSwgW2FdInIiKGEpCisgICAgICAgICA6ICk7CisgICAgcmV0dXJuIG91dDsKKyNlbHNlCisgICAgcmV0dXJuIGEgKyBzdGF0aWNfY2FzdDxpbnQzMl90Pigoc3RhdGljX2Nhc3Q8aW50NjRfdD4odikgKiBpbikgPj4gMTYpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUKK2ludDMyX3QgbXVsQWRkKGludDMyX3QgaW4sIGludDMyX3QgdiwgaW50MzJfdCBhKQoreworI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkKKyAgICBpbnQzMl90IG91dDsKKyAgICBhc20oICJzbW1sYSAlW291dF0sICVbdl0sICVbaW5dLCAlW2FdIFxuIgorICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgOiBbaW5dIiVyIihpbiksIFt2XSJyIih2KSwgW2FdInIiKGEpCisgICAgICAgICA6ICk7CisgICAgcmV0dXJuIG91dDsKKyNlbHNlCisgICAgcmV0dXJuIGEgKyBzdGF0aWNfY2FzdDxpbnQzMl90Pigoc3RhdGljX2Nhc3Q8aW50NjRfdD4odikgKiBpbikgPj4gMzIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUKK2ludDMyX3QgbXVsQWRkUkwoaW50IGxlZnQsIHVpbnQzMl90IGluUkwsIGludDE2X3QgdiwgaW50MzJfdCBhKQoreworI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkKKyAgICBpbnQzMl90IG91dDsKKyAgICBpZiAobGVmdCkgeworICAgICAgICBhc20oICJzbWxhYmIgJVtvdXRdLCAlW3ZdLCAlW2luUkxdLCAlW2FdIFxuIgorICAgICAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgICAgICA6IFtpblJMXSIlciIoaW5STCksIFt2XSJyIih2KSwgW2FdInIiKGEpCisgICAgICAgICAgICAgOiApOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzbSggInNtbGFidCAlW291dF0sICVbdl0sICVbaW5STF0sICVbYV0gXG4iCisgICAgICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgICAgIDogW2luUkxdIiVyIihpblJMKSwgW3ZdInIiKHYpLCBbYV0iciIoYSkKKyAgICAgICAgICAgICA6ICk7CisgICAgfQorICAgIHJldHVybiBvdXQ7CisjZWxzZQorICAgIGludDE2X3QgcyA9IGxlZnQgPyBzdGF0aWNfY2FzdDxpbnQxNl90PihpblJMKSA6IHN0YXRpY19jYXN0PGludDE2X3Q+KGluUkw+PjE2KTsKKyAgICByZXR1cm4gYSArIHYgKiBzOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUKK2ludDMyX3QgbXVsQWRkUkwoaW50IGxlZnQsIHVpbnQzMl90IGluUkwsIGludDMyX3QgdiwgaW50MzJfdCBhKQoreworI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkKKyAgICBpbnQzMl90IG91dDsKKyAgICBpZiAobGVmdCkgeworICAgICAgICBhc20oICJzbWxhd2IgJVtvdXRdLCAlW3ZdLCAlW2luUkxdLCAlW2FdIFxuIgorICAgICAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgICAgICA6IFtpblJMXSIlciIoaW5STCksIFt2XSJyIih2KSwgW2FdInIiKGEpCisgICAgICAgICAgICAgOiApOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzbSggInNtbGF3dCAlW291dF0sICVbdl0sICVbaW5STF0sICVbYV0gXG4iCisgICAgICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgICAgIDogW2luUkxdIiVyIihpblJMKSwgW3ZdInIiKHYpLCBbYV0iciIoYSkKKyAgICAgICAgICAgICA6ICk7CisgICAgfQorICAgIHJldHVybiBvdXQ7CisjZWxzZQorICAgIGludDE2X3QgcyA9IGxlZnQgPyBzdGF0aWNfY2FzdDxpbnQxNl90PihpblJMKSA6IHN0YXRpY19jYXN0PGludDE2X3Q+KGluUkw+PjE2KTsKKyAgICByZXR1cm4gYSArIHN0YXRpY19jYXN0PGludDMyX3Q+KChzdGF0aWNfY2FzdDxpbnQ2NF90Pih2KSAqIHMpID4+IDE2KTsKKyNlbmRpZgorfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfT1BTX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDJkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGRlcGVuZHMgb24gQXVkaW9SZXNhbXBsZXJGaXJPcHMuaAorCisvKiB2YXJpYW50IGZvciBpbnB1dCB0eXBlIFRJID0gaW50MTZfdCBpbnB1dCBzYW1wbGVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQz4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbWFjKGludDMyX3QmIGwsIGludDMyX3QmIHIsIFRDIGNvZWYsIGNvbnN0IGludDE2X3QqIHNhbXBsZXMpCit7CisgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KHNhbXBsZXMpOworICAgIGwgPSBtdWxBZGRSTCgxLCBybCwgY29lZiwgbCk7CisgICAgciA9IG11bEFkZFJMKDAsIHJsLCBjb2VmLCByKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEM+CitzdGF0aWMgaW5saW5lCit2b2lkIG1hYyhpbnQzMl90JiBsLCBUQyBjb2VmLCBjb25zdCBpbnQxNl90KiBzYW1wbGVzKQoreworICAgIGwgPSBtdWxBZGQoc2FtcGxlc1swXSwgY29lZiwgbCk7Cit9CisKKy8qIHZhcmlhbnQgZm9yIGlucHV0IHR5cGUgVEkgPSBmbG9hdCBpbnB1dCBzYW1wbGVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQz4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbWFjKGZsb2F0JiBsLCBmbG9hdCYgciwgVEMgY29lZiwgIGNvbnN0IGZsb2F0KiBzYW1wbGVzKQoreworICAgIGwgKz0gKnNhbXBsZXMrKyAqIGNvZWY7CisgICAgciArPSAqc2FtcGxlcysrICogY29lZjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEM+CitzdGF0aWMgaW5saW5lCit2b2lkIG1hYyhmbG9hdCYgbCwgVEMgY29lZiwgIGNvbnN0IGZsb2F0KiBzYW1wbGVzKQoreworICAgIGwgKz0gKnNhbXBsZXMrKyAqIGNvZWY7Cit9CisKKy8qIHZhcmlhbnQgZm9yIG91dHB1dCB0eXBlIFRPID0gaW50MzJfdCBvdXRwdXQgc2FtcGxlcyAqLworc3RhdGljIGlubGluZQoraW50MzJfdCB2b2x1bWVBZGp1c3QoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpCit7CisgICAgcmV0dXJuIDIgKiBtdWxSTCgwLCB2YWx1ZSwgdm9sdW1lKTsgIC8vIE5vdGU6IG9ubHkgdXNlIHRvcCAxNmIKK30KKworLyogdmFyaWFudCBmb3Igb3V0cHV0IHR5cGUgVE8gPSBmbG9hdCBvdXRwdXQgc2FtcGxlcyAqLworc3RhdGljIGlubGluZQorZmxvYXQgdm9sdW1lQWRqdXN0KGZsb2F0IHZhbHVlLCBmbG9hdCB2b2x1bWUpCit7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCisvKgorICogQ2FsY3VsYXRlcyBhIHNpbmdsZSBvdXRwdXQgZnJhbWUgKHR3byBzYW1wbGVzKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIGJvdGggdGhlIHBvc2l0aXZlIGhhbGYgRklSIGRvdCBwcm9kdWN0IGFuZAorICogdGhlIG5lZ2F0aXZlIGhhbGYgRklSIGRvdCBwcm9kdWN0LCBhY2N1bXVsYXRlcywgYW5kIHRoZW4gYXBwbGllcyB0aGUgdm9sdW1lLgorICoKKyAqIFRoaXMgaXMgYSBsb2NrZWQgcGhhc2UgZmlsdGVyIChpdCBkb2VzIG5vdCBjb21wdXRlIHRoZSBpbnRlcnBvbGF0aW9uKS4KKyAqCisgKiBVc2UgZmlyKCkgdG8gY29tcHV0ZSB0aGUgcHJvcGVyIGNvZWZmaWNpZW50IHBvaW50ZXJzIGZvciBhIHBvbHlwaGFzZQorICogZmlsdGVyIGJhbmsuCisgKi8KKwordGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgdHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgUHJvY2Vzc0woVE8qIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBUQyogY29lZnNQLAorICAgICAgICBjb25zdCBUQyogY29lZnNOLAorICAgICAgICBjb25zdCBUSSogc1AsCisgICAgICAgIGNvbnN0IFRJKiBzTiwKKyAgICAgICAgY29uc3QgVE8qIGNvbnN0IHZvbHVtZUxSKQoreworICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoQ0hBTk5FTFMgPj0gMSAmJiBDSEFOTkVMUyA8PSAyKQorICAgIGlmIChDSEFOTkVMUyA9PSAyKSB7CisgICAgICAgIFRPIGwgPSAwOworICAgICAgICBUTyByID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgbWFjKGwsIHIsICpjb2Vmc1ArKywgc1ApOworICAgICAgICAgICAgc1AgLT0gQ0hBTk5FTFM7CisgICAgICAgICAgICBtYWMobCwgciwgKmNvZWZzTisrLCBzTik7CisgICAgICAgICAgICBzTiArPSBDSEFOTkVMUzsKKyAgICAgICAgfSB3aGlsZSAoLS1jb3VudCA+IDApOworICAgICAgICBvdXRbMF0gKz0gdm9sdW1lQWRqdXN0KGwsIHZvbHVtZUxSWzBdKTsKKyAgICAgICAgb3V0WzFdICs9IHZvbHVtZUFkanVzdChyLCB2b2x1bWVMUlsxXSk7CisgICAgfSBlbHNlIHsgLyogQ0hBTk5FTFMgPT0gMSAqLworICAgICAgICBUTyBsID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgbWFjKGwsICpjb2Vmc1ArKywgc1ApOworICAgICAgICAgICAgc1AgLT0gQ0hBTk5FTFM7CisgICAgICAgICAgICBtYWMobCwgKmNvZWZzTisrLCBzTik7CisgICAgICAgICAgICBzTiArPSBDSEFOTkVMUzsKKyAgICAgICAgfSB3aGlsZSAoLS1jb3VudCA+IDApOworICAgICAgICBvdXRbMF0gKz0gdm9sdW1lQWRqdXN0KGwsIHZvbHVtZUxSWzBdKTsKKyAgICAgICAgb3V0WzFdICs9IHZvbHVtZUFkanVzdChsLCB2b2x1bWVMUlsxXSk7CisgICAgfQorfQorCisvKgorICogQ2FsY3VsYXRlcyBhIHNpbmdsZSBvdXRwdXQgZnJhbWUgKHR3byBzYW1wbGVzKSBpbnRlcnBvbGF0aW5nIHBoYXNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgYm90aCB0aGUgcG9zaXRpdmUgaGFsZiBGSVIgZG90IHByb2R1Y3QgYW5kCisgKiB0aGUgbmVnYXRpdmUgaGFsZiBGSVIgZG90IHByb2R1Y3QsIGFjY3VtdWxhdGVzLCBhbmQgdGhlbiBhcHBsaWVzIHRoZSB2b2x1bWUuCisgKgorICogVGhpcyBpcyBhbiBpbnRlcnBvbGF0ZWQgcGhhc2UgZmlsdGVyLgorICoKKyAqIFVzZSBmaXIoKSB0byBjb21wdXRlIHRoZSBwcm9wZXIgY29lZmZpY2llbnQgcG9pbnRlcnMgZm9yIGEgcG9seXBoYXNlCisgKiBmaWx0ZXIgYmFuay4KKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVD4KK3ZvaWQgYWRqdXN0TGVycChUJiBsZXJwUCBfX3VudXNlZCkKK3sKK30KKwordGVtcGxhdGU8aW50MzJfdCwgdHlwZW5hbWUgVD4KK3ZvaWQgYWRqdXN0TGVycChUJiBsZXJwUCkKK3sKKyAgICBsZXJwUCA+Pj0gMTY7ICAgLy8gbGVycFAgaXMgMzJiaXQgZm9yIE5FT04gaW50MzJfdCwgYnV0IGFsd2F5cyAxNiBiaXQgZm9yIG5vbi1ORU9OIHBhdGgKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJTlRFUlA+CitzdGF0aWMgaW5saW5lCitUQyBpbnRlcnBvbGF0ZShUQyBjb2VmXzAsIFRDIGNvZWZfMSwgVElOVEVSUCBsZXJwKQoreworICAgIHJldHVybiBsZXJwICogKGNvZWZfMSAtIGNvZWZfMCkgKyBjb2VmXzA7Cit9CisKK3RlbXBsYXRlPGludDE2X3QsIHVpbnQzMl90Pgorc3RhdGljIGlubGluZQoraW50MTZfdCBpbnRlcnBvbGF0ZShpbnQxNl90IGNvZWZfMCwgaW50MTZfdCBjb2VmXzEsIHVpbnQzMl90IGxlcnApCit7CisgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxpbnQxNl90PihsZXJwKSAqICgoY29lZl8xLWNvZWZfMCk8PDEpPj4xNikgKyBjb2VmXzA7Cit9CisKK3RlbXBsYXRlPGludDMyX3QsIHVpbnQzMl90Pgorc3RhdGljIGlubGluZQoraW50MzJfdCBpbnRlcnBvbGF0ZShpbnQzMl90IGNvZWZfMCwgaW50MzJfdCBjb2VmXzEsIHVpbnQzMl90IGxlcnApCit7CisgICAgcmV0dXJuIG11bEFkZChzdGF0aWNfY2FzdDxpbnQxNl90PihsZXJwKSwgKGNvZWZfMS1jb2VmXzApPDwxLCBjb2VmXzApOworfQorCit0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCB0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSU5URVJQPgorc3RhdGljIGlubGluZQordm9pZCBQcm9jZXNzKFRPKiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzUDEgX191bnVzZWQsCisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc04xIF9fdW51c2VkLAorICAgICAgICBjb25zdCBUSSogc1AsCisgICAgICAgIGNvbnN0IFRJKiBzTiwKKyAgICAgICAgVElOVEVSUCBsZXJwUCwKKyAgICAgICAgY29uc3QgVE8qIGNvbnN0IHZvbHVtZUxSKQoreworICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoQ0hBTk5FTFMgPj0gMSAmJiBDSEFOTkVMUyA8PSAyKQorICAgIGFkanVzdExlcnA8VEMsIFRJTlRFUlA+KGxlcnBQKTsgLy8gY29lZmZpY2llbnQgdHlwZSBhZGp1c3RtZW50IGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMikgeworICAgICAgICBUTyBsID0gMDsKKyAgICAgICAgVE8gciA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgbWFjKGwsIHIsIGludGVycG9sYXRlKGNvZWZzUFswXSwgY29lZnNQW2NvdW50XSwgbGVycFApLCBzUCk7CisgICAgICAgICAgICBjb2Vmc1ArKzsKKyAgICAgICAgICAgIHNQIC09IENIQU5ORUxTOworICAgICAgICAgICAgbWFjKGwsIHIsIGludGVycG9sYXRlKGNvZWZzTltjb3VudF0sIGNvZWZzTlswXSwgbGVycFApLCBzTik7CisgICAgICAgICAgICBjb2Vmc04rKzsKKyAgICAgICAgICAgIHNOICs9IENIQU5ORUxTOworICAgICAgICB9CisgICAgICAgIG91dFswXSArPSB2b2x1bWVBZGp1c3QobCwgdm9sdW1lTFJbMF0pOworICAgICAgICBvdXRbMV0gKz0gdm9sdW1lQWRqdXN0KHIsIHZvbHVtZUxSWzFdKTsKKyAgICB9IGVsc2UgeyAvKiBDSEFOTkVMUyA9PSAxICovCisgICAgICAgIFRPIGwgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIG1hYyhsLCBpbnRlcnBvbGF0ZShjb2Vmc1BbMF0sIGNvZWZzUFtjb3VudF0sIGxlcnBQKSwgc1ApOworICAgICAgICAgICAgY29lZnNQKys7CisgICAgICAgICAgICBzUCAtPSBDSEFOTkVMUzsKKyAgICAgICAgICAgIG1hYyhsLCBpbnRlcnBvbGF0ZShjb2Vmc05bY291bnRdLCBjb2Vmc05bMF0sIGxlcnBQKSwgc04pOworICAgICAgICAgICAgY29lZnNOKys7CisgICAgICAgICAgICBzTiArPSBDSEFOTkVMUzsKKyAgICAgICAgfQorICAgICAgICBvdXRbMF0gKz0gdm9sdW1lQWRqdXN0KGwsIHZvbHVtZUxSWzBdKTsKKyAgICAgICAgb3V0WzFdICs9IHZvbHVtZUFkanVzdChsLCB2b2x1bWVMUlsxXSk7CisgICAgfQorfQorCisvKgorICogQ2FsY3VsYXRlcyBhIHNpbmdsZSBvdXRwdXQgZnJhbWUgKHR3byBzYW1wbGVzKSBmcm9tIGlucHV0IHNhbXBsZSBwb2ludGVyLgorICoKKyAqIFRoaXMgc2V0cyB1cCB0aGUgcGFyYW1zIGZvciB0aGUgYWNjZWxlcmF0ZWQgUHJvY2VzcygpIGFuZCBQcm9jZXNzTCgpCisgKiBmdW5jdGlvbnMgdG8gZG8gdGhlIGFwcHJvcHJpYXRlIGRvdCBwcm9kdWN0cy4KKyAqCisgKiBAcGFyYW0gb3V0IHNob3VsZCBwb2ludCB0byB0aGUgb3V0cHV0IGJ1ZmZlciB3aXRoIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgb3V0cHV0IGZyYW1lLgorICoKKyAqIEBwYXJhbSBwaGFzZSBpcyB0aGUgZnJhY3Rpb25hbCBkaXN0YW5jZSBiZXR3ZWVuIGlucHV0IGZyYW1lcyBmb3IgaW50ZXJwb2xhdGlvbjoKKyAqIHBoYXNlID49IDAgICYmIHBoYXNlIDwgcGhhc2VXcmFwTGltaXQuICBJdCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIHJhdGlvbmFsIGZyYWN0aW9uCisgKiBvZiBwaGFzZS9waGFzZVdyYXBMaW1pdC4KKyAqCisgKiBAcGFyYW0gcGhhc2VXcmFwTGltaXQgaXMgI3BvbHlwaGFzZXM8PGNvZWZTaGlmdCwgd2hlcmUgI3BvbHlwaGFzZXMgaXMgdGhlIG51bWJlciBvZiBwb2x5cGhhc2VzCisgKiBpbiB0aGUgcG9seXBoYXNlIGZpbHRlci4gTGlrZXdpc2UsICNwb2x5cGhhc2VzIGNhbiBiZSBvYnRhaW5lZCBhcyAocGhhc2VXcmFwTGltaXQ+PmNvZWZTaGlmdCkuCisgKgorICogQHBhcmFtIGNvZWZTaGlmdCBnaXZlcyB0aGUgYml0IGFsaWdubWVudCBvZiB0aGUgcG9seXBoYXNlIGluZGV4IGluIHRoZSBwaGFzZSBwYXJhbWV0ZXIuCisgKgorICogQHBhcmFtIGhhbGZOdW1Db2VmcyBpcyB0aGUgaGFsZiB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBwZXIgcG9seXBoYXNlIGZpbHRlci4gU2luY2UgdGhlCisgKiBvdmVyYWxsIGZpbHRlcmJhbmsgaXMgb2RkLWxlbmd0aCBzeW1tZXRyaWMsIG9ubHkgaGFsZk51bUNvZWZzIG5lZWQgYmUgc3RvcmVkLgorICoKKyAqIEBwYXJhbSBjb2VmcyBpcyB0aGUgcG9seXBoYXNlIGZpbHRlciBiYW5rLCBzdGFydGluZyBhdCBmcm9tIHBvbHlwaGFzZSBpbmRleCAwLCBhbmQgcmFuZ2luZyB0bworICogYW5kIGluY2x1ZGluZyB0aGUgI3BvbHlwaGFzZXMuICBFYWNoIHBvbHlwaGFzZSBvZiB0aGUgZmlsdGVyIGhhcyBoYWxmLWxlbmd0aCBoYWxmTnVtQ29lZnMKKyAqIChkdWUgdG8gc3ltbWV0cnkpLiAgVGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpbHRlciBiYW5rIGluIGNvZWZmaWNpZW50cyBpcworICogKCNwb2x5cGhhc2VzKzEpKmhhbGZOdW1Db2Vmcy4KKyAqCisgKiBUaGUgZmlsdGVyIGJhbmsgY29lZnMgc2hvdWxkIGJlIGFsaWduZWQgdG8gYSBtaW5pbXVtIG9mIDE2IGJ5dGVzIChwcmVmZXJyYWJseSB0byBjYWNoZSBsaW5lKS4KKyAqCisgKiBUaGUgY29lZnMgc2hvdWxkIGJlIGF0dGVudWF0ZWQgKHRvIGNvbXBlbnNhdGUgZm9yIHBhc3NiYW5kIHJpcHBsZSkKKyAqIGlmIHN0b3JpbmcgYmFjayBpbnRvIHRoZSBuYXRpdmUgZm9ybWF0LgorICoKKyAqIEBwYXJhbSBzYW1wbGVzIGFyZSB1bmFsaWduZWQgaW5wdXQgc2FtcGxlcy4gIFRoZSBwb3NpdGlvbiBpcyBpbiB0aGUgIm1pZGRsZSIgb2YgdGhlCisgKiBzYW1wbGUgYXJyYXkgd2l0aCByZXNwZWN0IHRvIHRoZSBGSVIgZmlsdGVyOgorICogdGhlIG5lZ2F0aXZlIGhhbGYgb2YgdGhlIGZpbHRlciBpcyBkb3QgcHJvZHVjdCBmcm9tIHNhbXBsZXMrMSB0byBzYW1wbGVzK2hhbGZOdW1Db2VmczsKKyAqIHRoZSBwb3NpdGl2ZSBoYWxmIG9mIHRoZSBmaWx0ZXIgaXMgZG90IHByb2R1Y3QgZnJvbSBzYW1wbGVzIHRvIHNhbXBsZXMtaGFsZk51bUNvZWZzKzEuCisgKgorICogQHBhcmFtIHZvbHVtZUxSIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB0d28gMzIgYml0IHZvbHVtZSB2YWx1ZXMsIG9uZSBwZXIgc3RlcmVvIGNoYW5uZWwsCisgKiBleHByZXNzZWQgYXMgYSBTMzIgaW50ZWdlci4gIEEgbmVnYXRpdmUgdmFsdWUgaW52ZXJ0cyB0aGUgY2hhbm5lbCAxODAgZGVncmVlcy4KKyAqIFRoZSBwb2ludGVyIHZvbHVtZUxSIHNob3VsZCBiZSBhbGlnbmVkIHRvIGEgbWluaW11bSBvZiA4IGJ5dGVzLgorICogQSB0eXBpY2FsIHZhbHVlIGZvciB2b2x1bWUgaXMgMHgxMDAwIHRvIGFsaWduIHRvIGEgdW5pdHkgZ2FpbiBvdXRwdXQgb2YgMjAuMTIuCisgKgorICogSW4gYmV0d2VlbiBjYWxscyB0byBmaWx0ZXJDb2VmZmljaWVudCwgdGhlIHBoYXNlIGlzIGluY3JlbWVudGVkIGJ5IHBoYXNlSW5jcmVtZW50LCB3aGVyZQorICogcGhhc2VJbmNyZW1lbnQgaXMgY2FsY3VsYXRlZCBhcyBpbnB1dFNhbXBsaW5nICogcGhhc2VXcmFwTGltaXQgLyBvdXRwdXRTYW1wbGluZy4KKyAqCisgKiBUaGUgZmlsdGVyIHBvbHlwaGFzZSBpbmRleCBpcyBnaXZlbiBieSBpbmRleFAgPSBwaGFzZSA+PiBjb2VmU2hpZnQuIER1ZSB0bworICogb2RkIGxlbmd0aCBzeW1tZXRyaWMgZmlsdGVyLCB0aGUgcG9seXBoYXNlIGluZGV4IG9mIHRoZSBuZWdhdGl2ZSBoYWxmIGRlcGVuZHMgb24KKyAqIHdoZXRoZXIgaW50ZXJwb2xhdGlvbiBpcyB1c2VkLgorICoKKyAqIFRoZSBmcmFjdGlvbmFsIHNpdGluZyBiZXR3ZWVuIHRoZSBwb2x5cGhhc2UgaW5kaWNlcyBpcyBnaXZlbiBieSB0aGUgYml0cyBiZWxvdyBjb2VmU2hpZnQ6CisgKgorICogbGVycFAgPSBwaGFzZSA8PCAzMiAtIGNvZWZTaGlmdCA+PiAxOyAgLy8gZm9yIDMyIGJpdCB1bnNpZ25lZCBwaGFzZSBtdWx0aXBseQorICogbGVycFAgPSBwaGFzZSA8PCAzMiAtIGNvZWZTaGlmdCA+PiAxNzsgLy8gZm9yIDE2IGJpdCB1bnNpZ25lZCBwaGFzZSBtdWx0aXBseQorICoKKyAqIEZvciBpbnRlZ2VyIHR5cGVzLCB0aGlzIGlzIGV4cHJlc3NlZCBhczoKKyAqCisgKiBsZXJwUCA9IHBoYXNlIDw8IHNpemVvZihwaGFzZSkqOCAtIGNvZWZTaGlmdAorICogICAgICAgICAgICAgID4+IChzaXplb2YocGhhc2UpLXNpemVvZigqY29lZnMpKSo4ICsgMTsKKyAqCisgKiBGb3IgZmxvYXRpbmcgcG9pbnQsIGxlcnBQIGlzIHRoZSBmcmFjdGlvbmFsIHBoYXNlIHNjYWxlZCB0byBbMC4wLCAxLjApOgorICoKKyAqIGxlcnBQID0gKHBoYXNlIDw8IDMyIC0gY29lZlNoaWZ0KSAvICgxIDw8IDMyKTsgLy8gZmxvYXRpbmcgcG9pbnQgZXF1aXZhbGVudAorICovCisKK3RlbXBsYXRlPGludCBDSEFOTkVMUywgYm9vbCBMT0NLRUQsIGludCBTVFJJREUsIHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitzdGF0aWMgaW5saW5lCit2b2lkIGZpcihUTyogY29uc3Qgb3V0LAorICAgICAgICBjb25zdCB1aW50MzJfdCBwaGFzZSwgY29uc3QgdWludDMyX3QgcGhhc2VXcmFwTGltaXQsCisgICAgICAgIGNvbnN0IGludCBjb2VmU2hpZnQsIGNvbnN0IGludCBoYWxmTnVtQ29lZnMsIGNvbnN0IFRDKiBjb25zdCBjb2VmcywKKyAgICAgICAgY29uc3QgVEkqIGNvbnN0IHNhbXBsZXMsIGNvbnN0IFRPKiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICAvLyBOT1RFOiBiZSB2ZXJ5IGNhcmVmdWwgd2hlbiBtb2RpZnlpbmcgdGhlIGNvZGUgaGVyZS4gcmVnaXN0ZXIKKyAgICAvLyBwcmVzc3VyZSBpcyB2ZXJ5IGhpZ2ggYW5kIGEgc21hbGwgY2hhbmdlIG1pZ2h0IGNhdXNlIHRoZSBjb21waWxlcgorICAgIC8vIHRvIGdlbmVyYXRlIGZhciBsZXNzIGVmZmljaWVudCBjb2RlLgorICAgIC8vIEFsd2F5cyBzYW5pdHkgY2hlY2sgdGhlIHJlc3VsdCB3aXRoIG9iamR1bXAgb3IgdGVzdC1yZXNhbXBsZS4KKworICAgIGlmIChMT0NLRUQpIHsKKyAgICAgICAgLy8gbG9ja2VkIHBvbHlwaGFzZSAobm8gaW50ZXJwb2xhdGlvbikKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcG9seXBoYXNlIGZpbHRlciBpbmRleCBvbiB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHNpZGUuCisgICAgICAgIHVpbnQzMl90IGluZGV4UCA9IHBoYXNlID4+IGNvZWZTaGlmdDsKKyAgICAgICAgdWludDMyX3QgaW5kZXhOID0gKHBoYXNlV3JhcExpbWl0IC0gcGhhc2UpID4+IGNvZWZTaGlmdDsKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzUCA9IGNvZWZzICsgaW5kZXhQKmhhbGZOdW1Db2VmczsKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTiA9IGNvZWZzICsgaW5kZXhOKmhhbGZOdW1Db2VmczsKKyAgICAgICAgY29uc3QgVEkqIHNQID0gc2FtcGxlczsKKyAgICAgICAgY29uc3QgVEkqIHNOID0gc2FtcGxlcyArIENIQU5ORUxTOworCisgICAgICAgIC8vIGRvdCBwcm9kdWN0IGZpbHRlci4KKyAgICAgICAgUHJvY2Vzc0w8Q0hBTk5FTFMsIFNUUklERT4ob3V0LAorICAgICAgICAgICAgICAgIGhhbGZOdW1Db2VmcywgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGludGVycG9sYXRlZCBwb2x5cGhhc2UKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcG9seXBoYXNlIGZpbHRlciBpbmRleCBvbiB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHNpZGUuCisgICAgICAgIHVpbnQzMl90IGluZGV4UCA9IHBoYXNlID4+IGNvZWZTaGlmdDsKKyAgICAgICAgdWludDMyX3QgaW5kZXhOID0gKHBoYXNlV3JhcExpbWl0IC0gcGhhc2UgLSAxKSA+PiBjb2VmU2hpZnQ7IC8vIG9uZSdzIGNvbXBsZW1lbnQuCisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc1AgPSBjb2VmcyArIGluZGV4UCpoYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc04gPSBjb2VmcyArIGluZGV4TipoYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc1AxID0gY29lZnNQICsgaGFsZk51bUNvZWZzOworICAgICAgICBjb25zdCBUQyogY29lZnNOMSA9IGNvZWZzTiArIGhhbGZOdW1Db2VmczsKKyAgICAgICAgY29uc3QgVEkqIHNQID0gc2FtcGxlczsKKyAgICAgICAgY29uc3QgVEkqIHNOID0gc2FtcGxlcyArIENIQU5ORUxTOworCisgICAgICAgIC8vIEludGVycG9sYXRpb24gZnJhY3Rpb24gbGVycFAgZGVyaXZlZCBieSBzaGlmdGluZyBhbGwgdGhlIHdheSB1cCBhbmQgZG93bgorICAgICAgICAvLyB0byBjbGVhciB0aGUgYXBwcm9wcmlhdGUgYml0cyBhbmQgYWxpZ24gdG8gdGhlIGFwcHJvcHJpYXRlIGxldmVsCisgICAgICAgIC8vIGZvciB0aGUgaW50ZWdlciBtdWx0aXBseS4gIFRoZSBjb25zdGFudHMgc2hvdWxkIHJlc29sdmUgaW4gY29tcGlsZSB0aW1lLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgaW50ZXJwb2xhdGVkIGZpbHRlciBjb2VmZmljaWVudCBpcyBkZXJpdmVkIGFzIGZvbGxvd3MgZm9yIHRoZSBwb3MvbmVnIGhhbGY6CisgICAgICAgIC8vCisgICAgICAgIC8vIGludGVycG9sYXRlZFtQXSA9IGluZGV4W1BdKmxlcnBQICsgaW5kZXhbUCsxXSooMS1sZXJwUCkKKyAgICAgICAgLy8gaW50ZXJwb2xhdGVkW05dID0gaW5kZXhbTisxXSpsZXJwUCArIGluZGV4W05dKigxLWxlcnBQKQorCisgICAgICAgIC8vIG9uLXRoZS1mbHkgaW50ZXJwb2xhdGVkIGRvdCBwcm9kdWN0IGZpbHRlcgorICAgICAgICBpZiAoaXNfc2FtZTxUQywgZmxvYXQ+Ojp2YWx1ZSB8fCBpc19zYW1lPFRDLCBkb3VibGU+Ojp2YWx1ZSkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IFRDIHNjYWxlID0gMS4gLyAoNjU1MzYuICogNjU1MzYuKTsgLy8gc2NhbGUgcGhhc2UgYml0cyB0byBbMC4wLCAxLjApCisgICAgICAgICAgICBUQyBsZXJwUCA9IFRDKHBoYXNlIDw8IChzaXplb2YocGhhc2UpKjggLSBjb2VmU2hpZnQpKSAqIHNjYWxlOworCisgICAgICAgICAgICBQcm9jZXNzPENIQU5ORUxTLCBTVFJJREU+KG91dCwKKyAgICAgICAgICAgICAgICAgICAgaGFsZk51bUNvZWZzLCBjb2Vmc1AsIGNvZWZzTiwgY29lZnNQMSwgY29lZnNOMSwgc1AsIHNOLCBsZXJwUCwgdm9sdW1lTFIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3QgbGVycFAgPSBwaGFzZSA8PCAoc2l6ZW9mKHBoYXNlKSo4IC0gY29lZlNoaWZ0KQorICAgICAgICAgICAgICAgICAgICA+PiAoKHNpemVvZihwaGFzZSktc2l6ZW9mKCpjb2VmcykpKjggKyAxKTsKKworICAgICAgICAgICAgUHJvY2VzczxDSEFOTkVMUywgU1RSSURFPihvdXQsCisgICAgICAgICAgICAgICAgICAgIGhhbGZOdW1Db2VmcywgY29lZnNQLCBjb2Vmc04sIGNvZWZzUDEsIGNvZWZzTjEsIHNQLCBzTiwgbGVycFAsIHZvbHVtZUxSKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzTmVvbi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc05lb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzExY2VmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc05lb24uaApAQCAtMCwwICsxLDExNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX05FT05fSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfUFJPQ0VTU19ORU9OX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBkZXBlbmRzIG9uIEF1ZGlvUmVzYW1wbGVyRmlyT3BzLmgsIEF1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCisKKyNpZiBVU0VfTkVPTgorLy8KKy8vIE5FT04gc3BlY2lhbGl6YXRpb25zIGFyZSBlbmFibGVkIGZvciBQcm9jZXNzKCkgYW5kIFByb2Nlc3NMKCkKKy8vCisvLyBUT0RPOiBTdHJpZGUgMTYgYW5kIFN0cmlkZSA4IGNhbiBiZSBjb21iaW5lZCB3aXRoIG9uZSBwYXNzIHN0cmlkZSA4IChpZiBuZWNlc3NhcnkpCisvLyBhbmQgbG9vcGluZyBzdHJpZGUgMTYgKG9yIHZpY2UgdmVyc2EpLiBUaGlzIGhhcyBzb21lIHBvbHlwaGFzZSBjb2VmIGRhdGEgYWxpZ25tZW50CisvLyBpc3N1ZXMgd2l0aCBTMTYgY29lZnMuIENvbnNpZGVyIHRoaXMgbGF0ZXIuCisKKy8vIE1hY3JvcyB0byBzYXZlIGEgbW9uby9zdGVyZW8gYWNjdW11bGF0b3Igc2FtcGxlIGluIHEwIChhbmQgcTQpIGFzIHN0ZXJlbyBvdXQuCisjZGVmaW5lIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTyBcCisgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDJ9LCBbJVt2TFJdOjY0XSAgICAgICAgXG4iLyogKDEpIGxvYWQgdm9sdW1lcyAqL1wKKyAgICAgICAgInZsZDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIvKiAoMikgdW5hbGlnbmVkIGxvYWQgdGhlIG91dHB1dCAqL1wKKyAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDEgICAgICAgICAgICAgICBcbiIvKiAoMSkgYWRkIGFsbCA0IHBhcnRpYWwgc3VtcyAqL1wKKyAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDAgICAgICAgICAgICAgICBcbiIvKiAoMSs0ZCkgYW5kIHJlcGxpY2F0ZSBML1IgKi9cCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBkMCwgZDAsIGQyICAgICAgICAgICAgICAgXG4iLyogKDIrM2QpIGFwcGx5IHZvbHVtZSAqL1wKKyAgICAgICAgInZxYWRkLnMzMiAgICAgIGQzLCBkMywgZDAgICAgICAgICAgICAgICBcbiIvKiAoMSs0ZCkgYWNjdW11bGF0ZSByZXN1bHQgKHNhdHVyYXRpbmcpICovXAorICAgICAgICAidnN0MS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIi8qICgyKzJkKSBzdG9yZSByZXN1bHQgKi8KKworI2RlZmluZSBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTyBcCisgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDJ9LCBbJVt2TFJdOjY0XSAgICAgICAgXG4iLyogKDEpIGxvYWQgdm9sdW1lcyovXAorICAgICAgICAidmxkMS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIi8qICgyKSB1bmFsaWduZWQgbG9hZCB0aGUgb3V0cHV0Ki9cCisgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQxICAgICAgICAgICAgICAgXG4iLyogKDEpIGFkZCBhbGwgNCBwYXJ0aWFsIHN1bXMgZnJvbSBxMCovXAorICAgICAgICAidnBhZGQuczMyICAgICAgZDgsIGQ4LCBkOSAgICAgICAgICAgICAgIFxuIi8qICgxKSBhZGQgYWxsIDQgcGFydGlhbCBzdW1zIGZyb20gcTQqL1wKKyAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDggICAgICAgICAgICAgICBcbiIvKiAoMSs0ZCkgY29tYmluZSBpbnRvIEwvUiovXAorICAgICAgICAidnFyZG11bGguczMyICAgZDAsIGQwLCBkMiAgICAgICAgICAgICAgIFxuIi8qICgyKzNkKSBhcHBseSB2b2x1bWUqL1wKKyAgICAgICAgInZxYWRkLnMzMiAgICAgIGQzLCBkMywgZDAgICAgICAgICAgICAgICBcbiIvKiAoMSs0ZCkgYWNjdW11bGF0ZSByZXN1bHQgKHNhdHVyYXRpbmcpKi9cCisgICAgICAgICJ2c3QxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iLyogKDIrMmQpc3RvcmUgcmVzdWx0Ki8KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDEsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgwIC0gY29tYmluZXMrKSBhY2N1bXVsYXRvciA9IDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTJ9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gKDIrMGQpIGxvYWQgOCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge3EzfSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vICgyKSBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIHMzLCBzMiwgczEsIHMwLCBzNywgczYsIHM1LCBzNAorCisgICAgICAgIC8vIHJlb3JkZXJpbmcgdGhlIHZtYWwgdG8gZG8gZDYsIGQ3IGJlZm9yZSBkNCwgZDUgaXMgc2xvd2VyKD8pCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNyAgICAgICAgICAgICAgXG4iLy8gKDErMGQpIG11bHRpcGx5IChyZXZlcnNlZClzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKXNhbXBsZXMgYnkgY29lZgorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBuZWcgc2FtcGxlcworICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ3LCBkMjEgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBuZWcgc2FtcGxlcworCisgICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBuZW9uIGFib3ZlIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE4IiwgInExMCIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MiwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDEpIGFjY19MID0gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgYWNjX1IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgIFxuIi8vICgzKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgIFxuIi8vICgzKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIGxlZnQgcG9zaXRpdmUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIHJldmVyc2UgcmlnaHQgcG9zaXRpdmUKKworICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTcgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ2LCBkMTcgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNywgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDEwLCBkMjAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQxMSwgZDIxICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkMTIsIGQyMCAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyByaWdodAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQxMywgZDIxICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIHJpZ2h0CisKKyAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBiZWZvcmUgbmVvbiBzZWVtcyB0byBiZSBzbG93ZXIKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMzIgICAgICAgIFxuIi8vICgwKSBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQorICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTworCisgICAgICAgIDogW291dF0gIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW3NQXSAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAiK3IiIChzTikKKyAgICAgICAgOiBbdkxSXSAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKKyAgICAgICAgICAicTgiLCAicTEwIgorICAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2VzczwxLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UgUzMyIFExNQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgwIC0gY29tYmluZXMrKSBhY2N1bXVsYXRvciA9IDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTJ9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gKDIrMGQpIGxvYWQgOCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge3EzfSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vICgyKSBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOX0sIFslW2NvZWZzUDFdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAidnN1Yi5zMTYgICAgICAgcTksIHE5LCBxOCAgICAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczE2ICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIHE5LCBxOSwgZDJbMF0gICAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBxMTEsIHExMSwgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgczMsIHMyLCBzMSwgczAsIHM3LCBzNiwgczUsIHM0CisKKyAgICAgICAgInZhZGQuczE2ICAgICAgIHE4LCBxOCwgcTkgICAgICAgICAgICAgICBcbiIvLyAoMSsyZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0CisgICAgICAgICJ2YWRkLnMxNiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldAorCisgICAgICAgIC8vIHJlb3JkZXJpbmcgdGhlIHZtYWwgdG8gZG8gZDYsIGQ3IGJlZm9yZSBkNCwgZDUgaXMgc2xvd2VyKD8pCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNyAgICAgICAgICAgICAgXG4iLy8gKDErMGQpIG11bHRpcGx5IHJldmVyc2VkIHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSByZXZlcnNlZCBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgbmVnIHNhbXBsZXMKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNywgZDIxICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgbmVnIHNhbXBsZXMKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGluc3RydWN0aW9ucyBiZWZvcmUgbmVvbiBhYm92ZSBzZWVtcyB0byBiZSBzbG93ZXIKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vICgwKSBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQorICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MiwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDEpIGFjY19MID0gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgYWNjX1IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgIFxuIi8vICgzKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgIFxuIi8vICgzKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge3E5fSwgWyVbY29lZnNQMV06MTI4XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICAidmxkMS4xNiAgICAgICAge3ExMH0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge3ExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorCisgICAgICAgICJ2c3ViLnMxNiAgICAgICBxOSwgcTksIHE4ICAgICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnN1Yi5zMTYgICAgICAgcTExLCBxMTEsIHExMCAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKKworICAgICAgICAidnFyZG11bGguczE2ICAgcTksIHE5LCBkMlswXSAgICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIHExMSwgcTExLCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAybmQgc2V0IG9mIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgbGVmdCBwb3NpdGl2ZQorICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSByaWdodCBwb3NpdGl2ZQorCisgICAgICAgICJ2YWRkLnMxNiAgICAgICBxOCwgcTgsIHE5ICAgICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAorICAgICAgICAidmFkZC5zMTYgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQKKworICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTcgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSByZXZlcnNlZCBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgcmV2ZXJzZWQgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDYsIGQxNyAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHJldmVyc2VkIHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNywgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgcmV2ZXJzZWQgc2FtcGxlcyByaWdodAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQxMCwgZDIwICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkMTEsIGQyMSAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDEyLCBkMjAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkMTMsIGQyMSAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyByaWdodAorCisgICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gYmVmb3JlIG5lb24gc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzMyICAgICAgICBcbiIvLyAoMCkgbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAiK3IiIChzTikKKyAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCisgICAgICAgICAgW3ZMUl0gInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDEsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMn0sIFslW3NQXV0gICAgICAgICAgICAgICAgIFxuIi8vIGxvYWQgOCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge3EzfSwgWyVbc05dXSEgICAgICAgICAgICAgICAgXG4iLy8gbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTgsIHE5fSwgWyVbY29lZnNQMF06MTI4XSEgICBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMCwgcTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsIGQ0LCAjMTUgICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsIGQ1LCAjMTUgICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgZDcsICMxNSAgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgICAgICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwyLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTgsIHE5fSwgWyVbY29lZnNQMF06MTI4XSEgICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMCwgcTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNCwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNSwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQxMCwgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgIGQxMSwgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDYsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDcsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkMTIsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsICBkMTMsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICAgICAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzMyICAgICAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDEsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge3EyfSwgWyVbc1BdXSAgICAgICAgICAgICAgICAgXG4iLy8gbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTN9LCBbJVtzTl1dISAgICAgICAgICAgICAgICBcbiIvLyBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOCwgcTl9LCBbJVtjb2Vmc1AwXToxMjhdISAgIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEyLCBxMTN9LCBbJVtjb2Vmc1AxXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMCwgcTExfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTQsIHExNX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExMywgcTEzLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIGQyWzBdICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIGQyWzBdICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIGQyWzBdICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIGQyWzBdICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxOCwgcTgsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxOSwgcTksIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTEsIHExMSwgcTE1ICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDUsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkNiwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsICBkNywgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICAgICAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAorICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCisgICAgICAgICAgW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCisgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2VzczwyLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOCwgcTl9LCBbJVtjb2Vmc1AwXToxMjhdISAgIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEyLCBxMTN9LCBbJVtjb2Vmc1AxXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMCwgcTExfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTQsIHExNX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExMywgcTEzLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIGQyWzBdICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIGQyWzBdICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIGQyWzBdICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIGQyWzBdICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxOCwgcTgsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxOSwgcTksIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTEsIHExMSwgcTE1ICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDUsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkMTAsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsICBkMTEsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ2LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ3LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDEyLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDEzLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgICAgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMzMiAgICAgICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCisgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MSwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgwIC0gY29tYmluZXMrKSBhY2N1bXVsYXRvciA9IDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDR9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gKDIrMGQpIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q2fSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vICgyKSBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTZ9LCBbJVtjb2Vmc1AwXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjB9LCBbJVtjb2Vmc04wXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlZCBzMywgczIsIHMxLCBzMCwgczcsIHM2LCBzNSwgczQKKworICAgICAgICAvLyByZW9yZGVyaW5nIHRoZSB2bWFsIHRvIGRvIGQ2LCBkNyBiZWZvcmUgZDQsIGQ1IGlzIHNsb3dlcig/KQorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCisKKyAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBpbnN0cnVjdGlvbnMgYmVmb3JlIG5lb24gYWJvdmUgc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgICBcbiIvLyAoMCkgbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxMTAiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDIsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMSkgYWNjX0wgPSAwCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gKDAgY29tYmluZXMrKSBhY2NfUiA9IDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gKDIrMGQpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDYsIGQ3fSwgWyVbc05dXSEgICAgICAgXG4iLy8gKDIpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE2fSwgWyVbY29lZnNQMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIwfSwgWyVbY29lZnNOMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgbGVmdCBwb3NpdGl2ZQorCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyByaWdodAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNywgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyByaWdodAorCisgICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gYmVmb3JlIG5lb24gc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyAoMCkgbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCisgICAgICAgICAgInE4IiwgInExMCIKKyAgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MSwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZSBTMzIgUTE1CisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDAgLSBjb21iaW5lcyspIGFjY3VtdWxhdG9yID0gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNH0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyAoMiswZCkgbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDZ9LCBbJVtzTl1dISAgICAgICAgICAgXG4iLy8gKDIpIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QxNn0sIFslW2NvZWZzUDBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QxN30sIFslW2NvZWZzUDFdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMH0sIFslW2NvZWZzTjFdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMX0sIFslW2NvZWZzTjBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorCisgICAgICAgICJ2c3ViLnMxNiAgICAgICBkMTcsIGQxNywgZDE2ICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnN1Yi5zMTYgICAgICAgZDIxLCBkMjEsIGQyMCAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKKworICAgICAgICAidnFyZG11bGguczE2ICAgZDE3LCBkMTcsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIGQyMSwgZDIxLCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAybmQgc2V0IG9mIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSBzMywgczIsIHMxLCBzMCwgczcsIHM2LCBzNSwgczQKKworICAgICAgICAidmFkZC5zMTYgICAgICAgZDE2LCBkMTYsIGQxNyAgICAgICAgICAgIFxuIi8vICgxKzJkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKKyAgICAgICAgInZhZGQuczE2ICAgICAgIGQyMCwgZDIwLCBkMjEgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0CisKKyAgICAgICAgLy8gcmVvcmRlcmluZyB0aGUgdm1hbCB0byBkbyBkNiwgZDcgYmVmb3JlIGQ0LCBkNSBpcyBzbG93ZXIoPykKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSswZCkgbXVsdGlwbHkgKHJldmVyc2VkKWJ5IGNvZWYKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgbmVnIHNhbXBsZXMKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGluc3RydWN0aW9ucyBiZWZvcmUgbmVvbiBhYm92ZSBzZWVtcyB0byBiZSBzbG93ZXIKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjOCAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDIsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDg7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMSkgYWNjX0wgPSAwCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gKDAgY29tYmluZXMrKSBhY2NfUiA9IDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gKDMrMGQpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDYsIGQ3fSwgWyVbc05dXSEgICAgICAgXG4iLy8gKDMpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE2fSwgWyVbY29lZnNQMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE3fSwgWyVbY29lZnNQMV06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIwfSwgWyVbY29lZnNOMV06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIxfSwgWyVbY29lZnNOMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgInZzdWIuczE2ICAgICAgIGQxNywgZDE3LCBkMTYgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c3ViLnMxNiAgICAgICBkMjEsIGQyMSwgZDIwICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cworCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBkMTcsIGQxNywgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnFyZG11bGguczE2ICAgZDIxLCBkMjEsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBsZWZ0IHBvc2l0aXZlCisKKyAgICAgICAgInZhZGQuczE2ICAgICAgIGQxNiwgZDE2LCBkMTcgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0CisgICAgICAgICJ2YWRkLnMxNiAgICAgICBkMjAsIGQyMCwgZDIxICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldAorCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyByaWdodAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNywgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyByaWdodAorCisgICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gYmVmb3JlIG5lb24gc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQorICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTworCisgICAgICAgIDogW291dF0gIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAorICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKKyAgICAgICAgICBbc1BdICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MSwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q0fSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q2fSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgIFxuIi8vIChzdGFsbCkgZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCBkNiwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIChzdGFsbCkgYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW3NQXSAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAiK3IiIChzTikKKyAgICAgICAgOiBbdkxSXSAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTE0IgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDg7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCwgZDV9LCBbJVtzUF1dICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsIGQ0LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCBkNSwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCBkNiwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgZDcsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCisgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2VzczwxLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDR9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDZ9LCBbJVtzTl1dISAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOX0sIFslW2NvZWZzUDFdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnN1Yi5zMzIgICAgICAgcTksIHE5LCBxOCAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnN1Yi5zMzIgICAgICAgcTExLCBxMTEsIHExMCAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTksIHE5LCBkMlswXSAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnFyZG11bGguczMyICAgcTExLCBxMTEsIGQyWzBdICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCBkNiwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTgsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwNCkgMm5kIHNldAorCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCisgICAgICAgICAgW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCisgICAgICAgICAgInExMiIsICJxMTQiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZQordm9pZCBQcm9jZXNzPDIsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDg7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCwgZDV9LCBbJVtzUF1dICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOX0sIFslW2NvZWZzUDFdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vIChyZXZlcnNlZCkgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnN1Yi5zMzIgICAgICAgcTksIHE5LCBxOCAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnN1Yi5zMzIgICAgICAgcTExLCBxMTEsIHExMCAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgZDUsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHE5LCBxOSwgZDJbMF0gICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMSwgcTExLCBkMlsxXSAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsIGQ3LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxOCwgcTgsIHE5ICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXA0KSAybmQgc2V0CisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisgICAgKTsKK30KKworI2VuZGlmIC8vVVNFX05FT04KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfTkVPTl9IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKaW5kZXggZTUwYjE5Mi4uMzU1NTNlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKQEAgLTU0Myw3ICs1NDMsNyBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChvdXRGcmFtZUNvdW50KTsKIAogICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSB7CiAgICAgICAgIC8vIGJ1ZmZlciBpcyBlbXB0eSwgZmV0Y2ggYSBuZXcgb25lCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaAppbmRleCAwNzU0ZDlkLi42YThhZWIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKQEAgLTMxLDYgKzMxLDcgQEAKIAogLy8gdW5jb21tZW50IHRvIGVuYWJsZSBmYXN0IG1peGVyIHRvIHRha2UgcGVyZm9ybWFuY2Ugc2FtcGxlcyBmb3IgbGF0ZXIgc3RhdGlzdGljYWwgYW5hbHlzaXMKICNkZWZpbmUgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisvLyBGSVhNRSByZW5hbWUgdG8gRkFTVF9USFJFQURfU1RBVElTVElDUwogCiAvLyB1bmNvbW1lbnQgZm9yIGRlYnVnZ2luZyB0aW1pbmcgcHJvYmxlbXMgcmVsYXRlZCB0byBTdGF0ZVF1ZXVlOjpwdXNoKCkKIC8vI2RlZmluZSBTVEFURV9RVUVVRV9EVU1QCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKaW5kZXggMDEwZTIzMy4uMjliNTZkYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcApAQCAtMTE2LDggKzExNiw5IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICAvLyBmaXJzdCBub24gZGVzdHJveWVkIGhhbmRsZSBpcyBjb25zaWRlcmVkIGluIGNvbnRyb2wKLSAgICAgICAgaWYgKGNvbnRyb2xIYW5kbGUgPT0gTlVMTCkKKyAgICAgICAgaWYgKGNvbnRyb2xIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICAgICAgY29udHJvbEhhbmRsZSA9IGg7CisgICAgICAgIH0KICAgICAgICAgaWYgKGgtPnByaW9yaXR5KCkgPD0gcHJpb3JpdHkpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC04MDQsNyArODA1LDExMiBAQAogICAgIHJldHVybiBtT2ZmbG9hZGVkOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK1N0cmluZzggZWZmZWN0RmxhZ3NUb1N0cmluZyh1aW50MzJfdCBmbGFncykgeworICAgIFN0cmluZzggczsKKworICAgIHMuYXBwZW5kKCJjb25uLiBtb2RlOiAiKTsKKyAgICBzd2l0Y2ggKGZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVDogcy5hcHBlbmQoImluc2VydCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZOiBzLmFwcGVuZCgiYXV4aWxpYXJ5Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9SRVBMQUNFOiBzLmFwcGVuZCgicmVwbGFjZSIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0M6IHMuYXBwZW5kKCJwcmVwcm9jIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0M6IHMuYXBwZW5kKCJwb3N0cHJvYyIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICBzLmFwcGVuZCgiaW5zZXJ0IHByZWY6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19JTlNFUlRfTUFTSykgeworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0FOWTogcy5hcHBlbmQoImFueSIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVDogcy5hcHBlbmQoImZpcnN0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1Q6IHMuYXBwZW5kKCJsYXN0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRTogcy5hcHBlbmQoImV4Y2x1c2l2ZSIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICBzLmFwcGVuZCgidm9sdW1lIG1nbXQ6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgeworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX05PTkU6IHMuYXBwZW5kKCJub25lIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkw6IHMuYXBwZW5kKCJpbXBsZW1lbnRzIGNvbnRyb2wiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EOiBzLmFwcGVuZCgicmVxdWlyZXMgaW5kaWNhdGlvbiIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICB1aW50MzJfdCBkZXZpbmQgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0RFVklDRV9NQVNLOworICAgIGlmIChkZXZpbmQpIHsKKyAgICAgICAgcy5hcHBlbmQoImRldmljZSBpbmRpY2F0aW9uOiAiKTsKKyAgICAgICAgc3dpdGNoIChkZXZpbmQpIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EOiBzLmFwcGVuZCgicmVxdWlyZXMgdXBkYXRlcyIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy5hcHBlbmQoIiwgIik7CisgICAgfQorCisgICAgcy5hcHBlbmQoImlucHV0IG1vZGU6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19JTlBVVF9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlBVVF9ESVJFQ1Q6IHMuYXBwZW5kKCJkaXJlY3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlBVVF9QUk9WSURFUjogcy5hcHBlbmQoInByb3ZpZGVyIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5QVVRfQk9USDogcy5hcHBlbmQoImRpcmVjdCtwcm92aWRlciIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgibm90IHNldCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICBzLmFwcGVuZCgib3V0cHV0IG1vZGU6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19PVVRQVVRfTUFTSykgeworICAgIGNhc2UgRUZGRUNUX0ZMQUdfT1VUUFVUX0RJUkVDVDogcy5hcHBlbmQoImRpcmVjdCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX09VVFBVVF9QUk9WSURFUjogcy5hcHBlbmQoInByb3ZpZGVyIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfT1VUUFVUX0JPVEg6IHMuYXBwZW5kKCJkaXJlY3QrcHJvdmlkZXIiKTsgYnJlYWs7CisgICAgZGVmYXVsdDogcy5hcHBlbmQoIm5vdCBzZXQiKTsgYnJlYWs7CisgICAgfQorICAgIHMuYXBwZW5kKCIsICIpOworCisgICAgdWludDMyX3QgYWNjZWwgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19NQVNLOworICAgIGlmIChhY2NlbCkgeworICAgICAgICBzLmFwcGVuZCgiaGFyZHdhcmUgYWNjZWxlcmF0aW9uOiAiKTsKKyAgICAgICAgc3dpdGNoIChhY2NlbCkgeworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0hXX0FDQ19TSU1QTEU6IHMuYXBwZW5kKCJub24tdHVubmVsZWQiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTDogcy5hcHBlbmQoInR1bm5lbGVkIik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtb2RlaW5kID0gZmxhZ3MgJiBFRkZFQ1RfRkxBR19BVURJT19NT0RFX01BU0s7CisgICAgaWYgKG1vZGVpbmQpIHsKKyAgICAgICAgcy5hcHBlbmQoIm1vZGUgaW5kaWNhdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAobW9kZWluZCkgeworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0FVRElPX01PREVfSU5EOiBzLmFwcGVuZCgicmVxdWlyZWQiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMuYXBwZW5kKCIsICIpOworICAgIH0KKworICAgIHVpbnQzMl90IHNyY2luZCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX01BU0s7CisgICAgaWYgKHNyY2luZCkgeworICAgICAgICBzLmFwcGVuZCgic291cmNlIGluZGljYXRpb246ICIpOworICAgICAgICBzd2l0Y2ggKHNyY2luZCkgeworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlZCIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy5hcHBlbmQoIiwgIik7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9NQVNLKSB7CisgICAgICAgIHMuYXBwZW5kKCJvZmZsb2FkYWJsZSwgIik7CisgICAgfQorCisgICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7CisgICAgaWYgKHMubGVuZ3RoKCkgPiAyKSB7CisgICAgICAgIGNoYXIgKnN0ciA9IHMubG9ja0J1ZmZlcihsZW4pOworICAgICAgICBzLnVubG9ja0J1ZmZlcihsZW4gLSAyKTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKKwordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC04MzgsOSArOTQ0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUubm9kZVsyXSwKICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLm5vZGVbM10sbURlc2NyaXB0b3IudHlwZS5ub2RlWzRdLG1EZXNjcmlwdG9yLnR5cGUubm9kZVs1XSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIGFwaVZlcnNpb246ICUwOFhcblx0XHQtIGZsYWdzOiAlMDhYXG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIGFwaVZlcnNpb246ICUwOFhcblx0XHQtIGZsYWdzOiAlMDhYICglcylcbiIsCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5hcGlWZXJzaW9uLAotICAgICAgICAgICAgbURlc2NyaXB0b3IuZmxhZ3MpOworICAgICAgICAgICAgbURlc2NyaXB0b3IuZmxhZ3MsCisgICAgICAgICAgICBlZmZlY3RGbGFnc1RvU3RyaW5nKG1EZXNjcmlwdG9yLmZsYWdzKS5zdHJpbmcoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIG5hbWU6ICVzXG4iLAogICAgICAgICAgICAgbURlc2NyaXB0b3IubmFtZSk7CkBAIC04NTEsMzcgKzk1OCwzNyBAQAogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gSW5wdXQgY29uZmlndXJhdGlvbjpcbiIpOwogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEZyYW1lcyAgU21wIHJhdGUgQ2hhbm5lbHMgRm9ybWF0IEJ1ZmZlclxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdFx0JTA1enUgICAlMDVkICAgICUwOHggJTZkICVwXG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdCUwNXp1ICAgJTA1ZCAgICAlMDh4ICU2ZCAoJXMpICVwXG4iLAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCwKICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscywKICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0LAorICAgICAgICAgICAgZm9ybWF0VG9TdHJpbmcoKGF1ZGlvX2Zvcm1hdF90KW1Db25maWcuaW5wdXRDZmcuZm9ybWF0KSwKICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gT3V0cHV0IGNvbmZpZ3VyYXRpb246XG4iKTsKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRCdWZmZXIgICAgIEZyYW1lcyAgU21wIHJhdGUgQ2hhbm5lbHMgRm9ybWF0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQlcCAlMDV6dSAgICUwNWQgICAgJTA4eCAlZFxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQlcCAlMDV6dSAgICUwNWQgICAgJTA4eCAlZCAoJXMpXG4iLAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdywKICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMsCi0gICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5mb3JtYXQpOworICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0LAorICAgICAgICAgICAgZm9ybWF0VG9TdHJpbmcoKGF1ZGlvX2Zvcm1hdF90KW1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQlenUgQ2xpZW50czpcbiIsIG1IYW5kbGVzLnNpemUoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdFBpZCAgIFByaW9yaXR5IEN0cmwgTG9ja2VkIGNsaWVudCBzZXJ2ZXJcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdCAgUGlkIFByaW9yaXR5IEN0cmwgTG9ja2VkIGNsaWVudCBzZXJ2ZXJcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhhbmRsZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgRWZmZWN0SGFuZGxlICpoYW5kbGUgPSBtSGFuZGxlc1tpXTsKICAgICAgICAgaWYgKGhhbmRsZSAhPSBOVUxMICYmICFoYW5kbGUtPmRlc3Ryb3llZF9sKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZS0+ZHVtcChidWZmZXIsIFNJWkUpOworICAgICAgICAgICAgaGFuZGxlLT5kdW1wVG9CdWZmZXIoYnVmZmVyLCBTSVpFKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0KICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQubGVuZ3RoKCkpOwogCiAgICAgaWYgKGxvY2tlZCkgewpAQCAtOTExLDE4ICsxMDE4LDE1IEBACiAgICAgfQogICAgIGludCBidWZPZmZzZXQgPSAoKHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwogICAgIG1DYmxrTWVtb3J5ID0gY2xpZW50LT5oZWFwKCktPmFsbG9jYXRlKEVGRkVDVF9QQVJBTV9CVUZGRVJfU0laRSArIGJ1Zk9mZnNldCk7Ci0gICAgaWYgKG1DYmxrTWVtb3J5ICE9IDApIHsKLSAgICAgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxlZmZlY3RfcGFyYW1fY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpOwotCi0gICAgICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuZXcobUNibGspIGVmZmVjdF9wYXJhbV9jYmxrX3QoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAobUNibGtNZW1vcnkgPT0gMCB8fAorICAgICAgICAgICAgKG1DYmxrID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X3BhcmFtX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKSkgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEVmZmVjdCBzaXplPSV1IiwgRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFICsKICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX2NibGtfdCkpOworICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIG5ldyhtQ2JsaykgZWZmZWN0X3BhcmFtX2NibGtfdCgpOworICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OwogfQogCiBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6fkVmZmVjdEhhbmRsZSgpCkBAIC05MzksNiArMTA0MywxMSBAQAogICAgIGRpc2Nvbm5lY3QoZmFsc2UpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gbUNsaWVudCA9PSAwIHx8IG1DYmxrTWVtb3J5ICE9IDAgPyBPSyA6IE5PX01FTU9SWTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmVuYWJsZSgpCiB7CiAgICAgQUxPR1YoImVuYWJsZSAlcCIsIHRoaXMpOwpAQCAtMTE3OSwxNSArMTI4OCwxNSBAQAogfQogCiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmR1bXBUb0J1ZmZlcihjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQogewogICAgIGJvb2wgbG9ja2VkID0gbUNibGsgIT0gTlVMTCAmJiBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1DYmxrLT5sb2NrKTsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCUwNWQgJTA1ZCAgICAlMDF1ICAgICUwMXUgICAgICAlMDV1ICAlMDV1XG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCU1ZCAgICAlNWQgICUzcyAgICAlM3MgICU1dSAgJTV1XG4iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtUHJpb3JpdHksCi0gICAgICAgICAgICBtSGFzQ29udHJvbCwKLSAgICAgICAgICAgICFsb2NrZWQsCisgICAgICAgICAgICBtSGFzQ29udHJvbCA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgICAgIGxvY2tlZCA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIG1DYmxrID8gbUNibGstPmNsaWVudEluZGV4IDogMCwKICAgICAgICAgICAgIG1DYmxrID8gbUNibGstPnNlcnZlckluZGV4IDogMAogICAgICAgICAgICAgKTsKQEAgLTE1NjgsMzMgKzE2NzcsMzUgQEAKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkVmZmVjdHMgZm9yIHNlc3Npb24gJWQ6XG4iLCBtU2Vzc2lvbklkKTsKKyAgICBzaXplX3QgbnVtRWZmZWN0cyA9IG1FZmZlY3RzLnNpemUoKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgJWQgZWZmZWN0cyBmb3Igc2Vzc2lvbiAlZFxuIiwgbnVtRWZmZWN0cywgbVNlc3Npb25JZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCi0gICAgYm9vbCBsb2NrZWQgPSBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1Mb2NrKTsKLSAgICAvLyBmYWlsZWQgdG8gbG9jayAtIEF1ZGlvRmxpbmdlciBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCi0gICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXHRDb3VsZCBub3QgbG9jayBtdXRleDpcbiIpOwotICAgIH0KLQotICAgIHJlc3VsdC5hcHBlbmQoIlx0TnVtIGZ4IEluIGJ1ZmZlciAgIE91dCBidWZmZXIgICBBY3RpdmUgdHJhY2tzOlxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHQlMDJ6dSAgICAgJXAgICVwICAgJWRcbiIsCi0gICAgICAgICAgICBtRWZmZWN0cy5zaXplKCksCi0gICAgICAgICAgICBtSW5CdWZmZXIsCi0gICAgICAgICAgICBtT3V0QnVmZmVyLAotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrQ250KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gbUVmZmVjdHNbaV07Ci0gICAgICAgIGlmIChlZmZlY3QgIT0gMCkgewotICAgICAgICAgICAgZWZmZWN0LT5kdW1wKGZkLCBhcmdzKTsKKyAgICBpZiAobnVtRWZmZWN0cykgeworICAgICAgICBib29sIGxvY2tlZCA9IEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUxvY2spOworICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIEF1ZGlvRmxpbmdlciBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCisgICAgICAgIGlmICghbG9ja2VkKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcdENvdWxkIG5vdCBsb2NrIG11dGV4OlxuIik7CiAgICAgICAgIH0KLSAgICB9CiAKLSAgICBpZiAobG9ja2VkKSB7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJcdEluIGJ1ZmZlciAgIE91dCBidWZmZXIgICBBY3RpdmUgdHJhY2tzOlxuIik7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0JXAgICVwICAgJWRcbiIsCisgICAgICAgICAgICAgICAgbUluQnVmZmVyLAorICAgICAgICAgICAgICAgIG1PdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrQ250KTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7ICsraSkgeworICAgICAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBtRWZmZWN0c1tpXTsKKyAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgeworICAgICAgICAgICAgICAgIGVmZmVjdC0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9ja2VkKSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKaW5kZXggYjcxNzg1Ny4uY2NjNDgyNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCkBAIC0xNjksNiArMTY5LDcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCiAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5KTsKICAgICB2aXJ0dWFsIH5FZmZlY3RIYW5kbGUoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwogCiAgICAgLy8gSUVmZmVjdAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlKCk7CkBAIC0yMDgsNyArMjA5LDcgQEAKICAgICAvLyBkZXN0cm95ZWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGFzc29jaWF0ZWQgRWZmZWN0TW9kdWxlIG1Mb2NrIGhlbGQKICAgICBib29sIGRlc3Ryb3llZF9sKCkgY29uc3QgeyByZXR1cm4gbURlc3Ryb3llZDsgfQogCi0gICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgZHVtcFRvQnVmZmVyKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgICAgICAgICAgLy8gZm9yIG1FZmZlY3QsIG1IYXNDb250cm9sLCBtRW5hYmxlZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCA4NWQ2MzdlLi41Y2I0MmNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtNDAsNjE3ICs0MCwzODUgQEAKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAKLSNkZWZpbmUgRkFTVF9IT1RfSURMRV9OUyAgICAgMTAwMDAwMEwgICAvLyAxIG1zOiB0aW1lIHRvIHNsZWVwIHdoaWxlIGhvdCBpZGxpbmcKLSNkZWZpbmUgRkFTVF9ERUZBVUxUX05TICAgIDk5OTk5OTk5OUwgICAvLyB+MSBzZWM6IGRlZmF1bHQgdGltZSB0byBzbGVlcAotI2RlZmluZSBNSU5fV0FSTVVQX0NZQ0xFUyAgICAgICAgICAyICAgIC8vIG1pbmltdW0gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHRvIHdhaXQgZm9yIHdhcm11cAotI2RlZmluZSBNQVhfV0FSTVVQX0NZQ0xFUyAgICAgICAgIDEwICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHRvIHdhaXQgZm9yIHdhcm11cAotCiAjZGVmaW5lIEZDQ18yICAgICAgICAgICAgICAgICAgICAgICAyICAgLy8gZml4ZWQgY2hhbm5lbCBjb3VudCBhc3N1bXB0aW9uCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gRmFzdCBtaXhlciB0aHJlYWQKLWJvb2wgRmFzdE1peGVyOjp0aHJlYWRMb29wKCkKKy8qc3RhdGljKi8gY29uc3QgRmFzdE1peGVyU3RhdGUgRmFzdE1peGVyOjppbml0aWFsOworCitGYXN0TWl4ZXI6OkZhc3RNaXhlcigpIDogRmFzdFRocmVhZCgpLAorICAgIHNsb3BOcygwKSwKKyAgICAvLyBmYXN0VHJhY2tOYW1lcworICAgIC8vIGdlbmVyYXRpb25zCisgICAgb3V0cHV0U2luayhOVUxMKSwKKyAgICBvdXRwdXRTaW5rR2VuKDApLAorICAgIG1peGVyKE5VTEwpLAorICAgIG1peEJ1ZmZlcihOVUxMKSwKKyAgICBtaXhCdWZmZXJTdGF0ZShVTkRFRklORUQpLAorICAgIGZvcm1hdChGb3JtYXRfSW52YWxpZCksCisgICAgc2FtcGxlUmF0ZSgwKSwKKyAgICBmYXN0VHJhY2tzR2VuKDApLAorICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbigwKSwKKyAgICAvLyB0aW1lc3RhbXAKKyAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKDApICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgogewotICAgIHN0YXRpYyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBpbml0aWFsOwotICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICpwcmV2aW91cyA9ICZpbml0aWFsLCAqY3VycmVudCA9ICZpbml0aWFsOwotICAgIEZhc3RNaXhlclN0YXRlIHByZUlkbGU7IC8vIGNvcHkgb2Ygc3RhdGUgYmVmb3JlIHdlIHdlbnQgaW50byBpZGxlCi0gICAgc3RydWN0IHRpbWVzcGVjIG9sZFRzID0gezAsIDB9OwotICAgIGJvb2wgb2xkVHNWYWxpZCA9IGZhbHNlOwotICAgIGxvbmcgc2xvcE5zID0gMDsgICAgLy8gYWNjdW11bGF0ZWQgdGltZSB3ZSd2ZSB3b2tlbiB1cCB0b28gZWFybHkgKD4gMCkgb3IgdG9vIGxhdGUgKDwgMCkKLSAgICBsb25nIHNsZWVwTnMgPSAtMTsgIC8vIC0xOiBidXN5IHdhaXQsIDA6IHNjaGVkX3lpZWxkLCA+IDA6IG5hbm9zbGVlcAotICAgIGludCBmYXN0VHJhY2tOYW1lc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOyAvLyBoYW5kbGVzIHVzZWQgYnkgbWl4ZXIgdG8gaWRlbnRpZnkgdHJhY2tzCi0gICAgaW50IGdlbmVyYXRpb25zW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107ICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUZhc3RUcmFja3NbaV0ubUdlbmVyYXRpb24KKyAgICAvLyBGSVhNRSBwYXNzIGluaXRpYWwgYXMgcGFyYW1ldGVyIHRvIGJhc2UgY2xhc3MgY29uc3RydWN0b3IsIGFuZCBtYWtlIGl0IHN0YXRpYyBsb2NhbAorICAgIHByZXZpb3VzID0gJmluaXRpYWw7CisgICAgY3VycmVudCA9ICZpbml0aWFsOworCisgICAgbUR1bW15RHVtcFN0YXRlID0gJmR1bW15RHVtcFN0YXRlOworCiAgICAgdW5zaWduZWQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2kpIHsKICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSAwOwogICAgIH0KLSAgICBOQkFJT19TaW5rICpvdXRwdXRTaW5rID0gTlVMTDsKLSAgICBpbnQgb3V0cHV0U2lua0dlbiA9IDA7Ci0gICAgQXVkaW9NaXhlciogbWl4ZXIgPSBOVUxMOwotICAgIHNob3J0ICptaXhCdWZmZXIgPSBOVUxMOwotICAgIGVudW0ge1VOREVGSU5FRCwgTUlYRUQsIFpFUk9FRH0gbWl4QnVmZmVyU3RhdGUgPSBVTkRFRklORUQ7Ci0gICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOwotICAgIHVuc2lnbmVkIHNhbXBsZVJhdGUgPSAwOwotICAgIGludCBmYXN0VHJhY2tzR2VuID0gMDsKLSAgICBsb25nIHBlcmlvZE5zID0gMDsgICAgICAvLyBleHBlY3RlZCBwZXJpb2Q7IHRoZSB0aW1lIHJlcXVpcmVkIHRvIHJlbmRlciBvbmUgbWl4IGJ1ZmZlcgotICAgIGxvbmcgdW5kZXJydW5OcyA9IDA7ICAgIC8vIHVuZGVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlCi0gICAgbG9uZyBvdmVycnVuTnMgPSAwOyAgICAgLy8gb3ZlcnJ1biBsaWtlbHkgd2hlbiB3cml0ZSBjeWNsZSBpcyBsZXNzIHRoYW4gdGhpcyB2YWx1ZQotICAgIGxvbmcgZm9yY2VOcyA9IDA7ICAgICAgIC8vIGlmIG92ZXJydW4gZGV0ZWN0ZWQsIGZvcmNlIHRoZSB3cml0ZSBjeWNsZSB0byB0YWtlIHRoaXMgbXVjaCB0aW1lCi0gICAgbG9uZyB3YXJtdXBOcyA9IDA7ICAgICAgLy8gd2FybXVwIGNvbXBsZXRlIHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRvIHRoaXMgdmFsdWUKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgZHVtbXlEdW1wU3RhdGUsICpkdW1wU3RhdGUgPSAmZHVtbXlEdW1wU3RhdGU7Ci0gICAgYm9vbCBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7ICAvLyB1c2VkIHRvIGlnbm9yZSBpbml0aWFsIG92ZXJydW4gYW5kIGZpcnN0IGFmdGVyIGFuIHVuZGVycnVuCiAjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgc3RydWN0IHRpbWVzcGVjIG9sZExvYWQgPSB7MCwgMH07ICAgIC8vIHByZXZpb3VzIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCi0gICAgYm9vbCBvbGRMb2FkVmFsaWQgPSBmYWxzZTsgIC8vIHdoZXRoZXIgb2xkTG9hZCBpcyB2YWxpZAotICAgIHVpbnQzMl90IGJvdW5kcyA9IDA7Ci0gICAgYm9vbCBmdWxsID0gZmFsc2U7ICAgICAgLy8gd2hldGhlciB3ZSBoYXZlIGNvbGxlY3RlZCBhdCBsZWFzdCBtU2FtcGxpbmdOIHNhbXBsZXMKLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBUaHJlYWRDcHVVc2FnZSB0Y3U7ICAgICAvLyBmb3IgcmVhZGluZyB0aGUgY3VycmVudCBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIegorICAgIG9sZExvYWQudHZfc2VjID0gMDsKKyAgICBvbGRMb2FkLnR2X25zZWMgPSAwOwogI2VuZGlmCit9CisKK0Zhc3RNaXhlcjo6fkZhc3RNaXhlcigpCit7Cit9CisKK0Zhc3RNaXhlclN0YXRlUXVldWUqIEZhc3RNaXhlcjo6c3EoKQoreworICAgIHJldHVybiAmbVNROworfQorCitjb25zdCBGYXN0VGhyZWFkU3RhdGUgKkZhc3RNaXhlcjo6cG9sbCgpCit7CisgICAgcmV0dXJuIG1TUS5wb2xsKCk7Cit9CisKK3ZvaWQgRmFzdE1peGVyOjpzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyKQoreworICAgIGlmIChtaXhlciAhPSBOVUxMKSB7CisgICAgICAgIG1peGVyLT5zZXRMb2cobG9nV3JpdGVyKTsKKyAgICB9Cit9CisKK3ZvaWQgRmFzdE1peGVyOjpvbklkbGUoKQoreworICAgIHByZUlkbGUgPSAqKGNvbnN0IEZhc3RNaXhlclN0YXRlICopY3VycmVudDsKKyAgICBjdXJyZW50ID0gJnByZUlkbGU7Cit9CisKK3ZvaWQgRmFzdE1peGVyOjpvbkV4aXQoKQoreworICAgIGRlbGV0ZSBtaXhlcjsKKyAgICBkZWxldGVbXSBtaXhCdWZmZXI7Cit9CisKK2Jvb2wgRmFzdE1peGVyOjppc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCkKK3sKKyAgICBzd2l0Y2ggKChGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCkgY29tbWFuZCkgeworICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWDoKKyAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpXUklURToKKyAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVhfV1JJVEU6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlKCkKK3sKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIHRoaXMtPnByZXZpb3VzOworICAgIEZhc3RNaXhlckR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0TWl4ZXJEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisKKyAgICAvLyBoYW5kbGUgc3RhdGUgY2hhbmdlIGhlcmUsIGJ1dCBzaW5jZSB3ZSB3YW50IHRvIGRpZmYgdGhlIHN0YXRlLAorICAgIC8vIHdlJ3JlIHByZXBhcmVkIGZvciBwcmV2aW91cyA9PSAmaW5pdGlhbCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoCisgICAgdW5zaWduZWQgcHJldmlvdXNUcmFja01hc2s7CisKKyAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIG91dHB1dCBIQUwgY29uZmlndXJhdGlvbgorICAgIE5CQUlPX0Zvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IGZvcm1hdDsKKyAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gb3V0cHV0U2lua0dlbikgeworICAgICAgICBvdXRwdXRTaW5rID0gY3VycmVudC0+bU91dHB1dFNpbms7CisgICAgICAgIG91dHB1dFNpbmtHZW4gPSBjdXJyZW50LT5tT3V0cHV0U2lua0dlbjsKKyAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCkgeworICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IG91dHB1dFNpbmstPmZvcm1hdCgpOworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkgPT0gRkNDXzIpOworICAgICAgICB9CisgICAgICAgIGR1bXBTdGF0ZS0+bVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIH0KKworICAgIGlmICgoIUZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgcHJldmlvdXNGb3JtYXQpKSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7CisgICAgICAgIC8vIEZJWE1FIHRvIGF2b2lkIHByaW9yaXR5IGludmVyc2lvbiwgZG9uJ3QgZGVsZXRlIGhlcmUKKyAgICAgICAgZGVsZXRlIG1peGVyOworICAgICAgICBtaXhlciA9IE5VTEw7CisgICAgICAgIGRlbGV0ZVtdIG1peEJ1ZmZlcjsKKyAgICAgICAgbWl4QnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIHNhbXBsZVJhdGUgPiAwKSB7CisgICAgICAgICAgICAvLyBGSVhNRSBuZXcgbWF5IGJsb2NrIGZvciB1bmJvdW5kZWQgdGltZSBhdCBpbnRlcm5hbCBtdXRleCBvZiB0aGUgaGVhcAorICAgICAgICAgICAgLy8gICAgICAgaW1wbGVtZW50YXRpb247IGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIG5vcm1hbCBtaXhlciBhbGxvY2F0ZSBmb3IgdXMKKyAgICAgICAgICAgIC8vICAgICAgIHRvIGF2b2lkIGJsb2NraW5nIGhlcmUgYW5kIHRvIHByZXZlbnQgcG9zc2libGUgcHJpb3JpdHkgaW52ZXJzaW9uCisgICAgICAgICAgICBtaXhlciA9IG5ldyBBdWRpb01peGVyKGZyYW1lQ291bnQsIHNhbXBsZVJhdGUsIEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7CisgICAgICAgICAgICBtaXhCdWZmZXIgPSBuZXcgc2hvcnRbZnJhbWVDb3VudCAqIEZDQ18yXTsKKyAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAorICAgICAgICAgICAgdW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAvLyAxLjc1CisgICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKKyAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQorICAgICAgICAgICAgd2FybXVwTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAvLyAwLjUwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZXJpb2ROcyA9IDA7CisgICAgICAgICAgICB1bmRlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7CisgICAgICAgICAgICBmb3JjZU5zID0gMDsKKyAgICAgICAgICAgIHdhcm11cE5zID0gMDsKKyAgICAgICAgfQorICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKKyNpZiAhTE9HX05ERUJVRworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7CisgICAgICAgIH0KICNlbmRpZgotICAgIHVuc2lnbmVkIGNvbGRHZW4gPSAwOyAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUNvbGRHZW4KLSAgICBib29sIGlzV2FybSA9IGZhbHNlOyAgICAvLyB0cnVlIG1lYW5zIHJlYWR5IHRvIG1peCwgZmFsc2UgbWVhbnMgd2FpdCBmb3Igd2FybXVwIGJlZm9yZSBtaXhpbmcKLSAgICBzdHJ1Y3QgdGltZXNwZWMgbWVhc3VyZWRXYXJtdXBUcyA9IHswLCAwfTsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKLSAgICB1aW50MzJfdCB3YXJtdXBDeWNsZXMgPSAwOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCi0gICAgTkJBSU9fU2luayogdGVlU2luayA9IE5VTEw7IC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLSAgICBOQkxvZzo6V3JpdGVyIGR1bW15TG9nV3JpdGVyLCAqbG9nV3JpdGVyID0gJmR1bW15TG9nV3JpdGVyOwotICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiA9IDA7ICAvLyBjb3BpZWQgdG8gZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbgorICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlY29uZmlndXJlIGFsbCBhY3RpdmUgdHJhY2tzCisgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKKyAgICAgICAgZmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuIC0gMTsKKyAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSBwcmV2aW91cy0+bVRyYWNrTWFzazsKKyAgICB9CiAKLSAgICAvLyBuZXh0IDIgZmllbGRzIGFyZSB2YWxpZCBvbmx5IHdoZW4gdGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SCi0gICAgQXVkaW9UaW1lc3RhbXAgdGltZXN0YW1wOwotICAgIHVpbnQzMl90IG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSAwOyAgICAvLyB0aGUgPSAwIGlzIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCi0gICAgc3RhdHVzX3QgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBhY3RpdmUgdHJhY2sgc2V0CisgICAgY29uc3QgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CisgICAgZHVtcFN0YXRlLT5tVHJhY2tNYXNrID0gY3VycmVudFRyYWNrTWFzazsKKyAgICBpZiAoY3VycmVudC0+bUZhc3RUcmFja3NHZW4gIT0gZmFzdFRyYWNrc0dlbikgeworICAgICAgICBBTE9HX0FTU0VSVChtaXhCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGludCBuYW1lOwogCi0gICAgZm9yICg7OykgewotCi0gICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKLSAgICAgICAgaWYgKHNsZWVwTnMgPj0gMCkgewotICAgICAgICAgICAgaWYgKHNsZWVwTnMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoc2xlZXBOcyA8IDEwMDAwMDAwMDApOwotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXEgPSB7MCwgc2xlZXBOc307Ci0gICAgICAgICAgICAgICAgbmFub3NsZWVwKCZyZXEsIE5VTEwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzY2hlZF95aWVsZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGRlZmF1bHQgdG8gbG9uZyBzbGVlcCBmb3IgbmV4dCBjeWNsZQotICAgICAgICBzbGVlcE5zID0gRkFTVF9ERUZBVUxUX05TOwotCi0gICAgICAgIC8vIHBvbGwgZm9yIHN0YXRlIGNoYW5nZQotICAgICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqbmV4dCA9IG1TUS5wb2xsKCk7Ci0gICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsIHN0YXRlIHVudGlsIGEgcmVhbCBzdGF0ZSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGN1cnJlbnQgPT0gJmluaXRpYWwgJiYgcHJldmlvdXMgPT0gJmluaXRpYWwpOwotICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gbmV4dC0+bUNvbW1hbmQ7Ci0gICAgICAgIGlmIChuZXh0ICE9IGN1cnJlbnQpIHsKLQotICAgICAgICAgICAgLy8gQXMgc29vbiBhcyBwb3NzaWJsZSBvZiBsZWFybmluZyBvZiBhIG5ldyBkdW1wIGFyZWEsIHN0YXJ0IHVzaW5nIGl0Ci0gICAgICAgICAgICBkdW1wU3RhdGUgPSBuZXh0LT5tRHVtcFN0YXRlICE9IE5VTEwgPyBuZXh0LT5tRHVtcFN0YXRlIDogJmR1bW15RHVtcFN0YXRlOwotICAgICAgICAgICAgdGVlU2luayA9IG5leHQtPm1UZWVTaW5rOwotICAgICAgICAgICAgbG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPyBuZXh0LT5tTkJMb2dXcml0ZXIgOiAmZHVtbXlMb2dXcml0ZXI7CisgICAgICAgIC8vIHByb2Nlc3MgcmVtb3ZlZCB0cmFja3MgZmlyc3QgdG8gYXZvaWQgcnVubmluZyBvdXQgb2YgdHJhY2sgbmFtZXMKKyAgICAgICAgdW5zaWduZWQgcmVtb3ZlZFRyYWNrcyA9IHByZXZpb3VzVHJhY2tNYXNrICYgfmN1cnJlbnRUcmFja01hc2s7CisgICAgICAgIHdoaWxlIChyZW1vdmVkVHJhY2tzICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihyZW1vdmVkVHJhY2tzKTsKKyAgICAgICAgICAgIHJlbW92ZWRUcmFja3MgJj0gfigxIDw8IGkpOworICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CisgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9PSBOVUxMKTsKICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldExvZyhsb2dXcml0ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGFsd2F5cyBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyAobm9uLWlkbGUpIHN0YXRlLgotICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHN0YXRlIHF1ZXVlIG9ubHkgZ3VhcmFudGVlcyBhY2Nlc3MgdG8gY3VycmVudCBhbmQgcHJldmlvdXMgc3RhdGVzLgotICAgICAgICAgICAgLy8gU28gd2hlbiB0aGVyZSBpcyBhIHRyYW5zaXRpb24gZnJvbSBhIG5vbi1pZGxlIHN0YXRlIGludG8gYW4gaWRsZSBzdGF0ZSwgd2UgbWFrZSBhCi0gICAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBsYXN0IGtub3duIG5vbi1pZGxlIHN0YXRlIHNvIGl0IGlzIHN0aWxsIGF2YWlsYWJsZSBvbiByZXR1cm4gZnJvbSBpZGxlLgotICAgICAgICAgICAgLy8gVGhlIHBvc3NpYmxlIHRyYW5zaXRpb25zIGFyZToKLSAgICAgICAgICAgIC8vICBub24taWRsZSAtPiBub24taWRsZSAgICB1cGRhdGUgcHJldmlvdXMgZnJvbSBjdXJyZW50IGluLXBsYWNlCi0gICAgICAgICAgICAvLyAgbm9uLWlkbGUgLT4gaWRsZSAgICAgICAgdXBkYXRlIHByZXZpb3VzIGZyb20gY29weSBvZiBjdXJyZW50Ci0gICAgICAgICAgICAvLyAgaWRsZSAgICAgLT4gaWRsZSAgICAgICAgZG9uJ3QgdXBkYXRlIHByZXZpb3VzCi0gICAgICAgICAgICAvLyAgaWRsZSAgICAgLT4gbm9uLWlkbGUgICAgZG9uJ3QgdXBkYXRlIHByZXZpb3VzCi0gICAgICAgICAgICBpZiAoIShjdXJyZW50LT5tQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgewotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlSWRsZSA9ICpjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gJnByZUlkbGU7Ci0gICAgICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gZmFsc2U7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKLSAgICAgICAgfQotI2lmICFMT0dfTkRFQlVHCi0gICAgICAgIG5leHQgPSBOVUxMOyAgICAvLyBub3QgcmVmZXJlbmNlZCBhZ2FpbgotI2VuZGlmCi0KLSAgICAgICAgZHVtcFN0YXRlLT5tQ29tbWFuZCA9IGNvbW1hbmQ7Ci0KLSAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OklOSVRJQUw6Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOgotICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6Q09MRF9JRExFOgotICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIGEgY29sZCBpZGxlIGNvbW1hbmQgb25jZQotICAgICAgICAgICAgLy8gRklYTUUgY29uc2lkZXIgY2hlY2tpbmcgcHJldmlvdXMgc3RhdGUgYW5kIG9ubHkgcGVyZm9ybSBpZiBwcmV2aW91cyAhPSBDT0xEX0lETEUKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5tQ29sZEdlbiAhPSBjb2xkR2VuKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCAqY29sZEZ1dGV4QWRkciA9IGN1cnJlbnQtPm1Db2xkRnV0ZXhBZGRyOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNvbGRGdXRleEFkZHIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19kZWMoY29sZEZ1dGV4QWRkcik7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9fZnV0ZXhfc3lzY2FsbDQoY29sZEZ1dGV4QWRkciwgRlVURVhfV0FJVF9QUklWQVRFLCBvbGQgLSAxLCBOVUxMKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHBvbGljeSA9IHNjaGVkX2dldHNjaGVkdWxlcigwKTsKLSAgICAgICAgICAgICAgICBpZiAoIShwb2xpY3kgPT0gU0NIRURfRklGTyB8fCBwb2xpY3kgPT0gU0NIRURfUlIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3QiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgYmUgb3Zlcmx5IGNvbnNlcnZhdGl2ZTsgdGhlcmUgY291bGQgYmUgdGltZXMgdGhhdCB0aGUgbm9ybWFsIG1peGVyCi0gICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMgc3VjaCBhIGJyaWVmIGNvbGQgaWRsZSB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSByZXNldHRpbmcgdGhpcyBmbGFnLgotICAgICAgICAgICAgICAgIGlzV2FybSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOwotICAgICAgICAgICAgICAgIHdhcm11cEN5Y2xlcyA9IDA7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IC0xOwotICAgICAgICAgICAgICAgIGNvbGRHZW4gPSBjdXJyZW50LT5tQ29sZEdlbjsKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICBib3VuZHMgPSAwOwotICAgICAgICAgICAgICAgIGZ1bGwgPSBmYWxzZTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSAhY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZvbGRUcyk7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OkVYSVQ6Ci0gICAgICAgICAgICBkZWxldGUgbWl4ZXI7Ci0gICAgICAgICAgICBkZWxldGVbXSBtaXhCdWZmZXI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWDoKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6V1JJVEU6Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWF9XUklURToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJiYWQgY29tbWFuZCAlZCIsIGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlcmUgaXMgYSBub24taWRsZSBzdGF0ZSBhdmFpbGFibGUgdG8gdXM7IGRpZCB0aGUgc3RhdGUgY2hhbmdlPwotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OwotICAgICAgICBpZiAoY3VycmVudCAhPSBwcmV2aW91cykgewotCi0gICAgICAgICAgICAvLyBoYW5kbGUgc3RhdGUgY2hhbmdlIGhlcmUsIGJ1dCBzaW5jZSB3ZSB3YW50IHRvIGRpZmYgdGhlIHN0YXRlLAotICAgICAgICAgICAgLy8gd2UncmUgcHJlcGFyZWQgZm9yIHByZXZpb3VzID09ICZpbml0aWFsIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gKLSAgICAgICAgICAgIHVuc2lnbmVkIHByZXZpb3VzVHJhY2tNYXNrOwotCi0gICAgICAgICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIG91dHB1dCBIQUwgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IHByZXZpb3VzRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuICE9IG91dHB1dFNpbmtHZW4pIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRTaW5rID0gY3VycmVudC0+bU91dHB1dFNpbms7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U2lua0dlbiA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuOwotICAgICAgICAgICAgICAgIGlmIChvdXRwdXRTaW5rID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7Ci0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IG91dHB1dFNpbmstPmZvcm1hdCgpOwotICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpID09IEZDQ18yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgoZm9ybWF0ICE9IHByZXZpb3VzRm9ybWF0KSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUUgdG8gYXZvaWQgcHJpb3JpdHkgaW52ZXJzaW9uLCBkb24ndCBkZWxldGUgaGVyZQotICAgICAgICAgICAgICAgIGRlbGV0ZSBtaXhlcjsKLSAgICAgICAgICAgICAgICBtaXhlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gbWl4QnVmZmVyOwotICAgICAgICAgICAgICAgIG1peEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIHNhbXBsZVJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgbWl4ZXIgYWxsb2NhdGUgZm9yIHVzCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHRvIGF2b2lkIGJsb2NraW5nIGhlcmUgYW5kIHRvIHByZXZlbnQgcG9zc2libGUgcHJpb3JpdHkgaW52ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgIG1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgc2FtcGxlUmF0ZSwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgbWl4QnVmZmVyID0gbmV3IHNob3J0W2ZyYW1lQ291bnQgKiBGQ0NfMl07Ci0gICAgICAgICAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAotICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiAxNzUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgIC8vIDEuNzUKLSAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAwLjUwCi0gICAgICAgICAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQotICAgICAgICAgICAgICAgICAgICB3YXJtdXBOcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgIC8vIDAuNTAKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwZXJpb2ROcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVuTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICBvdmVycnVuTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3JjZU5zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd2FybXVwTnMgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKLSNpZiAhTE9HX05ERUJVRwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVjb25maWd1cmUgYWxsIGFjdGl2ZSB0cmFja3MKLSAgICAgICAgICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgZmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuIC0gMTsKLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSBwcmV2aW91cy0+bVRyYWNrTWFzazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBhY3RpdmUgdHJhY2sgc2V0Ci0gICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50VHJhY2tNYXNrID0gY3VycmVudC0+bVRyYWNrTWFzazsKLSAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVRyYWNrTWFzayA9IGN1cnJlbnRUcmFja01hc2s7Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+bUZhc3RUcmFja3NHZW4gIT0gZmFzdFRyYWNrc0dlbikgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG1peEJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBpbnQgbmFtZTsKLQotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgcmVtb3ZlZCB0cmFja3MgZmlyc3QgdG8gYXZvaWQgcnVubmluZyBvdXQgb2YgdHJhY2sgbmFtZXMKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCByZW1vdmVkVHJhY2tzID0gcHJldmlvdXNUcmFja01hc2sgJiB+Y3VycmVudFRyYWNrTWFzazsKLSAgICAgICAgICAgICAgICB3aGlsZSAocmVtb3ZlZFRyYWNrcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KHJlbW92ZWRUcmFja3MpOwotICAgICAgICAgICAgICAgICAgICByZW1vdmVkVHJhY2tzICY9IH4oMSA8PCBpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID09IE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5kZWxldGVUcmFja05hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZiAhTE9HX05ERUJVRwotICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlc2V0IHRyYWNrIGR1bXAgc3RhdGUsIHNpbmNlIG90aGVyIHNpZGUgaXMgaWdub3JpbmcgaXQKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG5vdyBwcm9jZXNzIGFkZGVkIHRyYWNrcwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFkZGVkVHJhY2tzID0gY3VycmVudFRyYWNrTWFzayAmIH5wcmV2aW91c1RyYWNrTWFzazsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYWRkZWRUcmFja3MgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpID0gX19idWlsdGluX2N0eihhZGRlZFRyYWNrcyk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkVHJhY2tzICY9IH4oMSA8PCBpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgJiYgZmFzdFRyYWNrTmFtZXNbaV0gPT0gLTEpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGluZyBnZXRUcmFja05hbWUgd2l0aCBkZWZhdWx0IGNoYW5uZWwgbWFzayBhbmQgYSByYW5kb20gaW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBzZXNzaW9uSWQgKG5vIGVmZmVjdHMgaGVyZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBtaXhlci0+Z2V0VHJhY2tOYW1lKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgLTU1NSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSBuYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBtaXhCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3bHkgYWxsb2NhdGVkIHRyYWNrIG5hbWVzIGRlZmF1bHQgdG8gZnVsbCBzY2FsZSB2b2x1bWUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGZpbmFsbHkgcHJvY2VzcyAocG90ZW50aWFsbHkpIG1vZGlmaWVkIHRyYWNrczsgdGhlc2UgdXNlIHRoZSBzYW1lIHNsb3QKLSAgICAgICAgICAgICAgICAvLyBidXQgbWF5IGhhdmUgYSBkaWZmZXJlbnQgYnVmZmVyIHByb3ZpZGVyIG9yIHZvbHVtZSBwcm92aWRlcgotICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1vZGlmaWVkVHJhY2tzID0gY3VycmVudFRyYWNrTWFzayAmIHByZXZpb3VzVHJhY2tNYXNrOwotICAgICAgICAgICAgICAgIHdoaWxlIChtb2RpZmllZFRyYWNrcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KG1vZGlmaWVkVHJhY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bUdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbnNbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgd2FzIGFjdHVhbGx5IG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikweDEwMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKTB4MTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRU1PVkUsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCkgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuOwotCi0gICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTnVtVHJhY2tzID0gcG9wY291bnQoY3VycmVudFRyYWNrTWFzayk7Ci0gICAgICAgICAgICB9Ci0KLSNpZiAxICAgLy8gRklYTUUgc2hvdWxkbid0IG5lZWQgdGhpcwotICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHN0YXRlIGNoYW5nZSBvbmNlCi0gICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvIHdvcmsgdXNpbmcgY3VycmVudCBzdGF0ZSBoZXJlCi0gICAgICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpNSVgpICYmIChtaXhlciAhPSBOVUxMKSAmJiBpc1dhcm0pIHsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKG1peEJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrLCB1cGRhdGUgdm9sdW1lIGFuZCBjaGVjayBmb3IgdW5kZXJydW4KLSAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOwotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRUcmFja01hc2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KGN1cnJlbnRUcmFja01hc2spOwotICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFja01hc2sgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotCi0gICAgICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgcGVyLXRyYWNrIHRpbWVzdGFtcAotICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbiA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWxlYXNlZCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBDYW4ndCBwcm92aWRlIGFuIEF1ZGlvVGltZXN0YW1wIGJlZm9yZSBmaXJzdCBmcmFtZSBwcmVzZW50ZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIG9yIGR1cmluZyB0aGUgYnJpZWYgMzItYml0IHdyYXBhcm91bmQgd2luZG93Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFja0ZyYW1lc1dyaXR0ZW4gPj0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWVzdGFtcCBwZXJUcmFja1RpbWVzdGFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1Qb3NpdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRnJhbWVzV3JpdHRlbiAtIHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1UaW1lID0gdGltZXN0YW1wLm1UaW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPm9uVGltZXN0YW1wKHBlclRyYWNrVGltZXN0YW1wKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07CisgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOwogICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCkodmxyICYgMHhGRkZGKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCkodmxyID4+IDE2KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEZJWE1FIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGZyYW1lc1JlYWR5KCkgZm9yIGZhc3QgdHJhY2tzCi0gICAgICAgICAgICAgICAgLy8gdGFrZXMgYSB0cnlMb2NrLCB3aGljaCBjYW4gYmxvY2sKLSAgICAgICAgICAgICAgICAvLyB1cCB0byAxIG1zLiAgSWYgZW5vdWdoIGFjdGl2ZSB0cmFja3MgYWxsIGJsb2NrZWQgaW4gc2VxdWVuY2UsIHRoaXMgd291bGQgcmVzdWx0Ci0gICAgICAgICAgICAgICAgLy8gaW4gdGhlIG92ZXJhbGwgZmFzdCBtaXggY3ljbGUgYmVpbmcgZGVsYXllZC4gIFNob3VsZCB1c2UgYSBub24tYmxvY2tpbmcgRklGTy4KLSAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzUmVhZHkgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlci0+ZnJhbWVzUmVhZHkoKTsKLSAgICAgICAgICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcwotICAgICAgICAgICAgICAgICAgICBjaGFyIHRyYWNlTmFtZVsxNl07Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNweSh0cmFjZU5hbWUsICJmUmR5Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs0XSA9IGkgKyAoaSA8IDEwID8gJzAnIDogJ0EnIC0gMTApOwotICAgICAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNV0gPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZSwgZnJhbWVzUmVhZHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGYXN0VHJhY2tEdW1wICpmdER1bXAgPSAmZHVtcFN0YXRlLT5tVHJhY2tzW2ldOwotICAgICAgICAgICAgICAgIEZhc3RUcmFja1VuZGVycnVucyB1bmRlcnJ1bnMgPSBmdER1bXAtPm1VbmRlcnJ1bnM7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5IDwgZnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubUVtcHR5Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0VNUFRZOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmRpc2FibGUobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBtaXhpbmcgcGFydGlhbCBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX1BBUlRJQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgICAgIG1peGVyLT5kZWxldGVUcmFja05hbWUobmFtZSk7CisgICAgICAgICAgICB9CisjaWYgIUxPR19OREVCVUcKKyAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIGRvbid0IHJlc2V0IHRyYWNrIGR1bXAgc3RhdGUsIHNpbmNlIG90aGVyIHNpZGUgaXMgaWdub3JpbmcgaXQKKyAgICAgICAgICAgIGdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBwcm9jZXNzIGFkZGVkIHRyYWNrcworICAgICAgICB1bnNpZ25lZCBhZGRlZFRyYWNrcyA9IGN1cnJlbnRUcmFja01hc2sgJiB+cHJldmlvdXNUcmFja01hc2s7CisgICAgICAgIHdoaWxlIChhZGRlZFRyYWNrcyAhPSAwKSB7CisgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHooYWRkZWRUcmFja3MpOworICAgICAgICAgICAgYWRkZWRUcmFja3MgJj0gfigxIDw8IGkpOworICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CisgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOworICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCAmJiBmYXN0VHJhY2tOYW1lc1tpXSA9PSAtMSk7CisgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgZ2V0VHJhY2tOYW1lIHdpdGggZGVmYXVsdCBjaGFubmVsIG1hc2sgYW5kIGEgcmFuZG9tIGludmFsaWQKKyAgICAgICAgICAgICAgICAvLyAgIHNlc3Npb25JZCAobm8gZWZmZWN0cyBoZXJlKQorICAgICAgICAgICAgICAgIG5hbWUgPSBtaXhlci0+Z2V0VHJhY2tOYW1lKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgLTU1NSk7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IG5hbWU7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIG1peEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgLy8gbmV3bHkgYWxsb2NhdGVkIHRyYWNrIG5hbWVzIGRlZmF1bHQgdG8gZnVsbCBzY2FsZSB2b2x1bWUKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvLyBmaW5hbGx5IHByb2Nlc3MgKHBvdGVudGlhbGx5KSBtb2RpZmllZCB0cmFja3M7IHRoZXNlIHVzZSB0aGUgc2FtZSBzbG90CisgICAgICAgIC8vIGJ1dCBtYXkgaGF2ZSBhIGRpZmZlcmVudCBidWZmZXIgcHJvdmlkZXIgb3Igdm9sdW1lIHByb3ZpZGVyCisgICAgICAgIHVuc2lnbmVkIG1vZGlmaWVkVHJhY2tzID0gY3VycmVudFRyYWNrTWFzayAmIHByZXZpb3VzVHJhY2tNYXNrOworICAgICAgICB3aGlsZSAobW9kaWZpZWRUcmFja3MgIT0gMCkgeworICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KG1vZGlmaWVkVHJhY2tzKTsKKyAgICAgICAgICAgIG1vZGlmaWVkVHJhY2tzICY9IH4oMSA8PCBpKTsKKyAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bUdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbnNbaV0pIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHRyYWNrIHdhcyBhY3R1YWxseSBtb2RpZmllZAorICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopMHgxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKTB4MTAwMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRU1PVkUsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KSBmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW47CisKKyAgICAgICAgZHVtcFN0YXRlLT5tTnVtVHJhY2tzID0gcG9wY291bnQoY3VycmVudFRyYWNrTWFzayk7CisgICAgfQorfQorCit2b2lkIEZhc3RNaXhlcjo6b25Xb3JrKCkKK3sKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gdGhpcy0+Y29tbWFuZDsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworCisgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6Ok1JWCkgJiYgKG1peGVyICE9IE5VTEwpICYmIGlzV2FybSkgeworICAgICAgICBBTE9HX0FTU0VSVChtaXhCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrLCB1cGRhdGUgdm9sdW1lIGFuZCBjaGVjayBmb3IgdW5kZXJydW4KKyAgICAgICAgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CisgICAgICAgIHdoaWxlIChjdXJyZW50VHJhY2tNYXNrICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihjdXJyZW50VHJhY2tNYXNrKTsKKyAgICAgICAgICAgIGN1cnJlbnRUcmFja01hc2sgJj0gfigxIDw8IGkpOworICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CisKKyAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIHBlci10cmFjayB0aW1lc3RhbXAKKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbiA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgICAgIC8vIENhbid0IHByb3ZpZGUgYW4gQXVkaW9UaW1lc3RhbXAgYmVmb3JlIGZpcnN0IGZyYW1lIHByZXNlbnRlZCwKKyAgICAgICAgICAgICAgICAvLyBvciBkdXJpbmcgdGhlIGJyaWVmIDMyLWJpdCB3cmFwYXJvdW5kIHdpbmRvdworICAgICAgICAgICAgICAgIGlmICh0cmFja0ZyYW1lc1dyaXR0ZW4gPj0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKSB7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZXN0YW1wIHBlclRyYWNrVGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICBwZXJUcmFja1RpbWVzdGFtcC5tUG9zaXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRnJhbWVzV3JpdHRlbiAtIHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKKyAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVRpbWUgPSB0aW1lc3RhbXAubVRpbWU7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5vblRpbWVzdGFtcChwZXJUcmFja1RpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpKHZsciAmIDB4RkZGRikpOworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KSh2bHIgPj4gMTYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZJWE1FIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGZyYW1lc1JlYWR5KCkgZm9yIGZhc3QgdHJhY2tzCisgICAgICAgICAgICAvLyB0YWtlcyBhIHRyeUxvY2ssIHdoaWNoIGNhbiBibG9jaworICAgICAgICAgICAgLy8gdXAgdG8gMSBtcy4gIElmIGVub3VnaCBhY3RpdmUgdHJhY2tzIGFsbCBibG9ja2VkIGluIHNlcXVlbmNlLCB0aGlzIHdvdWxkIHJlc3VsdAorICAgICAgICAgICAgLy8gaW4gdGhlIG92ZXJhbGwgZmFzdCBtaXggY3ljbGUgYmVpbmcgZGVsYXllZC4gIFNob3VsZCB1c2UgYSBub24tYmxvY2tpbmcgRklGTy4KKyAgICAgICAgICAgIHNpemVfdCBmcmFtZXNSZWFkeSA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWFkeSgpOworICAgICAgICAgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcworICAgICAgICAgICAgICAgIGNoYXIgdHJhY2VOYW1lWzE2XTsKKyAgICAgICAgICAgICAgICBzdHJjcHkodHJhY2VOYW1lLCAiZlJkeSIpOworICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs0XSA9IGkgKyAoaSA8IDEwID8gJzAnIDogJ0EnIC0gMTApOworICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs1XSA9ICdcMCc7CisgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCh0cmFjZU5hbWUsIGZyYW1lc1JlYWR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZhc3RUcmFja0R1bXAgKmZ0RHVtcCA9ICZkdW1wU3RhdGUtPm1UcmFja3NbaV07CisgICAgICAgICAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgdW5kZXJydW5zID0gZnREdW1wLT5tVW5kZXJydW5zOworICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5IDwgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSsrOworICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0VNUFRZOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZGlzYWJsZShuYW1lKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRnVsbCsrOwotICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0ZVTEw7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IG1peGluZyBwYXJ0aWFsIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tUGFydGlhbCsrOworICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX1BBUlRJQUw7CiAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZ0RHVtcC0+bVVuZGVycnVucyA9IHVuZGVycnVuczsKLSAgICAgICAgICAgICAgICBmdER1bXAtPm1GcmFtZXNSZWFkeSA9IGZyYW1lc1JlYWR5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IHB0czsKLSAgICAgICAgICAgIGlmIChvdXRwdXRTaW5rID09IE5VTEwgfHwgKE9LICE9IG91dHB1dFNpbmstPmdldE5leHRXcml0ZVRpbWVzdGFtcCgmcHRzKSkpCi0gICAgICAgICAgICAgICAgcHRzID0gQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFM7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MoKSBpcyBDUFUtYm91bmQKLSAgICAgICAgICAgIG1peGVyLT5wcm9jZXNzKHB0cyk7Ci0gICAgICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IE1JWEVEOwotICAgICAgICB9IGVsc2UgaWYgKG1peEJ1ZmZlclN0YXRlID09IE1JWEVEKSB7Ci0gICAgICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKLSAgICAgICAgfQotICAgICAgICBib29sIGF0dGVtcHRlZFdyaXRlID0gZmFsc2U7Ci0gICAgICAgIC8vYm9vbCBkaWRGdWxsV3JpdGUgPSBmYWxzZTsgICAgLy8gZHVtcHN5cyBjb3VsZCBkaXNwbGF5IGEgY291bnQgb2YgcGFydGlhbCB3cml0ZXMKLSAgICAgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OldSSVRFKSAmJiAob3V0cHV0U2luayAhPSBOVUxMKSAmJiAobWl4QnVmZmVyICE9IE5VTEwpKSB7Ci0gICAgICAgICAgICBpZiAobWl4QnVmZmVyU3RhdGUgPT0gVU5ERUZJTkVEKSB7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KG1peEJ1ZmZlciwgMCwgZnJhbWVDb3VudCAqIEZDQ18yICogc2l6ZW9mKHNob3J0KSk7Ci0gICAgICAgICAgICAgICAgbWl4QnVmZmVyU3RhdGUgPSBaRVJPRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGVlU2luayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHRlZVNpbmstPndyaXRlKG1peEJ1ZmZlciwgZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGSVhNRSB3cml0ZSgpIGlzIG5vbi1ibG9ja2luZyBhbmQgbG9jay1mcmVlIGZvciBhIHByb3Blcmx5IGltcGxlbWVudGVkIE5CQUlPIHNpbmssCi0gICAgICAgICAgICAvLyAgICAgICBidXQgdGhpcyBjb2RlIHNob3VsZCBiZSBtb2RpZmllZCB0byBoYW5kbGUgYm90aCBub24tYmxvY2tpbmcgYW5kIGJsb2NraW5nIHNpbmtzCi0gICAgICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7Ci0gICAgICAgICAgICBBVFJBQ0VfQkVHSU4oIndyaXRlIik7Ci0gICAgICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBvdXRwdXRTaW5rLT53cml0ZShtaXhCdWZmZXIsIGZyYW1lQ291bnQpOwotICAgICAgICAgICAgQVRSQUNFX0VORCgpOwotICAgICAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVTZXF1ZW5jZSsrOwotICAgICAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPj0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPD0gZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuICs9IGZyYW1lc1dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbiA9IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAvL2lmICgoc2l6ZV90KSBmcmFtZXNXcml0dGVuID09IGZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICAvLyAgICBkaWRGdWxsV3JpdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZUVycm9ycysrOworICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKys7CisgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9GVUxMOworICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdHRlbXB0ZWRXcml0ZSA9IHRydWU7Ci0gICAgICAgICAgICAvLyBGSVhNRSBjb3VudCAjIG9mIHdyaXRlcyBibG9ja2VkIGV4Y2Vzc2l2ZWx5LCBDUFUgdXNhZ2UsIGV0Yy4gZm9yIGR1bXAKLQotICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gb3V0cHV0U2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgICAgICAgICBpZiAodGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPSB0aW1lc3RhbXAubVBvc2l0aW9uOwotICAgICAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBIQUwgcmVwb3J0ZWQgdGhhdCBtb3JlIGZyYW1lcyB3ZXJlIHByZXNlbnRlZCB0aGFuIHdlcmUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmdER1bXAtPm1VbmRlcnJ1bnMgPSB1bmRlcnJ1bnM7CisgICAgICAgICAgICBmdER1bXAtPm1GcmFtZXNSZWFkeSA9IGZyYW1lc1JlYWR5OwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVG8gYmUgZXhhY3RseSBwZXJpb2RpYywgY29tcHV0ZSB0aGUgbmV4dCBzbGVlcCB0aW1lIGJhc2VkIG9uIGN1cnJlbnQgdGltZS4KLSAgICAgICAgLy8gVGhpcyBjb2RlIGRvZXNuJ3QgaGF2ZSBsb25nLXRlcm0gc3RhYmlsaXR5IHdoZW4gdGhlIHNpbmsgaXMgbm9uLWJsb2NraW5nLgotICAgICAgICAvLyBGSVhNRSBUbyBhdm9pZCBkcmlmdCwgdXNlIHRoZSBsb2NhbCBhdWRpbyBjbG9jayBvciB3YXRjaCB0aGUgc2luaydzIGZpbGwgc3RhdHVzLgotICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3VHM7Ci0gICAgICAgIGludCByYyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmbmV3VHMpOwotICAgICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAgICAgLy9sb2dXcml0ZXItPmxvZ1RpbWVzdGFtcChuZXdUcyk7Ci0gICAgICAgICAgICBpZiAob2xkVHNWYWxpZCkgewotICAgICAgICAgICAgICAgIHRpbWVfdCBzZWMgPSBuZXdUcy50dl9zZWMgLSBvbGRUcy50dl9zZWM7Ci0gICAgICAgICAgICAgICAgbG9uZyBuc2VjID0gbmV3VHMudHZfbnNlYyAtIG9sZFRzLnR2X25zZWM7Ci0gICAgICAgICAgICAgICAgQUxPR0VfSUYoc2VjIDwgMCB8fCAoc2VjID09IDAgJiYgbnNlYyA8IDApLAotICAgICAgICAgICAgICAgICAgICAgICAgImNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKSBmYWlsZWQ6IHdhcyAlbGQuJTA5bGQgYnV0IG5vdyAlbGQuJTA5bGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgb2xkVHMudHZfc2VjLCBvbGRUcy50dl9uc2VjLCBuZXdUcy50dl9zZWMsIG5ld1RzLnR2X25zZWMpOwotICAgICAgICAgICAgICAgIGlmIChuc2VjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAtLXNlYzsKLSAgICAgICAgICAgICAgICAgICAgbnNlYyArPSAxMDAwMDAwMDAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBhbiBpbml0aWFsIHVuZGVycnVuIG9uIGZhc3QgdHJhY2tzIGFmdGVyIGV4aXRpbmcgc3RhbmRieSwKLSAgICAgICAgICAgICAgICAvLyBkbyBub3Qgc3RhcnQgcHVsbGluZyBkYXRhIGZyb20gdHJhY2tzIGFuZCBtaXhpbmcgdW50aWwgd2FybXVwIGlzIGNvbXBsZXRlLgotICAgICAgICAgICAgICAgIC8vIFdhcm11cCBpcyBjb25zaWRlcmVkIGNvbXBsZXRlIGFmdGVyIHRoZSBlYXJsaWVyIG9mOgotICAgICAgICAgICAgICAgIC8vICAgICAgTUlOX1dBUk1VUF9DWUNMRVMgd3JpdGUoKSBhdHRlbXB0cyBhbmQgbGFzdCBvbmUgYmxvY2tzIGZvciBhdCBsZWFzdCB3YXJtdXBOcwotICAgICAgICAgICAgICAgIC8vICAgICAgTUFYX1dBUk1VUF9DWUNMRVMgd3JpdGUoKSBhdHRlbXB0cy4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG92ZXJseSBjb25zZXJ2YXRpdmUsIGJ1dCB0byBnZXQgYmV0dGVyIGFjY3VyYWN5IHJlcXVpcmVzIGEgbmV3IEhBTCBBUEkuCi0gICAgICAgICAgICAgICAgaWYgKCFpc1dhcm0gJiYgYXR0ZW1wdGVkV3JpdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKz0gc2VjOwotICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgKz0gbnNlYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA+PSAxMDAwMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC09IDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKyt3YXJtdXBDeWNsZXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobnNlYyA+IHdhcm11cE5zICYmIHdhcm11cEN5Y2xlcyA+PSBNSU5fV0FSTVVQX0NZQ0xFUykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FybXVwQ3ljbGVzID49IE1BWF9XQVJNVVBfQ1lDTEVTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJtID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1lYXN1cmVkV2FybXVwVHMgPSBtZWFzdXJlZFdhcm11cFRzOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gd2FybXVwQ3ljbGVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNsZWVwTnMgPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAoaXNXYXJtKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwIHx8IG5zZWMgPiB1bmRlcnJ1bk5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgbG9nIG9jY2FzaW9uYWxseQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuZGVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVW5kZXJydW5zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG92ZXJydW5OcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZU5leHRPdmVycnVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU92ZXJydW5zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSB3b3JrcyB3aXRoIGEgdmFyaWFibGUgYnVmZmVyIGRlcHRoIGF1ZGlvIEhBTCB0aGF0IG5ldmVyIHB1bGxzIGF0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJhdGUgPCB0aGFuIG92ZXJydW5OcyBwZXIgYnVmZmVyLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gcmVjb3ZlcnMgZnJvbSBvdmVycnVuIGltbWVkaWF0ZWx5IGFmdGVyIHVuZGVycnVuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IHdvcmsgd2l0aCBhIG5vbi1ibG9ja2luZyBhdWRpbyBIQUwuCi0gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcE5zID0gZm9yY2VOcyAtIG5zZWM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICAgICAgICAgIGlmIChpc1dhcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSB0aGUgRklGTyBxdWV1ZSBib3VuZHMKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvdW5kcyA9IChib3VuZHMgJiAweEZGRkYwMDAwKSB8ICgoYm91bmRzICsgMSkgJiAweEZGRkYpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzICs9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBkZWx0YSB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbW9ub3RvbmljTnMgPSBuc2VjOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCAmJiBzZWMgPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb25vdG9uaWNOcyArPSBzZWMgKiAxMDAwMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgcmF3IENQVSBsb2FkID0gZGVsdGEgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbG9hZE5zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIG5ld0xvYWQ7Ci0gICAgICAgICAgICAgICAgICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJm5ld0xvYWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZExvYWRWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYyA9IG5ld0xvYWQudHZfc2VjIC0gb2xkTG9hZC50dl9zZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyA9IG5ld0xvYWQudHZfbnNlYyAtIG9sZExvYWQudHZfbnNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnNlYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1zZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWMgKz0gMTAwMDAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE5zID0gbnNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCAmJiBzZWMgPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWROcyArPSBzZWMgKiAxMDAwMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvYWQgPSBuZXdMb2FkOwotICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKLSAgICAgICAgICAgICAgICAgICAgaW50IGNwdU51bSA9IHNjaGVkX2dldGNwdSgpOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrSHogPSB0Y3UuZ2V0Q3B1a0h6KGNwdU51bSk7Ci0gICAgICAgICAgICAgICAgICAgIGtIeiA9IChrSHogPDwgNCkgfCAoY3B1TnVtICYgMHhGKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHZhbHVlcyBpbiBGSUZPIHF1ZXVlcyBmb3IgZHVtcHN5cwotICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzdG9yZXMgIzEsICMyLCAjMyBhcmUgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlciwKLSAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2l0aCByZXNwZWN0IHRvIHN0b3JlICM0IGJlbG93Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUxvYWROc1tpXSA9IGxvYWROczsKLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tQ3B1a0h6W2ldID0ga0h6OwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RvcmUgIzQgaXMgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gc3RvcmVzICMxLCAjMiwgIzMgYWJvdmUsIGJ1dAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV3ZXN0IG9wZW4gJiBvbGRlc3QgY2xvc2VkIGhhbHZlcyBhcmUgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyCi0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUJvdW5kcyA9IGJvdW5kczsKLSAgICAgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCgiY3ljbGVfbXMiLCBtb25vdG9uaWNOcyAvIDEwMDAwMDApOwotICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJsb2FkX3VzIiwgbG9hZE5zIC8gMTAwMCk7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcAotICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKLSAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbGRUcyA9IG5ld1RzOworICAgICAgICBpbnQ2NF90IHB0czsKKyAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCB8fCAoT0sgIT0gb3V0cHV0U2luay0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKCZwdHMpKSkgeworICAgICAgICAgICAgcHRzID0gQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFM7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzKCkgaXMgQ1BVLWJvdW5kCisgICAgICAgIG1peGVyLT5wcm9jZXNzKHB0cyk7CisgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gTUlYRUQ7CisgICAgfSBlbHNlIGlmIChtaXhCdWZmZXJTdGF0ZSA9PSBNSVhFRCkgeworICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKKyAgICB9CisgICAgLy9ib29sIGRpZEZ1bGxXcml0ZSA9IGZhbHNlOyAgICAvLyBkdW1wc3lzIGNvdWxkIGRpc3BsYXkgYSBjb3VudCBvZiBwYXJ0aWFsIHdyaXRlcworICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpXUklURSkgJiYgKG91dHB1dFNpbmsgIT0gTlVMTCkgJiYgKG1peEJ1ZmZlciAhPSBOVUxMKSkgeworICAgICAgICBpZiAobWl4QnVmZmVyU3RhdGUgPT0gVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBtZW1zZXQobWl4QnVmZmVyLCAwLCBmcmFtZUNvdW50ICogRkNDXzIgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gWkVST0VEOworICAgICAgICB9CisgICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKKyAgICAgICAgTkJBSU9fU2luayogdGVlU2luazsKKyAgICAgICAgaWYgKCh0ZWVTaW5rID0gY3VycmVudC0+bVRlZVNpbmspICE9IE5VTEwpIHsKKyAgICAgICAgICAgICh2b2lkKSB0ZWVTaW5rLT53cml0ZShtaXhCdWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FIHdyaXRlKCkgaXMgbm9uLWJsb2NraW5nIGFuZCBsb2NrLWZyZWUgZm9yIGEgcHJvcGVybHkgaW1wbGVtZW50ZWQgTkJBSU8gc2luaywKKyAgICAgICAgLy8gICAgICAgYnV0IHRoaXMgY29kZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gaGFuZGxlIGJvdGggbm9uLWJsb2NraW5nIGFuZCBibG9ja2luZyBzaW5rcworICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CisgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gb3V0cHV0U2luay0+d3JpdGUobWl4QnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CisgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID49IDApIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPD0gZnJhbWVDb3VudCk7CisgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4gPSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICAvL2lmICgoc2l6ZV90KSBmcmFtZXNXcml0dGVuID09IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIC8vICAgIGRpZEZ1bGxXcml0ZSA9IHRydWU7CisgICAgICAgICAgICAvL30KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1vbm90b25pYyBjbG9jayBpcyBicm9rZW4KLSAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlRXJyb3JzKys7CiAgICAgICAgIH0KKyAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSB0cnVlOworICAgICAgICAvLyBGSVhNRSBjb3VudCAjIG9mIHdyaXRlcyBibG9ja2VkIGV4Y2Vzc2l2ZWx5LCBDUFUgdXNhZ2UsIGV0Yy4gZm9yIGR1bXAKIAotCi0gICAgfSAgIC8vIGZvciAoOzspCi0KLSAgICAvLyBuZXZlciByZXR1cm4gJ3RydWUnOyBUaHJlYWQ6Ol90aHJlYWRMb29wKCkgbG9ja3MgbXV0ZXggd2hpY2ggY2FuIHJlc3VsdCBpbiBwcmlvcml0eSBpbnZlcnNpb24KKyAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gb3V0cHV0U2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0gdGltZXN0YW1wLm1Qb3NpdGlvbjsKKyAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KKyAgICAgICAgICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCisgICAgICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIEZhc3RNaXhlckR1bXBTdGF0ZTo6RmFzdE1peGVyRHVtcFN0YXRlKAogI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwogICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04KICNlbmRpZgotICAgICAgICApIDoKLSAgICBtQ29tbWFuZChGYXN0TWl4ZXJTdGF0ZTo6SU5JVElBTCksIG1Xcml0ZVNlcXVlbmNlKDApLCBtRnJhbWVzV3JpdHRlbigwKSwKLSAgICBtTnVtVHJhY2tzKDApLCBtV3JpdGVFcnJvcnMoMCksIG1VbmRlcnJ1bnMoMCksIG1PdmVycnVucygwKSwKLSAgICBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCksIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovIG1XYXJtdXBDeWNsZXMoMCksCisgICAgICAgICkgOiBGYXN0VGhyZWFkRHVtcFN0YXRlKCksCisgICAgbVdyaXRlU2VxdWVuY2UoMCksIG1GcmFtZXNXcml0dGVuKDApLAorICAgIG1OdW1UcmFja3MoMCksIG1Xcml0ZUVycm9ycygwKSwKKyAgICBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCksCiAgICAgbVRyYWNrTWFzaygwKQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICwgbVNhbXBsaW5nTigwKSwgbUJvdW5kcygwKQotI2VuZGlmCiB7Ci0gICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKLSAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKICNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKICAgICBpbmNyZWFzZVNhbXBsaW5nTihzYW1wbGluZ04pOwogI2VuZGlmCkBAIC02OTUsNyArNDYzLDcgQEAKIHZvaWQgRmFzdE1peGVyRHVtcFN0YXRlOjpkdW1wKGludCBmZCkgY29uc3QKIHsKICAgICBpZiAobUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OklOSVRJQUwpIHsKLSAgICAgICAgZmRwcmludGYoZmQsICJGYXN0TWl4ZXIgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgZmRwcmludGYoZmQsICIgIEZhc3RNaXhlciBub3QgaW5pdGlhbGl6ZWRcbiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogI2RlZmluZSBDT01NQU5EX01BWCAzMgpAQCAtNzI5LDEwICs0OTcsMTAgQEAKICAgICBkb3VibGUgbWVhc3VyZWRXYXJtdXBNcyA9IChtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKiAxMDAwLjApICsKICAgICAgICAgICAgIChtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC8gMTAwMDAwMC4wKTsKICAgICBkb3VibGUgbWl4UGVyaW9kU2VjID0gKGRvdWJsZSkgbUZyYW1lQ291bnQgLyAoZG91YmxlKSBtU2FtcGxlUmF0ZTsKLSAgICBmZHByaW50ZihmZCwgIkZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgotICAgICAgICAgICAgICAgICAiICAgICAgICAgIG51bVRyYWNrcz0ldSB3cml0ZUVycm9ycz0ldSB1bmRlcnJ1bnM9JXUgb3ZlcnJ1bnM9JXVcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICBzYW1wbGVSYXRlPSV1IGZyYW1lQ291bnQ9JXp1IG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldVxuIgotICAgICAgICAgICAgICAgICAiICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAorICAgIGZkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgY29tbWFuZD0lcyB3cml0ZVNlcXVlbmNlPSV1IGZyYW1lc1dyaXR0ZW49JXVcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG51bVRyYWNrcz0ldSB3cml0ZUVycm9ycz0ldSB1bmRlcnJ1bnM9JXUgb3ZlcnJ1bnM9JXVcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenUgbWVhc3VyZWRXYXJtdXA9JS4zZyBtcywgd2FybXVwQ3ljbGVzPSV1XG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtc1xuIiwKICAgICAgICAgICAgICAgICAgc3RyaW5nLCBtV3JpdGVTZXF1ZW5jZSwgbUZyYW1lc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgIG1OdW1UcmFja3MsIG1Xcml0ZUVycm9ycywgbVVuZGVycnVucywgbU92ZXJydW5zLAogICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1lYXN1cmVkV2FybXVwTXMsIG1XYXJtdXBDeWNsZXMsCkBAIC03ODMsMTQgKzU1MSwyMCBAQAogICAgICAgICBwcmV2aW91c0NwdWtIeiA9IHNhbXBsZUNwdWtIejsKICNlbmRpZgogICAgIH0KLSAgICBmZHByaW50ZihmZCwgIlNpbXBsZSBtb3Zpbmcgc3RhdGlzdGljcyBvdmVyIGxhc3QgJS4xZiBzZWNvbmRzOlxuIiwgd2FsbC5uKCkgKiBtaXhQZXJpb2RTZWMpOwotICAgIGZkcHJpbnRmKGZkLCAiICB3YWxsIGNsb2NrIHRpbWUgaW4gbXMgcGVyIG1peCBjeWNsZTpcbiIKLSAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgIHdhbGwubWVhbigpKjFlLTYsIHdhbGwubWluaW11bSgpKjFlLTYsIHdhbGwubWF4aW11bSgpKjFlLTYsIHdhbGwuc3RkZGV2KCkqMWUtNik7Ci0gICAgZmRwcmludGYoZmQsICIgIHJhdyBDUFUgbG9hZCBpbiB1cyBwZXIgbWl4IGN5Y2xlOlxuIgotICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKLSAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgIGlmIChuKSB7CisgICAgICAgIGZkcHJpbnRmKGZkLCAiICBTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsCisgICAgICAgICAgICAgICAgICAgICB3YWxsLm4oKSAqIG1peFBlcmlvZFNlYyk7CisgICAgICAgIGZkcHJpbnRmKGZkLCAiICAgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHdhbGwubWVhbigpKjFlLTYsIHdhbGwubWluaW11bSgpKjFlLTYsIHdhbGwubWF4aW11bSgpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgICB3YWxsLnN0ZGRldigpKjFlLTYpOworICAgICAgICBmZHByaW50ZihmZCwgIiAgICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCisgICAgICAgICAgICAgICAgICAgICBsb2FkTnMubWVhbigpKjFlLTMsIGxvYWROcy5taW5pbXVtKCkqMWUtMywgbG9hZE5zLm1heGltdW0oKSoxZS0zLAorICAgICAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZkcHJpbnRmKGZkLCAiICBObyBGYXN0TWl4ZXIgc3RhdGlzdGljcyBhdmFpbGFibGUgY3VycmVudGx5XG4iKTsKKyAgICB9CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgZmRwcmludGYoZmQsICIgIENQVSBjbG9jayBmcmVxdWVuY3kgaW4gTUh6OlxuIgogICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKQEAgLTgwOCw5ICs1ODIsOSBAQAogICAgICAgICAgICAgbGVmdC5zYW1wbGUodGFpbFtpXSk7CiAgICAgICAgICAgICByaWdodC5zYW1wbGUodGFpbFtuIC0gKGkgKyAxKV0pOwogICAgICAgICB9Ci0gICAgICAgIGZkcHJpbnRmKGZkLCAiRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICg+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCi0gICAgICAgICAgICAgICAgICAgICAiICBsZWZ0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIgotICAgICAgICAgICAgICAgICAgICAgIiAgcmlnaHQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAorICAgICAgICBmZHByaW50ZihmZCwgIiAgRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICg+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgIGxlZnQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgIHJpZ2h0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKICAgICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0Lm1lYW4oKSoxZS02LCByaWdodC5taW5pbXVtKCkqMWUtNiwgcmlnaHQubWF4aW11bSgpKjFlLTYsCiAgICAgICAgICAgICAgICAgICAgICByaWdodC5zdGRkZXYoKSoxZS02KTsKQEAgLTgyMyw5ICs1OTcsOSBAQAogICAgIC8vIEluc3RlYWQgd2UgYWx3YXlzIGRpc3BsYXkgYWxsIHRyYWNrcywgd2l0aCBhbiBpbmRpY2F0aW9uCiAgICAgLy8gb2Ygd2hldGhlciB3ZSB0aGluayB0aGUgdHJhY2sgaXMgYWN0aXZlLgogICAgIHVpbnQzMl90IHRyYWNrTWFzayA9IG1UcmFja01hc2s7Ci0gICAgZmRwcmludGYoZmQsICJGYXN0IHRyYWNrczoga01heEZhc3RUcmFja3M9JXUgYWN0aXZlTWFzaz0lI3hcbiIsCisgICAgZmRwcmludGYoZmQsICIgIEZhc3QgdHJhY2tzOiBrTWF4RmFzdFRyYWNrcz0ldSBhY3RpdmVNYXNrPSUjeFxuIiwKICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcywgdHJhY2tNYXNrKTsKLSAgICBmZHByaW50ZihmZCwgIkluZGV4IEFjdGl2ZSBGdWxsIFBhcnRpYWwgRW1wdHkgIFJlY2VudCBSZWFkeVxuIik7CisgICAgZmRwcmludGYoZmQsICIgIEluZGV4IEFjdGl2ZSBGdWxsIFBhcnRpYWwgRW1wdHkgIFJlY2VudCBSZWFkeVxuIik7CiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpLCB0cmFja01hc2sgPj49IDEpIHsKICAgICAgICAgYm9vbCBpc0FjdGl2ZSA9IHRyYWNrTWFzayAmIDE7CiAgICAgICAgIGNvbnN0IEZhc3RUcmFja0R1bXAgKmZ0RHVtcCA9ICZtVHJhY2tzW2ldOwpAQCAtODQ1LDcgKzYxOSw3IEBACiAgICAgICAgICAgICBtb3N0UmVjZW50ID0gIj8iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgZmRwcmludGYoZmQsICIlNXUgJTZzICU0dSAlN3UgJTV1ICU3cyAlNXp1XG4iLCBpLCBpc0FjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgZmRwcmludGYoZmQsICIgICU1dSAlNnMgJTR1ICU3dSAlNXUgJTdzICU1enVcbiIsIGksIGlzQWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRnVsbCkgJiBVTkRFUlJVTl9NQVNLLAogICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tUGFydGlhbCkgJiBVTkRFUlJVTl9NQVNLLAogICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkpICYgVU5ERVJSVU5fTUFTSywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAppbmRleCA2MTU4OTI1Li45ODFjMWE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCkBAIC0xOCwxMjMgKzE4LDY1IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9ICiAKICNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgotI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2lmIDEgICAvLyBGSVhNRSBtb3ZlIHRvIHdoZXJlIHVzZWQKIGV4dGVybiAiQyIgewogI2luY2x1ZGUgIi4uL3ByaXZhdGUvYmlvbmljX2Z1dGV4LmgiCiB9CisjZW5kaWYKKyNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCisjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgQXVkaW9NaXhlcjsKKwogdHlwZWRlZiBTdGF0ZVF1ZXVlPEZhc3RNaXhlclN0YXRlPiBGYXN0TWl4ZXJTdGF0ZVF1ZXVlOwogCi1jbGFzcyBGYXN0TWl4ZXIgOiBwdWJsaWMgVGhyZWFkIHsKK2NsYXNzIEZhc3RNaXhlciA6IHB1YmxpYyBGYXN0VGhyZWFkIHsKIAogcHVibGljOgotICAgICAgICAgICAgRmFzdE1peGVyKCkgOiBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSB7IH0KLSAgICB2aXJ0dWFsIH5GYXN0TWl4ZXIoKSB7IH0KKyAgICAgICAgICAgIEZhc3RNaXhlcigpOworICAgIHZpcnR1YWwgfkZhc3RNaXhlcigpOwogCi0gICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlKiBzcSgpIHsgcmV0dXJuICZtU1E7IH0KKyAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUqIHNxKCk7CiAKIHByaXZhdGU6Ci0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgIHRocmVhZExvb3AoKTsKICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgbVNROwogCisgICAgLy8gY2FsbG91dHMKKyAgICB2aXJ0dWFsIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqcG9sbCgpOworICAgIHZpcnR1YWwgdm9pZCBzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25JZGxlKCk7CisgICAgdmlydHVhbCB2b2lkIG9uRXhpdCgpOworICAgIHZpcnR1YWwgYm9vbCBpc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCk7CisgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCk7CisKKyAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMgYW5kIHRvIGJlIHJlbmFtZWQgdG8gaGF2ZSAibSIgcHJlZml4CisgICAgc3RhdGljIGNvbnN0IEZhc3RNaXhlclN0YXRlIGluaXRpYWw7CisgICAgRmFzdE1peGVyU3RhdGUgcHJlSWRsZTsgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKKyAgICBsb25nIHNsb3BOczsgICAgICAgIC8vIGFjY3VtdWxhdGVkIHRpbWUgd2UndmUgd29rZW4gdXAgdG9vIGVhcmx5ICg+IDApIG9yIHRvbyBsYXRlICg8IDApCisgICAgaW50IGZhc3RUcmFja05hbWVzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107IC8vIGhhbmRsZXMgdXNlZCBieSBtaXhlciB0byBpZGVudGlmeSB0cmFja3MKKyAgICBpbnQgZ2VuZXJhdGlvbnNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsgICAgLy8gbGFzdCBvYnNlcnZlZCBtRmFzdFRyYWNrc1tpXS5tR2VuZXJhdGlvbgorICAgIE5CQUlPX1NpbmsgKm91dHB1dFNpbms7CisgICAgaW50IG91dHB1dFNpbmtHZW47CisgICAgQXVkaW9NaXhlciogbWl4ZXI7CisgICAgc2hvcnQgKm1peEJ1ZmZlcjsKKyAgICBlbnVtIHtVTkRFRklORUQsIE1JWEVELCBaRVJPRUR9IG1peEJ1ZmZlclN0YXRlOworICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQ7CisgICAgdW5zaWduZWQgc2FtcGxlUmF0ZTsKKyAgICBpbnQgZmFzdFRyYWNrc0dlbjsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgZHVtbXlEdW1wU3RhdGU7CisgICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOyAgLy8gY29waWVkIHRvIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4KKworICAgIC8vIG5leHQgMiBmaWVsZHMgYXJlIHZhbGlkIG9ubHkgd2hlbiB0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IKKyAgICBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXA7CisgICAgdWludDMyX3QgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKKwogfTsgIC8vIGNsYXNzIEZhc3RNaXhlcgogCi0vLyBEZXNjcmliZXMgdGhlIHVuZGVycnVuIHN0YXR1cyBmb3IgYSBzaW5nbGUgInB1bGwiIGF0dGVtcHQKLWVudW0gRmFzdFRyYWNrVW5kZXJydW5TdGF0dXMgewotICAgIFVOREVSUlVOX0ZVTEwsICAgICAgLy8gZnJhbWVzUmVhZHkoKSBpcyBmdWxsIGZyYW1lIGNvdW50LCBubyB1bmRlcnJ1bgotICAgIFVOREVSUlVOX1BBUlRJQUwsICAgLy8gZnJhbWVzUmVhZHkoKSBpcyBub24temVybyBidXQgPCBmdWxsIGZyYW1lIGNvdW50LCBwYXJ0aWFsIHVuZGVycnVuCi0gICAgVU5ERVJSVU5fRU1QVFksICAgICAvLyBmcmFtZXNSZWFkeSgpIGlzIHplcm8sIHRvdGFsIHVuZGVycnVuCi19OwotCi0vLyBVbmRlcnJ1biBjb3VudGVycyBhcmUgbm90IHJlc2V0IHRvIHplcm8gZm9yIG5ldyB0cmFja3Mgb3IgaWYgdHJhY2sgZ2VuZXJhdGlvbiBjaGFuZ2VzLgotLy8gVGhpcyBwYWNrZWQgcmVwcmVzZW50YXRpb24gaXMgdXNlZCB0byBrZWVwIHRoZSBpbmZvcm1hdGlvbiBhdG9taWMuCi11bmlvbiBGYXN0VHJhY2tVbmRlcnJ1bnMgewotICAgIEZhc3RUcmFja1VuZGVycnVucygpIHsgbUF0b21pYyA9IDA7Ci0gICAgICAgICAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKHNpemVvZihGYXN0VHJhY2tVbmRlcnJ1bnMpID09IHNpemVvZih1aW50MzJfdCkpOyB9Ci0gICAgRmFzdFRyYWNrVW5kZXJydW5zKGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgY29weUZyb20pIDogbUF0b21pYyhjb3B5RnJvbS5tQXRvbWljKSB7IH0KLSAgICBGYXN0VHJhY2tVbmRlcnJ1bnMmIG9wZXJhdG9yPShjb25zdCBGYXN0VHJhY2tVbmRlcnJ1bnMmIHJocykKLSAgICAgICAgICAgIHsgaWYgKHRoaXMgIT0gJnJocykgbUF0b21pYyA9IHJocy5tQXRvbWljOyByZXR1cm4gKnRoaXM7IH0KLSAgICBzdHJ1Y3QgewotI2RlZmluZSBVTkRFUlJVTl9CSVRTIDEwCi0jZGVmaW5lIFVOREVSUlVOX01BU0sgKCgxIDw8IFVOREVSUlVOX0JJVFMpIC0gMSkKLSAgICAgICAgdWludDMyX3QgbUZ1bGwgICAgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIGZ1bGwgZnJhbWUgY291bnQKLSAgICAgICAgdWludDMyX3QgbVBhcnRpYWwgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIG5vbi16ZXJvIGJ1dCA8IGZ1bGwgZnJhbWUgY291bnQKLSAgICAgICAgdWludDMyX3QgbUVtcHR5ICAgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIHplcm8KLSAgICAgICAgRmFzdFRyYWNrVW5kZXJydW5TdGF0dXMgbU1vc3RSZWNlbnQgOiAyOyAgICAvLyBzdGF0dXMgb2YgbW9zdCByZWNlbnQgZnJhbWVzUmVhZHkoKQotICAgIH0gICAgICAgIG1CaXRGaWVsZHM7Ci1wcml2YXRlOgotICAgIHVpbnQzMl90IG1BdG9taWM7Ci19OwotCi0vLyBSZXByZXNlbnRzIHRoZSBkdW1wIHN0YXRlIG9mIGEgZmFzdCB0cmFjawotc3RydWN0IEZhc3RUcmFja0R1bXAgewotICAgIEZhc3RUcmFja0R1bXAoKSA6IG1GcmFtZXNSZWFkeSgwKSB7IH0KLSAgICAvKnZpcnR1YWwqLyB+RmFzdFRyYWNrRHVtcCgpIHsgfQotICAgIEZhc3RUcmFja1VuZGVycnVucyBtVW5kZXJydW5zOwotICAgIHNpemVfdCBtRnJhbWVzUmVhZHk7ICAgICAgICAvLyBtb3N0IHJlY2VudCB2YWx1ZSBvbmx5OyBubyBsb25nLXRlcm0gc3RhdGlzdGljcyBrZXB0Ci19OwotCi0vLyBUaGUgRmFzdE1peGVyRHVtcFN0YXRlIGtlZXBzIGEgY2FjaGUgb2YgRmFzdE1peGVyIHN0YXRpc3RpY3MgdGhhdCBjYW4gYmUgbG9nZ2VkIGJ5IGR1bXBzeXMuCi0vLyBFYWNoIGluZGl2aWR1YWwgbmF0aXZlIHdvcmQtc2l6ZWQgZmllbGQgaXMgYWNjZXNzZWQgYXRvbWljYWxseS4gIEJ1dCB0aGUKLS8vIG92ZXJhbGwgc3RydWN0dXJlIGlzIG5vbi1hdG9taWMsIHRoYXQgaXMgdGhlcmUgbWF5IGJlIGFuIGluY29uc2lzdGVuY3kgYmV0d2VlbiBmaWVsZHMuCi0vLyBObyBiYXJyaWVycyBvciBsb2NrcyBhcmUgdXNlZCBmb3IgZWl0aGVyIHdyaXRpbmcgb3IgcmVhZGluZy4KLS8vIE9ubHkgUE9EIHR5cGVzIGFyZSBwZXJtaXR0ZWQsIGFuZCB0aGUgY29udGVudHMgc2hvdWxkbid0IGJlIHRydXN0ZWQgKGkuZS4gZG8gcmFuZ2UgY2hlY2tzKS4KLS8vIEl0IGhhcyBhIGRpZmZlcmVudCBsaWZldGltZSB0aGFuIHRoZSBGYXN0TWl4ZXIsIGFuZCBzbyBpdCBjYW4ndCBiZSBhIG1lbWJlciBvZiBGYXN0TWl4ZXIuCi1zdHJ1Y3QgRmFzdE1peGVyRHVtcFN0YXRlIHsKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUoCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04gPSBrU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlCi0jZW5kaWYKLSAgICAgICAgICAgICk7Ci0gICAgLyp2aXJ0dWFsKi8gfkZhc3RNaXhlckR1bXBTdGF0ZSgpOwotCi0gICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCi0KLSAgICBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBtQ29tbWFuZDsgICAvLyBjdXJyZW50IGNvbW1hbmQKLSAgICB1aW50MzJfdCBtV3JpdGVTZXF1ZW5jZTsgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHdyaXRlKCkKLSAgICB1aW50MzJfdCBtRnJhbWVzV3JpdHRlbjsgICAgLy8gdG90YWwgbnVtYmVyIG9mIGZyYW1lcyB3cml0dGVuIHN1Y2Nlc3NmdWxseQotICAgIHVpbnQzMl90IG1OdW1UcmFja3M7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIGZhc3QgdHJhY2tzCi0gICAgdWludDMyX3QgbVdyaXRlRXJyb3JzOyAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB3cml0ZSgpIGVycm9ycwotICAgIHVpbnQzMl90IG1VbmRlcnJ1bnM7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgdW5kZXJydW5zCi0gICAgdWludDMyX3QgbU92ZXJydW5zOyAgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBvdmVycnVucwotICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOwotICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OwotICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIG1lYXN1cmVkIHdhcm11cCB0aW1lCi0gICAgdWludDMyX3QgbVdhcm11cEN5Y2xlczsgICAgIC8vIG51bWJlciBvZiBsb29wIGN5Y2xlcyByZXF1aXJlZCB0byB3YXJtdXAKLSAgICB1aW50MzJfdCBtVHJhY2tNYXNrOyAgICAgICAgLy8gbWFzayBvZiBhY3RpdmUgdHJhY2tzCi0gICAgRmFzdFRyYWNrRHVtcCAgIG1UcmFja3NbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKLQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgIC8vIFJlY2VudGx5IGNvbGxlY3RlZCBzYW1wbGVzIG9mIHBlci1jeWNsZSBtb25vdG9uaWMgdGltZSwgdGhyZWFkIENQVSB0aW1lLCBhbmQgQ1BVIGZyZXF1ZW5jeS4KLSAgICAvLyBrU2FtcGxpbmdOIGlzIG1heCBzaXplIG9mIHNhbXBsaW5nIGZyYW1lIChzdGF0aXN0aWNzKSwgYW5kIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IDB4ODAwMC4KLSAgICAvLyBUaGUgc2FtcGxlIGFycmF5cyBhcmUgdmlydHVhbGx5IGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIGNvbXBpbGUtdGltZSBjb25zdGFudCwKLSAgICAvLyBidXQgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYmFzZWQgb24gdGhlIHJ1bnRpbWUgcGFyYW1ldGVyIG1TYW1wbGluZ04uCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ04gPSAweDgwMDA7Ci0gICAgLy8gQ29tcGlsZS10aW1lIGNvbnN0YW50IGZvciBhICJsb3cgUkFNIGRldmljZSIsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCi0gICAgLy8gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBlYWNoIGFycmF5IHVzZXMgMSBzbWFsbCBwYWdlICg0IEtieXRlcykuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgPSAweDQwMDsKLSAgICAvLyBDb3JyZXNwb25kaW5nIHJ1bnRpbWUgbWF4aW11bSBzaXplIG9mIHNhbXBsZSBhcnJheXMsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCi0gICAgdWludDMyX3QgbVNhbXBsaW5nTjsKLSAgICAvLyBUaGUgYm91bmRzIGRlZmluZSB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcywgYW5kIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOgotICAgIC8vICAgICAgbmV3ZXN0IG9wZW4gKGV4Y2x1ZGVkKSBlbmRwb2ludCAgID0gbG93ZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCi0gICAgLy8gICAgICBvbGRlc3QgY2xvc2VkIChpbmNsdWRlZCkgZW5kcG9pbnQgPSB1cHBlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KLSAgICAvLyBOdW1iZXIgb2YgdmFsaWQgc2FtcGxlcyBpcyBuZXdlc3QgLSBvbGRlc3QuCi0gICAgdWludDMyX3QgbUJvdW5kczsgICAgICAgICAgICAgICAgICAgLy8gYm91bmRzIGZvciBtTW9ub3RvbmljTnMsIG1UaHJlYWRDcHVOcywgYW5kIG1DcHVrSHoKLSAgICAvLyBUaGUgZWxlbWVudHMgaW4gdGhlICpOcyBhcnJheXMgYXJlIGluIHVuaXRzIG9mIG5hbm9zZWNvbmRzIDw9IDM5OTk5OTk5OTkuCi0gICAgdWludDMyX3QgbU1vbm90b25pY05zW2tTYW1wbGluZ05dOyAgLy8gZGVsdGEgbW9ub3RvbmljICh3YWxsIGNsb2NrKSB0aW1lCi0gICAgdWludDMyX3QgbUxvYWROc1trU2FtcGxpbmdOXTsgICAgICAgLy8gZGVsdGEgQ1BVIGxvYWQgaW4gdGltZQotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIHVpbnQzMl90IG1DcHVrSHpba1NhbXBsaW5nTl07ICAgICAgIC8vIGFic29sdXRlIENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6LCBiaXRzIDAtMyBhcmUgQ1BVIwotI2VuZGlmCi0gICAgLy8gSW5jcmVhc2Ugc2FtcGxpbmcgd2luZG93IGFmdGVyIGNvbnN0cnVjdGlvbiwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTgotICAgIHZvaWQgICAgaW5jcmVhc2VTYW1wbGluZ04odWludDMyX3Qgc2FtcGxpbmdOKTsKLSNlbmRpZgotfTsKLQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTFlNDY0OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfRFVNUF9TVEFURV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBEZXNjcmliZXMgdGhlIHVuZGVycnVuIHN0YXR1cyBmb3IgYSBzaW5nbGUgInB1bGwiIGF0dGVtcHQKK2VudW0gRmFzdFRyYWNrVW5kZXJydW5TdGF0dXMgeworICAgIFVOREVSUlVOX0ZVTEwsICAgICAgLy8gZnJhbWVzUmVhZHkoKSBpcyBmdWxsIGZyYW1lIGNvdW50LCBubyB1bmRlcnJ1bgorICAgIFVOREVSUlVOX1BBUlRJQUwsICAgLy8gZnJhbWVzUmVhZHkoKSBpcyBub24temVybyBidXQgPCBmdWxsIGZyYW1lIGNvdW50LCBwYXJ0aWFsIHVuZGVycnVuCisgICAgVU5ERVJSVU5fRU1QVFksICAgICAvLyBmcmFtZXNSZWFkeSgpIGlzIHplcm8sIHRvdGFsIHVuZGVycnVuCit9OworCisvLyBVbmRlcnJ1biBjb3VudGVycyBhcmUgbm90IHJlc2V0IHRvIHplcm8gZm9yIG5ldyB0cmFja3Mgb3IgaWYgdHJhY2sgZ2VuZXJhdGlvbiBjaGFuZ2VzLgorLy8gVGhpcyBwYWNrZWQgcmVwcmVzZW50YXRpb24gaXMgdXNlZCB0byBrZWVwIHRoZSBpbmZvcm1hdGlvbiBhdG9taWMuCit1bmlvbiBGYXN0VHJhY2tVbmRlcnJ1bnMgeworICAgIEZhc3RUcmFja1VuZGVycnVucygpIHsgbUF0b21pYyA9IDA7CisgICAgICAgICAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKHNpemVvZihGYXN0VHJhY2tVbmRlcnJ1bnMpID09IHNpemVvZih1aW50MzJfdCkpOyB9CisgICAgRmFzdFRyYWNrVW5kZXJydW5zKGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgY29weUZyb20pIDogbUF0b21pYyhjb3B5RnJvbS5tQXRvbWljKSB7IH0KKyAgICBGYXN0VHJhY2tVbmRlcnJ1bnMmIG9wZXJhdG9yPShjb25zdCBGYXN0VHJhY2tVbmRlcnJ1bnMmIHJocykKKyAgICAgICAgICAgIHsgaWYgKHRoaXMgIT0gJnJocykgbUF0b21pYyA9IHJocy5tQXRvbWljOyByZXR1cm4gKnRoaXM7IH0KKyAgICBzdHJ1Y3QgeworI2RlZmluZSBVTkRFUlJVTl9CSVRTIDEwCisjZGVmaW5lIFVOREVSUlVOX01BU0sgKCgxIDw8IFVOREVSUlVOX0JJVFMpIC0gMSkKKyAgICAgICAgdWludDMyX3QgbUZ1bGwgICAgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIGZ1bGwgZnJhbWUgY291bnQKKyAgICAgICAgdWludDMyX3QgbVBhcnRpYWwgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIG5vbi16ZXJvIGJ1dCA8IGZ1bGwgZnJhbWUgY291bnQKKyAgICAgICAgdWludDMyX3QgbUVtcHR5ICAgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIHplcm8KKyAgICAgICAgRmFzdFRyYWNrVW5kZXJydW5TdGF0dXMgbU1vc3RSZWNlbnQgOiAyOyAgICAvLyBzdGF0dXMgb2YgbW9zdCByZWNlbnQgZnJhbWVzUmVhZHkoKQorICAgIH0gICAgICAgIG1CaXRGaWVsZHM7Citwcml2YXRlOgorICAgIHVpbnQzMl90IG1BdG9taWM7Cit9OworCisvLyBSZXByZXNlbnRzIHRoZSBkdW1wIHN0YXRlIG9mIGEgZmFzdCB0cmFjaworc3RydWN0IEZhc3RUcmFja0R1bXAgeworICAgIEZhc3RUcmFja0R1bXAoKSA6IG1GcmFtZXNSZWFkeSgwKSB7IH0KKyAgICAvKnZpcnR1YWwqLyB+RmFzdFRyYWNrRHVtcCgpIHsgfQorICAgIEZhc3RUcmFja1VuZGVycnVucyBtVW5kZXJydW5zOworICAgIHNpemVfdCBtRnJhbWVzUmVhZHk7ICAgICAgICAvLyBtb3N0IHJlY2VudCB2YWx1ZSBvbmx5OyBubyBsb25nLXRlcm0gc3RhdGlzdGljcyBrZXB0Cit9OworCisvLyBUaGUgRmFzdE1peGVyRHVtcFN0YXRlIGtlZXBzIGEgY2FjaGUgb2YgRmFzdE1peGVyIHN0YXRpc3RpY3MgdGhhdCBjYW4gYmUgbG9nZ2VkIGJ5IGR1bXBzeXMuCisvLyBFYWNoIGluZGl2aWR1YWwgbmF0aXZlIHdvcmQtc2l6ZWQgZmllbGQgaXMgYWNjZXNzZWQgYXRvbWljYWxseS4gIEJ1dCB0aGUKKy8vIG92ZXJhbGwgc3RydWN0dXJlIGlzIG5vbi1hdG9taWMsIHRoYXQgaXMgdGhlcmUgbWF5IGJlIGFuIGluY29uc2lzdGVuY3kgYmV0d2VlbiBmaWVsZHMuCisvLyBObyBiYXJyaWVycyBvciBsb2NrcyBhcmUgdXNlZCBmb3IgZWl0aGVyIHdyaXRpbmcgb3IgcmVhZGluZy4KKy8vIE9ubHkgUE9EIHR5cGVzIGFyZSBwZXJtaXR0ZWQsIGFuZCB0aGUgY29udGVudHMgc2hvdWxkbid0IGJlIHRydXN0ZWQgKGkuZS4gZG8gcmFuZ2UgY2hlY2tzKS4KKy8vIEl0IGhhcyBhIGRpZmZlcmVudCBsaWZldGltZSB0aGFuIHRoZSBGYXN0TWl4ZXIsIGFuZCBzbyBpdCBjYW4ndCBiZSBhIG1lbWJlciBvZiBGYXN0TWl4ZXIuCitzdHJ1Y3QgRmFzdE1peGVyRHVtcFN0YXRlIDogRmFzdFRocmVhZER1bXBTdGF0ZSB7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlKAorI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdOID0ga1NhbXBsaW5nTmZvckxvd1JhbURldmljZQorI2VuZGlmCisgICAgICAgICAgICApOworICAgIC8qdmlydHVhbCovIH5GYXN0TWl4ZXJEdW1wU3RhdGUoKTsKKworICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OyAgICAvLyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzdGFibGUgY29weSwgbm90IHRoZSBvcmlnaW5hbAorCisgICAgdWludDMyX3QgbVdyaXRlU2VxdWVuY2U7ICAgIC8vIGluY3JlbWVudGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCB3cml0ZSgpCisgICAgdWludDMyX3QgbUZyYW1lc1dyaXR0ZW47ICAgIC8vIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkKKyAgICB1aW50MzJfdCBtTnVtVHJhY2tzOyAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBmYXN0IHRyYWNrcworICAgIHVpbnQzMl90IG1Xcml0ZUVycm9yczsgICAgICAvLyB0b3RhbCBudW1iZXIgb2Ygd3JpdGUoKSBlcnJvcnMKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKKyAgICB1aW50MzJfdCBtVHJhY2tNYXNrOyAgICAgICAgLy8gbWFzayBvZiBhY3RpdmUgdHJhY2tzCisgICAgRmFzdFRyYWNrRHVtcCAgIG1UcmFja3NbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKKworI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgIC8vIENvbXBpbGUtdGltZSBjb25zdGFudCBmb3IgYSAibG93IFJBTSBkZXZpY2UiLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOLgorICAgIC8vIFRoaXMgdmFsdWUgd2FzIGNob3NlbiBzdWNoIHRoYXQgZWFjaCBhcnJheSB1c2VzIDEgc21hbGwgcGFnZSAoNCBLYnl0ZXMpLgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlID0gMHg0MDA7CisgICAgLy8gSW5jcmVhc2Ugc2FtcGxpbmcgd2luZG93IGFmdGVyIGNvbnN0cnVjdGlvbiwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTgorICAgIHZvaWQgICAgaW5jcmVhc2VTYW1wbGluZ04odWludDMyX3Qgc2FtcGxpbmdOKTsKKyNlbmRpZgorfTsKKworfSAgIC8vIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfRFVNUF9TVEFURV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAppbmRleCA0M2ZmMjMzLi44ZTZkMGQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKQEAgLTE0LDcgKzE0LDYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjksMTAgKzI4LDEwIEBACiB7CiB9CiAKLUZhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDoKK0Zhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDogRmFzdFRocmVhZFN0YXRlKCksCisgICAgLy8gbUZhc3RUcmFja3MKICAgICBtRmFzdFRyYWNrc0dlbigwKSwgbVRyYWNrTWFzaygwKSwgbU91dHB1dFNpbmsoTlVMTCksIG1PdXRwdXRTaW5rR2VuKDApLAotICAgIG1GcmFtZUNvdW50KDApLCBtQ29tbWFuZChJTklUSUFMKSwgbUNvbGRGdXRleEFkZHIoTlVMTCksIG1Db2xkR2VuKDApLAotICAgIG1EdW1wU3RhdGUoTlVMTCksIG1UZWVTaW5rKE5VTEwpLCBtTkJMb2dXcml0ZXIoTlVMTCkKKyAgICBtRnJhbWVDb3VudCgwKSwgbVRlZVNpbmsoTlVMTCkKIHsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAppbmRleCA5NzM5ZmU5Li5iZTFhMzc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0V4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlICJGYXN0VGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00OCw3ICs0OSw3IEBACiB9OwogCiAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIHRoZSBmYXN0IG1peGVyCi1zdHJ1Y3QgRmFzdE1peGVyU3RhdGUgeworc3RydWN0IEZhc3RNaXhlclN0YXRlIDogRmFzdFRocmVhZFN0YXRlIHsKICAgICAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZSgpOwogICAgIC8qdmlydHVhbCovIH5GYXN0TWl4ZXJTdGF0ZSgpOwogCkBAIC02MSwyMyArNjIsMTYgQEAKICAgICBOQkFJT19TaW5rKiBtT3V0cHV0U2luazsgICAgLy8gSEFMIG91dHB1dCBkZXZpY2UsIG11c3QgYWxyZWFkeSBiZSBuZWdvdGlhdGVkCiAgICAgaW50ICAgICAgICAgbU91dHB1dFNpbmtHZW47IC8vIGluY3JlbWVudCB3aGVuIG1PdXRwdXRTaW5rIGlzIGFzc2lnbmVkCiAgICAgc2l6ZV90ICAgICAgbUZyYW1lQ291bnQ7ICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIGZhc3QgbWl4IGJ1ZmZlcgotICAgIGVudW0gQ29tbWFuZCB7Ci0gICAgICAgIElOSVRJQUwgPSAwLCAgICAgICAgICAgIC8vIHVzZWQgb25seSBmb3IgdGhlIGluaXRpYWwgc3RhdGUKLSAgICAgICAgSE9UX0lETEUgPSAxLCAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICBDT0xEX0lETEUgPSAyLCAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgZnV0ZXgKLSAgICAgICAgSURMRSA9IDMsICAgICAgICAgICAgICAgLy8gZWl0aGVyIEhPVF9JRExFIG9yIENPTERfSURMRQotICAgICAgICBFWElUID0gNCwgICAgICAgICAgICAgICAvLyBleGl0IGZyb20gdGhyZWFkCisKKyAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAorICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6CiAgICAgICAgIE1JWCA9IDB4OCwgICAgICAgICAgICAgIC8vIG1peCB0cmFja3MKICAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgLy8gd3JpdGUgdG8gb3V0cHV0IHNpbmsKLSAgICAgICAgTUlYX1dSSVRFID0gMHgxOCwgICAgICAgLy8gbWl4IHRyYWNrcyBhbmQgd3JpdGUgdG8gb3V0cHV0IHNpbmsKLSAgICB9IG1Db21tYW5kOwotICAgIGludDMyX3QqICAgIG1Db2xkRnV0ZXhBZGRyOyAvLyBmb3IgQ09MRF9JRExFIG9ubHksIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0ZWQgZnV0ZXgKLSAgICB1bnNpZ25lZCAgICBtQ29sZEdlbjsgICAgICAgLy8gaW5jcmVtZW50IHdoZW4gQ09MRF9JRExFIGlzIHJlcXVlc3RlZCBzbyBpdCdzIG9ubHkgcGVyZm9ybWVkIG9uY2UKKyAgICAgICAgTUlYX1dSSVRFID0gMHgxODsgICAgICAgLy8gbWl4IHRyYWNrcyBhbmQgd3JpdGUgdG8gb3V0cHV0IHNpbmsKKwogICAgIC8vIFRoaXMgbWlnaHQgYmUgYSBvbmUtdGltZSBjb25maWd1cmF0aW9uIHJhdGhlciB0aGFuIHBlci1zdGF0ZQotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSogbUR1bXBTdGF0ZTsgLy8gaWYgbm9uLU5VTEwsIHRoZW4gdXBkYXRlIGR1bXAgc3RhdGUgcGVyaW9kaWNhbGx5CiAgICAgTkJBSU9fU2luayogbVRlZVNpbms7ICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpcyB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCi0gICAgTkJMb2c6OldyaXRlciogbU5CTG9nV3JpdGVyOyAvLyBub24tYmxvY2tpbmcgbG9nZ2VyCiB9OyAgLy8gc3RydWN0IEZhc3RNaXhlclN0YXRlCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjE2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkZhc3RUaHJlYWQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICIuLi9wcml2YXRlL2Jpb25pY19mdXRleC5oIgorfQorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgorCisjZGVmaW5lIEZBU1RfREVGQVVMVF9OUyAgICA5OTk5OTk5OTlMICAgLy8gfjEgc2VjOiBkZWZhdWx0IHRpbWUgdG8gc2xlZXAKKyNkZWZpbmUgRkFTVF9IT1RfSURMRV9OUyAgICAgMTAwMDAwMEwgICAvLyAxIG1zOiB0aW1lIHRvIHNsZWVwIHdoaWxlIGhvdCBpZGxpbmcKKyNkZWZpbmUgTUlOX1dBUk1VUF9DWUNMRVMgICAgICAgICAgMiAgICAvLyBtaW5pbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKKyNkZWZpbmUgTUFYX1dBUk1VUF9DWUNMRVMgICAgICAgICAxMCAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitGYXN0VGhyZWFkOjpGYXN0VGhyZWFkKCkgOiBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSwKKyAgICAvLyByZS1pbml0aWFsaXplZCB0byAmaW5pdGlhbCBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcgorICAgICBwcmV2aW91cyhOVUxMKSwgY3VycmVudChOVUxMKSwKKyAgICAvKiBvbGRUcyh7MCwgMH0pLCAqLworICAgIG9sZFRzVmFsaWQoZmFsc2UpLAorICAgIHNsZWVwTnMoLTEpLAorICAgIHBlcmlvZE5zKDApLAorICAgIHVuZGVycnVuTnMoMCksCisgICAgb3ZlcnJ1bk5zKDApLAorICAgIGZvcmNlTnMoMCksCisgICAgd2FybXVwTnMoMCksCisgICAgLy8gcmUtaW5pdGlhbGl6ZWQgdG8gJmR1bW15RHVtcFN0YXRlIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9yCisgICAgbUR1bW15RHVtcFN0YXRlKE5VTEwpLAorICAgIGR1bXBTdGF0ZShOVUxMKSwKKyAgICBpZ25vcmVOZXh0T3ZlcnJ1bih0cnVlKSwKKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICAvLyBvbGRMb2FkCisgICAgb2xkTG9hZFZhbGlkKGZhbHNlKSwKKyAgICBib3VuZHMoMCksCisgICAgZnVsbChmYWxzZSksCisgICAgLy8gdGN1CisjZW5kaWYKKyAgICBjb2xkR2VuKDApLAorICAgIGlzV2FybShmYWxzZSksCisgICAgLyogbWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLworICAgIHdhcm11cEN5Y2xlcygwKSwKKyAgICAvLyBkdW1teUxvZ1dyaXRlcgorICAgIGxvZ1dyaXRlcigmZHVtbXlMb2dXcml0ZXIpLAorICAgIHRpbWVzdGFtcFN0YXR1cyhJTlZBTElEX09QRVJBVElPTiksCisKKyAgICBjb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksCisjaWYgMAorICAgIGZyYW1lQ291bnQoMCksCisjZW5kaWYKKyAgICBhdHRlbXB0ZWRXcml0ZShmYWxzZSkKK3sKKyAgICBvbGRUcy50dl9zZWMgPSAwOworICAgIG9sZFRzLnR2X25zZWMgPSAwOworICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKKyAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOworfQorCitGYXN0VGhyZWFkOjp+RmFzdFRocmVhZCgpCit7Cit9CisKK2Jvb2wgRmFzdFRocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgZm9yICg7OykgeworCisgICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKKyAgICAgICAgaWYgKHNsZWVwTnMgPj0gMCkgeworICAgICAgICAgICAgaWYgKHNsZWVwTnMgPiAwKSB7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoc2xlZXBOcyA8IDEwMDAwMDAwMDApOworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXEgPSB7MCwgc2xlZXBOc307CisgICAgICAgICAgICAgICAgbmFub3NsZWVwKCZyZXEsIE5VTEwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY2hlZF95aWVsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGRlZmF1bHQgdG8gbG9uZyBzbGVlcCBmb3IgbmV4dCBjeWNsZQorICAgICAgICBzbGVlcE5zID0gRkFTVF9ERUZBVUxUX05TOworCisgICAgICAgIC8vIHBvbGwgZm9yIHN0YXRlIGNoYW5nZQorICAgICAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKm5leHQgPSBwb2xsKCk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsIHN0YXRlIHVudGlsIGEgcmVhbCBzdGF0ZSBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIC8vIEZJWE1FICZpbml0aWFsIG5vdCBhdmFpbGFibGUsIHNob3VsZCBzYXZlIGFkZHJlc3MgZWFybGllcgorICAgICAgICAgICAgLy9BTE9HX0FTU0VSVChjdXJyZW50ID09ICZpbml0aWFsICYmIHByZXZpb3VzID09ICZpbml0aWFsKTsKKyAgICAgICAgICAgIG5leHQgPSBjdXJyZW50OworICAgICAgICB9CisKKyAgICAgICAgY29tbWFuZCA9IG5leHQtPm1Db21tYW5kOworICAgICAgICBpZiAobmV4dCAhPSBjdXJyZW50KSB7CisKKyAgICAgICAgICAgIC8vIEFzIHNvb24gYXMgcG9zc2libGUgb2YgbGVhcm5pbmcgb2YgYSBuZXcgZHVtcCBhcmVhLCBzdGFydCB1c2luZyBpdAorICAgICAgICAgICAgZHVtcFN0YXRlID0gbmV4dC0+bUR1bXBTdGF0ZSAhPSBOVUxMID8gbmV4dC0+bUR1bXBTdGF0ZSA6IG1EdW1teUR1bXBTdGF0ZTsKKyAgICAgICAgICAgIGxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8gbmV4dC0+bU5CTG9nV3JpdGVyIDogJmR1bW15TG9nV3JpdGVyOworICAgICAgICAgICAgc2V0TG9nKGxvZ1dyaXRlcik7CisKKyAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gYWx3YXlzIGhhdmUgYSB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIChub24taWRsZSkgc3RhdGUuCisgICAgICAgICAgICAvLyBIb3dldmVyLCB0aGUgc3RhdGUgcXVldWUgb25seSBndWFyYW50ZWVzIGFjY2VzcyB0byBjdXJyZW50IGFuZCBwcmV2aW91cyBzdGF0ZXMuCisgICAgICAgICAgICAvLyBTbyB3aGVuIHRoZXJlIGlzIGEgdHJhbnNpdGlvbiBmcm9tIGEgbm9uLWlkbGUgc3RhdGUgaW50byBhbiBpZGxlIHN0YXRlLCB3ZSBtYWtlIGEKKyAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIGxhc3Qga25vd24gbm9uLWlkbGUgc3RhdGUgc28gaXQgaXMgc3RpbGwgYXZhaWxhYmxlIG9uIHJldHVybiBmcm9tIGlkbGUuCisgICAgICAgICAgICAvLyBUaGUgcG9zc2libGUgdHJhbnNpdGlvbnMgYXJlOgorICAgICAgICAgICAgLy8gIG5vbi1pZGxlIC0+IG5vbi1pZGxlICAgIHVwZGF0ZSBwcmV2aW91cyBmcm9tIGN1cnJlbnQgaW4tcGxhY2UKKyAgICAgICAgICAgIC8vICBub24taWRsZSAtPiBpZGxlICAgICAgICB1cGRhdGUgcHJldmlvdXMgZnJvbSBjb3B5IG9mIGN1cnJlbnQKKyAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBpZGxlICAgICAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKKyAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBub24taWRsZSAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKKyAgICAgICAgICAgIGlmICghKGN1cnJlbnQtPm1Db21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSkgeworICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSB7CisgICAgICAgICAgICAgICAgICAgIG9uSWRsZSgpOworICAgICAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gZmFsc2U7CisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgICAgIG9sZExvYWRWYWxpZCA9IGZhbHNlOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7CisgICAgICAgIH0KKyNpZiAhTE9HX05ERUJVRworICAgICAgICBuZXh0ID0gTlVMTDsgICAgLy8gbm90IHJlZmVyZW5jZWQgYWdhaW4KKyNlbmRpZgorCisgICAgICAgIGR1bXBTdGF0ZS0+bUNvbW1hbmQgPSBjb21tYW5kOworCisgICAgICAgIC8vIDw8IGN1cnJlbnQsIHByZXZpb3VzLCBjb21tYW5kLCBkdW1wU3RhdGUgPj4KKworICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICAgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUw6CisgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpIT1RfSURMRToKKyAgICAgICAgICAgIHNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpDT0xEX0lETEU6CisgICAgICAgICAgICAvLyBvbmx5IHBlcmZvcm0gYSBjb2xkIGlkbGUgY29tbWFuZCBvbmNlCisgICAgICAgICAgICAvLyBGSVhNRSBjb25zaWRlciBjaGVja2luZyBwcmV2aW91cyBzdGF0ZSBhbmQgb25seSBwZXJmb3JtIGlmIHByZXZpb3VzICE9IENPTERfSURMRQorICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm1Db2xkR2VuICE9IGNvbGRHZW4pIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90ICpjb2xkRnV0ZXhBZGRyID0gY3VycmVudC0+bUNvbGRGdXRleEFkZHI7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoY29sZEZ1dGV4QWRkciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2RlYyhjb2xkRnV0ZXhBZGRyKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgX19mdXRleF9zeXNjYWxsNChjb2xkRnV0ZXhBZGRyLCBGVVRFWF9XQUlUX1BSSVZBVEUsIG9sZCAtIDEsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgcG9saWN5ID0gc2NoZWRfZ2V0c2NoZWR1bGVyKDApOworICAgICAgICAgICAgICAgIGlmICghKHBvbGljeSA9PSBTQ0hFRF9GSUZPIHx8IHBvbGljeSA9PSBTQ0hFRF9SUikpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSBvdmVybHkgY29uc2VydmF0aXZlOyB0aGVyZSBjb3VsZCBiZSB0aW1lcyB0aGF0IHRoZSBub3JtYWwgbWl4ZXIKKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cyBzdWNoIGEgYnJpZWYgY29sZCBpZGxlIHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIHJlc2V0dGluZyB0aGlzIGZsYWcuCisgICAgICAgICAgICAgICAgaXNXYXJtID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOworICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7CisgICAgICAgICAgICAgICAgd2FybXVwQ3ljbGVzID0gMDsKKyAgICAgICAgICAgICAgICBzbGVlcE5zID0gLTE7CisgICAgICAgICAgICAgICAgY29sZEdlbiA9IGN1cnJlbnQtPm1Db2xkR2VuOworI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgICAgICAgICAgICAgIGJvdW5kcyA9IDA7CisgICAgICAgICAgICAgICAgZnVsbCA9IGZhbHNlOworI2VuZGlmCisgICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9ICFjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm9sZFRzKTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OkVYSVQ6CisgICAgICAgICAgICBvbkV4aXQoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWlzU3ViQ2xhc3NDb21tYW5kKGNvbW1hbmQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlcmUgaXMgYSBub24taWRsZSBzdGF0ZSBhdmFpbGFibGUgdG8gdXM7IGRpZCB0aGUgc3RhdGUgY2hhbmdlPworICAgICAgICBpZiAoY3VycmVudCAhPSBwcmV2aW91cykgeworICAgICAgICAgICAgb25TdGF0ZUNoYW5nZSgpOworI2lmIDEgICAvLyBGSVhNRSBzaG91bGRuJ3QgbmVlZCB0aGlzCisgICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3Mgc3RhdGUgY2hhbmdlIG9uY2UKKyAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgLy8gZG8gd29yayB1c2luZyBjdXJyZW50IHN0YXRlIGhlcmUKKyAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSBmYWxzZTsKKyAgICAgICAgb25Xb3JrKCk7CisKKyAgICAgICAgLy8gVG8gYmUgZXhhY3RseSBwZXJpb2RpYywgY29tcHV0ZSB0aGUgbmV4dCBzbGVlcCB0aW1lIGJhc2VkIG9uIGN1cnJlbnQgdGltZS4KKyAgICAgICAgLy8gVGhpcyBjb2RlIGRvZXNuJ3QgaGF2ZSBsb25nLXRlcm0gc3RhYmlsaXR5IHdoZW4gdGhlIHNpbmsgaXMgbm9uLWJsb2NraW5nLgorICAgICAgICAvLyBGSVhNRSBUbyBhdm9pZCBkcmlmdCwgdXNlIHRoZSBsb2NhbCBhdWRpbyBjbG9jayBvciB3YXRjaCB0aGUgc2luaydzIGZpbGwgc3RhdHVzLgorICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3VHM7CisgICAgICAgIGludCByYyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmbmV3VHMpOworICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgLy9sb2dXcml0ZXItPmxvZ1RpbWVzdGFtcChuZXdUcyk7CisgICAgICAgICAgICBpZiAob2xkVHNWYWxpZCkgeworICAgICAgICAgICAgICAgIHRpbWVfdCBzZWMgPSBuZXdUcy50dl9zZWMgLSBvbGRUcy50dl9zZWM7CisgICAgICAgICAgICAgICAgbG9uZyBuc2VjID0gbmV3VHMudHZfbnNlYyAtIG9sZFRzLnR2X25zZWM7CisgICAgICAgICAgICAgICAgQUxPR0VfSUYoc2VjIDwgMCB8fCAoc2VjID09IDAgJiYgbnNlYyA8IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgImNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKSBmYWlsZWQ6IHdhcyAlbGQuJTA5bGQgYnV0IG5vdyAlbGQuJTA5bGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb2xkVHMudHZfc2VjLCBvbGRUcy50dl9uc2VjLCBuZXdUcy50dl9zZWMsIG5ld1RzLnR2X25zZWMpOworICAgICAgICAgICAgICAgIGlmIChuc2VjIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAtLXNlYzsKKyAgICAgICAgICAgICAgICAgICAgbnNlYyArPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBhbiBpbml0aWFsIHVuZGVycnVuIG9uIGZhc3QgdHJhY2tzIGFmdGVyIGV4aXRpbmcgc3RhbmRieSwKKyAgICAgICAgICAgICAgICAvLyBkbyBub3Qgc3RhcnQgcHVsbGluZyBkYXRhIGZyb20gdHJhY2tzIGFuZCBtaXhpbmcgdW50aWwgd2FybXVwIGlzIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgIC8vIFdhcm11cCBpcyBjb25zaWRlcmVkIGNvbXBsZXRlIGFmdGVyIHRoZSBlYXJsaWVyIG9mOgorICAgICAgICAgICAgICAgIC8vICAgICAgTUlOX1dBUk1VUF9DWUNMRVMgd3JpdGUoKSBhdHRlbXB0cyBhbmQgbGFzdCBvbmUgYmxvY2tzIGZvciBhdCBsZWFzdCB3YXJtdXBOcworICAgICAgICAgICAgICAgIC8vICAgICAgTUFYX1dBUk1VUF9DWUNMRVMgd3JpdGUoKSBhdHRlbXB0cy4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG92ZXJseSBjb25zZXJ2YXRpdmUsIGJ1dCB0byBnZXQgYmV0dGVyIGFjY3VyYWN5IHJlcXVpcmVzIGEgbmV3IEhBTCBBUEkuCisgICAgICAgICAgICAgICAgaWYgKCFpc1dhcm0gJiYgYXR0ZW1wdGVkV3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKz0gc2VjOworICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgKz0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA+PSAxMDAwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYysrOworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC09IDEwMDAwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKyt3YXJtdXBDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgIGlmICgobnNlYyA+IHdhcm11cE5zICYmIHdhcm11cEN5Y2xlcyA+PSBNSU5fV0FSTVVQX0NZQ0xFUykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FybXVwQ3ljbGVzID49IE1BWF9XQVJNVVBfQ1lDTEVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1lYXN1cmVkV2FybXVwVHMgPSBtZWFzdXJlZFdhcm11cFRzOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gd2FybXVwQ3ljbGVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNsZWVwTnMgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoaXNXYXJtKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwIHx8IG5zZWMgPiB1bmRlcnJ1bk5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgbG9nIG9jY2FzaW9uYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuZGVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVW5kZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG92ZXJydW5OcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZU5leHRPdmVycnVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU92ZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSB3b3JrcyB3aXRoIGEgdmFyaWFibGUgYnVmZmVyIGRlcHRoIGF1ZGlvIEhBTCB0aGF0IG5ldmVyIHB1bGxzIGF0IGEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJhdGUgPCB0aGFuIG92ZXJydW5OcyBwZXIgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gcmVjb3ZlcnMgZnJvbSBvdmVycnVuIGltbWVkaWF0ZWx5IGFmdGVyIHVuZGVycnVuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IHdvcmsgd2l0aCBhIG5vbi1ibG9ja2luZyBhdWRpbyBIQUwuCisgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcE5zID0gZm9yY2VOcyAtIG5zZWM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgICAgICAgICAgICAgIGlmIChpc1dhcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSB0aGUgRklGTyBxdWV1ZSBib3VuZHMKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGJvdW5kcyA9IChib3VuZHMgJiAweEZGRkYwMDAwKSB8ICgoYm91bmRzICsgMSkgJiAweEZGRkYpOworICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzICs9IDB4MTAwMDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBkZWx0YSB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbW9ub3RvbmljTnMgPSBuc2VjOworICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCAmJiBzZWMgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb25vdG9uaWNOcyArPSBzZWMgKiAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgcmF3IENQVSBsb2FkID0gZGVsdGEgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbG9hZE5zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIG5ld0xvYWQ7CisgICAgICAgICAgICAgICAgICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJm5ld0xvYWQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZExvYWRWYWxpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYyA9IG5ld0xvYWQudHZfc2VjIC0gb2xkTG9hZC50dl9zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyA9IG5ld0xvYWQudHZfbnNlYyAtIG9sZExvYWQudHZfbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnNlYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWMgKz0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE5zID0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCAmJiBzZWMgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWROcyArPSBzZWMgKiAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvYWQgPSBuZXdMb2FkOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKKyAgICAgICAgICAgICAgICAgICAgaW50IGNwdU51bSA9IHNjaGVkX2dldGNwdSgpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrSHogPSB0Y3UuZ2V0Q3B1a0h6KGNwdU51bSk7CisgICAgICAgICAgICAgICAgICAgIGtIeiA9IChrSHogPDwgNCkgfCAoY3B1TnVtICYgMHhGKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHZhbHVlcyBpbiBGSUZPIHF1ZXVlcyBmb3IgZHVtcHN5cworICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzdG9yZXMgIzEsICMyLCAjMyBhcmUgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2l0aCByZXNwZWN0IHRvIHN0b3JlICM0IGJlbG93CisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7CisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUxvYWROc1tpXSA9IGxvYWROczsKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tQ3B1a0h6W2ldID0ga0h6OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RvcmUgIzQgaXMgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gc3RvcmVzICMxLCAjMiwgIzMgYWJvdmUsIGJ1dAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV3ZXN0IG9wZW4gJiBvbGRlc3QgY2xvc2VkIGhhbHZlcyBhcmUgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyCisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUJvdW5kcyA9IGJvdW5kczsKKyAgICAgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCgiY3ljbGVfbXMiLCBtb25vdG9uaWNOcyAvIDEwMDAwMDApOworICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJsb2FkX3VzIiwgbG9hZE5zIC8gMTAwMCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcAorICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKKyAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRUcyA9IG5ld1RzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbW9ub3RvbmljIGNsb2NrIGlzIGJyb2tlbgorICAgICAgICAgICAgb2xkVHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOworICAgICAgICB9CisKKyAgICB9ICAgLy8gZm9yICg7OykKKworICAgIC8vIG5ldmVyIHJldHVybiAndHJ1ZSc7IFRocmVhZDo6X3RocmVhZExvb3AoKSBsb2NrcyBtdXRleCB3aGljaCBjYW4gcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgorfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzAzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0gKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gRmFzdFRocmVhZCBpcyB0aGUgY29tbW9uIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgRmFzdE1peGVyIGFuZCBGYXN0Q2FwdHVyZQorY2xhc3MgRmFzdFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworCitwdWJsaWM6CisgICAgICAgICAgICBGYXN0VGhyZWFkKCk7CisgICAgdmlydHVhbCB+RmFzdFRocmVhZCgpOworCitwcml2YXRlOgorICAgIC8vIGltcGxlbWVudCBUaHJlYWQ6OnRocmVhZExvb3AoKQorICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjYWxsb3V0cyB0byBzdWJjbGFzcyBpbiBzYW1lIGxleGljYWwgb3JkZXIgYXMgdGhleSB3ZXJlIGluIG9yaWdpbmFsIEZhc3RNaXhlci5jcHAKKyAgICAvLyBGSVhNRSBuZWVkIGNvbW1lbnRzCisgICAgdmlydHVhbCBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKnBvbGwoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldExvZyhOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIgX191bnVzZWQpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBvbklkbGUoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uRXhpdCgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdWJDbGFzc0NvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCkgPSAwOworCisgICAgLy8gRklYTUUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBuZWVkIGNvbW1lbnRzIGFuZCB0byBiZSByZW5hbWVkIHRvIGhhdmUgYW4gIm0iIHByZWZpeAorICAgIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqcHJldmlvdXM7CisgICAgY29uc3QgRmFzdFRocmVhZFN0YXRlICpjdXJyZW50OworICAgIHN0cnVjdCB0aW1lc3BlYyBvbGRUczsKKyAgICBib29sIG9sZFRzVmFsaWQ7CisgICAgbG9uZyBzbGVlcE5zOyAgIC8vIC0xOiBidXN5IHdhaXQsIDA6IHNjaGVkX3lpZWxkLCA+IDA6IG5hbm9zbGVlcAorICAgIGxvbmcgcGVyaW9kTnM7ICAgICAgLy8gZXhwZWN0ZWQgcGVyaW9kOyB0aGUgdGltZSByZXF1aXJlZCB0byByZW5kZXIgb25lIG1peCBidWZmZXIKKyAgICBsb25nIHVuZGVycnVuTnM7ICAgIC8vIHVuZGVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlCisgICAgbG9uZyBvdmVycnVuTnM7ICAgICAvLyBvdmVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGxlc3MgdGhhbiB0aGlzIHZhbHVlCisgICAgbG9uZyBmb3JjZU5zOyAgICAgICAvLyBpZiBvdmVycnVuIGRldGVjdGVkLCBmb3JjZSB0aGUgd3JpdGUgY3ljbGUgdG8gdGFrZSB0aGlzIG11Y2ggdGltZQorICAgIGxvbmcgd2FybXVwTnM7ICAgICAgLy8gd2FybXVwIGNvbXBsZXRlIHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRvIHRoaXMgdmFsdWUKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlICptRHVtbXlEdW1wU3RhdGU7CisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSAqZHVtcFN0YXRlOworICAgIGJvb2wgaWdub3JlTmV4dE92ZXJydW47ICAvLyB1c2VkIHRvIGlnbm9yZSBpbml0aWFsIG92ZXJydW4gYW5kIGZpcnN0IGFmdGVyIGFuIHVuZGVycnVuCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgc3RydWN0IHRpbWVzcGVjIG9sZExvYWQ7ICAgIC8vIHByZXZpb3VzIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCisgICAgYm9vbCBvbGRMb2FkVmFsaWQ7ICAvLyB3aGV0aGVyIG9sZExvYWQgaXMgdmFsaWQKKyAgICB1aW50MzJfdCBib3VuZHM7CisgICAgYm9vbCBmdWxsOyAgICAgICAgICAvLyB3aGV0aGVyIHdlIGhhdmUgY29sbGVjdGVkIGF0IGxlYXN0IG1TYW1wbGluZ04gc2FtcGxlcworI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgIFRocmVhZENwdVVzYWdlIHRjdTsgICAgIC8vIGZvciByZWFkaW5nIHRoZSBjdXJyZW50IENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6CisjZW5kaWYKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNvbGRHZW47ICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgorICAgIGJvb2wgaXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsIGZhbHNlIG1lYW5zIHdhaXQgZm9yIHdhcm11cCBiZWZvcmUgbWl4aW5nCisgICAgc3RydWN0IHRpbWVzcGVjIG1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCisgICAgdWludDMyX3Qgd2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCisgICAgTkJMb2c6OldyaXRlciBkdW1teUxvZ1dyaXRlcjsKKyAgICBOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXI7CisgICAgc3RhdHVzX3QgdGltZXN0YW1wU3RhdHVzOworCisgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQ7CisjaWYgMAorICAgIHNpemVfdCBmcmFtZUNvdW50OworI2VuZGlmCisgICAgYm9vbCBhdHRlbXB0ZWRXcml0ZTsKKworfTsgIC8vIGNsYXNzIEZhc3RUaHJlYWQKKworfSAgIC8vIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkNjI1NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0Zhc3RUaHJlYWRTdGF0ZTo6RmFzdFRocmVhZFN0YXRlKCkgOgorICAgIG1Db21tYW5kKElOSVRJQUwpLCBtQ29sZEZ1dGV4QWRkcihOVUxMKSwgbUNvbGRHZW4oMCksIG1EdW1wU3RhdGUoTlVMTCksIG1OQkxvZ1dyaXRlcihOVUxMKQorCit7Cit9CisKK0Zhc3RUaHJlYWRTdGF0ZTo6fkZhc3RUaHJlYWRTdGF0ZSgpCit7Cit9CisKKworRmFzdFRocmVhZER1bXBTdGF0ZTo6RmFzdFRocmVhZER1bXBTdGF0ZSgpIDoKKyAgICBtQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUwpLCBtVW5kZXJydW5zKDApLCBtT3ZlcnJ1bnMoMCksCisgICAgLyogbU1lYXN1cmVkV2FybXVwVHMoezAsIDB9KSwgKi8KKyAgICBtV2FybXVwQ3ljbGVzKDApCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgLCBtU2FtcGxpbmdOKDApLCBtQm91bmRzKDApCisjZW5kaWYKK3sKKyAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOworICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOworfQorCitGYXN0VGhyZWFkRHVtcFN0YXRlOjp+RmFzdFRocmVhZER1bXBTdGF0ZSgpCit7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjhhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9TVEFURV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfU1RBVEVfSAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEZhc3RUaHJlYWREdW1wU3RhdGU7CisKKy8vIFJlcHJlc2VudHMgYSBzaW5nbGUgc3RhdGUgb2YgYSBGYXN0VGhyZWFkCitzdHJ1Y3QgRmFzdFRocmVhZFN0YXRlIHsKKyAgICAgICAgICAgICAgICBGYXN0VGhyZWFkU3RhdGUoKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdFRocmVhZFN0YXRlKCk7CisKKyAgICB0eXBlZGVmIHVpbnQzMl90IENvbW1hbmQ7CisgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKKyAgICAgICAgSU5JVElBTCA9IDAsICAgICAgICAgICAgLy8gdXNlZCBvbmx5IGZvciB0aGUgaW5pdGlhbCBzdGF0ZQorICAgICAgICBIT1RfSURMRSA9IDEsICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIENPTERfSURMRSA9IDIsICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBmdXRleAorICAgICAgICBJRExFID0gMywgICAgICAgICAgICAgICAvLyBlaXRoZXIgSE9UX0lETEUgb3IgQ09MRF9JRExFCisgICAgICAgIEVYSVQgPSA0OyAgICAgICAgICAgICAgIC8vIGV4aXQgZnJvbSB0aHJlYWQKKyAgICAgICAgLy8gYWRkaXRpb25hbCB2YWx1ZXMgZGVmaW5lZCBwZXIgc3ViY2xhc3MKKyAgICBDb21tYW5kICAgICBtQ29tbWFuZDsgICAgICAgLy8gY3VycmVudCBjb21tYW5kCisgICAgaW50MzJfdCogICAgbUNvbGRGdXRleEFkZHI7IC8vIGZvciBDT0xEX0lETEUgb25seSwgcG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBmdXRleAorICAgIHVuc2lnbmVkICAgIG1Db2xkR2VuOyAgICAgICAvLyBpbmNyZW1lbnQgd2hlbiBDT0xEX0lETEUgaXMgcmVxdWVzdGVkIHNvIGl0J3Mgb25seSBwZXJmb3JtZWQgb25jZQorCisgICAgLy8gVGhpcyBtaWdodCBiZSBhIG9uZS10aW1lIGNvbmZpZ3VyYXRpb24gcmF0aGVyIHRoYW4gcGVyLXN0YXRlCisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSogbUR1bXBTdGF0ZTsgLy8gaWYgbm9uLU5VTEwsIHRoZW4gdXBkYXRlIGR1bXAgc3RhdGUgcGVyaW9kaWNhbGx5CisgICAgTkJMb2c6OldyaXRlciogbU5CTG9nV3JpdGVyOyAvLyBub24tYmxvY2tpbmcgbG9nZ2VyCisKK307ICAvLyBzdHJ1Y3QgRmFzdFRocmVhZFN0YXRlCisKKworLy8gRklYTUUgZXh0cmFjdCBjb21tb24gcGFydCBvZiBjb21tZW50IGF0IEZhc3RNaXhlckR1bXBTdGF0ZQorc3RydWN0IEZhc3RUaHJlYWREdW1wU3RhdGUgeworICAgIEZhc3RUaHJlYWREdW1wU3RhdGUoKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdFRocmVhZER1bXBTdGF0ZSgpOworCisgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIG1Db21tYW5kOyAgIC8vIGN1cnJlbnQgY29tbWFuZAorICAgIHVpbnQzMl90IG1VbmRlcnJ1bnM7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgdW5kZXJydW5zCisgICAgdWludDMyX3QgbU92ZXJydW5zOyAgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBvdmVycnVucworICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIG1lYXN1cmVkIHdhcm11cCB0aW1lCisgICAgdWludDMyX3QgbVdhcm11cEN5Y2xlczsgICAgIC8vIG51bWJlciBvZiBsb29wIGN5Y2xlcyByZXF1aXJlZCB0byB3YXJtdXAKKworI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgIC8vIFJlY2VudGx5IGNvbGxlY3RlZCBzYW1wbGVzIG9mIHBlci1jeWNsZSBtb25vdG9uaWMgdGltZSwgdGhyZWFkIENQVSB0aW1lLCBhbmQgQ1BVIGZyZXF1ZW5jeS4KKyAgICAvLyBrU2FtcGxpbmdOIGlzIG1heCBzaXplIG9mIHNhbXBsaW5nIGZyYW1lIChzdGF0aXN0aWNzKSwgYW5kIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IDB4ODAwMC4KKyAgICAvLyBUaGUgc2FtcGxlIGFycmF5cyBhcmUgdmlydHVhbGx5IGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIGNvbXBpbGUtdGltZSBjb25zdGFudCwKKyAgICAvLyBidXQgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYmFzZWQgb24gdGhlIHJ1bnRpbWUgcGFyYW1ldGVyIG1TYW1wbGluZ04uCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ04gPSAweDgwMDA7CisgICAgLy8gQ29ycmVzcG9uZGluZyBydW50aW1lIG1heGltdW0gc2l6ZSBvZiBzYW1wbGUgYXJyYXlzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOLgorICAgIHVpbnQzMl90IG1TYW1wbGluZ047CisgICAgLy8gVGhlIGJvdW5kcyBkZWZpbmUgdGhlIGludGVydmFsIG9mIHZhbGlkIHNhbXBsZXMsIGFuZCBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czoKKyAgICAvLyAgICAgIG5ld2VzdCBvcGVuIChleGNsdWRlZCkgZW5kcG9pbnQgICA9IGxvd2VyIDE2IGJpdHMgb2YgYm91bmRzLCBtb2R1bG8gTgorICAgIC8vICAgICAgb2xkZXN0IGNsb3NlZCAoaW5jbHVkZWQpIGVuZHBvaW50ID0gdXBwZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCisgICAgLy8gTnVtYmVyIG9mIHZhbGlkIHNhbXBsZXMgaXMgbmV3ZXN0IC0gb2xkZXN0LgorICAgIHVpbnQzMl90IG1Cb3VuZHM7ICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kcyBmb3IgbU1vbm90b25pY05zLCBtVGhyZWFkQ3B1TnMsIGFuZCBtQ3B1a0h6CisgICAgLy8gVGhlIGVsZW1lbnRzIGluIHRoZSAqTnMgYXJyYXlzIGFyZSBpbiB1bml0cyBvZiBuYW5vc2Vjb25kcyA8PSAzOTk5OTk5OTk5LgorICAgIHVpbnQzMl90IG1Nb25vdG9uaWNOc1trU2FtcGxpbmdOXTsgIC8vIGRlbHRhIG1vbm90b25pYyAod2FsbCBjbG9jaykgdGltZQorICAgIHVpbnQzMl90IG1Mb2FkTnNba1NhbXBsaW5nTl07ICAgICAgIC8vIGRlbHRhIENQVSBsb2FkIGluIHRpbWUKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICB1aW50MzJfdCBtQ3B1a0h6W2tTYW1wbGluZ05dOyAgICAgICAvLyBhYnNvbHV0ZSBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIeiwgYml0cyAwLTMgYXJlIENQVSMKKyNlbmRpZgorI2VuZGlmCisKK307ICAvLyBzdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZQorCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfU1RBVEVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCA0M2I3N2YzLi5lOWM2ODM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMzQsOSArMzQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncyk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2soKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiA9IDApOwpAQCAtOTMsNiArOTQsMTAgQEAKICAgICBib29sIGlzUmVhZHkoKSBjb25zdDsKICAgICB2b2lkIHNldFBhdXNlZCgpIHsgbVN0YXRlID0gUEFVU0VEOyB9CiAgICAgdm9pZCByZXNldCgpOworICAgIGJvb2wgaXNGbHVzaFBlbmRpbmcoKSBjb25zdCB7IHJldHVybiBtRmx1c2hId1BlbmRpbmc7IH0KKyAgICB2b2lkIGZsdXNoQWNrKCk7CisgICAgYm9vbCBpc1Jlc3VtZVBlbmRpbmcoKTsKKyAgICB2b2lkIHJlc3VtZUFjaygpOwogCiAgICAgYm9vbCBpc091dHB1dFRyYWNrKCkgY29uc3QgewogICAgICAgICByZXR1cm4gKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9DTlQpOwpAQCAtMTU0LDYgKzE1OSw3IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNJbnZhbGlkOyAvLyBub24tcmVzZXR0YWJsZSBsYXRjaCwgc2V0IGJ5IGludmFsaWRhdGUoKQogICAgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSogIG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzdW1lVG9TdG9wcGluZzsgLy8gdHJhY2sgd2FzIHBhdXNlZCBpbiBzdG9wcGluZyBzdGF0ZS4KKyAgICBib29sICAgICAgICAgICAgICAgIG1GbHVzaEh3UGVuZGluZzsgLy8gdHJhY2sgcmVxdWVzdHMgZm9yIHRocmVhZCBmbHVzaAogfTsgIC8vIGVuZCBvZiBUcmFjawogCiBjbGFzcyBUaW1lZFRyYWNrIDogcHVibGljIFRyYWNrIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCA1N2RlNTY4Li42ZmMwNmQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC00NSw3ICs0NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsgfQogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSk7CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgLy8gZm9yIG1TdGF0ZQpAQCAtNTksNSArNjIsMzMgQEAKICAgICAvLyByZWxlYXNlQnVmZmVyKCkgbm90IG92ZXJyaWRkZW4KIAogICAgIGJvb2wgICAgICAgICAgICAgICAgbU92ZXJmbG93OyAgLy8gb3ZlcmZsb3cgb24gbW9zdCByZWNlbnQgYXR0ZW1wdCB0byBmaWxsIGNsaWVudCBidWZmZXIKLSAgICBBdWRpb1JlY29yZFNlcnZlclByb3h5KiBtQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eTsKKworICAgICAgICAgICAvLyB1cGRhdGVkIGJ5IFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKKyAgICAgICAgICAgIEF1ZGlvUmVzYW1wbGVyICAgICAgICAgICAgICAgICAgICAgICptUmVzYW1wbGVyOworCisgICAgICAgICAgICAvLyBpbnRlcmxlYXZlZCBzdGVyZW8gcGFpcnMgb2YgZml4ZWQtcG9pbnQgUTQuMjcKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptUnNtcE91dEJ1ZmZlcjsKKyAgICAgICAgICAgIC8vIGN1cnJlbnQgYWxsb2NhdGVkIGZyYW1lIGNvdW50IGZvciB0aGUgYWJvdmUsIHdoaWNoIG1heSBiZSBsYXJnZXIgdGhhbiBuZWVkZWQKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wT3V0RnJhbWVDb3VudDsKKworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJblVucmVsOyAgIC8vIHVucmVsZWFzZWQgZnJhbWVzIHJlbWFpbmluZyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9zdCByZWNlbnQgZ2V0TmV4dEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkZWJ1ZyBvbmx5CisKKyAgICAgICAgICAgIC8vIHJvbGxpbmcgY291bnRlciB0aGF0IGlzIG5ldmVyIGNsZWFyZWQKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5Gcm9udDsgICAvLyBuZXh0IGF2YWlsYWJsZSBmcmFtZQorCisgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgbVNpbms7ICAvLyByZWZlcmVuY2VzIGNsaWVudCdzIGJ1ZmZlciBzaW5rIGluIHNoYXJlZCBtZW1vcnkKKworICAgICAgICAgICAgLy8gc3luYyBldmVudCB0cmlnZ2VyaW5nIGFjdHVhbCBhdWRpbyBjYXB0dXJlLiBGcmFtZXMgcmVhZCBiZWZvcmUgdGhpcyBldmVudCB3aWxsCisgICAgICAgICAgICAvLyBiZSBkcm9wcGVkIGFuZCB0aGVyZWZvcmUgbm90IHJlYWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgc3A8U3luY0V2ZW50PiAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdGFydEV2ZW50OworCisgICAgICAgICAgICAvLyBudW1iZXIgb2YgY2FwdHVyZWQgZnJhbWVzIHRvIGRyb3AgYWZ0ZXIgdGhlIHN0YXJ0IHN5bmMgZXZlbnQgaGFzIGJlZW4gcmVjZWl2ZWQuCisgICAgICAgICAgICAvLyB3aGVuIDwgMCwgbWF4aW11bSBmcmFtZXMgdG8gZHJvcCBiZWZvcmUgc3RhcnRpbmcgY2FwdHVyZSBldmVuIGlmIHN5bmMgZXZlbnQgaXMKKyAgICAgICAgICAgIC8vIG5vdCByZWNlaXZlZAorICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1RvRHJvcDsKKworICAgICAgICAgICAgLy8gdXNlZCBieSByZXNhbXBsZXIgdG8gZmluZCBzb3VyY2UgZnJhbWVzCisgICAgICAgICAgICBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciAqbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCBjYWM3ODVhLi5hZTNkZDhiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAKIC8vIE5CQUlPIGltcGxlbWVudGF0aW9ucwogI2luY2x1ZGUgPG1lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oPgpAQCAtMTA0LDEwICsxMDUsMTAgQEAKIC8vIG1heGltdW0gZGl2aWRlciBhcHBsaWVkIHRvIHRoZSBhY3RpdmUgc2xlZXAgdGltZSBpbiB0aGUgbWl4ZXIgdGhyZWFkIGxvb3AKIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4VGhyZWFkU2xlZXBUaW1lU2hpZnQgPSAyOwogCi0vLyBtaW5pbXVtIG5vcm1hbCBtaXggYnVmZmVyIHNpemUsIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMgcmF0aGVyIHRoYW4gZnJhbWVzCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga01pbk5vcm1hbE1peEJ1ZmZlclNpemVNcyA9IDIwOwotLy8gbWF4aW11bSBub3JtYWwgbWl4IGJ1ZmZlciBzaXplCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga01heE5vcm1hbE1peEJ1ZmZlclNpemVNcyA9IDI0OworLy8gbWluaW11bSBub3JtYWwgc2luayBidWZmZXIgc2l6ZSwgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcyByYXRoZXIgdGhhbiBmcmFtZXMKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTWluTm9ybWFsU2lua0J1ZmZlclNpemVNcyA9IDIwOworLy8gbWF4aW11bSBub3JtYWwgc2luayBidWZmZXIgc2l6ZQorc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhOb3JtYWxTaW5rQnVmZmVyU2l6ZU1zID0gMjQ7CiAKIC8vIE9mZmxvYWRlZCBvdXRwdXQgdGhyZWFkIHN0YW5kYnkgZGVsYXk6IGFsbG93cyB0cmFjayB0cmFuc2l0aW9uIHdpdGhvdXQgZ29pbmcgdG8gc3RhbmRieQogc3RhdGljIGNvbnN0IG5zZWNzX3Qga09mZmxvYWRTdGFuZGJ5RGVsYXlOcyA9IHNlY29uZHMoMSk7CkBAIC0xODUsNyArMTg2LDExIEBACiB7CiB9CiAKLXZvaWQgQ3B1U3RhdHM6OnNhbXBsZShjb25zdCBTdHJpbmc4ICZ0aXRsZSkgewordm9pZCBDcHVTdGF0czo6c2FtcGxlKGNvbnN0IFN0cmluZzggJnRpdGxlCisjaWZuZGVmIERFQlVHX0NQVV9VU0FHRQorICAgICAgICAgICAgICAgIF9fdW51c2VkCisjZW5kaWYKKyAgICAgICAgKSB7CiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCiAgICAgLy8gZ2V0IGN1cnJlbnQgdGhyZWFkJ3MgZGVsdGEgQ1BVIHRpbWUgaW4gd2FsbCBjbG9jayBucwogICAgIGRvdWJsZSB3Y05zOwpAQCAtMjY5LDggKzI3NCw5IEBACiAgICAgOiAgIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLAogICAgICAgICBtVHlwZSh0eXBlKSwKICAgICAgICAgbUF1ZGlvRmxpbmdlcihhdWRpb0ZsaW5nZXIpLAotICAgICAgICAvLyBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCwgbUZyYW1lU2l6ZSwgYW5kIG1Gb3JtYXQgYXJlCi0gICAgICAgIC8vIHNldCBieSBQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnMoKSBvciBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQorICAgICAgICAvLyBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCwgbUZyYW1lU2l6ZSwgbUZvcm1hdCwgbUJ1ZmZlclNpemUKKyAgICAgICAgLy8gYXJlIHNldCBieSBQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIG9yCisgICAgICAgIC8vIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICAgICAgbVBhcmFtU3RhdHVzKE5PX0VSUk9SKSwKICAgICAgICAgLy9GSVhNRTogbVN0YW5kYnkgc2hvdWxkIGJlIHRydWUgaGVyZS4gSXMgdGhpcyBzb21lIGtpbmQgb2YgaGFjaz8KICAgICAgICAgbVN0YW5kYnkoZmFsc2UpLCBtT3V0RGV2aWNlKG91dERldmljZSksIG1JbkRldmljZShpbkRldmljZSksCkBAIC0yOTcsNiArMzAzLDE3IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnJlYWR5VG9SdW4oKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IGluaXRDaGVjaygpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0koIkF1ZGlvRmxpbmdlcidzIHRocmVhZCAlcCByZWFkeSB0byBydW4iLCB0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiTm8gd29ya2luZyBhdWRpbyBkcml2ZXIgZm91bmQuIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpleGl0KCkKIHsKICAgICBBTE9HVigiVGhyZWFkQmFzZTo6ZXhpdCIpOwpAQCAtMzY5LDcgKzM4NiwxMyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cHJvY2Vzc0NvbmZpZ0V2ZW50cygpCiB7Ci0gICAgbUxvY2subG9jaygpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCk7Cit9CisKKy8vIHBvc3QgY29uZGl0aW9uOiBtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnByb2Nlc3NDb25maWdFdmVudHNfbCgpCit7CiAgICAgd2hpbGUgKCFtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKSkgewogICAgICAgICBBTE9HVigicHJvY2Vzc0NvbmZpZ0V2ZW50cygpIHJlbWFpbmluZyBldmVudHMgJWQiLCBtQ29uZmlnRXZlbnRzLnNpemUoKSk7CiAgICAgICAgIENvbmZpZ0V2ZW50ICpldmVudCA9IG1Db25maWdFdmVudHNbMF07CkBAIC0zNzcsMzUgKzQwMCw4MSBAQAogICAgICAgICAvLyByZWxlYXNlIG1Mb2NrIGJlZm9yZSBsb2NraW5nIEF1ZGlvRmxpbmdlciBtTG9jazogbG9jayBvcmRlciBpcyBhbHdheXMKICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIHRoZW4gVGhyZWFkQmFzZSB0byBhdm9pZCBjcm9zcyBkZWFkbG9jawogICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgc3dpdGNoKGV2ZW50LT50eXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1BSSU86IHsKLSAgICAgICAgICAgICAgICBQcmlvQ29uZmlnRXZlbnQgKnByaW9FdmVudCA9IHN0YXRpY19jYXN0PFByaW9Db25maWdFdmVudCAqPihldmVudCk7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUUgTmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIGhhcyBiZSBkb25lIGFzeW5jaHJvbm91c2x5Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eShwcmlvRXZlbnQtPnBpZCgpLCBwcmlvRXZlbnQtPnRpZCgpLCBwcmlvRXZlbnQtPnByaW8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyphc3luY2hyb25vdXMqLyk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJQb2xpY3kgU0NIRURfRklGTyBwcmlvcml0eSAlZCBpcyB1bmF2YWlsYWJsZSBmb3IgcGlkICVkIHRpZCAlZDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvRXZlbnQtPnByaW8oKSwgcHJpb0V2ZW50LT5waWQoKSwgcHJpb0V2ZW50LT50aWQoKSwgZXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDRkdfRVZFTlRfSU86IHsKLSAgICAgICAgICAgICAgICBJb0NvbmZpZ0V2ZW50ICppb0V2ZW50ID0gc3RhdGljX2Nhc3Q8SW9Db25maWdFdmVudCAqPihldmVudCk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+bUxvY2subG9jaygpOworICAgICAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKCkpIHsKKyAgICAgICAgY2FzZSBDRkdfRVZFTlRfUFJJTzogeworICAgICAgICAgICAgUHJpb0NvbmZpZ0V2ZW50ICpwcmlvRXZlbnQgPSBzdGF0aWNfY2FzdDxQcmlvQ29uZmlnRXZlbnQgKj4oZXZlbnQpOworICAgICAgICAgICAgLy8gRklYTUUgTmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIGhhcyBiZSBkb25lIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KHByaW9FdmVudC0+cGlkKCksIHByaW9FdmVudC0+dGlkKCksIHByaW9FdmVudC0+cHJpbygpLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlBvbGljeSBTQ0hFRF9GSUZPIHByaW9yaXR5ICVkIGlzIHVuYXZhaWxhYmxlIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgcHJpb0V2ZW50LT5wcmlvKCksIHByaW9FdmVudC0+cGlkKCksIHByaW9FdmVudC0+dGlkKCksIGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX0lPOiB7CisgICAgICAgICAgICBJb0NvbmZpZ0V2ZW50ICppb0V2ZW50ID0gc3RhdGljX2Nhc3Q8SW9Db25maWdFdmVudCAqPihldmVudCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1BdWRpb0ZsaW5nZXItPm1Mb2NrKTsKICAgICAgICAgICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpb0V2ZW50LT5ldmVudCgpLCBpb0V2ZW50LT5wYXJhbSgpKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5tTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCJwcm9jZXNzQ29uZmlnRXZlbnRzKCkgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPnR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgicHJvY2Vzc0NvbmZpZ0V2ZW50cygpIHVua25vd24gZXZlbnQgdHlwZSAlZCIsIGV2ZW50LT50eXBlKCkpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlIGV2ZW50OwogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgfQotICAgIG1Mb2NrLnVubG9jaygpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEJhc2UoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQorU3RyaW5nOCBjaGFubmVsTWFza1RvU3RyaW5nKGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2ssIGJvb2wgb3V0cHV0KSB7CisgICAgU3RyaW5nOCBzOworICAgIGlmIChvdXRwdXQpIHsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgiZnJvbnQtbGVmdCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJmcm9udC1yaWdodCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtY2VudGVyLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSBzLmFwcGVuZCgibG93IGZyZXEsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCkgcy5hcHBlbmQoImJhY2stbGVmdCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCkgcy5hcHBlbmQoImJhY2stcmlnaHQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtbGVmdC1vZi1jZW50ZXIsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUikgcy5hcHBlbmQoImZyb250LXJpZ2h0LW9mLWNlbnRlciwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJiYWNrLWNlbnRlciwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUKSBzLmFwcGVuZCgic2lkZS1sZWZ0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUKSBzLmFwcGVuZCgic2lkZS1yaWdodCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0NFTlRFUikgcy5hcHBlbmQoInRvcC1jZW50ZXIgLCIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgidG9wLWZyb250LWxlZnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtY2VudGVyLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtcmlnaHQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJ0b3AtYmFjay1sZWZ0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCkgcy5hcHBlbmQoInRvcC1iYWNrLXJpZ2h0LCAiICk7CisgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVCkgcy5hcHBlbmQoImxlZnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUklHSFQpIHMuYXBwZW5kKCJyaWdodCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVCkgcy5hcHBlbmQoImZyb250LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0spIHMuYXBwZW5kKCJiYWNrLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgibGVmdC1wcm9jZXNzZWQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUklHSFRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgicmlnaHQtcHJvY2Vzc2VkLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0ZST05UX1BST0NFU1NFRCkgcy5hcHBlbmQoImZyb250LXByb2Nlc3NlZCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX1BST0NFU1NFRCkgcy5hcHBlbmQoImJhY2stcHJvY2Vzc2VkLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1BSRVNTVVJFKSBzLmFwcGVuZCgicHJlc3N1cmUsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTKSBzLmFwcGVuZCgiWCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9ZX0FYSVMpIHMuYXBwZW5kKCJZLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1pfQVhJUykgcy5hcHBlbmQoIlosICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LKSBzLmFwcGVuZCgidm9pY2UtdXBsaW5rLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykgcy5hcHBlbmQoInZvaWNlLWRubGluaywgIik7CisgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfSU5fQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOworICAgIH0KKyAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICBpZiAocy5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgY2hhciAqc3RyID0gcy5sb2NrQnVmZmVyKGxlbik7CisgICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBCYXNlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTQxMyw0NyArNDgyLDQzIEBACiAKICAgICBib29sIGxvY2tlZCA9IEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUxvY2spOwogICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgInRocmVhZCAlcCBtYXliZSBkZWFkIGxvY2tlZFxuIiwgdGhpcyk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgZmRwcmludGYoZmQsICJ0aHJlYWQgJXAgbWF5YmUgZGVhZCBsb2NrZWRcbiIsIHRoaXMpOwogICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgImlvIGhhbmRsZTogJWRcbiIsIG1JZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRJRDogJWRcbiIsIGdldFRpZCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAic3RhbmRieTogJWRcbiIsIG1TdGFuZGJ5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiU2FtcGxlIHJhdGU6ICV1XG4iLCBtU2FtcGxlUmF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkhBTCBmcmFtZSBjb3VudDogJXp1XG4iLCBtRnJhbWVDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNoYW5uZWwgQ291bnQ6ICV1XG4iLCBtQ2hhbm5lbENvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2hhbm5lbCBNYXNrOiAweCUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJGcmFtZSBzaXplOiAlenVcbiIsIG1GcmFtZVNpemUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuUGVuZGluZyBzZXRQYXJhbWV0ZXJzIGNvbW1hbmRzOiBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgSW5kZXggQ29tbWFuZCIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5ld1BhcmFtZXRlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4gJTAyenUgICAgIiwgaSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChtTmV3UGFyYW1ldGVyc1tpXSk7CisgICAgZmRwcmludGYoZmQsICIgIEkvTyBoYW5kbGU6ICVkXG4iLCBtSWQpOworICAgIGZkcHJpbnRmKGZkLCAiICBUSUQ6ICVkXG4iLCBnZXRUaWQoKSk7CisgICAgZmRwcmludGYoZmQsICIgIFN0YW5kYnk6ICVzXG4iLCBtU3RhbmRieSA/ICJ5ZXMiIDogIm5vIik7CisgICAgZmRwcmludGYoZmQsICIgIFNhbXBsZSByYXRlOiAldVxuIiwgbVNhbXBsZVJhdGUpOworICAgIGZkcHJpbnRmKGZkLCAiICBIQUwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbUZyYW1lQ291bnQpOworICAgIGZkcHJpbnRmKGZkLCAiICBIQUwgYnVmZmVyIHNpemU6ICV1IGJ5dGVzXG4iLCBtQnVmZmVyU2l6ZSk7CisgICAgZmRwcmludGYoZmQsICIgIENoYW5uZWwgQ291bnQ6ICV1XG4iLCBtQ2hhbm5lbENvdW50KTsKKyAgICBmZHByaW50ZihmZCwgIiAgQ2hhbm5lbCBNYXNrOiAweCUwOHggKCVzKVxuIiwgbUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgY2hhbm5lbE1hc2tUb1N0cmluZyhtQ2hhbm5lbE1hc2ssIG1UeXBlICE9IFJFQ09SRCkuc3RyaW5nKCkpOworICAgIGZkcHJpbnRmKGZkLCAiICBGb3JtYXQ6IDB4JXggKCVzKVxuIiwgbUZvcm1hdCwgZm9ybWF0VG9TdHJpbmcobUZvcm1hdCkpOworICAgIGZkcHJpbnRmKGZkLCAiICBGcmFtZSBzaXplOiAlenVcbiIsIG1GcmFtZVNpemUpOworICAgIGZkcHJpbnRmKGZkLCAiICBQZW5kaW5nIHNldFBhcmFtZXRlcnMgY29tbWFuZHM6Iik7CisgICAgc2l6ZV90IG51bVBhcmFtcyA9IG1OZXdQYXJhbWV0ZXJzLnNpemUoKTsKKyAgICBpZiAobnVtUGFyYW1zKSB7CisgICAgICAgIGZkcHJpbnRmKGZkLCAiXG4gICBJbmRleCBDb21tYW5kIik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGFyYW1zOyArK2kpIHsKKyAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiXG4gICAlMDJ6dSAgICAiLCBpKTsKKyAgICAgICAgICAgIGZkcHJpbnRmKGZkLCBtTmV3UGFyYW1ldGVyc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgZmRwcmludGYoZmQsICJcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZkcHJpbnRmKGZkLCAiIG5vbmVcbiIpOwogICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuXG5QZW5kaW5nIGNvbmZpZyBldmVudHM6IFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbmZpZ0V2ZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBtQ29uZmlnRXZlbnRzW2ldLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmZHByaW50ZihmZCwgIiAgUGVuZGluZyBjb25maWcgZXZlbnRzOiIpOworICAgIHNpemVfdCBudW1Db25maWcgPSBtQ29uZmlnRXZlbnRzLnNpemUoKTsKKyAgICBpZiAobnVtQ29uZmlnKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ29uZmlnOyBpKyspIHsKKyAgICAgICAgICAgIG1Db25maWdFdmVudHNbaV0tPmR1bXAoYnVmZmVyLCBTSVpFKTsKKyAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiXG4gICAgJXMiLCBidWZmZXIpOworICAgICAgICB9CisgICAgICAgIGZkcHJpbnRmKGZkLCAiXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmZHByaW50ZihmZCwgIiBub25lXG4iKTsKICAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogCiAgICAgaWYgKGxvY2tlZCkgewogICAgICAgICBtTG9jay51bmxvY2soKTsKQEAgLTQ2NiwxMCArNTMxLDExIEBACiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbi0gJXp1IEVmZmVjdCBDaGFpbnM6XG4iLCBtRWZmZWN0Q2hhaW5zLnNpemUoKSk7CisgICAgc2l6ZV90IG51bUVmZmVjdENoYWlucyA9IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgJXp1IEVmZmVjdCBDaGFpbnNcbiIsIG51bUVmZmVjdENoYWlucyk7CiAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RDaGFpbnM7ICsraSkgewogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtRWZmZWN0Q2hhaW5zW2ldOwogICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewogICAgICAgICAgICAgY2hhaW4tPmR1bXAoZmQsIGFyZ3MpOwpAQCAtNTg2LDcgKzY1Miw3IEBACiAgICAgbVBvd2VyTWFuYWdlci5jbGVhcigpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlBNRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKIHsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKQEAgLTczOSw4ICs4MDUsNyBAQAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICBpbnQgKmVuYWJsZWQsCi0gICAgICAgIHN0YXR1c190ICpzdGF0dXMKLSAgICAgICAgKQorICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0OwogICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlOwpAQCAtNzU2LDYgKzgyMSwxNSBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCisgICAgLy8gUmVqZWN0IGFueSBlZmZlY3Qgb24gRGlyZWN0IG91dHB1dCB0aHJlYWRzIGZvciBub3csIHNpbmNlIHRoZSBmb3JtYXQgb2YKKyAgICAvLyBtU2lua0J1ZmZlciBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggZWZmZWN0IHByb2Nlc3NpbmcgKFBDTSAxNiBzdGVyZW8pLgorICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdF9sKCkgQ2Fubm90IGFkZCBlZmZlY3QgJXMgb24gRGlyZWN0IG91dHB1dCB0eXBlIHRocmVhZCAlcyIsCisgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgbU5hbWUpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCiAgICAgLy8gQWxsb3cgZ2xvYmFsIGVmZmVjdHMgb25seSBvbiBvZmZsb2FkZWQgYW5kIG1peGVyIHRocmVhZHMKICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewogICAgICAgICBzd2l0Y2ggKG1UeXBlKSB7CkBAIC04MjksNyArOTAzLDEwIEBACiAgICAgICAgIH0KICAgICAgICAgLy8gY3JlYXRlIGVmZmVjdCBoYW5kbGUgYW5kIGNvbm5lY3QgaXQgdG8gZWZmZWN0IG1vZHVsZQogICAgICAgICBoYW5kbGUgPSBuZXcgRWZmZWN0SGFuZGxlKGVmZmVjdCwgY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5KTsKLSAgICAgICAgbFN0YXR1cyA9IGVmZmVjdC0+YWRkSGFuZGxlKGhhbmRsZS5nZXQoKSk7CisgICAgICAgIGxTdGF0dXMgPSBoYW5kbGUtPmluaXRDaGVjaygpOworICAgICAgICBpZiAobFN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgbFN0YXR1cyA9IGVmZmVjdC0+YWRkSGFuZGxlKGhhbmRsZS5nZXQoKSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKGVuYWJsZWQgIT0gTlVMTCkgewogICAgICAgICAgICAgKmVuYWJsZWQgPSAoaW50KWVmZmVjdC0+aXNFbmFibGVkKCk7CiAgICAgICAgIH0KQEAgLTg1MCw5ICs5MjcsNyBAQAogICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICB9CiAKLSAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKQEAgLTEwMDEsOCArMTA3NiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdCB0eXBlKQogICAgIDogICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIGRldmljZSwgQVVESU9fREVWSUNFX05PTkUsIHR5cGUpLAotICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCgwKSwgbU1peEJ1ZmZlcihOVUxMKSwKLSAgICAgICAgbUFsbG9jTWl4QnVmZmVyKE5VTEwpLCBtU3VzcGVuZGVkKDApLCBtQnl0ZXNXcml0dGVuKDApLAorICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCgwKSwgbVNpbmtCdWZmZXIoTlVMTCksCisgICAgICAgIG1NaXhlckJ1ZmZlckVuYWJsZWQoZmFsc2UpLAorICAgICAgICBtTWl4ZXJCdWZmZXIoTlVMTCksCisgICAgICAgIG1NaXhlckJ1ZmZlclNpemUoMCksCisgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfSU5WQUxJRCksCisgICAgICAgIG1NaXhlckJ1ZmZlclZhbGlkKGZhbHNlKSwKKyAgICAgICAgbUVmZmVjdEJ1ZmZlckVuYWJsZWQoZmFsc2UpLAorICAgICAgICBtRWZmZWN0QnVmZmVyKE5VTEwpLAorICAgICAgICBtRWZmZWN0QnVmZmVyU2l6ZSgwKSwKKyAgICAgICAgbUVmZmVjdEJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfSU5WQUxJRCksCisgICAgICAgIG1FZmZlY3RCdWZmZXJWYWxpZChmYWxzZSksCisgICAgICAgIG1TdXNwZW5kZWQoMCksIG1CeXRlc1dyaXR0ZW4oMCksCiAgICAgICAgIG1BY3RpdmVUcmFja3NHZW5lcmF0aW9uKDApLAogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBib2R5CiAgICAgICAgIG1PdXRwdXQob3V0cHV0KSwKQEAgLTEwNDQsMTEgKzExMjksMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCk7CisgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOwogCiAgICAgLy8gbVN0cmVhbVR5cGVzW0FVRElPX1NUUkVBTV9DTlRdIGlzIGluaXRpYWxpemVkIGJ5IHN0cmVhbV90eXBlX3QgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgIC8vIFRoZXJlIGlzIG5vIEFVRElPX1NUUkVBTV9NSU4sIGFuZCArKyBvcGVyYXRvciBkb2VzIG5vdCBjb21waWxlCi0gICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOworICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOwogICAgICAgICAgICAgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIChzdHJlYW0gKyAxKSkgewogICAgICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWUgPSBtQXVkaW9GbGluZ2VyLT5zdHJlYW1Wb2x1bWVfbChzdHJlYW0pOwogICAgICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS5tdXRlID0gbUF1ZGlvRmxpbmdlci0+c3RyZWFtTXV0ZV9sKHN0cmVhbSk7CkBAIC0xMDYwLDcgKzExNDUsOSBAQAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6flBsYXliYWNrVGhyZWFkKCkKIHsKICAgICBtQXVkaW9GbGluZ2VyLT51bnJlZ2lzdGVyV3JpdGVyKG1OQkxvZ1dyaXRlcik7Ci0gICAgZGVsZXRlIFtdIG1BbGxvY01peEJ1ZmZlcjsKKyAgICBmcmVlKG1TaW5rQnVmZmVyKTsKKyAgICBmcmVlKG1NaXhlckJ1ZmZlcik7CisgICAgZnJlZShtRWZmZWN0QnVmZmVyKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTEwNzAsMTMgKzExNTcsMTMgQEAKICAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJPdXRwdXQgdGhyZWFkICVwIHN0cmVhbSB2b2x1bWVzIGluIGRCOlxuICAgICIsIHRoaXMpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgU3RyZWFtIHZvbHVtZXMgaW4gZEI6ICIpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgKytpKSB7CiAgICAgICAgIGNvbnN0IHN0cmVhbV90eXBlX3QgKnN0ID0gJm1TdHJlYW1UeXBlc1tpXTsKICAgICAgICAgaWYgKGkgPiAwKSB7CkBAIC0xMDkxLDc1ICsxMTc4LDY5IEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0Lmxlbmd0aCgpKTsKICAgICByZXN1bHQuY2xlYXIoKTsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgdHJhY2tzXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKLSAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXRwdXQgdGhyZWFkICVwIGFjdGl2ZSB0cmFja3NcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KICAgICAvLyBUaGVzZSB2YWx1ZXMgYXJlICJyYXciOyB0aGV5IHdpbGwgd3JhcCBhcm91bmQuICBTZWUgcHJlcGFyZVRyYWNrc19sKCkgZm9yIGEgYmV0dGVyIHdheS4KICAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgdW5kZXJydW5zID0gZ2V0RmFzdFRyYWNrVW5kZXJydW5zKDApOwotICAgIGZkcHJpbnRmKGZkLCAiTm9ybWFsIG1peGVyIHJhdyB1bmRlcnJ1biBjb3VudGVyczogcGFydGlhbD0ldSBlbXB0eT0ldVxuIiwKKyAgICBmZHByaW50ZihmZCwgIiAgTm9ybWFsIG1peGVyIHJhdyB1bmRlcnJ1biBjb3VudGVyczogcGFydGlhbD0ldSBlbXB0eT0ldVxuIiwKICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsLCB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkpOworCisgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1UcmFja3Muc2l6ZSgpOworICAgIHNpemVfdCBudW1hY3RpdmUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICBmZHByaW50ZihmZCwgIiAgJWQgVHJhY2tzIiwgbnVtdHJhY2tzKTsKKyAgICBzaXplX3QgbnVtYWN0aXZlc2VlbiA9IDA7CisgICAgaWYgKG51bXRyYWNrcykgeworICAgICAgICBmZHByaW50ZihmZCwgIiBvZiB3aGljaCAlZCBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOworICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CisgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICBib29sIGFjdGl2ZSA9IG1BY3RpdmVUcmFja3MuaW5kZXhPZih0cmFjaykgPj0gMDsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorICAgIGlmIChudW1hY3RpdmVzZWVuICE9IG51bWFjdGl2ZSkgeworICAgICAgICAvLyBzb21lIHRyYWNrcyBpbiB0aGUgYWN0aXZlIGxpc3Qgd2VyZSBub3QgaW4gdGhlIHRyYWNrcyBsaXN0CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCisgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYWN0aXZlOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHRyYWNrICE9IDAgJiYgbVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIHRydWUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dCB0aHJlYWQgJXAgaW50ZXJuYWxzXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiTm9ybWFsIGZyYW1lIGNvdW50OiAlenVcbiIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAibGFzdCB3cml0ZSBvY2N1cnJlZCAobXNlY3MpOiAlbGx1XG4iLAotICAgICAgICAgICAgbnMybXMoc3lzdGVtVGltZSgpIC0gbUxhc3RXcml0ZVRpbWUpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAidG90YWwgd3JpdGVzOiAlZFxuIiwgbU51bVdyaXRlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgImRlbGF5ZWQgd3JpdGVzOiAlZFxuIiwgbU51bURlbGF5ZWRXcml0ZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJibG9ja2VkIGluIHdyaXRlOiAlZFxuIiwgbUluV3JpdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJzdXNwZW5kIGNvdW50OiAlZFxuIiwgbVN1c3BlbmRlZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIm1peCBidWZmZXIgOiAlcFxuIiwgbU1peEJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIGZkcHJpbnRmKGZkLCAiRmFzdCB0cmFjayBhdmFpbE1hc2s9JSN4XG4iLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKKyAgICBmZHByaW50ZihmZCwgIlxuT3V0cHV0IHRocmVhZCAlcDpcbiIsIHRoaXMpOworICAgIGZkcHJpbnRmKGZkLCAiICBOb3JtYWwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOworICAgIGZkcHJpbnRmKGZkLCAiICBMYXN0IHdyaXRlIG9jY3VycmVkIChtc2Vjcyk6ICVsbHVcbiIsIG5zMm1zKHN5c3RlbVRpbWUoKSAtIG1MYXN0V3JpdGVUaW1lKSk7CisgICAgZmRwcmludGYoZmQsICIgIFRvdGFsIHdyaXRlczogJWRcbiIsIG1OdW1Xcml0ZXMpOworICAgIGZkcHJpbnRmKGZkLCAiICBEZWxheWVkIHdyaXRlczogJWRcbiIsIG1OdW1EZWxheWVkV3JpdGVzKTsKKyAgICBmZHByaW50ZihmZCwgIiAgQmxvY2tlZCBpbiB3cml0ZTogJXNcbiIsIG1JbldyaXRlID8gInllcyIgOiAibm8iKTsKKyAgICBmZHByaW50ZihmZCwgIiAgU3VzcGVuZCBjb3VudDogJWRcbiIsIG1TdXNwZW5kZWQpOworICAgIGZkcHJpbnRmKGZkLCAiICBTaW5rIGJ1ZmZlciA6ICVwXG4iLCBtU2lua0J1ZmZlcik7CisgICAgZmRwcmludGYoZmQsICIgIE1peGVyIGJ1ZmZlcjogJXBcbiIsIG1NaXhlckJ1ZmZlcik7CisgICAgZmRwcmludGYoZmQsICIgIEVmZmVjdCBidWZmZXI6ICVwXG4iLCBtRWZmZWN0QnVmZmVyKTsKKyAgICBmZHByaW50ZihmZCwgIiAgRmFzdCB0cmFjayBhdmFpbE1hc2s9JSN4XG4iLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKIAogICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKIH0KIAogLy8gVGhyZWFkIHZpcnR1YWxzCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkeVRvUnVuKCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0Q2hlY2soKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dJKCJBdWRpb0ZsaW5nZXIncyB0aHJlYWQgJXAgcmVhZHkgdG8gcnVuIiwgdGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIk5vIHdvcmtpbmcgYXVkaW8gZHJpdmVyIGZvdW5kLiIpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQogewpAQCAtMTE4Miw3ICsxMjYzLDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLApAQCAtMTE5MCw2ICsxMjcxLDcgQEAKICAgICAgICAgaW50IHVpZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9ICpwRnJhbWVDb3VudDsKICAgICBzcDxUcmFjaz4gdHJhY2s7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKIApAQCAtMTI1NiwyOSArMTMzOCwzNiBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQorICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAKLSAgICBpZiAobVR5cGUgPT0gRElSRUNUKSB7CisgICAgc3dpdGNoIChtVHlwZSkgeworCisgICAgY2FzZSBESVJFQ1Q6CiAgICAgICAgIGlmICgoZm9ybWF0ICYgQVVESU9fRk9STUFUX01BSU5fTUFTSykgPT0gQVVESU9fRk9STUFUX1BDTSkgewogICAgICAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbE1hc2sgIT0gbUNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBzYW1wbGVSYXRlICV1IGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgMHglMDh4ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IHNhbXBsZVJhdGUgJXUgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgMHglMDh4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICUjeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBtT3V0cHV0LCBtRm9ybWF0KTsKICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gT0ZGTE9BRCkgeworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT0ZGTE9BRDoKICAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbE1hc2sgIT0gbUNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IHNhbXBsZVJhdGUgJWQgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAweCUwOHggXCIiCi0gICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICVkIiwKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAweCUwOHggXCIiCisgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICUjeCIsCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIG1PdXRwdXQsIG1Gb3JtYXQpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKICAgICAgICAgaWYgKChmb3JtYXQgJiBBVURJT19GT1JNQVRfTUFJTl9NQVNLKSAhPSBBVURJT19GT1JNQVRfUENNKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBmb3JtYXQgJWQgXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIG91dHB1dCAlcCB3aXRoIGZvcm1hdCAlZCIsCisgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBmb3JtYXQgJSN4IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJSN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgbU91dHB1dCwgbUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CkBAIC0xMjg5LDExICsxMzc4LDEzIEBACiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CisgICAgICAgIGJyZWFrOworCiAgICAgfQogCiAgICAgbFN0YXR1cyA9IGluaXRDaGVjaygpOwogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIGF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIApAQCAtMTMyNSwxMiArMTQxNiwxNCBAQAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQsIHVpZCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodHJhY2sgPT0gMCB8fCB0cmFjay0+Z2V0Q2JsaygpID09IE5VTEwgfHwgdHJhY2stPm5hbWUoKSA8IDApIHsKLSAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CisgICAgICAgIC8vIG5ldyBUcmFjayBhbHdheXMgcmV0dXJucyBub24tTlVMTCwKKyAgICAgICAgLy8gYnV0IFRpbWVkVHJhY2s6OmNyZWF0ZSgpIGlzIGEgZmFjdG9yeSB0aGF0IGNvdWxkIGZhaWwgYnkgcmV0dXJuaW5nIE5VTEwKKyAgICAgICAgbFN0YXR1cyA9IHRyYWNrICE9IDAgPyB0cmFjay0+aW5pdENoZWNrKCkgOiAoc3RhdHVzX3QpIE5PX01FTU9SWTsKKyAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgaW5pdENoZWNrIGZhaWxlZCAlZDsgbm8gY29udHJvbCBibG9jaz8iLCBsU3RhdHVzKTsKICAgICAgICAgICAgIC8vIHRyYWNrIG11c3QgYmUgY2xlYXJlZCBmcm9tIHRoZSBjYWxsZXIgYXMgdGhlIGNhbGxlciBoYXMgdGhlIEFGIGxvY2sKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQotCiAgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKIAogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CkBAIC0xMzUyLDkgKzE0NDUsNyBAQAogICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKIAogRXhpdDoKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gdHJhY2s7CiB9CiAKQEAgLTE0NzMsOSArMTU2NCw3IEBACiAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIH0KIAotICAgIEFMT0dWKCJzaWduYWwgcGxheWJhY2sgdGhyZWFkIik7Ci0gICAgYnJvYWRjYXN0X2woKTsKLQorICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE2MDEsNyArMTY5MCw3IEBACiAKIC8vIHN0YXRpYwogaW50IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmFtIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQogewogICAgIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKm1lID0gKEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKiljb29raWU7CkBAIC0xNjIwLDI5ICsxNzA5LDMwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnMoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKIHsKLSAgICAvLyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgbm8gd2F5IG9mIHJlY292ZXJpbmcgZnJvbSBlcnJvcnMgaGVyZSwgaGVuY2UgdGhlIExPR19GQVRBTAorICAgIC8vIHVuZm9ydHVuYXRlbHkgd2UgaGF2ZSBubyB3YXkgb2YgcmVjb3ZlcmluZyBmcm9tIGVycm9ycyBoZXJlLCBoZW5jZSB0aGUgTE9HX0FMV0FZU19GQVRBTAogICAgIG1TYW1wbGVSYXRlID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUNoYW5uZWxNYXNrID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChtQ2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIExPR19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtQ2hhbm5lbE1hc2spOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1DaGFubmVsTWFzayk7CiAgICAgfQogICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpICYmIG1DaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3Qgc3VwcG9ydGVkIGZvciBtaXhlZCBvdXRwdXQ7ICIKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0OyAiCiAgICAgICAgICAgICAgICAgIm11c3QgYmUgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIiwgbUNoYW5uZWxNYXNrKTsKICAgICB9CiAgICAgbUNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1DaGFubmVsTWFzayk7CiAgICAgbUZvcm1hdCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChtRm9ybWF0KSkgewotICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJWQgbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtRm9ybWF0KTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGZvcm1hdCAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtRm9ybWF0KTsKICAgICB9CiAgICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykgJiYgbUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJWQgbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0OyBtdXN0IGJlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIiwKLSAgICAgICAgICAgICAgICBtRm9ybWF0KTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGZvcm1hdCAlI3ggbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0OyAiCisgICAgICAgICAgICAgICAgIm11c3QgYmUgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiLCBtRm9ybWF0KTsKICAgICB9CiAgICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgbUZyYW1lQ291bnQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKSAvIG1GcmFtZVNpemU7CisgICAgbUJ1ZmZlclNpemUgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtRnJhbWVDb3VudCA9IG1CdWZmZXJTaXplIC8gbUZyYW1lU2l6ZTsKICAgICBpZiAobUZyYW1lQ291bnQgJiAxNSkgewogICAgICAgICBBTE9HVygiSEFMIG91dHB1dCBidWZmZXIgc2l6ZSBpcyAldSBmcmFtZXMgYnV0IEF1ZGlvTWl4ZXIgcmVxdWlyZXMgbXVsdGlwbGVzIG9mIDE2IGZyYW1lcyIsCiAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQpOwpAQCAtMTY1NywxMiArMTc0NywxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQ2FsY3VsYXRlIHNpemUgb2Ygbm9ybWFsIG1peCBidWZmZXIgcmVsYXRpdmUgdG8gdGhlIEhBTCBvdXRwdXQgYnVmZmVyIHNpemUKKyAgICAvLyBDYWxjdWxhdGUgc2l6ZSBvZiBub3JtYWwgc2luayBidWZmZXIgcmVsYXRpdmUgdG8gdGhlIEhBTCBvdXRwdXQgYnVmZmVyIHNpemUKICAgICBkb3VibGUgbXVsdGlwbGllciA9IDEuMDsKICAgICBpZiAobVR5cGUgPT0gTUlYRVIgJiYgKGtVc2VGYXN0TWl4ZXIgPT0gRmFzdE1peGVyX1N0YXRpYyB8fAogICAgICAgICAgICAga1VzZUZhc3RNaXhlciA9PSBGYXN0TWl4ZXJfRHluYW1pYykpIHsKLSAgICAgICAgc2l6ZV90IG1pbk5vcm1hbEZyYW1lQ291bnQgPSAoa01pbk5vcm1hbE1peEJ1ZmZlclNpemVNcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7Ci0gICAgICAgIHNpemVfdCBtYXhOb3JtYWxGcmFtZUNvdW50ID0gKGtNYXhOb3JtYWxNaXhCdWZmZXJTaXplTXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOworICAgICAgICBzaXplX3QgbWluTm9ybWFsRnJhbWVDb3VudCA9IChrTWluTm9ybWFsU2lua0J1ZmZlclNpemVNcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CisgICAgICAgIHNpemVfdCBtYXhOb3JtYWxGcmFtZUNvdW50ID0gKGtNYXhOb3JtYWxTaW5rQnVmZmVyU2l6ZU1zICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKICAgICAgICAgLy8gcm91bmQgdXAgbWluaW11bSBhbmQgcm91bmQgZG93biBtYXhpbXVtIHRvIG5lYXJlc3QgMTYgZnJhbWVzIHRvIHNhdGlzZnkgQXVkaW9NaXhlcgogICAgICAgICBtaW5Ob3JtYWxGcmFtZUNvdW50ID0gKG1pbk5vcm1hbEZyYW1lQ291bnQgKyAxNSkgJiB+MTU7CiAgICAgICAgIG1heE5vcm1hbEZyYW1lQ291bnQgPSBtYXhOb3JtYWxGcmFtZUNvdW50ICYgfjE1OwpAQCAtMTY4MCw3ICsxNzcwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHByZWZlciBhbiBldmVuIG11bHRpcGxpZXIsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZG91Ymxpbmcgb2YgZmFzdCB0cmFja3MgZHVlIHRvIEhBTAotICAgICAgICAgICAgLy8gU1JDIChpdCB3b3VsZCBiZSB1bnVzdWFsIGZvciB0aGUgbm9ybWFsIG1peCBidWZmZXIgc2l6ZSB0byBub3QgYmUgYSBtdWx0aXBsZSBvZiBmYXN0CisgICAgICAgICAgICAvLyBTUkMgKGl0IHdvdWxkIGJlIHVudXN1YWwgZm9yIHRoZSBub3JtYWwgc2luayBidWZmZXIgc2l6ZSB0byBub3QgYmUgYSBtdWx0aXBsZSBvZiBmYXN0CiAgICAgICAgICAgICAvLyB0cmFjaywgYnV0IHdlIHNvbWV0aW1lcyBoYXZlIHRvIGRvIHRoaXMgdG8gc2F0aXNmeSB0aGUgbWF4aW11bSBmcmFtZSBjb3VudAogICAgICAgICAgICAgLy8gY29uc3RyYWludCkKICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgcm91bmRpbmcgdXAgc2hvdWxkIG5vdCBiZSBkb25lIGlmIG5vIEhBTCBTUkMKQEAgLTE2OTYsMTggKzE3ODYsNDAgQEAKICAgICBtTm9ybWFsRnJhbWVDb3VudCA9IG11bHRpcGxpZXIgKiBtRnJhbWVDb3VudDsKICAgICAvLyByb3VuZCB1cCB0byBuZWFyZXN0IDE2IGZyYW1lcyB0byBzYXRpc2Z5IEF1ZGlvTWl4ZXIKICAgICBtTm9ybWFsRnJhbWVDb3VudCA9IChtTm9ybWFsRnJhbWVDb3VudCArIDE1KSAmIH4xNTsKLSAgICBBTE9HSSgiSEFMIG91dHB1dCBidWZmZXIgc2l6ZSAldSBmcmFtZXMsIG5vcm1hbCBtaXggYnVmZmVyIHNpemUgJXUgZnJhbWVzIiwgbUZyYW1lQ291bnQsCisgICAgQUxPR0koIkhBTCBvdXRwdXQgYnVmZmVyIHNpemUgJXUgZnJhbWVzLCBub3JtYWwgc2luayBidWZmZXIgc2l6ZSAldSBmcmFtZXMiLCBtRnJhbWVDb3VudCwKICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KTsKIAotICAgIGRlbGV0ZVtdIG1BbGxvY01peEJ1ZmZlcjsKLSAgICBzaXplX3QgYWxpZ24gPSAobUZyYW1lU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgPyBzaXplb2YoaW50MTZfdCkgOiBtRnJhbWVTaXplOwotICAgIG1BbGxvY01peEJ1ZmZlciA9IG5ldyBpbnQ4X3RbbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplICsgYWxpZ24gLSAxXTsKLSAgICBtTWl4QnVmZmVyID0gKGludDE2X3QgKikgKCgoKHNpemVfdCltQWxsb2NNaXhCdWZmZXIgKyBhbGlnbiAtIDEpIC8gYWxpZ24pICogYWxpZ24pOwotICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOworICAgIC8vIG1TaW5rQnVmZmVyIGlzIHRoZSBzaW5rIGJ1ZmZlci4gIFNpemUgaXMgYWx3YXlzIG11bHRpcGxlLW9mLTE2IGZyYW1lcy4KKyAgICAvLyBPcmlnaW5hbGx5IHRoaXMgd2FzIGludDE2X3RbXSBhcnJheSwgbmVlZCB0byByZW1vdmUgbGVnYWN5IGltcGxpY2F0aW9ucy4KKyAgICBmcmVlKG1TaW5rQnVmZmVyKTsKKyAgICBtU2lua0J1ZmZlciA9IE5VTEw7CisgICAgLy8gRm9yIHNpbmsgYnVmZmVyIHNpemUsIHdlIHVzZSB0aGUgZnJhbWUgc2l6ZSBmcm9tIHRoZSBkb3duc3RyZWFtIHNpbmsgdG8gYXZvaWQgcHJvYmxlbXMKKyAgICAvLyB3aXRoIG5vbiBQQ00gZm9ybWF0cyBmb3IgY29tcHJlc3NlZCBtdXNpYywgZS5nLiBBQUMsIGFuZCBPZmZsb2FkIHRocmVhZHMuCisgICAgY29uc3Qgc2l6ZV90IHNpbmtCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOworICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtU2lua0J1ZmZlciwgMzIsIHNpbmtCdWZmZXJTaXplKTsKKworICAgIC8vIFdlIHJlc2l6ZSB0aGUgbU1peGVyQnVmZmVyIGFjY29yZGluZyB0byB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBzaW5rIGJ1ZmZlciB3aGljaAorICAgIC8vIGRyaXZlcyB0aGUgb3V0cHV0LgorICAgIGZyZWUobU1peGVyQnVmZmVyKTsKKyAgICBtTWl4ZXJCdWZmZXIgPSBOVUxMOworICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkKSB7CisgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7IC8vIGFsc28gdmFsaWQ6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTWl4ZXJCdWZmZXIsIDMyLCBtTWl4ZXJCdWZmZXJTaXplKTsKKyAgICB9CisgICAgZnJlZShtRWZmZWN0QnVmZmVyKTsKKyAgICBtRWZmZWN0QnVmZmVyID0gTlVMTDsKKyAgICBpZiAobUVmZmVjdEJ1ZmZlckVuYWJsZWQpIHsKKyAgICAgICAgbUVmZmVjdEJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOyAvLyBOb3RlOiBFZmZlY3RzIHN1cHBvcnQgMTZiIG9ubHkKKyAgICAgICAgbUVmZmVjdEJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUVmZmVjdEJ1ZmZlckZvcm1hdCk7CisgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtRWZmZWN0QnVmZmVyLCAzMiwgbUVmZmVjdEJ1ZmZlclNpemUpOworICAgIH0KIAogICAgIC8vIGZvcmNlIHJlY29uZmlndXJhdGlvbiBvZiBlZmZlY3QgY2hhaW5zIGFuZCBlbmdpbmVzIHRvIHRha2UgbmV3IGJ1ZmZlciBzaXplIGFuZCBhdWRpbwogICAgIC8vIHBhcmFtZXRlcnMgaW50byBhY2NvdW50Ci0gICAgLy8gTm90ZSB0aGF0IG1Mb2NrIGlzIG5vdCBoZWxkIHdoZW4gcmVhZE91dHB1dFBhcmFtZXRlcnMoKSBpcyBjYWxsZWQgZnJvbSB0aGUgY29uc3RydWN0b3IKKyAgICAvLyBOb3RlIHRoYXQgbUxvY2sgaXMgbm90IGhlbGQgd2hlbiByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yCiAgICAgLy8gYnV0IGluIHRoaXMgY2FzZSBub3RoaW5nIGlzIGRvbmUgYmVsb3cgYXMgbm8gYXVkaW8gc2Vzc2lvbnMgaGF2ZSBlZmZlY3QgeWV0IHNvIGl0IGRvZXNuJ3QKICAgICAvLyBtYXR0ZXIuCiAgICAgLy8gY3JlYXRlIGEgY29weSBvZiBtRWZmZWN0Q2hhaW5zIGFzIGNhbGxpbmcgbW92ZUVmZmVjdENoYWluX2woKSBjYW4gcmVvcmRlciBzb21lIGVmZmVjdCBjaGFpbnMKQEAgLTE4NDEsNyArMTk1Myw3IEBACiAgICAgICAgIGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQogewogICAgIHNpemVfdCBjb3VudCA9IHRyYWNrc1RvUmVtb3ZlLnNpemUoKTsKLSAgICBpZiAoY291bnQpIHsKKyAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKSB7CiAgICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwogICAgICAgICAgICAgaWYgKCF0cmFjay0+aXNPdXRwdXRUcmFjaygpKSB7CkBAIC0xODgyLDEyICsxOTk0LDEyIEBACiAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgbUluV3JpdGUgPSB0cnVlOwogICAgIHNzaXplX3QgYnl0ZXNXcml0dGVuOworICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBtQ3VycmVudFdyaXRlTGVuZ3RoIC0gbUJ5dGVzUmVtYWluaW5nOwogCiAgICAgLy8gSWYgYW4gTkJBSU8gc2luayBpcyBwcmVzZW50LCB1c2UgaXQgdG8gd3JpdGUgdGhlIG5vcm1hbCBtaXhlcidzIHN1Ym1peAogICAgIGlmIChtTm9ybWFsU2luayAhPSAwKSB7Ci0jZGVmaW5lIG1CaXRTaGlmdCAyIC8vIEZJWE1FCi0gICAgICAgIHNpemVfdCBjb3VudCA9IG1CeXRlc1JlbWFpbmluZyA+PiBtQml0U2hpZnQ7Ci0gICAgICAgIHNpemVfdCBvZmZzZXQgPSAobUN1cnJlbnRXcml0ZUxlbmd0aCAtIG1CeXRlc1JlbWFpbmluZykgPj4gMTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gbUJ5dGVzUmVtYWluaW5nIC8gbUZyYW1lU2l6ZTsKKwogICAgICAgICBBVFJBQ0VfQkVHSU4oIndyaXRlIik7CiAgICAgICAgIC8vIHVwZGF0ZSB0aGUgc2V0cG9pbnQgd2hlbiBBdWRpb0ZsaW5nZXI6Om1TY3JlZW5TdGF0ZSBjaGFuZ2VzCiAgICAgICAgIHVpbnQzMl90IHNjcmVlblN0YXRlID0gQXVkaW9GbGluZ2VyOjptU2NyZWVuU3RhdGU7CkBAIC0xODk5LDEwICsyMDExLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAocGlwZS0+bWF4RnJhbWVzKCkgKiA3KSAvIDggOiBtTm9ybWFsRnJhbWVDb3VudCAqIDIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG1Ob3JtYWxTaW5rLT53cml0ZShtTWl4QnVmZmVyICsgb2Zmc2V0LCBjb3VudCk7CisgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG1Ob3JtYWxTaW5rLT53cml0ZSgoY2hhciAqKW1TaW5rQnVmZmVyICsgb2Zmc2V0LCBjb3VudCk7CiAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPiAwKSB7Ci0gICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuIDw8IG1CaXRTaGlmdDsKKyAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW4gKiBtRnJhbWVTaXplOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbjsKICAgICAgICAgfQpAQCAtMTkxNyw3ICsyMDI5LDcgQEAKICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSBIQUwgLyBBdWRpb1N0cmVhbU91dCBkaXJlY3RseQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIERpcmVjdCBvdXRwdXQgYW5kIG9mZmxvYWQgdGhyZWFkcwotICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gKG1DdXJyZW50V3JpdGVMZW5ndGggLSBtQnl0ZXNSZW1haW5pbmcpOworCiAgICAgICAgIGlmIChtVXNlQXN5bmNXcml0ZSkgewogICAgICAgICAgICAgQUxPR1dfSUYobVdyaXRlQWNrU2VxdWVuY2UgJiAxLCAidGhyZWFkTG9vcF93cml0ZSgpOiBvdXQgb2Ygc2VxdWVuY2Ugd3JpdGUgcmVxdWVzdCIpOwogICAgICAgICAgICAgbVdyaXRlQWNrU2VxdWVuY2UgKz0gMjsKQEAgLTE5MjgsNyArMjA0MCw3IEBACiAgICAgICAgIC8vIEZJWE1FIFdlIHNob3VsZCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRpbWVzdGFtcHMgZm9yIGRpcmVjdCBvdXRwdXQgdGhyZWFkcy4KICAgICAgICAgLy8gVGhleSBhcmUgdXNlZCBlLmcgZm9yIG11bHRpY2hhbm5lbCBQQ00gcGxheWJhY2sgb3ZlciBIRE1JLgogICAgICAgICBieXRlc1dyaXR0ZW4gPSBtT3V0cHV0LT5zdHJlYW0tPndyaXRlKG1PdXRwdXQtPnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbU1peEJ1ZmZlciArIG9mZnNldCwgbUJ5dGVzUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIG1CeXRlc1JlbWFpbmluZyk7CiAgICAgICAgIGlmIChtVXNlQXN5bmNXcml0ZSAmJgogICAgICAgICAgICAgICAgICgoYnl0ZXNXcml0dGVuIDwgMCkgfHwgKGJ5dGVzV3JpdHRlbiA9PSAoc3NpemVfdCltQnl0ZXNSZW1haW5pbmcpKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IHdhaXQgZm9yIGFzeW5jIGNhbGxiYWNrIGluIGNhc2Ugb2YgZXJyb3Igb2YgZnVsbCB3cml0ZQpAQCAtMTk2Nyw3ICsyMDc5LDcgQEAKIAogLyoKIFRoZSBkZXJpdmVkIHZhbHVlcyB0aGF0IGFyZSBjYWNoZWQ6Ci0gLSBtaXhCdWZmZXJTaXplIGZyb20gZnJhbWUgY291bnQgKiBmcmFtZSBzaXplCisgLSBtU2lua0J1ZmZlclNpemUgZnJvbSBmcmFtZSBjb3VudCAqIGZyYW1lIHNpemUKICAtIGFjdGl2ZVNsZWVwVGltZSBmcm9tIGFjdGl2ZVNsZWVwVGltZVVzKCkKICAtIGlkbGVTbGVlcFRpbWUgZnJvbSBpZGxlU2xlZXBUaW1lVXMoKQogIC0gc3RhbmRieURlbGF5IGZyb20gbUFjdGl2ZVNsZWVwVGltZVVzIChESVJFQ1Qgb25seSkKQEAgLTE5ODYsNyArMjA5OCw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2FjaGVQYXJhbWV0ZXJzX2woKQogewotICAgIG1peEJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgbVNpbmtCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgIGFjdGl2ZVNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZVVzKCk7CiAgICAgaWRsZVNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWVVcygpOwogfQpAQCAtMjAwOSwxMyArMjEyMSwxNCBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKQogewogICAgIGludCBzZXNzaW9uID0gY2hhaW4tPnNlc3Npb25JZCgpOwotICAgIGludDE2X3QgKmJ1ZmZlciA9IG1NaXhCdWZmZXI7CisgICAgaW50MTZfdCogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obUVmZmVjdEJ1ZmZlckVuYWJsZWQKKyAgICAgICAgICAgID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyKTsKICAgICBib29sIG93bnNCdWZmZXIgPSBmYWxzZTsKIAogICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgJXAgb24gdGhyZWFkICVwIGZvciBzZXNzaW9uICVkIiwgY2hhaW4uZ2V0KCksIHRoaXMsIHNlc3Npb24pOwogICAgIGlmIChzZXNzaW9uID4gMCkgewogICAgICAgICAvLyBPbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgaW4gZGlyZWN0IG91dHB1dCB0aHJlYWQgYW5kIGl0IHVzZXMKLSAgICAgICAgLy8gdGhlIG1peCBidWZmZXIgYXMgaW5wdXQKKyAgICAgICAgLy8gdGhlIHNpbmsgYnVmZmVyIGFzIGlucHV0CiAgICAgICAgIGlmIChtVHlwZSAhPSBESVJFQ1QpIHsKICAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OwogICAgICAgICAgICAgYnVmZmVyID0gbmV3IGludDE2X3RbbnVtU2FtcGxlc107CkBAIC0yMDQ5LDcgKzIxNjIsOCBAQAogICAgIH0KIAogICAgIGNoYWluLT5zZXRJbkJ1ZmZlcihidWZmZXIsIG93bnNCdWZmZXIpOwotICAgIGNoYWluLT5zZXRPdXRCdWZmZXIobU1peEJ1ZmZlcik7CisgICAgY2hhaW4tPnNldE91dEJ1ZmZlcihyZWludGVycHJldF9jYXN0PGludDE2X3QqPihtRWZmZWN0QnVmZmVyRW5hYmxlZAorICAgICAgICAgICAgPyBtRWZmZWN0QnVmZmVyIDogbVNpbmtCdWZmZXIpKTsKICAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgaXMgaW5zZXJ0ZWQgYXQgZW5kIG9mIGVmZmVjdAogICAgIC8vIGNoYWlucyBsaXN0IGluIG9yZGVyIHRvIGJlIHByb2Nlc3NlZCBsYXN0IGFzIGl0IGNvbnRhaW5zIG91dHB1dCBzdGFnZSBlZmZlY3RzCiAgICAgLy8gRWZmZWN0IGNoYWluIGZvciBzZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCBpcyBpbnNlcnRlZCBiZWZvcmUKQEAgLTIwOTksNyArMjIxMyw3IEBACiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihtTWl4QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldE1haW5CdWZmZXIocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obVNpbmtCdWZmZXIpKTsKICAgICAgICAgICAgICAgICAgICAgY2hhaW4tPmRlY1RyYWNrQ250KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjMwMiwxNCArMjQxNiwzMiBAQAogICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgd3JpdHRlbiB0byBIQUwKICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX3NsZWVwVGltZSgpOwogICAgICAgICAgICAgICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbWl4QnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFaXRoZXIgdGhyZWFkTG9vcF9taXgoKSBvciB0aHJlYWRMb29wX3NsZWVwVGltZSgpIHNob3VsZCBoYXZlIHNldAorICAgICAgICAgICAgLy8gbU1peGVyQnVmZmVyIHdpdGggZGF0YSBpZiBtTWl4ZXJCdWZmZXJWYWxpZCBpcyB0cnVlIGFuZCBzbGVlcFRpbWUgPT0gMC4KKyAgICAgICAgICAgIC8vIE1lcmdlIG1NaXhlckJ1ZmZlciBkYXRhIGludG8gbUVmZmVjdEJ1ZmZlciAoaWYgYW55IGVmZmVjdHMgYXJlIHZhbGlkKQorICAgICAgICAgICAgLy8gb3IgbVNpbmtCdWZmZXIgKGlmIHRoZXJlIGFyZSBubyBlZmZlY3RzKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgcHJlLWVmZmVjdHMgY29tcHV0YXRpb247IGlmIGVmZmVjdHMgY2hhbmdlIHRvCisgICAgICAgICAgICAvLyBzdXBwb3J0IGhpZ2hlciBwcmVjaXNpb24sIHRoaXMgbmVlZHMgdG8gbW92ZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBtTWl4ZXJCdWZmZXJWYWxpZCBpcyBvbmx5IHNldCB0cnVlIGJ5IE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKS4KKyAgICAgICAgICAgIC8vIFRPRE8gdXNlIHNsZWVwVGltZSA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgorICAgICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclZhbGlkKSB7CisgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyOworICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IG1FZmZlY3RCdWZmZXJWYWxpZCA/IG1FZmZlY3RCdWZmZXJGb3JtYXQgOiBtRm9ybWF0OworCisgICAgICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChidWZmZXIsIGZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtQ3VycmVudFdyaXRlTGVuZ3RoOwogICAgICAgICAgICAgaWYgKGlzU3VzcGVuZGVkKCkpIHsKICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSBzdXNwZW5kU2xlZXBUaW1lVXMoKTsKICAgICAgICAgICAgICAgICAvLyBzaW11bGF0ZSB3cml0ZSB0byBIQUwgd2hlbiBzdXNwZW5kZWQKLSAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1peEJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSBtU2lua0J1ZmZlclNpemU7CiAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKICAgICAgICAgICAgIH0KIApAQCAtMjMzMCw2ICsyNDYyLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBPbmx5IGlmIHRoZSBFZmZlY3RzIGJ1ZmZlciBpcyBlbmFibGVkIGFuZCB0aGVyZSBpcyBkYXRhIGluIHRoZQorICAgICAgICAvLyBFZmZlY3RzIGJ1ZmZlciAoYnVmZmVyIHZhbGlkKSwgd2UgbmVlZCB0bworICAgICAgICAvLyBjb3B5IGludG8gdGhlIHNpbmsgYnVmZmVyLgorICAgICAgICAvLyBUT0RPIHVzZSBzbGVlcFRpbWUgPT0gMCBhcyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbi4KKyAgICAgICAgaWYgKG1FZmZlY3RCdWZmZXJWYWxpZCkgeworICAgICAgICAgICAgLy9BTE9HVigid3JpdGluZyBlZmZlY3QgYnVmZmVyIHRvIHNpbmsgYnVmZmVyIGZvcm1hdCAlI3giLCBtRm9ybWF0KTsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIG1Gb3JtYXQsIG1FZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAKQEAgLTIzNDgsMjAgKzI0OTAsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfRFJBSU5fQUxMKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX2RyYWluKCk7CiAgICAgICAgICAgICAgICAgfQotaWYgKG1UeXBlID09IE1JWEVSKSB7Ci0gICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KLSAgICAgICAgICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gbm93IC0gbUxhc3RXcml0ZVRpbWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBkZWx0YSA+IG1heFBlcmlvZCkgewotICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOwotICAgICAgICAgICAgICAgICAgICBpZiAoKG5vdyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgewotICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygid3JpdGUgYmxvY2tlZCBmb3IgJWxsdSBtc2VjcywgJWQgZGVsYXllZCB3cml0ZXMsIHRocmVhZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zMm1zKGRlbHRhKSwgbU51bURlbGF5ZWRXcml0ZXMsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBub3c7CisgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJsb2NrZWQgZGV0ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gbm93IC0gbUxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgZGVsdGEgPiBtYXhQZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5vdyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGx1IG1zZWNzLCAlZCBkZWxheWVkIHdyaXRlcywgdGhyZWFkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zMm1zKGRlbHRhKSwgbU51bURlbGF5ZWRXcml0ZXMsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbm93OworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotfQogCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVzbGVlcChzbGVlcFRpbWUpOwpAQCAtMjQwOSw3ICsyNTUxLDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVtb3ZlVHJhY2tzX2woY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCiB7CiAgICAgc2l6ZV90IGNvdW50ID0gdHJhY2tzVG9SZW1vdmUuc2l6ZSgpOwotICAgIGlmIChjb3VudCkgeworICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHRyYWNrKTsKQEAgLTI0NzMsNyArMjYxNSw3IEBACiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNpbmsgZm9yIHRoZSBIQUwgb3V0cHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1PdXRwdXRTaW5rID0gbmV3IEF1ZGlvU3RyZWFtT3V0U2luayhvdXRwdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCl9OworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCl9OwogICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0U2luay0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CiAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CiAKQEAgLTI3MTMsMTIgKzI4NTUsNiBAQAogICAgIFBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3N0YW5kYnkoKTsKIH0KIAotLy8gRW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIHN0YW5kYXJkIG1peGVyCi0vLyBPdmVycmlkZGVuIGZvciBvZmZsb2FkZWQgcGxheWJhY2sKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Zmx1c2hPdXRwdXRfbCgpCi17Ci19Ci0KIGJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6d2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpCiB7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjc1MCw2ICsyODg2LDEyIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpCit7CisgICAgQUxPR1YoInNpZ25hbCBwbGF5YmFjayB0aHJlYWQiKTsKKyAgICBicm9hZGNhc3RfbCgpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3BfbWl4KCkKIHsKICAgICAvLyBvYnRhaW4gdGhlIHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgb2YgdGhlIG5leHQgb3V0cHV0IGJ1ZmZlcgpAQCAtMjc2OCw3ICsyOTEwLDcgQEAKIAogICAgIC8vIG1peCBidWZmZXJzLi4uCiAgICAgbUF1ZGlvTWl4ZXItPnByb2Nlc3MocHRzKTsKLSAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbWl4QnVmZmVyU2l6ZTsKKyAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOwogICAgIC8vIGluY3JlYXNlIHNsZWVwIHRpbWUgcHJvZ3Jlc3NpdmVseSB3aGVuIGFwcGxpY2F0aW9uIHVuZGVycnVuIGNvbmRpdGlvbiBjbGVhcnMuCiAgICAgLy8gT25seSBpbmNyZWFzZSBzbGVlcCB0aW1lIGlmIHRoZSBtaXhlciBpcyByZWFkeSBmb3IgdHdvIGNvbnNlY3V0aXZlIHRpbWVzIHRvIGF2b2lkCiAgICAgLy8gdGhhdCBhIHN0ZWFkeSBzdGF0ZSBvZiBhbHRlcm5hdGluZyByZWFkeS9ub3QgcmVhZHkgY29uZGl0aW9ucyBrZWVwcyB0aGUgc2xlZXAgdGltZQpAQCAtMjgwMiw3ICsyOTQ0LDEzIEBACiAgICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgfHwgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkpIHsKLSAgICAgICAgbWVtc2V0IChtTWl4QnVmZmVyLCAwLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgLy8gY2xlYXIgb3V0IG1NaXhlckJ1ZmZlciBvciBtU2lua0J1ZmZlciwgdG8gZW5zdXJlIGJ1ZmZlcnMgYXJlIGNsZWFyZWQKKyAgICAgICAgLy8gYmVmb3JlIGVmZmVjdHMgcHJvY2Vzc2luZyBvciBvdXRwdXQuCisgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJWYWxpZCkgeworICAgICAgICAgICAgbWVtc2V0KG1NaXhlckJ1ZmZlciwgMCwgbU1peGVyQnVmZmVyU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CisgICAgICAgIH0KICAgICAgICAgc2xlZXBUaW1lID0gMDsKICAgICAgICAgQUxPR1ZfSUYobUJ5dGVzV3JpdHRlbiA9PSAwICYmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpLAogICAgICAgICAgICAgICAgICJhbnRpY2lwYXRlZCBzdGFydCIpOwpAQCAtMjg0OSw2ICsyOTk3LDkgQEAKICAgICAgICAgc3RhdGUgPSBzcS0+YmVnaW4oKTsKICAgICB9CiAKKyAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IGZhbHNlOyAgLy8gbU1peGVyQnVmZmVyIGhhcyBubyB2YWxpZCBkYXRhIHVudGlsIGFwcHJvcHJpYXRlIHRyYWNrcyBmb3VuZC4KKyAgICBtRWZmZWN0QnVmZmVyVmFsaWQgPSBmYWxzZTsgLy8gbUVmZmVjdEJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCB0cmFja3MgZm91bmQuCisKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiB0ID0gbUFjdGl2ZVRyYWNrc1tpXS5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0ID09IDApIHsKQEAgLTI5NjcsNyArMzExOCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRToKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTE9HX0ZBVEFMKCJ1bmV4cGVjdGVkIHRyYWNrIHN0YXRlICVkIiwgdHJhY2stPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgidW5leHBlY3RlZCB0cmFjayBzdGF0ZSAlZCIsIHRyYWNrLT5tU3RhdGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHsKQEAgLTI5OTgsNyArMzE0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gZGVjcmVtZW50IHRoZSBsYXN0IHNwPD4gb24gdGhvc2UgdHJhY2tzLgogICAgICAgICAgICAgICAgICAgICBibG9jayA9IEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR19GQVRBTCgiZmFzdCB0cmFjayAlZCBzaG91bGQgaGF2ZSBiZWVuIGFjdGl2ZSIsIGopOworICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJmYXN0IHRyYWNrICVkIHNob3VsZCBoYXZlIGJlZW4gYWN0aXZlIiwgaik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgIC8vIEF2b2lkcyBhIG1pc2xlYWRpbmcgZGlzcGxheSBpbiBkdW1wc3lzCkBAIC0zMDI3LDEyICszMTc4LDE0IEBACiAgICAgICAgICAgICAvLyArMSBmb3Igcm91bmRpbmcgYW5kICsxIGZvciBhZGRpdGlvbmFsIHNhbXBsZSBuZWVkZWQgZm9yIGludGVycG9sYXRpb24KICAgICAgICAgICAgIGRlc2lyZWRGcmFtZXMgPSAobU5vcm1hbEZyYW1lQ291bnQgKiBzcikgLyBtU2FtcGxlUmF0ZSArIDEgKyAxOwogICAgICAgICAgICAgLy8gYWRkIGZyYW1lcyBhbHJlYWR5IGNvbnN1bWVkIGJ1dCBub3QgeWV0IHJlbGVhc2VkIGJ5IHRoZSByZXNhbXBsZXIKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgY2Jsay0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCisgICAgICAgICAgICAvLyBiZWNhdXNlIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5KCkgd2lsbCBpbmNsdWRlIHRoZXNlIGZyYW1lcwogICAgICAgICAgICAgZGVzaXJlZEZyYW1lcyArPSBtQXVkaW9NaXhlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcyh0cmFjay0+bmFtZSgpKTsKKyNpZiAwCiAgICAgICAgICAgICAvLyB0aGUgbWluaW11bSB0cmFjayBidWZmZXIgc2l6ZSBpcyBub3JtYWxseSB0d2ljZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBuZWNlc3NhcnkKICAgICAgICAgICAgIC8vIHRvIGZpbGwgb25lIGJ1ZmZlciBhbmQgdGhlIHJlc2FtcGxlciBzaG91bGQgbm90IGxlYXZlIG1vcmUgdGhhbiBvbmUgYnVmZmVyIHdvcnRoCiAgICAgICAgICAgICAvLyBvZiB1bnJlbGVhc2VkIGZyYW1lcyBhZnRlciBlYWNoIHBhc3MsIGJ1dCBqdXN0IGluIGNhc2UuLi4KICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGRlc2lyZWRGcmFtZXMgPD0gY2Jsay0+ZnJhbWVDb3VudF8pOworI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzID0gMTsKICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpICYmCkBAIC0zMDQ4LDEwICszMjAxLDE0IEBACiAKICAgICAgICAgICAgIG1peGVkVHJhY2tzKys7CiAKLSAgICAgICAgICAgIC8vIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peEJ1ZmZlciBtZWFucyB0aGVyZSBpcyBhbiBlZmZlY3QgY2hhaW4KLSAgICAgICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgdHJhY2sKKyAgICAgICAgICAgIC8vIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbVNpbmtCdWZmZXIgb3IgbU1peGVyQnVmZmVyIG1lYW5zCisgICAgICAgICAgICAvLyB0aGVyZSBpcyBhbiBlZmZlY3QgY2hhaW4gY29ubmVjdGVkIHRvIHRoZSB0cmFjawogICAgICAgICAgICAgY2hhaW4uY2xlYXIoKTsKLSAgICAgICAgICAgIGlmICh0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1NaXhCdWZmZXIpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1TaW5rQnVmZmVyICYmCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peGVyQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FZmZlY3RCdWZmZXJFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJWYWxpZCA9IHRydWU7IC8vIExhdGVyIGNhbiBzZXQgZGlyZWN0bHkuCisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIC8vIERlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBpbiB0cmFjayBlZmZlY3QgY2hhaW4gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKQEAgLTMxNzcsMTAgKzMzMzQsNDEgQEAKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwKICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpcmVxU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgdHJhY2suCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVHJhY2tzIHdpdGggZWZmZWN0cyBnbyBpbnRvIHRoZWlyIG93biBlZmZlY3RzIGNoYWluIGJ1ZmZlcgorICAgICAgICAgICAgICogYW5kIGZyb20gdGhlcmUgaW50byBlaXRoZXIgbUVmZmVjdEJ1ZmZlciBvciBtU2lua0J1ZmZlci4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBPdGhlciB0cmFja3MgY2FuIHVzZSBtTWl4ZXJCdWZmZXIgZm9yIGhpZ2hlciBwcmVjaXNpb24KKyAgICAgICAgICAgICAqIGNoYW5uZWwgYWNjdW11bGF0aW9uLiAgSWYgdGhpcyBidWZmZXIgaXMgZW5hYmxlZAorICAgICAgICAgICAgICogKG1NaXhlckJ1ZmZlckVuYWJsZWQgdHJ1ZSksIHRoZW4gc2VsZWN0ZWQgdHJhY2tzIHdpbGwgYWNjdW11bGF0ZQorICAgICAgICAgICAgICogaW50byBpdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkCisgICAgICAgICAgICAgICAgICAgICYmICh0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1TaW5rQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPm1haW5CdWZmZXIoKSA9PSBtTWl4ZXJCdWZmZXIpKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IG92ZXJyaWRlIHRyYWNrLT5tYWluQnVmZmVyKCk/CisgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKUFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCkBAIC0zMjk0LDEzICszNDgyLDMwIEBACiAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgdHJhY2tzIHRoYXQgbmVlZCB0byBiZS4uLgogICAgIHJlbW92ZVRyYWNrc19sKCp0cmFja3NUb1JlbW92ZSk7CiAKLSAgICAvLyBtaXggYnVmZmVyIG11c3QgYmUgY2xlYXJlZCBpZiBhbGwgdHJhY2tzIGFyZSBjb25uZWN0ZWQgdG8gYW4KLSAgICAvLyBlZmZlY3QgY2hhaW4gYXMgaW4gdGhpcyBjYXNlIHRoZSBtaXhlciB3aWxsIG5vdCB3cml0ZSB0bwotICAgIC8vIG1peCBidWZmZXIgYW5kIHRyYWNrIGVmZmVjdHMgd2lsbCBhY2N1bXVsYXRlIGludG8gaXQKKyAgICAvLyBzaW5rIG9yIG1peCBidWZmZXIgbXVzdCBiZSBjbGVhcmVkIGlmIGFsbCB0cmFja3MgYXJlIGNvbm5lY3RlZCB0byBhbgorICAgIC8vIGVmZmVjdCBjaGFpbiBhcyBpbiB0aGlzIGNhc2UgdGhlIG1peGVyIHdpbGwgbm90IHdyaXRlIHRvIHRoZSBzaW5rIG9yIG1peCBidWZmZXIKKyAgICAvLyBhbmQgdHJhY2sgZWZmZWN0cyB3aWxsIGFjY3VtdWxhdGUgaW50byBpdAogICAgIGlmICgobUJ5dGVzUmVtYWluaW5nID09IDApICYmICgobWl4ZWRUcmFja3MgIT0gMCAmJiBtaXhlZFRyYWNrcyA9PSB0cmFja3NXaXRoRWZmZWN0KSB8fAogICAgICAgICAgICAgKG1peGVkVHJhY2tzID09IDAgJiYgZmFzdFRyYWNrcyA+IDApKSkgewogICAgICAgICAvLyBGSVhNRSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgc2hvdWxkIHJlbWVtYmVyIHByZXZpb3VzIHplcm8gc3RhdHVzCi0gICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICAgICAgLy8gVE9ETzogSW4gdGVzdGluZywgbVNpbmtCdWZmZXIgYmVsb3cgbmVlZCBub3QgYmUgY2xlYXJlZCBiZWNhdXNlCisgICAgICAgICAgICAvLyB0aGUgUGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSBjb3BpZXMgbU1peGVyQnVmZmVyIGludG8gbVNpbmtCdWZmZXIKKyAgICAgICAgICAgIC8vIGFmdGVyIG1peGluZy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUbyBlbmZvcmNlIHRoaXMgZ3VhcmFudGVlOgorICAgICAgICAgICAgLy8gKChtaXhlZFRyYWNrcyAhPSAwICYmIG1peGVkVHJhY2tzID09IHRyYWNrc1dpdGhFZmZlY3QpIHx8CisgICAgICAgICAgICAvLyAobWl4ZWRUcmFja3MgPT0gMCAmJiBmYXN0VHJhY2tzID4gMCkpCisgICAgICAgICAgICAvLyBtdXN0IGltcGx5IE1JWEVSX1RSQUNLU19SRUFEWS4KKyAgICAgICAgICAgIC8vIExhdGVyLCB3ZSBtYXkgY2xlYXIgYnVmZmVycyByZWdhcmRsZXNzLCBhbmQgc2tpcCBtdWNoIG9mIHRoaXMgbG9naWMuCisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyAtIGVpdGhlciBtRWZmZWN0QnVmZmVyIG9yIG1TaW5rQnVmZmVyIG5lZWRzIHRvIGJlIGNsZWFyZWQuCisgICAgICAgIGlmIChtRWZmZWN0QnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgIG1lbXNldChtRWZmZWN0QnVmZmVyLCAwLCBtRWZmZWN0QnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUUgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHNob3VsZCByZW1lbWJlciBwcmV2aW91cyB6ZXJvIHN0YXR1cworICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgfQogCiAgICAgLy8gaWYgYW55IGZhc3QgdHJhY2tzLCB0aGVuIHN0YXR1cyBpcyByZWFkeQpAQCAtMzM1OCw2ICszNTYzLDcgQEAKICAgICAgICAgICAgIGlmICgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNhdmUgdmFsdWUsIHNpbmNlIGl0J3MgY29uc3RhbnQKICAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMzNjUsNiArMzU3MSw3IEBACiAgICAgICAgICAgICBpZiAoKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2F2ZSB2YWx1ZSwgc2luY2UgaXQncyBjb25zdGFudAogICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzQyMyw3ICszNjMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvbmZpZykgewotICAgICAgICAgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOwogICAgICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKSA7IGkrKykgewpAQCAtMzQ2OCw5ICszNjc1LDcgQEAKIAogICAgIFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvTWl4ZXIgdHJhY2tzOiAlMDh4XG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZmRwcmludGYoZmQsICIgIEF1ZGlvTWl4ZXIgdHJhY2tzOiAweCUwOHhcbiIsIG1BdWRpb01peGVyLT50cmFja05hbWVzKCkpOwogCiAgICAgLy8gTWFrZSBhIG5vbi1hdG9taWMgY29weSBvZiBmYXN0IG1peGVyIGR1bXAgc3RhdGUgc28gaXQgd29uJ3QgY2hhbmdlIHVuZGVybmVhdGggdXMKICAgICBjb25zdCBGYXN0TWl4ZXJEdW1wU3RhdGUgY29weShtRmFzdE1peGVyRHVtcFN0YXRlKTsKQEAgLTM2ODgsNyArMzg5Myw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjp0aHJlYWRMb29wX21peCgpCiB7CiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICBpbnQ4X3QgKmN1ckJ1ZiA9IChpbnQ4X3QgKiltTWl4QnVmZmVyOworICAgIGludDhfdCAqY3VyQnVmID0gKGludDhfdCAqKW1TaW5rQnVmZmVyOwogICAgIC8vIG91dHB1dCBhdWRpbyB0byBoYXJkd2FyZQogICAgIHdoaWxlIChmcmFtZUNvdW50KSB7CiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CkBAIC0zNzAzLDcgKzM5MDgsNyBAQAogICAgICAgICBjdXJCdWYgKz0gYnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgICAgICBtQWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CiAgICAgfQotICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBjdXJCdWYgLSAoaW50OF90ICopbU1peEJ1ZmZlcjsKKyAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gY3VyQnVmIC0gKGludDhfdCAqKW1TaW5rQnVmZmVyOwogICAgIHNsZWVwVGltZSA9IDA7CiAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CiAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7CkBAIC0zNzE4LDIwICszOTIzLDIwIEBACiAgICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgJiYgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewotICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICBzbGVlcFRpbWUgPSAwOwogICAgIH0KIH0KIAogLy8gZ2V0VHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLWludCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBzZXNzaW9uSWQpCitpbnQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrIF9fdW51c2VkLAorICAgICAgICBpbnQgc2Vzc2lvbklkIF9fdW51c2VkKQogewogICAgIHJldHVybiAwOwogfQogCiAvLyBkZWxldGVUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6ZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSBfX3VudXNlZCkKIHsKIH0KIApAQCAtMzc0Niw2ICszOTUxLDE2IEBACiAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKICAgICAgICAgaW50IHZhbHVlOwogCisgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQorICAgICAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgorICAgICAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKICAgICAgICAgICAgIC8vIHNpemUgZGVwZW5kcyBvbiBmcmFtZSBjb3VudCBhbmQgY29ycmVjdCBiZWhhdmlvciB3b3VsZCBub3QgYmUgZ2FyYW50aWVkCkBAIC0zNzY3LDcgKzM5ODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAgICAgICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzk4NCw2ICs0MTk5LDE3IEBACiAgICAgICAgIHNwPFRyYWNrPiBsID0gbUxhdGVzdEFjdGl2ZVRyYWNrLnByb21vdGUoKTsKICAgICAgICAgYm9vbCBsYXN0ID0gbC5nZXQoKSA9PSB0cmFjazsKIAorICAgICAgICBpZiAodHJhY2stPmlzSW52YWxpZCgpKSB7CisgICAgICAgICAgICBBTE9HVygiQW4gaW52YWxpZGF0ZWQgdHJhY2sgc2hvdWxkbid0IGJlIGluIGFjdGl2ZSBsaXN0Iik7CisgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpJRExFKSB7CisgICAgICAgICAgICBBTE9HVygiQW4gaWRsZSB0cmFjayBzaG91bGRuJ3QgYmUgaW4gYWN0aXZlIGxpc3QiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgewogICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOwogICAgICAgICAgICAgaWYgKGxhc3QpIHsKQEAgLTQwMDIsMzIgKzQyMjgsMzkgQEAKICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOyAgICAvLyBzdG9wIHdyaXRpbmcKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwotICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5mcmFtZXNSZWFkeSgpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+aXNGbHVzaFBlbmRpbmcoKSkgeworICAgICAgICAgICAgdHJhY2stPmZsdXNoQWNrKCk7CisgICAgICAgICAgICBpZiAobGFzdCkgeworICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc1Jlc3VtZVBlbmRpbmcoKSl7CisgICAgICAgICAgICB0cmFjay0+cmVzdW1lQWNrKCk7CisgICAgICAgICAgICBpZiAobGFzdCkgeworICAgICAgICAgICAgICAgIGlmIChtUGF1c2VkQnl0ZXNSZW1haW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjb250aW51ZSB3cml0ZSB0aGF0IHdhcyBpbnRlcnJ1cHRlZAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVBhdXNlZFdyaXRlTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtUGF1c2VkQnl0ZXNSZW1haW5pbmc7CisgICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeXRlc1JlbWFpbmluZyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtSHdQYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWRMb29wX21peCgpIHdpbGwgaGFuZGxlIHRoZSBjYXNlIHRoYXQgd2UgbmVlZCB0bworICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgYW4gaW50ZXJydXB0ZWQgd3JpdGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZW5hYmxlIHdyaXRlIHRvIGF1ZGlvIEhBTAorICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBEbyBub3QgaGFuZGxlIG5ldyBkYXRhIGluIHRoaXMgaXRlcmF0aW9uIGV2ZW4gaWYgdHJhY2stPmZyYW1lc1JlYWR5KCkKKyAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOworICAgICAgICAgICAgfQorICAgICAgICB9ICBlbHNlIGlmICh0cmFjay0+ZnJhbWVzUmVhZHkoKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmCiAgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1BhdXNlZCgpICYmICF0cmFjay0+aXNUZXJtaW5hdGVkKCkgJiYgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSkgewogICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayAlZCBzPSUwOHggW09LXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CiAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHByb2Nlc3NWb2x1bWVfbCgpIHdpbGwgYXBwbHkgbmV3IHZvbHVtZSBldmVuIGlmIDAKICAgICAgICAgICAgICAgICBtTGVmdFZvbEZsb2F0ID0gbVJpZ2h0Vm9sRmxvYXQgPSAtMS4wOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QYXVzZWRCeXRlc1JlbWFpbmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY29udGludWUgd3JpdGUgdGhhdCB3YXMgaW50ZXJydXB0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVBhdXNlZFdyaXRlTGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IG1QYXVzZWRCeXRlc1JlbWFpbmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnl0ZXNSZW1haW5pbmcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Id1BhdXNlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvSHdSZXN1bWUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZExvb3BfbWl4KCkgd2lsbCBoYW5kbGUgdGhlIGNhc2UgdGhhdCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIGFuIGludGVycnVwdGVkIHdyaXRlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGUgd3JpdGUgdG8gYXVkaW8gSEFMCi0gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobGFzdCkgewpAQCAtNDA1MSw3ICs0Mjg0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZWsgd2hlbiByZXN1bWluZy4KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1RyYWNrLT5zZXNzaW9uSWQoKSAhPSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1RyYWNrLT5pbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC00MTI3LDkgKzQzNTksNiBAQAogICAgIC8vIGlmIHJlc3VtZSBpcyByZWNlaXZlZCBiZWZvcmUgcGF1c2UgaXMgZXhlY3V0ZWQuCiAgICAgaWYgKCFtU3RhbmRieSAmJiAoZG9Id1BhdXNlIHx8IChtRmx1c2hQZW5kaW5nICYmICFtSHdQYXVzZWQgJiYgKGNvdW50ICE9IDApKSkpIHsKICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5wYXVzZShtT3V0cHV0LT5zdHJlYW0pOwotICAgICAgICBpZiAoIWRvSHdQYXVzZSkgewotICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7Ci0gICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1GbHVzaFBlbmRpbmcpIHsKICAgICAgICAgZmx1c2hId19sKCk7CkBAIC00MTQ1LDExICs0Mzc0LDYgQEAKICAgICByZXR1cm4gbWl4ZXJTdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpmbHVzaE91dHB1dF9sKCkKLXsKLSAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKLX0KLQogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbXV0ZXggbG9ja2VkCiBib29sIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6d2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpCiB7CkBAIC00MTY0LDE1ICs0Mzg4LDE1IEBACiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZCBtdXRleCBsb2NrZWQKIGJvb2wgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpzaG91bGRTdGFuZGJ5X2woKQogewotICAgIGJvb2wgVHJhY2tQYXVzZWQgPSBmYWxzZTsKKyAgICBib29sIHRyYWNrUGF1c2VkID0gZmFsc2U7CiAKICAgICAvLyBkbyBub3QgcHV0IHRoZSBIQUwgaW4gc3RhbmRieSB3aGVuIHBhdXNlZC4gQXdlc29tZVBsYXllciBjbGVhciB0aGUgb2ZmbG9hZGVkIEF1ZGlvVHJhY2sKICAgICAvLyBhZnRlciBhIHRpbWVvdXQgYW5kIHdlIHdpbGwgZW50ZXIgc3RhbmRieSB0aGVuLgogICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKLSAgICAgICAgVHJhY2tQYXVzZWQgPSBtVHJhY2tzW21UcmFja3Muc2l6ZSgpIC0gMV0tPmlzUGF1c2VkKCk7CisgICAgICAgIHRyYWNrUGF1c2VkID0gbVRyYWNrc1ttVHJhY2tzLnNpemUoKSAtIDFdLT5pc1BhdXNlZCgpOwogICAgIH0KIAotICAgIHJldHVybiAhbVN0YW5kYnkgJiYgIVRyYWNrUGF1c2VkOworICAgIHJldHVybiAhbVN0YW5kYnkgJiYgIXRyYWNrUGF1c2VkOwogfQogCiAKQEAgLTQxOTAsNiArNDQxNCw4IEBACiAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKICAgICBtUGF1c2VkV3JpdGVMZW5ndGggPSAwOwogICAgIG1QYXVzZWRCeXRlc1JlbWFpbmluZyA9IDA7CisgICAgbUh3UGF1c2VkID0gZmFsc2U7CisKICAgICBpZiAobVVzZUFzeW5jV3JpdGUpIHsKICAgICAgICAgLy8gZGlzY2FyZCBhbnkgcGVuZGluZyBkcmFpbiBvciB3cml0ZSBhY2sgYnkgaW5jcmVtZW50aW5nIHNlcXVlbmNlCiAgICAgICAgIG1Xcml0ZUFja1NlcXVlbmNlID0gKG1Xcml0ZUFja1NlcXVlbmNlICsgMikgJiB+MTsKQEAgLTQyMDAsNiArNDQyNiwxOCBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpCit7CisgICAgc3A8VHJhY2s+IHByZXZpb3VzVHJhY2sgPSBtUHJldmlvdXNUcmFjay5wcm9tb3RlKCk7CisgICAgc3A8VHJhY2s+IGxhdGVzdFRyYWNrID0gbUxhdGVzdEFjdGl2ZVRyYWNrLnByb21vdGUoKTsKKworICAgIGlmIChwcmV2aW91c1RyYWNrICE9IDAgJiYgbGF0ZXN0VHJhY2sgIT0gMCAmJgorICAgICAgICAocHJldmlvdXNUcmFjay0+c2Vzc2lvbklkKCkgIT0gbGF0ZXN0VHJhY2stPnNlc3Npb25JZCgpKSkgeworICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICB9CisgICAgUGxheWJhY2tUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OkR1cGxpY2F0aW5nVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKQEAgLTQyMjQsMTEgKzQ0NjIsMTEgQEAKICAgICBpZiAob3V0cHV0c1JlYWR5KG91dHB1dFRyYWNrcykpIHsKICAgICAgICAgbUF1ZGlvTWl4ZXItPnByb2Nlc3MoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOwogICAgIH0KICAgICBzbGVlcFRpbWUgPSAwOwogICAgIHdyaXRlRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7Ci0gICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1peEJ1ZmZlclNpemU7CisgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKIH0KIApAQCAtNDI0Myw3ICs0NDgxLDcgQEAKICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCkgewogICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7CiAgICAgICAgICAgICB3cml0ZUZyYW1lcyA9IG1Ob3JtYWxGcmFtZUNvdW50OwotICAgICAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOworICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZmx1c2ggcmVtYWluaW5nIG92ZXJmbG93IGJ1ZmZlcnMgaW4gb3V0cHV0IHRyYWNrcwogICAgICAgICAgICAgd3JpdGVGcmFtZXMgPSAwOwpAQCAtNDI1NSwxMCArNDQ5MywxOCBAQAogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3dyaXRlKCkKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dFRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKG1NaXhCdWZmZXIsIHdyaXRlRnJhbWVzKTsKKyAgICAgICAgLy8gV2UgY29udmVydCB0aGUgZHVwbGljYXRpbmcgdGhyZWFkIGZvcm1hdCB0byBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAvLyBmb3IgZGVsaXZlcnkgZG93bnN0cmVhbSBhcyBuZWVkZWQuIFRoaXMgaW4tcGxhY2UgY29udmVyc2lvbiBpcyBzYWZlIGFzCisgICAgICAgIC8vIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIGlzIHNtYWxsZXIgdGhhbiBhbnkgb3RoZXIgc3VwcG9ydGVkIGZvcm1hdAorICAgICAgICAvLyAoQVVESU9fRk9STUFUX1BDTV84X0JJVCBpcyBub3QgYWxsb3dlZCBoZXJlKS4KKyAgICAgICAgaWYgKG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICBtU2lua0J1ZmZlciwgbUZvcm1hdCwgd3JpdGVGcmFtZXMgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1TaW5rQnVmZmVyKSwgd3JpdGVGcmFtZXMpOwogICAgIH0KICAgICBtU3RhbmRieSA9IGZhbHNlOwotICAgIHJldHVybiAoc3NpemVfdCltaXhCdWZmZXJTaXplOworICAgIHJldHVybiAoc3NpemVfdCltU2lua0J1ZmZlclNpemU7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6dGhyZWFkTG9vcF9zdGFuZGJ5KCkKQEAgLTQyODQsMTAgKzQ1MzAsMTYgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIEZJWE1FIGV4cGxhaW4gdGhpcyBmb3JtdWxhCiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAoMyAqIG1Ob3JtYWxGcmFtZUNvdW50ICogbVNhbXBsZVJhdGUpIC8gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgLy8gT3V0cHV0VHJhY2sgaXMgZm9yY2VkIHRvIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIHJlZ2FyZGxlc3Mgb2YgbUZvcm1hdAorICAgIC8vIGR1ZSB0byBjdXJyZW50IHVzYWdlIGNhc2UgYW5kIHJlc3RyaWN0aW9ucyBvbiB0aGUgQXVkaW9CdWZmZXJQcm92aWRlci4KKyAgICAvLyBBY3R1YWwgYnVmZmVyIGNvbnZlcnNpb24gaXMgZG9uZSBpbiB0aHJlYWRMb29wX3dyaXRlKCkuCisgICAgLy8KKyAgICAvLyBUT0RPOiBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwgZGVwZW5kaW5nIG9uIG11bHRpY2hhbm5lbAorICAgIC8vIChhbmQgbm9uIGludDE2X3QqKSBzdXBwb3J0IG9uIEFGOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2sKICAgICBPdXRwdXRUcmFjayAqb3V0cHV0VHJhY2sgPSBuZXcgT3V0cHV0VHJhY2sodGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTQzNjksOCArNDYyMSw2IEBACiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UKQEAgLTQzNzksMjcgKzQ2MjksMjQgQEAKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDoKICAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCksCi0gICAgbUlucHV0KGlucHV0KSwgbVJlc2FtcGxlcihOVUxMKSwgbVJzbXBPdXRCdWZmZXIoTlVMTCksIG1Sc21wSW5CdWZmZXIoTlVMTCksCi0gICAgLy8gbVJzbXBJbkluZGV4IGFuZCBtQnVmZmVyU2l6ZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVycygpCi0gICAgbVJlcUNoYW5uZWxDb3VudChwb3Bjb3VudChjaGFubmVsTWFzaykpLAotICAgIG1SZXFTYW1wbGVSYXRlKHNhbXBsZVJhdGUpCi0gICAgLy8gbUJ5dGVzUmVhZCBpcyBvbmx5IG1lYW5pbmdmdWwgd2hpbGUgYWN0aXZlLCBhbmQgc28gaXMgY2xlYXJlZCBpbiBzdGFydCgpCi0gICAgLy8gKGJ1dCBtaWdodCBiZSBiZXR0ZXIgdG8gYWxzbyBjbGVhciBoZXJlIGZvciBkdW1wPykKKyAgICBtSW5wdXQoaW5wdXQpLCBtQWN0aXZlVHJhY2tzR2VuKDApLCBtUnNtcEluQnVmZmVyKE5VTEwpLAorICAgIC8vIG1Sc21wSW5GcmFtZXMgYW5kIG1Sc21wSW5GcmFtZXNQMiBhcmUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCisgICAgbVJzbXBJblJlYXIoMCkKICNpZmRlZiBURUVfU0lOSwogICAgICwgbVRlZVNpbmsodGVlU2luaykKICNlbmRpZgogewogICAgIHNucHJpbnRmKG1OYW1lLCBrTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJVgiLCBpZCk7CisgICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbU5hbWUpOwogCi0gICAgcmVhZElucHV0UGFyYW1ldGVycygpOworICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOwogfQogCiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp+UmVjb3JkVGhyZWFkKCkKIHsKKyAgICBtQXVkaW9GbGluZ2VyLT51bnJlZ2lzdGVyV3JpdGVyKG1OQkxvZ1dyaXRlcik7CiAgICAgZGVsZXRlW10gbVJzbXBJbkJ1ZmZlcjsKLSAgICBkZWxldGUgbVJlc2FtcGxlcjsKLSAgICBkZWxldGVbXSBtUnNtcE91dEJ1ZmZlcjsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6b25GaXJzdFJlZigpCkBAIC00NDA3LDIzMCArNDY1NCwzOTMgQEAKICAgICBydW4obU5hbWUsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZWFkeVRvUnVuKCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0Q2hlY2soKTsKLSAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsIlJlY29yZFRocmVhZCAlcCBjb3VsZCBub3QgaW5pdGlhbGl6ZSIsIHRoaXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KIGJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnRocmVhZExvb3AoKQogewotICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7Ci0gICAgc3A8UmVjb3JkVHJhY2s+IGFjdGl2ZVRyYWNrOwotICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwotCiAgICAgbnNlY3NfdCBsYXN0V2FybmluZyA9IDA7CiAKICAgICBpbnB1dFN0YW5kQnkoKTsKKworcmVhY3F1aXJlX3dha2Vsb2NrOgorICAgIHNwPFJlY29yZFRyYWNrPiBhY3RpdmVUcmFjazsKKyAgICBpbnQgYWN0aXZlVHJhY2tzR2VuOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgYWN0aXZlVHJhY2sgPSBtQWN0aXZlVHJhY2s7Ci0gICAgICAgIGFjcXVpcmVXYWtlTG9ja19sKGFjdGl2ZVRyYWNrICE9IDAgPyBhY3RpdmVUcmFjay0+dWlkKCkgOiAtMSk7CisgICAgICAgIHNpemVfdCBzaXplID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgICAgIGFjdGl2ZVRyYWNrc0dlbiA9IG1BY3RpdmVUcmFja3NHZW47CisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgYW4gYXJiaXRyYXJ5IGNob2ljZQorICAgICAgICAgICAgYWN0aXZlVHJhY2sgPSBtQWN0aXZlVHJhY2tzWzBdOworICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woYWN0aXZlVHJhY2stPnVpZCgpKTsKKyAgICAgICAgICAgIGlmIChzaXplID4gMSkgeworICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxpbnQ+IHRtcDsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0bXAuYWRkKG1BY3RpdmVUcmFja3NbaV0tPnVpZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXBkYXRlV2FrZUxvY2tVaWRzX2wodG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFjcXVpcmVXYWtlTG9ja19sKC0xKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIC8vIHVzZWQgdG8gdmVyaWZ5IHdlJ3ZlIHJlYWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUgZXZhbHVhdGluZyBob3cgbWFueSBieXRlcyB3ZXJlIHJlYWQKLSAgICBib29sIHJlYWRPbmNlID0gZmFsc2U7CisgICAgLy8gdXNlZCB0byByZXF1ZXN0IGEgZGVmZXJyZWQgc2xlZXAsIHRvIGJlIGV4ZWN1dGVkIGxhdGVyIHdoaWxlIG11dGV4IGlzIHVubG9ja2VkCisgICAgdWludDMyX3Qgc2xlZXBVcyA9IDA7CiAKLSAgICAvLyBzdGFydCByZWNvcmRpbmcKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpIHsKKyAgICAvLyBsb29wIHdoaWxlIHRoZXJlIGlzIHdvcmsgdG8gZG8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCi0gICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKKyAgICAgICAgLy8gc2xlZXAgd2l0aCBtdXRleCB1bmxvY2tlZAorICAgICAgICBpZiAoc2xlZXBVcyA+IDApIHsKKyAgICAgICAgICAgIHVzbGVlcChzbGVlcFVzKTsKKyAgICAgICAgICAgIHNsZWVwVXMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWN0aXZlVHJhY2tzIGFjY3VtdWxhdGVzIGEgY29weSBvZiBhIHN1YnNldCBvZiBtQWN0aXZlVHJhY2tzCisgICAgICAgIFZlY3Rvcjwgc3A8UmVjb3JkVHJhY2s+ID4gYWN0aXZlVHJhY2tzOwogCiAgICAgICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCAmJiBhY3RpdmVUcmFjayAhPSBtQWN0aXZlVHJhY2spIHsKLSAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8aW50PiB0bXA7Ci0gICAgICAgICAgICAgICAgdG1wLmFkZChtQWN0aXZlVHJhY2stPnVpZCgpKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVXYWtlTG9ja1VpZHNfbCh0bXApOworCisgICAgICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKTsKKyAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSAncmVjb25maWcnIGlzIGN1cnJlbnRseSB1bnVzZWQKKyAgICAgICAgICAgIGJvb2wgcmVjb25maWcgPSBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpOworCisgICAgICAgICAgICAvLyBjaGVjayBleGl0UGVuZGluZyBoZXJlIGJlY2F1c2UgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSBhbmQKKyAgICAgICAgICAgIC8vIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkgY2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgbUxvY2sKKyAgICAgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhY3RpdmVUcmFjayA9IG1BY3RpdmVUcmFjazsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgPT0gMCAmJiBtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHN0YW5kYnkoKTsKIAotICAgICAgICAgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgLy8gaWYgbm8gYWN0aXZlIHRyYWNrKHMpLCB0aGVuIHN0YW5kYnkgYW5kIHJlbGVhc2Ugd2FrZWxvY2sKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpOworICAgICAgICAgICAgICAgIC8vIGV4aXRQZW5kaW5nKCkgY2FuJ3QgYmVjb21lIHRydWUgaGVyZQogICAgICAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlJlY29yZFRocmVhZDogbG9vcCBzdG9wcGluZyIpOwogICAgICAgICAgICAgICAgIC8vIGdvIHRvIHNsZWVwCiAgICAgICAgICAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdChtTG9jayk7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlJlY29yZFRocmVhZDogbG9vcCBzdGFydGluZyIpOwotICAgICAgICAgICAgICAgIGFjcXVpcmVXYWtlTG9ja19sKG1BY3RpdmVUcmFjayAhPSAwID8gbUFjdGl2ZVRyYWNrLT51aWQoKSA6IC0xKTsKKyAgICAgICAgICAgICAgICBnb3RvIHJlYWNxdWlyZV93YWtlbG9jazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3NHZW4gIT0gYWN0aXZlVHJhY2tzR2VuKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2tzR2VuID0gbUFjdGl2ZVRyYWNrc0dlbjsKKyAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8aW50PiB0bXA7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wLmFkZChtQWN0aXZlVHJhY2tzW2ldLT51aWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVwZGF0ZVdha2VMb2NrVWlkc19sKHRtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgZG9Ccm9hZGNhc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKSB7CisKKyAgICAgICAgICAgICAgICBhY3RpdmVUcmFjayA9IG1BY3RpdmVUcmFja3NbaV07CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUoYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CisgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVHJhY2tCYXNlOjp0cmFja19zdGF0ZSBhY3RpdmVUcmFja1N0YXRlID0gYWN0aXZlVHJhY2stPm1TdGF0ZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGl2ZVRyYWNrU3RhdGUpIHsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpQQVVTSU5HOgorICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZShhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3NHZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgZG9Ccm9hZGNhc3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzaXplLS07CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlNUQVJUSU5HXzE6CisgICAgICAgICAgICAgICAgICAgIHNsZWVwVXMgPSAxMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpTVEFSVElOR18yOgorICAgICAgICAgICAgICAgICAgICBkb0Jyb2FkY2FzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6QUNUSVZFOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOgorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5leHBlY3RlZCBhY3RpdmVUcmFja1N0YXRlICVkIiwgYWN0aXZlVHJhY2tTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2tzLmFkZChhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgaSsrOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZG9Ccm9hZGNhc3QpIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2xlZXAgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSB0cmFja3MgdG8gcHJvY2VzcworICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzbGVlcFVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2xlZXBVcyA9IGtSZWNvcmRUaHJlYWRTbGVlcFVzOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2wobUFjdGl2ZVRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhbmRieSgpOwotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0U3RvcENvbmQuYnJvYWRjYXN0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmVxQ2hhbm5lbENvdW50ICE9IG1BY3RpdmVUcmFjay0+Y2hhbm5lbENvdW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0U3RvcENvbmQuYnJvYWRjYXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZE9uY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCBzdGFydCBzdWNjZWVkcyBvbmx5IGlmIGZpcnN0IHJlYWQgZnJvbSBhdWRpbyBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2VlZHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnl0ZXNSZWFkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXBVcyA9IDA7CiAKICAgICAgICAgICAgIGxvY2tFZmZlY3RDaGFpbnNfbChlZmZlY3RDaGFpbnMpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgIT0gVHJhY2tCYXNlOjpBQ1RJVkUgJiYKLSAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPm1TdGF0ZSAhPSBUcmFja0Jhc2U6OlJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSArKykgewotICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIHRocmVhZCBtdXRleCBpcyBub3cgdW5sb2NrZWQsIG1BY3RpdmVUcmFja3MgdW5rbm93biwgYWN0aXZlVHJhY2tzLnNpemUoKSA+IDAKIAotICAgICAgICAgICAgYnVmZmVyLmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZWFkT25jZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc091dCA9IGJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgIGlmIChtUmVzYW1wbGVyID09IE5VTEwpIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBlZmZlY3RDaGFpbnMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgLy8gdGhyZWFkIG11dGV4IGlzIG5vdCBsb2NrZWQsIGJ1dCBlZmZlY3QgY2hhaW4gaXMgbG9ja2VkCisgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVhZCBmcm9tIEhBTCB0byBrZWVwIHVwIHdpdGggZmFzdGVzdCBjbGllbnQgaWYgbXVsdGlwbGUgYWN0aXZlIHRyYWNrcywgbm90IHNsb3dlc3Qgb25lLgorICAgICAgICAvLyBPbmx5IHRoZSBjbGllbnQocykgdGhhdCBhcmUgdG9vIHNsb3cgd2lsbCBvdmVycnVuLiBCdXQgaWYgZXZlbiB0aGUgZmFzdGVzdCBjbGllbnQgaXMgdG9vCisgICAgICAgIC8vIHNsb3csIHRoZW4gdGhpcyBSZWNvcmRUaHJlYWQgd2lsbCBvdmVycnVuIGJ5IG5vdCBjYWxsaW5nIEhBTCByZWFkIG9mdGVuIGVub3VnaC4KKyAgICAgICAgLy8gSWYgZGVzdGluYXRpb24gaXMgbm9uLWNvbnRpZ3VvdXMsIGZpcnN0IHJlYWQgcGFzdCB0aGUgbm9taW5hbCBlbmQgb2YgYnVmZmVyLCB0aGVuCisgICAgICAgIC8vIGNvcHkgdG8gdGhlIHJpZ2h0IHBsYWNlLiAgUGVybWl0dGVkIGJlY2F1c2UgbVJzbXBJbkJ1ZmZlciB3YXMgb3Zlci1hbGxvY2F0ZWQuCisKKyAgICAgICAgaW50MzJfdCByZWFyID0gbVJzbXBJblJlYXIgJiAobVJzbXBJbkZyYW1lc1AyIC0gMSk7CisgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sCisgICAgICAgICAgICAgICAgJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLCBtQnVmZmVyU2l6ZSk7CisgICAgICAgIGlmIChieXRlc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgZmFpbGVkOiBieXRlc1JlYWQ9JWQgPCAldSIsIGJ5dGVzUmVhZCwgbUJ1ZmZlclNpemUpOworICAgICAgICAgICAgLy8gRm9yY2UgaW5wdXQgaW50byBzdGFuZGJ5IHNvIHRoYXQgaXQgdHJpZXMgdG8gcmVjb3ZlciBhdCBuZXh0IHJlYWQgYXR0ZW1wdAorICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7CisgICAgICAgICAgICBzbGVlcFVzID0ga1JlY29yZFRocmVhZFNsZWVwVXM7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HX0FTU0VSVCgoc2l6ZV90KSBieXRlc1JlYWQgPD0gbUJ1ZmZlclNpemUpOworICAgICAgICBzaXplX3QgZnJhbWVzUmVhZCA9IGJ5dGVzUmVhZCAvIG1GcmFtZVNpemU7CisgICAgICAgIEFMT0dfQVNTRVJUKGZyYW1lc1JlYWQgPiAwKTsKKyAgICAgICAgaWYgKG1UZWVTaW5rICE9IDApIHsKKyAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBkZXN0aW5hdGlvbiBpcyBub24tY29udGlndW91cywgd2Ugbm93IGNvcnJlY3QgZm9yIHJlYWRpbmcgcGFzdCBlbmQgb2YgYnVmZmVyLgorICAgICAgICBzaXplX3QgcGFydDEgPSBtUnNtcEluRnJhbWVzUDIgLSByZWFyOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA+IHBhcnQxKSB7CisgICAgICAgICAgICBtZW1jcHkobVJzbXBJbkJ1ZmZlciwgJm1Sc21wSW5CdWZmZXJbbVJzbXBJbkZyYW1lc1AyICogbUNoYW5uZWxDb3VudF0sCisgICAgICAgICAgICAgICAgICAgIChmcmFtZXNSZWFkIC0gcGFydDEpICogbUZyYW1lU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVhciA9IG1Sc21wSW5SZWFyICs9IGZyYW1lc1JlYWQ7CisKKyAgICAgICAgc2l6ZSA9IGFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgICAgIC8vIGxvb3Agb3ZlciBlYWNoIGFjdGl2ZSB0cmFjaworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgYWN0aXZlVHJhY2sgPSBhY3RpdmVUcmFja3NbaV07CisKKyAgICAgICAgICAgIGVudW0geworICAgICAgICAgICAgICAgIE9WRVJSVU5fVU5LTk9XTiwKKyAgICAgICAgICAgICAgICBPVkVSUlVOX1RSVUUsCisgICAgICAgICAgICAgICAgT1ZFUlJVTl9GQUxTRQorICAgICAgICAgICAgfSBvdmVycnVuID0gT1ZFUlJVTl9VTktOT1dOOworCisgICAgICAgICAgICAvLyBsb29wIG92ZXIgZ2V0TmV4dEJ1ZmZlciB0byBoYW5kbGUgY2lyY3VsYXIgc2luaworICAgICAgICAgICAgZm9yICg7OykgeworCisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLmZyYW1lQ291bnQgPSB+MDsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYWN0aXZlVHJhY2stPm1TaW5rKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1TaW5rLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoc3RhdHVzID09IE9LKSAhPSAoZnJhbWVzT3V0ID4gMCkpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBmcm9udCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQ7CisgICAgICAgICAgICAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc0luOworCisgICAgICAgICAgICAgICAgaWYgKGZpbGxlZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCB0cmVhdCBsaWtlIGEgbWFzc2l2ZSBvdmVycnVuIGFuZCByZS1zeW5jCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCA9IHJlYXI7CisgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX1RSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoc2l6ZV90KSBmaWxsZWQgPD0gbVJzbXBJbkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IChzaXplX3QpIGZpbGxlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgaXMgbm90IGtlZXBpbmcgdXAgd2l0aCBzZXJ2ZXIsIGJ1dCBnaXZlIGl0IGxhdGVzdCBkYXRhCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gbVJzbXBJbkZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCA9IGZyb250ID0gcmVhciAtIGZyYW1lc0luOworICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPT0gMCB8fCBmcmFtZXNJbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bVJlc2FtcGxlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc2FtcGxpbmcKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyYW1lc091dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc0luID0gbUZyYW1lQ291bnQgLSBtUnNtcEluSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzSW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnNyYyA9IChpbnQ4X3QgKiltUnNtcEluQnVmZmVyICsgbVJzbXBJbkluZGV4ICogbUZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKmRzdCA9IGJ1ZmZlci5pOCArIChidWZmZXIuZnJhbWVDb3VudCAtIGZyYW1lc091dCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5tRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbiA+IGZyYW1lc091dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBmcmFtZXNPdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkluZGV4ICs9IGZyYW1lc0luOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCAtPSBmcmFtZXNJbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSBtUmVxQ2hhbm5lbENvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgZnJhbWVzSW4gKiBtRnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cG1peF90b19zdGVyZW9faTE2X2Zyb21fbW9ub19pMTYoKGludDE2X3QgKilkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopc3JjLCBmcmFtZXNJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X3RvX21vbm9faTE2X2Zyb21fc3RlcmVvX2kxNigoaW50MTZfdCAqKWRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKilzcmMsIGZyYW1lc0luKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgJiYgbUZyYW1lQ291bnQgPT0gbVJzbXBJbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVhZEludG87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSBtRnJhbWVDb3VudCAmJiBtQ2hhbm5lbENvdW50ID09IG1SZXFDaGFubmVsQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEludG8gPSBidWZmZXIucmF3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRJbnRvID0gbVJzbXBJbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZCA9IG1JbnB1dC0+c3RyZWFtLT5yZWFkKG1JbnB1dC0+c3RyZWFtLCByZWFkSW50bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVhZCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobUJ5dGVzUmVhZCA8IDApICYmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OkFDVElWRSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGF1ZGlvIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSBpbnB1dCBpbnRvIHN0YW5kYnkgc28gdGhhdCBpdCB0cmllcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBhdCBuZXh0IHJlYWQgYXR0ZW1wdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAoa1JlY29yZFRocmVhZFNsZWVwVXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCA9IG1GcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobVRlZVNpbmsgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbVRlZVNpbmstPndyaXRlKHJlYWRJbnRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlYWQgPj4gRm9ybWF0X2ZyYW1lQml0U2hpZnQobVRlZVNpbmstPmZvcm1hdCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbiA+IGZyYW1lc091dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBmcmFtZXNJbjsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKmRzdCA9IGFjdGl2ZVRyYWNrLT5tU2luay5pODsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyYW1lc0luID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnQgJj0gbVJzbXBJbkZyYW1lc1AyIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXJ0MSA9IG1Sc21wSW5GcmFtZXNQMiAtIGZyb250OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQxID4gZnJhbWVzSW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0MSA9IGZyYW1lc0luOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICpzcmMgPSAoaW50OF90ICopbVJzbXBJbkJ1ZmZlciArIChmcm9udCAqIG1GcmFtZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gYWN0aXZlVHJhY2stPm1DaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHBhcnQxICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaGFubmVsQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbWl4X3RvX3N0ZXJlb19pMTZfZnJvbV9tb25vX2kxNigoaW50MTZfdCAqKWRzdCwgKGludDE2X3QgKilzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0MSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KChpbnQxNl90ICopZHN0LCAoaW50MTZfdCAqKXNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBwYXJ0MSAqIGFjdGl2ZVRyYWNrLT5tRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnQgKz0gcGFydDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiAtPSBwYXJ0MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ICs9IGZyYW1lc091dDsKKwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgZnJhbWVzSW5OZWVkZWQgc2hvdWxkIHJlYWxseSBiZSBwYXJ0IG9mIHJlc2FtcGxlciBBUEksIGFuZCBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgZGVwZW5kIG9uIHRoZSBTUkMgcmF0aW8KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgdG8ga2VlcCBtUnNtcEluQnVmZmVyIGZ1bGwgc28gcmVzYW1wbGVyIGFsd2F5cyBoYXMgc3VmZmljaWVudCBpbnB1dAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzSW5OZWVkZWQ7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgcmUtY2FsY3VsYXRlIHdoZW4gaXQgY2hhbmdlcywgYW5kIG9wdGltaXplIGZvciBjb21tb24gcmF0aW9zCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpbk92ZXJPdXQgPSAoZG91YmxlKSBtU2FtcGxlUmF0ZSAvIGFjdGl2ZVRyYWNrLT5tU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIG91dE92ZXJJbiA9IChkb3VibGUpIGFjdGl2ZVRyYWNrLT5tU2FtcGxlUmF0ZSAvIG1TYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCA9IGNlaWwoZnJhbWVzT3V0ICogaW5PdmVyT3V0KSArIDE7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJuZWVkICV1IGZyYW1lcyBpbiB0byBwcm9kdWNlICV1IG91dCBnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkLCBmcmFtZXNPdXQsIGluT3Zlck91dCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEFsdGhvdWdoIHdlIHRoZW9yZXRpY2FsbHkgaGF2ZSBmcmFtZXNJbiBpbiBjaXJjdWxhciBidWZmZXIsIHNvbWUgb2YgdGhvc2UgYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHVucmVsZWFzZWQgZnJhbWVzLCBhbmQgdGh1cyBtdXN0IGJlIGRpc2NvdW50ZWQgZm9yIHB1cnBvc2Ugb2YgYnVkZ2V0aW5nLgorICAgICAgICAgICAgICAgICAgICBzaXplX3QgdW5yZWxlYXNlZCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWw7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gZnJhbWVzSW4gPiB1bnJlbGVhc2VkID8gZnJhbWVzSW4gLSB1bnJlbGVhc2VkIDogMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc0luIDwgZnJhbWVzSW5OZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJub3QgZW5vdWdoIHRvIHJlc2FtcGxlOiBoYXZlICV1IGZyYW1lcyBpbiBidXQgbmVlZCAldSBpbiB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWNlICV1IG91dCBnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBmcmFtZXNJbk5lZWRlZCwgZnJhbWVzT3V0LCBpbk92ZXJPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ld0ZyYW1lc091dCA9IGZyYW1lc0luID4gMCA/IGZsb29yKChmcmFtZXNJbiAtIDEpICogb3V0T3ZlckluKSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5ld0ZyYW1lc091dCA+PSBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZyYW1lc091dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCA9IGNlaWwobmV3RnJhbWVzT3V0ICogaW5PdmVyT3V0KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibm93IG5lZWQgJXUgZnJhbWVzIGluIHRvIHByb2R1Y2UgJXUgb3V0IGdpdmVuIG91dC9pbiByYXRpbyBvZiAlLjRnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQsIG5ld0ZyYW1lc091dCwgb3V0T3ZlckluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZnJhbWVzSW4gPCBmcmFtZXNJbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VjY2VzcyAyOiBoYXZlICV1IGZyYW1lcyBpbiBhbmQgbmVlZCAldSBpbiB0byBwcm9kdWNlICV1IG91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBuZXdGcmFtZXNPdXQsIGluT3Zlck91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBuZXdGcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VjY2VzcyAxOiBoYXZlICV1IGluIGFuZCBuZWVkICV1IGluIHRvIHByb2R1Y2UgJXUgb3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBmcmFtZXNJbk5lZWRlZCwgZnJhbWVzT3V0LCBpbk92ZXJPdXQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBtUnNtcE91dEJ1ZmZlciBhcyBuZWVkZWQ7IHdlIHdpbGwgZ3JvdyBidXQgbmV2ZXIgc2hyaW5rCisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bVJzbXBPdXRGcmFtZUNvdW50IDwgZnJhbWVzT3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSB3aHkgZG9lcyBlYWNoIHRyYWNrIG5lZWQgaXQncyBvd24gbVJzbXBPdXRCdWZmZXI/IGNhbid0IHRoZXkgc2hhcmU/CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNhbXBsZXIgYWx3YXlzIG91dHB1dHMgc3RlcmVvCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIgPSBuZXcgaW50MzJfdFtmcmFtZXNPdXQgKiBGQ0NfMl07CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBPdXRGcmFtZUNvdW50ID0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGFjY3VtdWxhdGVzLCBidXQgd2Ugb25seSBoYXZlIG9uZSBzb3VyY2UgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1Sc21wT3V0QnVmZmVyLCAwLCBmcmFtZXNPdXQgKiBGQ0NfMiAqIHNpemVvZihpbnQzMl90KSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFsdGVyIG91dHB1dCBmcmFtZSBjb3VudCBhcyBpZiB3ZSB3ZXJlIGV4cGVjdGluZyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID4+PSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKG1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyAvKiBBdWRpb0J1ZmZlclByb3ZpZGVyKiAqLyk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIDAsIGZyYW1lc091dCAqIEZDQ18yICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXItPnJlc2FtcGxlKGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGhvdyBhYm91dCBoYXZpbmcgYWN0aXZlVHJhY2sgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGl0c2VsZj8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGlzKi8gLyogQXVkaW9CdWZmZXJQcm92aWRlciogKi8pOwogICAgICAgICAgICAgICAgICAgICAvLyBkaXRoZXJBbmRDbGFtcCgpIHdvcmtzIGFzIGxvbmcgYXMgYWxsIGJ1ZmZlcnMgcmV0dXJuZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgLy8gbUFjdGl2ZVRyYWNrLT5nZXROZXh0QnVmZmVyKCkgYXJlIDMyIGJpdCBhbGlnbmVkIHdoaWNoIHNob3VsZCBiZSBhbHdheXMgdHJ1ZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMiAmJiBtUmVxQ2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbXBvcmFyaWx5IHR5cGUgcHVuIG1Sc21wT3V0QnVmZmVyIGZyb20gUTE5LjEyIHRvIGludDE2X3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKG1Sc21wT3V0QnVmZmVyLCBtUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoKSBhcmUgMzIgYml0IGFsaWduZWQgd2hpY2ggc2hvdWxkIGJlIGFsd2F5cyB0cnVlLgorICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1DaGFubmVsQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcG9yYXJpbHkgdHlwZSBwdW4gbVJzbXBPdXRCdWZmZXIgZnJvbSBRNC4yNyB0byBpbnQxNl90CisgICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIgYWx3YXlzIG91dHB1dHMgc3RlcmVvIHNhbXBsZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBwb3N0IHN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KGJ1ZmZlci5pMTYsIChpbnQxNl90ICopbVJzbXBPdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X3RvX21vbm9faTE2X2Zyb21fc3RlcmVvX2kxNihhY3RpdmVUcmFjay0+bVNpbmsuaTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKWFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0KTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90ICopYnVmZmVyLnJhdywgbVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCAqKWFjdGl2ZVRyYWNrLT5tU2luay5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyBub3cgZG9uZSB3aXRoIG1Sc21wT3V0QnVmZmVyCiAKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1GcmFtZXN0b0Ryb3AgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID4gMCAmJiAob3ZlcnJ1biA9PSBPVkVSUlVOX1VOS05PV04pKSB7CisgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsuZnJhbWVDb3VudCA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZhY3RpdmVUcmFjay0+bVNpbmspOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GcmFtZXN0b0Ryb3AgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzdG9Ecm9wIC09IGJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GcmFtZXN0b0Ryb3AgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY291bGQgZG8gYSBwYXJ0aWFsIGRyb3Agb2YgZnJhbWVzT3V0CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wIC09IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXN0b0Ryb3AgKz0gYnVmZmVyLmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZyYW1lc3RvRHJvcCA+PSAwIHx8IG1TeW5jU3RhcnRFdmVudCA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RhcnRFdmVudC0+aXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgKz0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wID49IDAgfHwgYWN0aXZlVHJhY2stPm1TeW5jU3RhcnRFdmVudCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3luY1N0YXJ0RXZlbnQtPmlzQ2FuY2VsbGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiU3luY2VkIHJlY29yZCAlcywgc2Vzc2lvbiAlZCwgdHJpZ2dlciBzZXNzaW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUZyYW1lc3RvRHJvcCA+PSAwKSA/ICJ0aW1lZCBvdXQiIDogImNhbmNlbGxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5zZXNzaW9uSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVN5bmNTdGFydEV2ZW50ICE9IDApID8gbVN5bmNTdGFydEV2ZW50LT50cmlnZ2VyU2Vzc2lvbigpIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA+PSAwKSA/ICJ0aW1lZCBvdXQiIDogImNhbmNlbGxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPnNlc3Npb25JZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY3RpdmVUcmFjay0+bVN5bmNTdGFydEV2ZW50ICE9IDApID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3luY1N0YXJ0RXZlbnQtPnRyaWdnZXJTZXNzaW9uKCkgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+Y2xlYXJPdmVyZmxvdygpOworCisgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNsaWVudCBpc24ndCByZXRyaWV2aW5nIGJ1ZmZlcnMgZmFzdCBlbm91Z2gKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghbUFjdGl2ZVRyYWNrLT5zZXRPdmVyZmxvdygpKSB7CisKKyAgICAgICAgICAgIHN3aXRjaCAob3ZlcnJ1bikgeworICAgICAgICAgICAgY2FzZSBPVkVSUlVOX1RSVUU6CisgICAgICAgICAgICAgICAgLy8gY2xpZW50IGlzbid0IHJldHJpZXZpbmcgYnVmZmVycyBmYXN0IGVub3VnaAorICAgICAgICAgICAgICAgIGlmICghYWN0aXZlVHJhY2stPnNldE92ZXJmbG93KCkpIHsKICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHNob3VsZCBsYXN0V2FybmluZyBwZXIgdHJhY2s/CiAgICAgICAgICAgICAgICAgICAgIGlmICgobm93IC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVjb3JkVGhyZWFkOiBidWZmZXIgb3ZlcmZsb3ciKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbm93OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIHByb2Nlc3NvciBmb3IgYSB3aGlsZSBiZWZvcmUgYXNraW5nIGZvciBhIG5ldyBidWZmZXIuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGdpdmUgdGhlIGFwcGxpY2F0aW9uIG1vcmUgY2hhbmNlIHRvIHJlYWQgZnJvbSB0aGUgYnVmZmVyIGFuZAotICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBvdmVyZmxvdy4KLSAgICAgICAgICAgICAgICB1c2xlZXAoa1JlY29yZFRocmVhZFNsZWVwVXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPVkVSUlVOX0ZBTFNFOgorICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5jbGVhck92ZXJmbG93KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9WRVJSVU5fVU5LTk9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKwogICAgICAgICB9CisKICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCiAgICAgICAgIHVubG9ja0VmZmVjdENoYWlucyhlZmZlY3RDaGFpbnMpOwotICAgICAgICBlZmZlY3RDaGFpbnMuY2xlYXIoKTsKKyAgICAgICAgLy8gZWZmZWN0Q2hhaW5zIGRvZXNuJ3QgbmVlZCB0byBiZSBjbGVhcmVkLCBzaW5jZSBpdCBpcyBjbGVhcmVkIGJ5IGRlc3RydWN0b3IgYXQgc2NvcGUgZW5kCiAgICAgfQogCi0gICAgc3RhbmRieSgpOworICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTQ2MzgsNyArNTA0OCw4IEBACiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsKICAgICAgICAgfQotICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrcy5jbGVhcigpOworICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CiAgICAgICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOwogICAgIH0KIApAQCAtNDY0OCw3ICs1MDU5LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN0YW5kYnkoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpCiB7CiAgICAgaWYgKCFtU3RhbmRieSkgewogICAgICAgICBpbnB1dFN0YW5kQnkoKTsKQEAgLTQ2NjEsMjYgKzUwNzIsMjMgQEAKICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogfQogCi1zcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+ICBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y3JlYXRlUmVjb3JkVHJhY2tfbCgKKy8vIFJlY29yZFRocmVhZDo6Y3JlYXRlUmVjb3JkVHJhY2tfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCitzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjcmVhdGVSZWNvcmRUcmFja19sKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIGludCB1aWQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAqcEZyYW1lQ291bnQ7CiAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrOwogICAgIHN0YXR1c190IGxTdGF0dXM7CiAKLSAgICBsU3RhdHVzID0gaW5pdENoZWNrKCk7Ci0gICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBhdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9CiAgICAgLy8gY2xpZW50IGV4cHJlc3NlcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QsIGJ1dCB3ZSBnZXQgdGhlIGZpbmFsIHNheQogICAgIGlmICgqZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CiAgICAgICBpZiAoCkBAIC00Njg4LDIxICs1MDk2LDI0IEBACiAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgKHRpZCAhPSAtMSkgJiYKICAgICAgICAgICAgICAgICAoKGZyYW1lQ291bnQgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBub3QgbmVjZXNzYXJpbHkgdHJ1ZSwgc2hvdWxkIGJlIG5hdGl2ZSBmcmFtZSBjb3VudCBmb3IgbmF0aXZlIFNSIQogICAgICAgICAgICAgICAgIChmcmFtZUNvdW50ID49IG1GcmFtZUNvdW50KSkKICAgICAgICAgICAgICkgJiYKLSAgICAgICAgICAgIC8vIEZJWE1FIHdoZW4gcmVjb3JkIHN1cHBvcnRzIG5vbi1QQ00gZGF0YSwgYWxzbyBjaGVjayBmb3IgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCisgICAgICAgICAgICAvLyBQQ00gZGF0YQorICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmCiAgICAgICAgICAgICAvLyBtb25vIG9yIHN0ZXJlbwogICAgICAgICAgICAgKCAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgfHwKICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgKSAmJgogICAgICAgICAgICAgLy8gaGFyZHdhcmUgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgIC8vIEZJWE1FIGFjdHVhbGx5IHRoZSBuYXRpdmUgaGFyZHdhcmUgc2FtcGxlIHJhdGUKICAgICAgICAgICAgIChzYW1wbGVSYXRlID09IG1TYW1wbGVSYXRlKSAmJgotICAgICAgICAgICAgLy8gcmVjb3JkIHRocmVhZCBoYXMgYW4gYXNzb2NpYXRlZCBmYXN0IHJlY29yZGVyCi0gICAgICAgICAgICBoYXNGYXN0UmVjb3JkZXIoKQotICAgICAgICAgICAgLy8gRklYTUUgdGVzdCB0aGF0IFJlY29yZFRocmVhZCBmb3IgdGhpcyBmYXN0IHRyYWNrIGhhcyBhIGNhcGFibGUgb3V0cHV0IEhBTAotICAgICAgICAgICAgLy8gRklYTUUgYWRkIGEgcGVybWlzc2lvbiB0ZXN0IGFsc28/CisgICAgICAgICAgICAvLyByZWNvcmQgdGhyZWFkIGhhcyBhbiBhc3NvY2lhdGVkIGZhc3QgY2FwdHVyZQorICAgICAgICAgICAgaGFzRmFzdENhcHR1cmUoKQorICAgICAgICAgICAgLy8gZmFzdCBjYXB0dXJlIGRvZXMgbm90IHJlcXVpcmUgc2xvdHMKICAgICAgICAgKSB7Ci0gICAgICAgIC8vIGlmIGZyYW1lQ291bnQgbm90IHNwZWNpZmllZCwgdGhlbiBpdCBkZWZhdWx0cyB0byBmYXN0IHJlY29yZGVyIChIQUwpIGZyYW1lIGNvdW50CisgICAgICAgIC8vIGlmIGZyYW1lQ291bnQgbm90IHNwZWNpZmllZCwgdGhlbiBpdCBkZWZhdWx0cyB0byBmYXN0IGNhcHR1cmUgKEhBTCkgZnJhbWUgY291bnQKICAgICAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgd3JvbmcgbUZyYW1lQ291bnQKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCAqIGtGYXN0VHJhY2tNdWx0aXBsaWVyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgYWNjZXB0ZWQ6IGZyYW1lQ291bnQ9JWQgbUZyYW1lQ291bnQ9JWQiLApAQCAtNDcxMCwxMSArNTEyMSwxMiBAQAogICAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQ6IGZyYW1lQ291bnQ9JWQgIgogICAgICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lZCBmb3JtYXQ9JWQgaXNMaW5lYXI9JWQgY2hhbm5lbE1hc2s9JSN4IHNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgotICAgICAgICAgICAgICAgICJoYXNGYXN0UmVjb3JkZXI9JWQgdGlkPSVkIiwKKyAgICAgICAgICAgICAgICAiaGFzRmFzdENhcHR1cmU9JWQgdGlkPSVkIiwKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCwgZm9ybWF0LAogICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgc2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsIGhhc0Zhc3RSZWNvcmRlcigpLCB0aWQpOworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBzYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwgaGFzRmFzdENhcHR1cmUoKSwgdGlkKTsKICAgICAgICAgKmZsYWdzICY9IH5JQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOworICAgICAgICAvLyBGSVhNRSBJdCdzIG5vdCBjbGVhciB0aGF0IHdlIG5lZWQgdG8gZW5mb3JjZSB0aGlzIGFueSBtb3JlLCBzaW5jZSB3ZSBoYXZlIGEgcGlwZS4KICAgICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBBdWRpb1JlY29yZCBjYWxjdWxhdGlvbiwgYnVmZmVyIGRlcHRoIGlzIGZvcmNlZAogICAgICAgICAvLyB0byBiZSBhdCBsZWFzdCAyIHggdGhlIHJlY29yZCB0aHJlYWQgZnJhbWUgY291bnQgYW5kIGNvdmVyIGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kuCiAgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgdG9vIGNvbnNlcnZhdGl2ZSwgYnV0IGxlZ2FjeSBhcHBsaWNhdGlvbiBjb2RlIG1heSBkZXBlbmQgb24gaXQuCkBAIC00NzMxLDggKzUxNDMsMTMgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0KKyAgICAqcEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogCi0gICAgLy8gRklYTUUgdXNlIGZsYWdzIGFuZCB0aWQgc2ltaWxhciB0byBjcmVhdGVUcmFja19sKCkKKyAgICBsU3RhdHVzID0gaW5pdENoZWNrKCk7CisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBhdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CiAKICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNDc0MCw5ICs1MTU3LDkgQEAKICAgICAgICAgdHJhY2sgPSBuZXcgUmVjb3JkVHJhY2sodGhpcywgY2xpZW50LCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIHNlc3Npb25JZCwgdWlkKTsKIAotICAgICAgICBpZiAodHJhY2stPmdldENibGsoKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIG5vIGNvbnRyb2wgYmxvY2siKTsKLSAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CisgICAgICAgIGxTdGF0dXMgPSB0cmFjay0+aW5pdENoZWNrKCk7CisgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIGluaXRDaGVjayBmYWlsZWQgJWQ7IG5vIGNvbnRyb2wgYmxvY2s/IiwgbFN0YXR1cyk7CiAgICAgICAgICAgICAvLyB0cmFjayBtdXN0IGJlIGNsZWFyZWQgZnJvbSB0aGUgY2FsbGVyIGFzIHRoZSBjYWxsZXIgaGFzIHRoZSBBRiBsb2NrCiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KQEAgLTQ3NjEsMTIgKzUxNzgsMTEgQEAKICAgICAgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnRfbChjYWxsaW5nUGlkLCB0aWQsIGtQcmlvcml0eUF1ZGlvQXBwKTsKICAgICAgICAgfQogICAgIH0KKwogICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKIAogRXhpdDoKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gdHJhY2s7CiB9CiAKQEAgLTQ3NzksMTI5ICs1MTk1LDEyMyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgaWYgKGV2ZW50ID09IEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUpIHsKLSAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwogICAgIH0gZWxzZSBpZiAoZXZlbnQgIT0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfU0FNRSkgewotICAgICAgICBtU3luY1N0YXJ0RXZlbnQgPSBtQXVkaW9GbGluZ2VyLT5jcmVhdGVTeW5jRXZlbnQoZXZlbnQsCisgICAgICAgIHJlY29yZFRyYWNrLT5tU3luY1N0YXJ0RXZlbnQgPSBtQXVkaW9GbGluZ2VyLT5jcmVhdGVTeW5jRXZlbnQoZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5zZXNzaW9uSWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNTdGFydEV2ZW50Q2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrKTsKICAgICAgICAgLy8gU3luYyBldmVudCBjYW4gYmUgY2FuY2VsbGVkIGJ5IHRoZSB0cmlnZ2VyIHNlc3Npb24gaWYgdGhlIHRyYWNrIGlzIG5vdCBpbiBhCiAgICAgICAgIC8vIGNvbXBhdGlibGUgc3RhdGUgaW4gd2hpY2ggY2FzZSB3ZSBzdGFydCByZWNvcmQgaW1tZWRpYXRlbHkKLSAgICAgICAgaWYgKG1TeW5jU3RhcnRFdmVudC0+aXNDYW5jZWxsZWQoKSkgewotICAgICAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TeW5jU3RhcnRFdmVudC0+aXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRvIG5vdCB3YWl0IGZvciB0aGUgZXZlbnQgZm9yIG1vcmUgdGhhbiBBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcwotICAgICAgICAgICAgbUZyYW1lc3RvRHJvcCA9IC0gKChBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcyAqIG1SZXFTYW1wbGVSYXRlKSAvIDEwMDApOworICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1GcmFtZXNUb0Ryb3AgPSAtCisgICAgICAgICAgICAgICAgICAgICgoQXVkaW9TeXN0ZW06OmtTeW5jUmVjb3JkU3RhcnRUaW1lT3V0TXMgKiByZWNvcmRUcmFjay0+bVNhbXBsZVJhdGUpIC8gMTAwMCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICB7CisgICAgICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBhIHJlbmRlenZvdXMgYmV0d2VlbiBiaW5kZXIgdGhyZWFkIGV4ZWN1dGluZyBzdGFydCgpIGFuZCBSZWNvcmRUaHJlYWQKICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjayAhPSBtQWN0aXZlVHJhY2suZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUJVU1k7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewotICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CisgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spID49IDApIHsKKyAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJhY3RpdmUgcmVjb3JkIHRyYWNrIFBBVVNJTkcgLT4gQUNUSVZFIik7CisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWN0aXZlIHJlY29yZCB0cmFjayBzdGF0ZSAlZCIsIHJlY29yZFRyYWNrLT5tU3RhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OklETEU7Ci0gICAgICAgIG1BY3RpdmVUcmFjayA9IHJlY29yZFRyYWNrOworICAgICAgICAvLyBUT0RPIGNvbnNpZGVyIG90aGVyIHdheXMgb2YgaGFuZGxpbmcgdGhpcywgc3VjaCBhcyBjaGFuZ2luZyB0aGUgc3RhdGUgdG8gOlNUQVJUSU5HIGFuZAorICAgICAgICAvLyAgICAgIGFkZGluZyB0aGUgdHJhY2sgdG8gbUFjdGl2ZVRyYWNrcyBhZnRlciByZXR1cm5pbmcgZnJvbSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dCgpLAorICAgICAgICAvLyAgICAgIG9yIHVzaW5nIGEgc2VwYXJhdGUgY29tbWFuZCB0aHJlYWQKKyAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrcy5hZGQocmVjb3JkVHJhY2spOworICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChtSWQpOwogICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIC8vIEZJWE1FIHNob3VsZCB2ZXJpZnkgdGhhdCByZWNvcmRUcmFjayBpcyBzdGlsbCBpbiBtQWN0aXZlVHJhY2tzCiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUocmVjb3JkVHJhY2spOworICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbisrOworICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KLSAgICAgICAgbVJzbXBJbkluZGV4ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgIG1CeXRlc1JlYWQgPSAwOwotICAgICAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUmVzYW1wbGVyLT5yZXNldCgpOworICAgICAgICAvLyBDYXRjaCB1cCB3aXRoIGN1cnJlbnQgYnVmZmVyIGluZGljZXMgaWYgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZy4KKyAgICAgICAgLy8gVGhpcyBpcyB3aGF0IG1ha2VzIGEgbmV3IGNsaWVudCBkaXNjYXJkIGFsbCBidWZmZXJlZCBkYXRhLiAgSWYgdGhlIHRyYWNrJ3MgbVJzbXBJbkZyb250CisgICAgICAgIC8vIHdhcyBpbml0aWFsaXplZCB0byBzb21lIHZhbHVlIGNsb3NlciB0byB0aGUgdGhyZWFkJ3MgbVJzbXBJbkZyb250LCB0aGVuIHRoZSB0cmFjayBjb3VsZAorICAgICAgICAvLyBzZWUgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhIGJlZm9yZSBpdCBjYWxsZWQgc3RhcnQoKSwgYnV0IHdpdGggZ3JlYXRlciByaXNrIG9mIG92ZXJydW4uCisKKyAgICAgICAgcmVjb3JkVHJhY2stPm1Sc21wSW5Gcm9udCA9IG1Sc21wSW5SZWFyOworICAgICAgICByZWNvcmRUcmFjay0+bVJzbXBJblVucmVsID0gMDsKKyAgICAgICAgLy8gRklYTUUgd2h5IHJlc2V0PworICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1SZXNhbXBsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXItPnJlc2V0KCk7CiAgICAgICAgIH0KLSAgICAgICAgbUFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlJFU1VNSU5HOworICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOwogICAgICAgICAvLyBzaWduYWwgdGhyZWFkIHRvIHN0YXJ0Ci0gICAgICAgIEFMT0dWKCJTaWduYWwgcmVjb3JkIHRocmVhZCIpOwogICAgICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsKLSAgICAgICAgLy8gZG8gbm90IHdhaXQgZm9yIG1TdGFydFN0b3BDb25kIGlmIGV4aXRpbmcKLSAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICBnb3RvIHN0YXJ0RXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXJ0U3RvcENvbmQud2FpdChtTG9jayk7Ci0gICAgICAgIGlmIChtQWN0aXZlVHJhY2sgPT0gMCkgeworICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmQgZmFpbGVkIHRvIHN0YXJ0Iik7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIHN0YXJ0RXJyb3I7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlJlY29yZCBzdGFydGVkIE9LIik7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiBzdGFydEVycm9yOgogICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobUlkKTsKLSAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAvLyBGSVhNRSBJIHdvbmRlciB3aHkgd2UgZG8gbm90IHJlc2V0IHRoZSBzdGF0ZSBoZXJlPwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNsZWFyU3luY1N0YXJ0RXZlbnQoKQotewotICAgIGlmIChtU3luY1N0YXJ0RXZlbnQgIT0gMCkgewotICAgICAgICBtU3luY1N0YXJ0RXZlbnQtPmNhbmNlbCgpOwotICAgIH0KLSAgICBtU3luY1N0YXJ0RXZlbnQuY2xlYXIoKTsKLSAgICBtRnJhbWVzdG9Ecm9wID0gMDsKLX0KLQogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3luY1N0YXJ0RXZlbnRDYWxsYmFjayhjb25zdCB3cDxTeW5jRXZlbnQ+JiBldmVudCkKIHsKICAgICBzcDxTeW5jRXZlbnQ+IHN0cm9uZ0V2ZW50ID0gZXZlbnQucHJvbW90ZSgpOwogCiAgICAgaWYgKHN0cm9uZ0V2ZW50ICE9IDApIHsKLSAgICAgICAgUmVjb3JkVGhyZWFkICptZSA9IChSZWNvcmRUaHJlYWQgKilzdHJvbmdFdmVudC0+Y29va2llKCk7Ci0gICAgICAgIG1lLT5oYW5kbGVTeW5jU3RhcnRFdmVudChzdHJvbmdFdmVudCk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkKLXsKLSAgICBpZiAoZXZlbnQgPT0gbVN5bmNTdGFydEV2ZW50KSB7Ci0gICAgICAgIC8vIFRPRE86IHVzZSBhY3R1YWwgYnVmZmVyIGZpbGxpbmcgc3RhdHVzIGluc3RlYWQgb2YgMiBidWZmZXJzIHdoZW4gaW5mbyBpcyBhdmFpbGFibGUKLSAgICAgICAgLy8gZnJvbSBhdWRpbyBIQUwKLSAgICAgICAgbUZyYW1lc3RvRHJvcCA9IG1GcmFtZUNvdW50ICogMjsKKyAgICAgICAgc3A8UmVmQmFzZT4gcHRyID0gc3Ryb25nRXZlbnQtPmNvb2tpZSgpLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHB0ciAhPSAwKSB7CisgICAgICAgICAgICBSZWNvcmRUcmFjayAqcmVjb3JkVHJhY2sgPSAoUmVjb3JkVHJhY2sgKilwdHIuZ2V0KCk7CisgICAgICAgICAgICByZWNvcmRUcmFjay0+aGFuZGxlU3luY1N0YXJ0RXZlbnQoc3Ryb25nRXZlbnQpOworICAgICAgICB9CiAgICAgfQogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzdG9wKFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSB7CiAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RvcCIpOwogICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgaWYgKHJlY29yZFRyYWNrICE9IG1BY3RpdmVUcmFjay5nZXQoKSB8fCByZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgeworICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spICE9IDAgfHwgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICAvLyBub3RlIHRoYXQgdGhyZWFkTG9vcCBtYXkgc3RpbGwgYmUgcHJvY2Vzc2luZyB0aGUgdHJhY2sgYXQgdGhpcyBwb2ludCBbd2l0aG91dCBsb2NrXQogICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlBBVVNJTkc7CiAgICAgLy8gZG8gbm90IHdhaXQgZm9yIG1TdGFydFN0b3BDb25kIGlmIGV4aXRpbmcKICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisgICAgLy8gRklYTUUgaW5jb3JyZWN0IHVzYWdlIG9mIHdhaXQ6IG5vIGV4cGxpY2l0IHByZWRpY2F0ZSBvciBsb29wCiAgICAgbVN0YXJ0U3RvcENvbmQud2FpdChtTG9jayk7Ci0gICAgLy8gaWYgd2UgaGF2ZSBiZWVuIHJlc3RhcnRlZCwgcmVjb3JkVHJhY2sgPT0gbUFjdGl2ZVRyYWNrLmdldCgpIGhlcmUKLSAgICBpZiAoZXhpdFBlbmRpbmcoKSB8fCByZWNvcmRUcmFjayAhPSBtQWN0aXZlVHJhY2suZ2V0KCkpIHsKKyAgICAvLyBpZiB3ZSBoYXZlIGJlZW4gcmVzdGFydGVkLCByZWNvcmRUcmFjayBpcyBpbiBtQWN0aXZlVHJhY2tzIGhlcmUKKyAgICBpZiAoZXhpdFBlbmRpbmcoKSB8fCBtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spICE9IDApIHsKICAgICAgICAgQUxPR1YoIlJlY29yZCBzdG9wcGVkIE9LIik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlzVmFsaWRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpIGNvbnN0Citib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjppc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50IF9fdW51c2VkKSBjb25zdAogewogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQgX191bnVzZWQpCiB7CiAjaWYgMCAgIC8vIFRoaXMgYnJhbmNoIGlzIGN1cnJlbnRseSBkZWFkIGNvZGUsIGJ1dCBpcyBwcmVzZXJ2ZWQgaW4gY2FzZSBpdCB3aWxsIGJlIG5lZWRlZCBpbiBmdXR1cmUKICAgICBpZiAoIWlzVmFsaWRTeW5jRXZlbnQoZXZlbnQpKSB7CkBAIC00OTMyLDcgKzUzNDIsNyBAQAogICAgIHRyYWNrLT50ZXJtaW5hdGUoKTsKICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOwogICAgIC8vIGFjdGl2ZSB0cmFja3MgYXJlIHJlbW92ZWQgYnkgdGhyZWFkTG9vcCgpCi0gICAgaWYgKG1BY3RpdmVUcmFjayAhPSB0cmFjaykgeworICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewogICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKICAgICB9CiB9CkBAIC00OTUyLDEwNCArNTM2MiwxMTkgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7CisgICAgZmRwcmludGYoZmQsICJcbklucHV0IHRocmVhZCAlcDpcbiIsIHRoaXMpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dCB0aHJlYWQgJXAgaW50ZXJuYWxzXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiSW4gaW5kZXg6ICV6dVxuIiwgbVJzbXBJbkluZGV4KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJCdWZmZXIgc2l6ZTogJXp1IGJ5dGVzXG4iLCBtQnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVzYW1wbGluZzogJWRcbiIsIChtUmVzYW1wbGVyICE9IE5VTEwpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXQgY2hhbm5lbCBjb3VudDogJXVcbiIsIG1SZXFDaGFubmVsQ291bnQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dCBzYW1wbGUgcmF0ZTogJXVcbiIsIG1SZXFTYW1wbGVSYXRlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZmRwcmludGYoZmQsICIgIEJ1ZmZlciBzaXplOiAlenUgYnl0ZXNcbiIsIG1CdWZmZXJTaXplKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJObyBhY3RpdmUgcmVjb3JkIGNsaWVudFxuIik7CisgICAgICAgIGZkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgcmVjb3JkIGNsaWVudHNcbiIpOwogICAgIH0KIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCiAgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiSW5wdXQgdGhyZWFkICVwIHRyYWNrc1xuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07Ci0gICAgICAgIGlmICh0cmFjayAhPSAwKSB7Ci0gICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNpemVfdCBudW10cmFja3MgPSBtVHJhY2tzLnNpemUoKTsKKyAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgc2l6ZV90IG51bWFjdGl2ZXNlZW4gPSAwOworICAgIGZkcHJpbnRmKGZkLCAiICAlZCBUcmFja3MiLCBudW10cmFja3MpOworICAgIGlmIChudW10cmFja3MpIHsKKyAgICAgICAgZmRwcmludGYoZmQsICIgb2Ygd2hpY2ggJWQgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKKyAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRyYWNrKSA+PSAwOworICAgICAgICAgICAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtYWN0aXZlc2VlbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIGFjdGl2ZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmRwcmludGYoZmQsICJcbiIpOwogICAgIH0KIAotICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0IHRocmVhZCAlcCBhY3RpdmUgdHJhY2tzXG4iLCB0aGlzKTsKKyAgICBpZiAobnVtYWN0aXZlc2VlbiAhPSBudW1hY3RpdmUpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKLSAgICAgICAgbUFjdGl2ZVRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgeworICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICB9CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyBfX3VudXNlZCkKIHsKLSAgICBzaXplX3QgZnJhbWVzUmVxID0gYnVmZmVyLT5mcmFtZUNvdW50OwotICAgIHNpemVfdCBmcmFtZXNSZWFkeSA9IG1GcmFtZUNvdW50IC0gbVJzbXBJbkluZGV4OwotICAgIGludCBjaGFubmVsQ291bnQ7Ci0KLSAgICBpZiAoZnJhbWVzUmVhZHkgPT0gMCkgewotICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sIG1Sc21wSW5CdWZmZXIsIG1CdWZmZXJTaXplKTsKLSAgICAgICAgaWYgKG1CeXRlc1JlYWQgPD0gMCkgewotICAgICAgICAgICAgaWYgKChtQnl0ZXNSZWFkIDwgMCkgJiYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6QUNUSVZFKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJSZWNvcmRUaHJlYWQ6OmdldE5leHRCdWZmZXIoKSBFcnJvciByZWFkaW5nIGF1ZGlvIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgaW5wdXQgaW50byBzdGFuZGJ5IHNvIHRoYXQgaXQgdHJpZXMgdG8KLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGF0IG5leHQgcmVhZCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICB9Ci0gICAgICAgIG1Sc21wSW5JbmRleCA9IDA7Ci0gICAgICAgIGZyYW1lc1JlYWR5ID0gbUZyYW1lQ291bnQ7CisgICAgUmVjb3JkVHJhY2sgKmFjdGl2ZVRyYWNrID0gbVJlY29yZFRyYWNrOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBhY3RpdmVUcmFjay0+bVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZEJhc2UgPT0gMCkgeworICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWRCYXNlLmdldCgpOworICAgIGludDMyX3QgcmVhciA9IHJlY29yZFRocmVhZC0+bVJzbXBJblJlYXI7CisgICAgaW50MzJfdCBmcm9udCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBiZSBQMiAoZG9uJ3Qgd2FudCB0byBpbmNyZWFzZSBsYXRlbmN5KQorICAgIC8vIEZJWE1FIGlmIGNsaWVudCBub3Qga2VlcGluZyB1cCwgZGlzY2FyZAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzKSk7CisgICAgLy8gJ2ZpbGxlZCcgbWF5IGJlIG5vbi1jb250aWd1b3VzLCBzbyByZXR1cm4gb25seSB0aGUgZmlyc3QgY29udGlndW91cyBjaHVuaworICAgIGZyb250ICY9IHJlY29yZFRocmVhZC0+bVJzbXBJbkZyYW1lc1AyIC0gMTsKKyAgICBzaXplX3QgcGFydDEgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXNQMiAtIGZyb250OworICAgIGlmIChwYXJ0MSA+IChzaXplX3QpIGZpbGxlZCkgeworICAgICAgICBwYXJ0MSA9IGZpbGxlZDsKKyAgICB9CisgICAgc2l6ZV90IGFzayA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBBTE9HX0FTU0VSVChhc2sgPiAwKTsKKyAgICBpZiAocGFydDEgPiBhc2spIHsKKyAgICAgICAgcGFydDEgPSBhc2s7CisgICAgfQorICAgIGlmIChwYXJ0MSA9PSAwKSB7CisgICAgICAgIC8vIEhpZ2hlci1sZXZlbCBzaG91bGQga2VlcCBtUnNtcEluQnVmZmVyIGZ1bGwsIGFuZCBub3QgY2FsbCByZXNhbXBsZXIgaWYgZW1wdHkKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiUmVjb3JkVGhyZWFkOjpnZXROZXh0QnVmZmVyKCkgc3RhcnZlZCIpOworICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWwgPSAwOworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIGlmIChmcmFtZXNSZXEgPiBmcmFtZXNSZWFkeSkgewotICAgICAgICBmcmFtZXNSZXEgPSBmcmFtZXNSZWFkeTsKLSAgICB9Ci0KLSAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMikgewotICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYW5uZWxDb3VudCA9IDI7Ci0gICAgfQotICAgIGJ1ZmZlci0+cmF3ID0gbVJzbXBJbkJ1ZmZlciArIG1Sc21wSW5JbmRleCAqIGNoYW5uZWxDb3VudDsKLSAgICBidWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXNSZXE7CisgICAgYnVmZmVyLT5yYXcgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5CdWZmZXIgKyBmcm9udCAqIHJlY29yZFRocmVhZC0+bUNoYW5uZWxDb3VudDsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSBwYXJ0MTsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsID0gcGFydDE7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBtUnNtcEluSW5kZXggKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIFJlY29yZFRyYWNrICphY3RpdmVUcmFjayA9IG1SZWNvcmRUcmFjazsKKyAgICBzaXplX3Qgc3RlcENvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIGlmIChzdGVwQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dfQVNTRVJUKHN0ZXBDb3VudCA8PSBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsKTsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsIC09IHN0ZXBDb3VudDsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ICs9IHN0ZXBDb3VudDsKKyAgICBidWZmZXItPnJhdyA9IE5VTEw7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKIH0KIApAQCAtNTA2MywxMSArNTQ4OCwxNCBAQAogICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcik7CiAgICAgICAgIGludCB2YWx1ZTsKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgcmVxRm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgdWludDMyX3QgcmVxU2FtcGxpbmdSYXRlID0gbVJlcVNhbXBsZVJhdGU7Ci0gICAgICAgIHVpbnQzMl90IHJlcUNoYW5uZWxDb3VudCA9IG1SZXFDaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KG1DaGFubmVsQ291bnQpOwogCisgICAgICAgIC8vIFRPRE8gSW52ZXN0aWdhdGUgd2hlbiB0aGlzIGNvZGUgcnVucy4gQ2hlY2sgd2l0aCBhdWRpbyBwb2xpY3kgd2hlbiBhIHNhbXBsZSByYXRlIGFuZAorICAgICAgICAvLyAgICAgIGNoYW5uZWwgY291bnQgY2hhbmdlIGNhbiBiZSByZXF1ZXN0ZWQuIERvIHdlIG1hbmRhdGUgdGhlIGZpcnN0IGNsaWVudCBkZWZpbmVzIHRoZQorICAgICAgICAvLyAgICAgIEhBTCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIGNvdW50IG9yIGRvIHdlIGFsbG93IGNoYW5nZXMgb24gdGhlIGZseT8KICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTYW1wbGluZ1JhdGUpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJlcVNhbXBsaW5nUmF0ZSA9IHZhbHVlOworICAgICAgICAgICAgc2FtcGxpbmdSYXRlID0gdmFsdWU7CiAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKQEAgLTUwNzksMTQgKzU1MDcsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXFDaGFubmVsQ291bnQgPSBwb3Bjb3VudCh2YWx1ZSk7Ci0gICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZTsKKyAgICAgICAgICAgIGlmIChtYXNrICE9IEFVRElPX0NIQU5ORUxfSU5fTU9OTyAmJiBtYXNrICE9IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1hc2s7CisgICAgICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCiAgICAgICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGd1YXJhbnRlZWQKICAgICAgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CkBAIC01MTI5LDYgKzU1NjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXZhbHVlOwogICAgICAgICB9CisKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKQEAgLTUxNDIsMTQgKzU1NzYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikgJiYKICAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCiAgICAgICAgICAgICAgICAgICAgIChtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAoMiAqIHJlcVNhbXBsaW5nUmF0ZSkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gKDIgKiBzYW1wbGluZ1JhdGUpKSAmJgogICAgICAgICAgICAgICAgICAgICBwb3Bjb3VudChtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gRkNDXzIgJiYKLSAgICAgICAgICAgICAgICAgICAgKHJlcUNoYW5uZWxDb3VudCA8PSBGQ0NfMikpIHsKKyAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSkgewogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOwogICAgICAgICAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpJTlBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTE3OSw5ICs1NjE0LDkgQEAKICAgICByZXR1cm4gb3V0X3M4OwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSkgewordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0gX191bnVzZWQpIHsKICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciBkZXNjOwotICAgIHZvaWQgKnBhcmFtMiA9IE5VTEw7CisgICAgY29uc3Qgdm9pZCAqcGFyYW0yID0gTlVMTDsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQ6CkBAIC01MjAxLDUzICs1NjM2LDM1IEBACiAgICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkX2woZXZlbnQsIG1JZCwgcGFyYW0yKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVycygpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogewotICAgIGRlbGV0ZVtdIG1Sc21wSW5CdWZmZXI7Ci0gICAgLy8gbVJzbXBJbkJ1ZmZlciBpcyBhbHdheXMgYXNzaWduZWQgYSBuZXdbXSBiZWxvdwotICAgIGRlbGV0ZVtdIG1Sc21wT3V0QnVmZmVyOwotICAgIG1Sc21wT3V0QnVmZmVyID0gTlVMTDsKLSAgICBkZWxldGUgbVJlc2FtcGxlcjsKLSAgICBtUmVzYW1wbGVyID0gTlVMTDsKLQogICAgIG1TYW1wbGVSYXRlID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1DaGFubmVsTWFzayA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtQ2hhbm5lbENvdW50ID0gcG9wY291bnQobUNoYW5uZWxNYXNrKTsKICAgICBtRm9ybWF0ID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBpZiAobUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgiSEFMIGZvcm1hdCAlZCBub3Qgc3VwcG9ydGVkOyBtdXN0IGJlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIiwgbUZvcm1hdCk7CisgICAgICAgIEFMT0dFKCJIQUwgZm9ybWF0ICUjeCBub3Qgc3VwcG9ydGVkOyBtdXN0IGJlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIiwgbUZvcm1hdCk7CiAgICAgfQogICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1fZnJhbWVfc2l6ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUJ1ZmZlclNpemUgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUZyYW1lQ291bnQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgbVJzbXBJbkJ1ZmZlciA9IG5ldyBpbnQxNl90W21GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudF07CisgICAgLy8gVGhpcyBpcyB0aGUgZm9ybXVsYSBmb3IgY2FsY3VsYXRpbmcgdGhlIHRlbXBvcmFyeSBidWZmZXIgc2l6ZS4KKyAgICAvLyBXaXRoIDcgSEFMIGJ1ZmZlcnMsIHdlIGNhbiBndWFyYW50ZWUgYWJpbGl0eSB0byBkb3duLXNhbXBsZSB0aGUgaW5wdXQgYnkgcmF0aW8gb2YgNjoxIHRvCisgICAgLy8gMSBmdWxsIG91dHB1dCBidWZmZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFsaWdubWVudCBvZiB0aGUgYXZhaWxhYmxlIGlucHV0LgorICAgIC8vIFRoZSB2YWx1ZSBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGFuZCBjb3VsZCBwcm9iYWJseSBiZSBldmVuIGxhcmdlci4KKyAgICAvLyBBIGxhcmdlciB2YWx1ZSBzaG91bGQgYWxsb3cgbW9yZSBvbGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIGEgdHJhY2sgY2FsbHMgc3RhcnQoKSwKKyAgICAvLyB3aXRob3V0IGluY3JlYXNpbmcgbGF0ZW5jeS4KKyAgICBtUnNtcEluRnJhbWVzID0gbUZyYW1lQ291bnQgKiA3OworICAgIG1Sc21wSW5GcmFtZXNQMiA9IHJvdW5kdXAobVJzbXBJbkZyYW1lcyk7CisgICAgZGVsZXRlW10gbVJzbXBJbkJ1ZmZlcjsKKyAgICAvLyBPdmVyLWFsbG9jYXRlIGJleW9uZCBtUnNtcEluRnJhbWVzUDIgdG8gcGVybWl0IGEgSEFMIHJlYWQgcGFzdCBlbmQgb2YgYnVmZmVyCisgICAgbVJzbXBJbkJ1ZmZlciA9IG5ldyBpbnQxNl90WyhtUnNtcEluRnJhbWVzUDIgKyBtRnJhbWVDb3VudCAtIDEpICogbUNoYW5uZWxDb3VudF07CiAKLSAgICBpZiAobVNhbXBsZVJhdGUgIT0gbVJlcVNhbXBsZVJhdGUgJiYgbUNoYW5uZWxDb3VudCA8PSBGQ0NfMiAmJiBtUmVxQ2hhbm5lbENvdW50IDw9IEZDQ18yKQotICAgIHsKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudDsKLSAgICAgICAgLy8gb3B0aW1pemF0aW9uOiBpZiBtb25vIHRvIG1vbm8sIHVzZSB0aGUgcmVzYW1wbGVyIGluIHN0ZXJlbyB0byBzdGVyZW8gbW9kZSB0byBhdm9pZAotICAgICAgICAvLyBzdGVyZW8gdG8gbW9ubyBwb3N0IHByb2Nlc3MgYXMgdGhlIHJlc2FtcGxlciBhbHdheXMgb3V0cHV0cyBzdGVyZW8uCi0gICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEgJiYgbVJlcUNoYW5uZWxDb3VudCA9PSAyKSB7Ci0gICAgICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gMjsKLSAgICAgICAgfQotICAgICAgICBtUmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgxNiwgY2hhbm5lbENvdW50LCBtUmVxU2FtcGxlUmF0ZSk7Ci0gICAgICAgIG1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUobVNhbXBsZVJhdGUpOwotICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoQXVkaW9NaXhlcjo6VU5JVFlfR0FJTiwgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTik7Ci0gICAgICAgIG1Sc21wT3V0QnVmZmVyID0gbmV3IGludDMyX3RbbUZyYW1lQ291bnQgKiBGQ0NfMl07Ci0KLSAgICAgICAgLy8gb3B0bWl6YXRpb246IGlmIG1vbm8gdG8gbW9ubywgYWx0ZXIgaW5wdXQgZnJhbWUgY291bnQgYXMgaWYgd2Ugd2VyZSBpbnB1dGluZwotICAgICAgICAvLyBzdGVyZW8gc2FtcGxlcwotICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgbUZyYW1lQ291bnQgPj49IDE7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBtUnNtcEluSW5kZXggPSBtRnJhbWVDb3VudDsKKyAgICAvLyBBdWRpb1JlY29yZCBtU2FtcGxlUmF0ZSBhbmQgbUNoYW5uZWxDb3VudCBhcmUgY29uc3RhbnQgZHVlIHRvIEF1ZGlvUmVjb3JkIEFQSSBjb25zdHJhaW50cy4KKyAgICAvLyBCdXQgaWYgdGhyZWFkJ3MgbVNhbXBsZVJhdGUgb3IgbUNoYW5uZWxDb3VudCBjaGFuZ2VzLCBob3cgd2lsbCB0aGF0IGFmZmVjdCBhY3RpdmUgdHJhY2tzPwogfQogCi11bnNpZ25lZCBpbnQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldElucHV0RnJhbWVzTG9zdCgpCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0SW5wdXRGcmFtZXNMb3N0KCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChpbml0Q2hlY2soKSAhPSBOT19FUlJPUikgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggYTJmYjg3NC4uNTYxN2MwYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC0zNiw2ICszNiw4IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCB0eXBlX3QgdHlwZSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VGhyZWFkQmFzZSgpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7CisKICAgICB2b2lkIGR1bXBCYXNlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCBkdW1wRWZmZWN0Q2hhaW5zKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTYzLDcgKzY1LDcgQEAKICAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgIElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0pIDoKLSAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9JTyksIG1FdmVudChldmVudCksIG1QYXJhbShldmVudCkge30KKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9JTyksIG1FdmVudChldmVudCksIG1QYXJhbShwYXJhbSkge30KICAgICAgICAgdmlydHVhbCB+SW9Db25maWdFdmVudCgpIHt9CiAKICAgICAgICAgICAgICAgICBpbnQgZXZlbnQoKSBjb25zdCB7IHJldHVybiBtRXZlbnQ7IH0KQEAgLTE0MSw2ICsxNDMsNyBAQAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50X2wocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbyk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50cygpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHNfbCgpOwogCiAgICAgICAgICAgICAgICAgLy8gc2VlIG5vdGUgYXQgZGVjbGFyYXRpb24gb2YgbVN0YW5kYnksIG1PdXREZXZpY2UgYW5kIG1JbkRldmljZQogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIHN0YW5kYnkoKSBjb25zdCB7IHJldHVybiBtU3RhbmRieTsgfQpAQCAtMTU2LDcgKzE1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogICAgICAgICAgICAgICAgIHZvaWQgZGlzY29ubmVjdEVmZmVjdChjb25zdCBzcDwgRWZmZWN0TW9kdWxlPiYgZWZmZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bnBpbklmTGFzdCk7CkBAIC0xOTgsMTMgKzIwMSwxMyBAQAogICAgICAgICAgICAgICAgIC8vIGVmZmVjdAogICAgICAgICAgICAgICAgIHZvaWQgcmVtb3ZlRWZmZWN0X2woY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAgICAgICAgICAgICAgICAgLy8gZGV0YWNoIGFsbCB0cmFja3MgY29ubmVjdGVkIHRvIGFuIGF1eGlsaWFyeSBlZmZlY3QKLSAgICB2aXJ0dWFsICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCkge30KKyAgICB2aXJ0dWFsICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCBfX3VudXNlZCkge30KICAgICAgICAgICAgICAgICAvLyByZXR1cm5zIGVpdGhlciBFRkZFQ1RfU0VTU0lPTiBpZiBlZmZlY3RzIG9uIHRoaXMgYXVkaW8gc2Vzc2lvbiBleGlzdCBpbiBvbmUKICAgICAgICAgICAgICAgICAvLyBjaGFpbiwgb3IgVFJBQ0tfU0VTU0lPTiBpZiB0cmFja3Mgb24gdGhpcyBhdWRpbyBzZXNzaW9uIGV4aXN0LCBvciBib3RoCiAgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb24oaW50IHNlc3Npb25JZCkgY29uc3QgPSAwOwogICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIG5vdCBpbXBvcnRhbnQgYXMgdGhlCiAgICAgICAgICAgICAgICAgLy8gc3RyYXRlZ3kgaXMgb25seSBtZWFuaW5nZnVsIGZvciBQbGF5YmFja1RocmVhZCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kCi0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkKSB7IHJldHVybiAwOyB9CisgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkIF9fdW51c2VkKSB7IHJldHVybiAwOyB9CiAKICAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIG9yIHJlc3RvcmUgZWZmZWN0IGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiBlZmZlY3QgcGFzc2VkLiBhIE5VTEwKICAgICAgICAgICAgICAgICAvLyB0eXBlIHBvaW50ZXIgbWVhbnMgc3VzcGVuZCBhbGwgZWZmZWN0cyBpbiB0aGUgc2Vzc2lvbgpAQCAtMjY3LDE0ICsyNzAsMTUgQEAKIAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4gIG1BdWRpb0ZsaW5nZXI7CiAKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIGJ5IFBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVycygpIG9yCi0gICAgICAgICAgICAgICAgLy8gUmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzKCkKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIGJ5IFBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkgb3IKKyAgICAgICAgICAgICAgICAvLyBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7ICAgICAgIC8vIG91dHB1dCBIQUwsIGRpcmVjdCBvdXRwdXQsIHJlY29yZAogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7CiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsKKyAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgICAgICAgLy8gSEFMIGJ1ZmZlciBzaXplIGZvciByZWFkKCkgb3Igd3JpdGUoKQogCiAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIHNlcXVlbmNlIGJ5IGNsaWVudDogYmluZGVyIHRocmVhZCBjYWxsaW5nIHNldFBhcmFtZXRlcnMoKToKICAgICAgICAgICAgICAgICAvLyAgMS4gTG9jayBtTG9jawpAQCAtMzAzLDEyICszMDcsMTIgQEAKICAgICAgICAgICAgICAgICBWZWN0b3I8Q29uZmlnRXZlbnQgKj4gICAgIG1Db25maWdFdmVudHM7CiAKICAgICAgICAgICAgICAgICAvLyBUaGVzZSBmaWVsZHMgYXJlIHdyaXR0ZW4gYW5kIHJlYWQgYnkgdGhyZWFkIGl0c2VsZiB3aXRob3V0IGxvY2sgb3IgYmFycmllciwKLSAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZCBieSBvdGhlciB0aHJlYWRzIHdpdGhvdXQgbG9jayBvciBiYXJyaWVyIHZpYSBzdGFuZGJ5KCkgLCBvdXREZXZpY2UoKQorICAgICAgICAgICAgICAgIC8vIGFuZCByZWFkIGJ5IG90aGVyIHRocmVhZHMgd2l0aG91dCBsb2NrIG9yIGJhcnJpZXIgdmlhIHN0YW5kYnkoKSwgb3V0RGV2aWNlKCkKICAgICAgICAgICAgICAgICAvLyBhbmQgaW5EZXZpY2UoKS4KICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSBhYnNlbmNlIG9mIGEgbG9jayBvciBiYXJyaWVyLCBhbnkgb3RoZXIgdGhyZWFkIHRoYXQgcmVhZHMKICAgICAgICAgICAgICAgICAvLyB0aGVzZSBmaWVsZHMgbXVzdCB1c2UgdGhlIGluZm9ybWF0aW9uIGluIGlzb2xhdGlvbiwgb3IgYmUgcHJlcGFyZWQgdG8gZGVhbAogICAgICAgICAgICAgICAgIC8vIHdpdGggcG9zc2liaWxpdHkgdGhhdCBpdCBtaWdodCBiZSBpbmNvbnNpc3RlbnQgd2l0aCBvdGhlciBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhbmRieTsgICAvLyBXaGV0aGVyIHRocmVhZCBpcyBjdXJyZW50bHkgaW4gc3RhbmRieS4KKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhbmRieTsgICAgIC8vIFdoZXRoZXIgdGhyZWFkIGlzIGN1cnJlbnRseSBpbiBzdGFuZGJ5LgogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1PdXREZXZpY2U7ICAgLy8gb3V0cHV0IGRldmljZQogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1JbkRldmljZTsgICAgLy8gaW5wdXQgZGV2aWNlCiAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgbUF1ZGlvU291cmNlOyAvLyAoc2VlIGF1ZGlvLmgsIGF1ZGlvX3NvdXJjZV90KQpAQCAtMzU4LDcgKzM2Miw2IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCi0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKIAogICAgIC8vIFJlZkJhc2UKQEAgLTM5MSw3ICszOTQsNyBAQAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrKCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgd2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHNob3VsZFN0YW5kYnlfbCgpOwotCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CiAKICAgICAvLyBUaHJlYWRCYXNlIHZpcnR1YWxzCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgcHJlRXhpdCgpOwpAQCAtNDE5LDEzICs0MjIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLyk7CiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogZ2V0T3V0cHV0KCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIGNsZWFyT3V0cHV0KCk7CkBAIC00NDcsNyArNDUwLDExIEBACiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpOwotICAgICAgICAgICAgICAgIGludDE2X3QgICAgICptaXhCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtTWl4QnVmZmVyOyB9OworICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlbmFtZSBtaXhCdWZmZXIoKSB0byBzaW5rQnVmZmVyKCkgYW5kIHJlbW92ZSBpbnQxNl90KiBkZXBlbmRlbmN5LgorICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIGFsc28gcmVtb3ZpbmcgYW5kIHBhc3NpbmcgYW4gZXhwbGljaXQgbU1haW5CdWZmZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgdG8gQUY6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6VHJhY2soKS4KKyAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAqbWl4QnVmZmVyKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KG1TaW5rQnVmZmVyKTsgfTsKIAogICAgIHZpcnR1YWwgICAgIHZvaWQgZGV0YWNoQXV4RWZmZWN0X2woaW50IGVmZmVjdElkKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhdHRhY2hBdXhFZmZlY3QoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+IHRyYWNrLApAQCAtNDc1LDExICs0ODIsNjggQEAKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgIGdldFRpbWVzdGFtcF9sKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOwogCiBwcm90ZWN0ZWQ6Ci0gICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVycygpCisgICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50OyAgLy8gbm9ybWFsIG1peGVyIGFuZCBlZmZlY3RzCiAKLSAgICBpbnQxNl90KiAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhCdWZmZXI7ICAgICAgICAgLy8gZnJhbWUgc2l6ZSBhbGlnbmVkIG1peCBidWZmZXIKLSAgICBpbnQ4X3QqICAgICAgICAgICAgICAgICAgICAgICAgIG1BbGxvY01peEJ1ZmZlcjsgICAgLy8gbWl4ZXIgYnVmZmVyIGFsbG9jYXRpb24gYWRkcmVzcworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXI7ICAgICAgICAgLy8gZnJhbWUgc2l6ZSBhbGlnbmVkIHNpbmsgYnVmZmVyCisKKyAgICAvLyBUT0RPOgorICAgIC8vIFJlYXJyYW5nZSB0aGUgYnVmZmVyIGluZm8gaW50byBhIHN0cnVjdC9jbGFzcyB3aXRoCisgICAgLy8gY2xlYXIsIGNvcHksIGNvbnN0cnVjdGlvbiwgZGVzdHJ1Y3Rpb24gbWV0aG9kcy4KKyAgICAvLworICAgIC8vIG1TaW5rQnVmZmVyIGFsc28gaGFzIGFzc29jaWF0ZWQgd2l0aCBpdDoKKyAgICAvLworICAgIC8vIG1TaW5rQnVmZmVyU2l6ZTogU2luayBCdWZmZXIgU2l6ZQorICAgIC8vIG1Gb3JtYXQ6IFNpbmsgQnVmZmVyIEZvcm1hdAorCisgICAgLy8gTWl4ZXIgQnVmZmVyIChtTWl4ZXJCdWZmZXIqKQorICAgIC8vCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgZmxvYXRpbmcgcG9pbnQgb3IgbXVsdGljaGFubmVsIGRhdGEsIHdoaWNoIGlzIG5vdCBpbiB0aGUKKyAgICAvLyBzaW5rIGZvcm1hdCwgaXQgaXMgcmVxdWlyZWQgdG8gYWNjdW11bGF0ZSBpbiBhIGhpZ2hlciBwcmVjaXNpb24gb3IgZ3JlYXRlciBjaGFubmVsIGNvdW50CisgICAgLy8gYnVmZmVyIGJlZm9yZSBkb3dubWl4aW5nIG9yIGRhdGEgY29udmVyc2lvbiB0byB0aGUgc2luayBidWZmZXIuCisKKyAgICAvLyBTZXQgdG8gInRydWUiIHRvIGVuYWJsZSB0aGUgTWl4ZXIgQnVmZmVyIG90aGVyd2lzZSBtaXhlciBvdXRwdXQgZ29lcyB0byBzaW5rIGJ1ZmZlci4KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlckVuYWJsZWQ7CisKKyAgICAvLyBTdG9yYWdlLCAzMiBieXRlIGFsaWduZWQgKG1heSBtYWtlIHRoaXMgYWxpZ25tZW50IGEgcmVxdWlyZW1lbnQgbGF0ZXIpLgorICAgIC8vIER1ZSB0byBjb25zdHJhaW50cyBvbiBtTm9ybWFsRnJhbWVDb3VudCwgdGhlIGJ1ZmZlciBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTYgZnJhbWVzLgorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyOworCisgICAgLy8gU2l6ZSBvZiBtTWl4ZXJCdWZmZXIgaW4gYnl0ZXM6IG1Ob3JtYWxGcmFtZUNvdW50ICogI2NoYW5uZWxzICogc2FtcHNpemUuCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplOworCisgICAgLy8gVGhlIGF1ZGlvIGZvcm1hdCBvZiBtTWl4ZXJCdWZmZXIuIFNldCB0byBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpIG9ubHkuCisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQ7CisKKyAgICAvLyBBbiBpbnRlcm5hbCBmbGFnIHNldCB0byB0cnVlIGJ5IE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKQorICAgIC8vIHdoZW4gbU1peGVyQnVmZmVyIGNvbnRhaW5zIHZhbGlkIGRhdGEgYWZ0ZXIgbWl4aW5nLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQ7CisKKyAgICAvLyBFZmZlY3RzIEJ1ZmZlciAobUVmZmVjdHNCdWZmZXIqKQorICAgIC8vCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgZWZmZWN0cyBkYXRhLCB3aGljaCBpcyBub3QgaW4gdGhlIHNpbmsgZm9ybWF0LAorICAgIC8vIGl0IGlzIHJlcXVpcmVkIHRvIGFjY3VtdWxhdGUgaW4gYSBkaWZmZXJlbnQgYnVmZmVyIGJlZm9yZSBkYXRhIGNvbnZlcnNpb24KKyAgICAvLyB0byB0aGUgc2luayBidWZmZXIuCisKKyAgICAvLyBTZXQgdG8gInRydWUiIHRvIGVuYWJsZSB0aGUgRWZmZWN0cyBCdWZmZXIgb3RoZXJ3aXNlIGVmZmVjdHMgb3V0cHV0IGdvZXMgdG8gc2luayBidWZmZXIuCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZDsKKworICAgIC8vIFN0b3JhZ2UsIDMyIGJ5dGUgYWxpZ25lZCAobWF5IG1ha2UgdGhpcyBhbGlnbm1lbnQgYSByZXF1aXJlbWVudCBsYXRlcikuCisgICAgLy8gRHVlIHRvIGNvbnN0cmFpbnRzIG9uIG1Ob3JtYWxGcmFtZUNvdW50LCB0aGUgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNiBmcmFtZXMuCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyOworCisgICAgLy8gU2l6ZSBvZiBtRWZmZWN0c0J1ZmZlciBpbiBieXRlczogbU5vcm1hbEZyYW1lQ291bnQgKiAjY2hhbm5lbHMgKiBzYW1wc2l6ZS4KKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJTaXplOworCisgICAgLy8gVGhlIGF1ZGlvIGZvcm1hdCBvZiBtRWZmZWN0c0J1ZmZlci4gU2V0IHRvIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIG9ubHkuCisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0OworCisgICAgLy8gQW4gaW50ZXJuYWwgZmxhZyBzZXQgdG8gdHJ1ZSBieSBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkKKyAgICAvLyB3aGVuIG1FZmZlY3RzQnVmZmVyIGNvbnRhaW5zIHZhbGlkIGRhdGEgYWZ0ZXIgbWl4aW5nLgorICAgIC8vCisgICAgLy8gV2hlbiB0aGlzIGlzIHNldCwgYWxsIG1peGVyIGRhdGEgaXMgcm91dGVkIGludG8gdGhlIGVmZmVjdHMgYnVmZmVyCisgICAgLy8gZm9yIGFueSBwcm9jZXNzaW5nIChpbmNsdWRpbmcgb3V0cHV0IHByb2Nlc3NpbmcpLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkOwogCiAgICAgLy8gc3VzcGVuZCBjb3VudCwgPiAwIG1lYW5zIHN1c3BlbmRlZC4gIFdoaWxlIHN1c3BlbmRlZCwgdGhlIHRocmVhZCBjb250aW51ZXMgdG8gcHVsbCBmcm9tCiAgICAgLy8gdHJhY2tzIGFuZCBtaXgsIGJ1dCBkb2Vzbid0IHdyaXRlIHRvIEhBTC4gIEEyRFAgYW5kIFNDTyBIQUwgaW1wbGVtZW50YXRpb25zIGNhbid0IGhhbmRsZQpAQCAtNTM5LDcgKzYwMyw3IEBACiAgICAgdm9pZCAgICAgICAgcmVtb3ZlVHJhY2tfbChjb25zdCBzcDxUcmFjaz4mIHRyYWNrKTsKICAgICB2b2lkICAgICAgICBicm9hZGNhc3RfbCgpOwogCi0gICAgdm9pZCAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKKyAgICB2b2lkICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKQEAgLTU1OCw3ICs2MjIsNyBAQAogCiAgICAgLy8gRklYTUUgcmVuYW1lIHRoZXNlIGZvcm1lciBsb2NhbCB2YXJpYWJsZXMgb2YgdGhyZWFkTG9vcCB0byBzdGFuZGFyZCAibSIgbmFtZXMKICAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYnlUaW1lOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4QnVmZmVyU2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaW5rQnVmZmVyU2l6ZTsKIAogICAgIC8vIGNhY2hlZCBjb3BpZXMgb2YgYWN0aXZlU2xlZXBUaW1lVXMoKSBhbmQgaWRsZVNsZWVwVGltZVVzKCkgbWFkZSBieSBjYWNoZVBhcmFtZXRlcnNfbCgpCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTbGVlcFRpbWU7CkBAIC02MjMsMTMgKzY4NywxMiBAQAogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlcjsKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCAgICAgRmFzdFRyYWNrVW5kZXJydW5zIGdldEZhc3RUcmFja1VuZGVycnVucyhzaXplX3QgZmFzdEluZGV4KSBjb25zdAorICAgIHZpcnR1YWwgICAgIEZhc3RUcmFja1VuZGVycnVucyBnZXRGYXN0VHJhY2tVbmRlcnJ1bnMoc2l6ZV90IGZhc3RJbmRleCBfX3VudXNlZCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBGYXN0VHJhY2tVbmRlcnJ1bnMgZHVtbXk7IHJldHVybiBkdW1teTsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgLy8gYWNjZXNzZWQgYnkgYm90aCBiaW5kZXIgdGhyZWFkcyBhbmQgd2l0aGluIHRocmVhZExvb3AoKSwgbG9jayBvbiBtdXRleCBuZWVkZWQKICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICBtRmFzdFRyYWNrQXZhaWxNYXNrOyAgICAvLyBiaXQgaSBzZXQgaWYgZmFzdCB0cmFjayBbaV0gaXMgYXZhaWxhYmxlCi0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hPdXRwdXRfbCgpOwogCiBwcml2YXRlOgogICAgIC8vIHRpbWVzdGFtcCBsYXRjaDoKQEAgLTc0OCwxMSArODExLDExIEBACiAgICAgLy8gdGhyZWFkTG9vcCBzbmlwcGV0cwogICAgIHZpcnR1YWwgICAgIG1peGVyX3N0YXRlIHByZXBhcmVUcmFja3NfbChWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9leGl0KCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hPdXRwdXRfbCgpOwogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgd2FpdGluZ0FzeW5jQ2FsbGJhY2soKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB3YWl0aW5nQXN5bmNDYWxsYmFja19sKCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgc2hvdWxkU3RhbmRieV9sKCk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CiAKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZmx1c2hId19sKCk7CkBAIC04MzgsMTcgKzkwMSwyOCBAQAogCiAKIC8vIHJlY29yZCB0aHJlYWQKLWNsYXNzIFJlY29yZFRocmVhZCA6IHB1YmxpYyBUaHJlYWRCYXNlLCBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlcyBmcm9tIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGZvciB1c2UgYnkgcmVzYW1wbGVyCitjbGFzcyBSZWNvcmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkQmFzZQogewogcHVibGljOgogCisgICAgY2xhc3MgUmVjb3JkVHJhY2s7CisgICAgY2xhc3MgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlcyBmcm9tIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGZvciB1c2UgYnkgcmVzYW1wbGVyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSA6IG1SZWNvcmRUcmFjayhyZWNvcmRUcmFjaykgeyB9CisgICAgICAgIHZpcnR1YWwgflJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKCkgeyB9CisgICAgICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOworICAgIHByaXZhdGU6CisgICAgICAgIFJlY29yZFRyYWNrICogY29uc3QgbVJlY29yZFRyYWNrOworICAgIH07CisKICNpbmNsdWRlICJSZWNvcmRUcmFja3MuaCIKIAogICAgICAgICAgICAgUmVjb3JkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlCkBAIC04NjcsMjMgKzk0MSwyMyBAQAogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7CiAKICAgICAvLyBSZWZCYXNlCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIChtSW5wdXQgPT0gTlVMTCkgPyBOT19JTklUIDogTk9fRVJST1I7IH0KKwogICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiAgY3JlYXRlUmVjb3JkVHJhY2tfbCgKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAogICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LApAQCAtODk3LDE1ICs5NzEsMTIgQEAKICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qIGNsZWFySW5wdXQoKTsKICAgICAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3QqIHN0cmVhbSgpIGNvbnN0OwogCi0gICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOwogCiAgICAgdmlydHVhbCBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpOwogICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzKCk7Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgIGdldElucHV0RnJhbWVzTG9zdCgpOworICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CisgICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRJbnB1dEZyYW1lc0xvc3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKICAgICB2aXJ0dWFsIHNpemVfdCByZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwpAQCAtOTIwLDQ0ICs5OTEsMzMgQEAKICAgICB2aXJ0dWFsIGJvb2wgICAgIGlzVmFsaWRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpIGNvbnN0OwogCiAgICAgc3RhdGljIHZvaWQgc3luY1N0YXJ0RXZlbnRDYWxsYmFjayhjb25zdCB3cDxTeW5jRXZlbnQ+JiBldmVudCk7Ci0gICAgICAgICAgIHZvaWQgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KLSAgICAgICAgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RSZWNvcmRlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICBib29sICAgICAgICBoYXNGYXN0Q2FwdHVyZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKIHByaXZhdGU6Ci0gICAgICAgICAgICB2b2lkIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLQogICAgICAgICAgICAgLy8gRW50ZXIgc3RhbmRieSBpZiBub3QgYWxyZWFkeSBpbiBzdGFuZGJ5LCBhbmQgc2V0IG1TdGFuZGJ5IGZsYWcKLSAgICAgICAgICAgIHZvaWQgc3RhbmRieSgpOworICAgICAgICAgICAgdm9pZCAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CiAKICAgICAgICAgICAgIC8vIENhbGwgdGhlIEhBTCBzdGFuZGJ5IG1ldGhvZCB1bmNvbmRpdGlvbmFsbHksIGFuZCBkb24ndCBjaGFuZ2UgbVN0YW5kYnkgZmxhZwotICAgICAgICAgICAgdm9pZCBpbnB1dFN0YW5kQnkoKTsKKyAgICAgICAgICAgIHZvaWQgICAgaW5wdXRTdGFuZEJ5KCk7CiAKICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4gICAgICAgICAgICAgICAgICAgICAgICptSW5wdXQ7CiAgICAgICAgICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxSZWNvcmRUcmFjaz4gPiAgICBtVHJhY2tzOwotICAgICAgICAgICAgLy8gbUFjdGl2ZVRyYWNrIGhhcyBkdWFsIHJvbGVzOiAgaXQgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGFjdGl2ZSB0cmFjaywgYW5kCisgICAgICAgICAgICAvLyBtQWN0aXZlVHJhY2tzIGhhcyBkdWFsIHJvbGVzOiAgaXQgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGFjdGl2ZSB0cmFjayhzKSwgYW5kCiAgICAgICAgICAgICAvLyBpcyB1c2VkIHRvZ2V0aGVyIHdpdGggbVN0YXJ0U3RvcENvbmQgdG8gaW5kaWNhdGUgc3RhcnQoKS9zdG9wKCkgcHJvZ3Jlc3MKLSAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjazsKKyAgICAgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8UmVjb3JkVHJhY2s+ID4gICAgIG1BY3RpdmVUcmFja3M7CisgICAgICAgICAgICAvLyBnZW5lcmF0aW9uIGNvdW50ZXIgZm9yIG1BY3RpdmVUcmFja3MKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3NHZW47CiAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZDsKIAotICAgICAgICAgICAgLy8gdXBkYXRlZCBieSBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQotICAgICAgICAgICAgQXVkaW9SZXNhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgKm1SZXNhbXBsZXI7Ci0gICAgICAgICAgICAvLyBpbnRlcmxlYXZlZCBzdGVyZW8gcGFpcnMgb2YgZml4ZWQtcG9pbnQgc2lnbmVkIFExOS4xMgotICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wT3V0QnVmZmVyOwotICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wSW5CdWZmZXI7IC8vIFttRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnRdCi0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluSW5kZXg7Ci0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgICAgLy8gc3RyZWFtIGJ1ZmZlciBzaXplIGZvciByZWFkKCkKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1SZXFDaGFubmVsQ291bnQ7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtUmVxU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlYWQ7Ci0gICAgICAgICAgICAvLyBzeW5jIGV2ZW50IHRyaWdnZXJpbmcgYWN0dWFsIGF1ZGlvIGNhcHR1cmUuIEZyYW1lcyByZWFkIGJlZm9yZSB0aGlzIGV2ZW50IHdpbGwKLSAgICAgICAgICAgIC8vIGJlIGRyb3BwZWQgYW5kIHRoZXJlZm9yZSBub3QgcmVhZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICAgICAgICAgICBzcDxTeW5jRXZlbnQ+ICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0YXJ0RXZlbnQ7Ci0gICAgICAgICAgICAvLyBudW1iZXIgb2YgY2FwdHVyZWQgZnJhbWVzIHRvIGRyb3AgYWZ0ZXIgdGhlIHN0YXJ0IHN5bmMgZXZlbnQgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gICAgICAgICAgICAvLyB3aGVuIDwgMCwgbWF4aW11bSBmcmFtZXMgdG8gZHJvcCBiZWZvcmUgc3RhcnRpbmcgY2FwdHVyZSBldmVuIGlmIHN5bmMgZXZlbnQgaXMKLSAgICAgICAgICAgIC8vIG5vdCByZWNlaXZlZAotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc3RvRHJvcDsKKyAgICAgICAgICAgIC8vIHJlc2FtcGxlciBjb252ZXJ0cyBpbnB1dCBhdCBIQUwgSHogdG8gb3V0cHV0IGF0IEF1ZGlvUmVjb3JkIGNsaWVudCBIegorICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wSW5CdWZmZXI7IC8vIHNlZSBuZXdbXSBmb3IgZGV0YWlscyBvbiB0aGUgc2l6ZQorICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyYW1lczsgIC8vIHNpemUgb2YgcmVzYW1wbGVyIGlucHV0IGluIGZyYW1lcworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyYW1lc1AyOy8vIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIKKworICAgICAgICAgICAgLy8gcm9sbGluZyBpbmRleCB0aGF0IGlzIG5ldmVyIGNsZWFyZWQKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5SZWFyOyAgICAvLyBsYXN0IGZpbGxlZCBmcmFtZSArIDEKIAogICAgICAgICAgICAgLy8gRm9yIGR1bXBzeXMKICAgICAgICAgICAgIGNvbnN0IHNwPE5CQUlPX1Npbms+ICAgICAgICAgICAgICAgIG1UZWVTaW5rOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IGNkMjAxZDkuLjU4NzA1YzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTM0LDcgKzM0LDkgQEAKICAgICAgICAgUkVTVU1JTkcsCiAgICAgICAgIEFDVElWRSwKICAgICAgICAgUEFVU0lORywKLSAgICAgICAgUEFVU0VECisgICAgICAgIFBBVVNFRCwKKyAgICAgICAgU1RBUlRJTkdfMSwgICAgIC8vIGZvciBSZWNvcmRUcmFjayBvbmx5CisgICAgICAgIFNUQVJUSU5HXzIsICAgICAvLyBmb3IgUmVjb3JkVHJhY2sgb25seQogICAgIH07CiAKICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZShUaHJlYWRCYXNlICp0aHJlYWQsCkBAIC00OCw2ICs1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdXQpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflRyYWNrQmFzZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gZ2V0Q2JsaygpICE9IDAgPyBOT19FUlJPUiA6IE5PX01FTU9SWTsgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24pID0gMDsKQEAgLTc4LDE1ICs4MSw2IEBACiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQogCi0gICAgLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBjb250aWd1b3VzIHNsaWNlIG9mIHRoZSB0cmFjayBidWZmZXIuCi0gICAgLy8gUGFyYW1ldGVyICdvZmZzZXQnIGlzIHRoZSByZXF1ZXN0ZWQgc3RhcnQgcG9zaXRpb24sIGV4cHJlc3NlZCBpbgotICAgIC8vIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBmcmFtZSB1bml0cyByZWxhdGl2ZSB0byB0aGUgdHJhY2sgZXBvY2guCi0gICAgLy8gUGFyYW1ldGVyICdmcmFtZXMnIGlzIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoLCBhbHNvIGluIGZyYW1lIHVuaXRzLgotICAgIC8vIEFsd2F5cyByZXR1cm5zIG5vbi1OVUxMLiAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvCi0gICAgLy8gdmVyaWZ5IHRoYXQgdGhpcyB3aWxsIGJlIHN1Y2Nlc3NmdWw7IHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzCi0gICAgLy8gZnVuY3Rpb24gd2l0aCBpbnZhbGlkICdvZmZzZXQnIG9yICdmcmFtZXMnIGlzIHVuZGVmaW5lZC4KLSAgICB2b2lkKiBnZXRCdWZmZXIodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBmcmFtZXMpIGNvbnN0OwotCiAgICAgYm9vbCBpc1N0b3BwZWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAobVN0YXRlID09IFNUT1BQRUQgfHwgbVN0YXRlID09IEZMVVNIRUQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKaW5kZXggZDA3MTEzYy4uMTA2NGZkMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKQEAgLTExNiwxMiArMTE2LDExIEBACiAKICAgICBpZiAoY2xpZW50ICE9IDApIHsKICAgICAgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoc2l6ZSk7Ci0gICAgICAgIGlmIChtQ2Jsa01lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKTsKLSAgICAgICAgICAgIC8vIGNhbid0IGFzc3VtZSBtQ2JsayAhPSBOVUxMCi0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtQ2Jsa01lbW9yeSA9PSAwIHx8CisgICAgICAgICAgICAgICAgKG1DYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0ldSIsIHNpemUpOwogICAgICAgICAgICAgY2xpZW50LT5oZWFwKCktPmR1bXAoIkF1ZGlvVHJhY2siKTsKKyAgICAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTM0LDcgKzEzMyw2IEBACiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKICAgICAgICAgbmV3KG1DYmxrKSBhdWRpb190cmFja19jYmxrX3QoKTsKICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKLSAgICAgICAgbUNibGstPmZyYW1lQ291bnRfID0gZnJhbWVDb3VudDsKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CiAgICAgICAgICAgICBtZW1zZXQobUJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSk7CkBAIC0xNDgsNyArMTQ2LDcgQEAKICNpZmRlZiBURUVfU0lOSwogICAgICAgICBpZiAobVRlZVNpbmtUcmFja0VuYWJsZWQpIHsKICAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBwaXBlRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICBpZiAocGlwZUZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKHBpcGVGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKG1UZWVTaW5rVHJhY2tGcmFtZXMsIHBpcGVGb3JtYXQpOwogICAgICAgICAgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKICAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge3BpcGVGb3JtYXR9OwpAQCAtMjc1LDYgKzI3MywxMSBAQAogICAgIGlmICghbVRyYWNrLT5pc1RpbWVkVHJhY2soKSkKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogCisgICAgaWYgKGJ1ZmZlciA9PSAwIHx8IGJ1ZmZlci0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInF1ZXVlVGltZWRCdWZmZXIoKSBidWZmZXIgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjayogdHQgPQogICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjayo+KG1UcmFjay5nZXQoKSk7CiAgICAgcmV0dXJuIHR0LT5xdWV1ZVRpbWVkQnVmZmVyKGJ1ZmZlciwgcHRzKTsKQEAgLTM0NCw0MSArMzQ3LDQyIEBACiAgICAgbUNhY2hlZFZvbHVtZSgxLjApLAogICAgIG1Jc0ludmFsaWQoZmFsc2UpLAogICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkoTlVMTCksCi0gICAgbVJlc3VtZVRvU3RvcHBpbmcoZmFsc2UpCisgICAgbVJlc3VtZVRvU3RvcHBpbmcoZmFsc2UpLAorICAgIG1GbHVzaEh3UGVuZGluZyhmYWxzZSkKIHsKLSAgICBpZiAobUNibGsgIT0gTlVMTCkgewotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplKTsKLSAgICAgICAgfQotICAgICAgICBtU2VydmVyUHJveHkgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5OwotICAgICAgICAvLyB0byBhdm9pZCBsZWFraW5nIGEgdHJhY2sgbmFtZSwgZG8gbm90IGFsbG9jYXRlIG9uZSB1bmxlc3MgdGhlcmUgaXMgYW4gbUNibGsKLSAgICAgICAgbU5hbWUgPSB0aHJlYWQtPmdldFRyYWNrTmFtZV9sKGNoYW5uZWxNYXNrLCBzZXNzaW9uSWQpOwotICAgICAgICBpZiAobU5hbWUgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm8gbW9yZSB0cmFjayBuYW1lcyBhdmFpbGFibGUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQotICAgICAgICBpZiAoZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeUlzQ2FsbGVkQnlNdWx0aXBsZVRocmVhZHMoKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAhPSAwKTsKLSAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eih0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2spOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoMCA8IGkgJiYgaSA8IChpbnQpRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzKTsKLSAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIGVhZ2VyLiAgV2UgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGJlZm9yZSB0aGUKLSAgICAgICAgICAgIC8vICAgICAgIGZhc3QgdHJhY2sgYmVjb21lcyBhY3RpdmUuICBTaW5jZSBmYXN0IHRyYWNrcyBhcmUgYSBzY2FyY2UgcmVzb3VyY2UsCi0gICAgICAgICAgICAvLyAgICAgICB0aGlzIG1lYW5zIHdlIGFyZSBwb3RlbnRpYWxseSBkZW55aW5nIG90aGVyIG1vcmUgaW1wb3J0YW50IGZhc3QgdHJhY2tzIGZyb20KLSAgICAgICAgICAgIC8vICAgICAgIGJlaW5nIGNyZWF0ZWQuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYWxsb2NhdGUgdGhlIGluZGV4IGR5bmFtaWNhbGx5LgotICAgICAgICAgICAgbUZhc3RJbmRleCA9IGk7Ci0gICAgICAgICAgICAvLyBSZWFkIHRoZSBpbml0aWFsIHVuZGVycnVucyBiZWNhdXNlIHRoaXMgZmllbGQgaXMgbmV2ZXIgY2xlYXJlZCBieSB0aGUgZmFzdCBtaXhlcgotICAgICAgICAgICAgbU9ic2VydmVkVW5kZXJydW5zID0gdGhyZWFkLT5nZXRGYXN0VHJhY2tVbmRlcnJ1bnMoaSk7Ci0gICAgICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOwotICAgICAgICB9CisgICAgaWYgKG1DYmxrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBTE9HVigiVHJhY2sgY29uc3RydWN0b3IgbmFtZSAlZCwgY2FsbGluZyBwaWQgJWQiLCBtTmFtZSwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisKKyAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7CisgICAgfQorICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CisKKyAgICBtTmFtZSA9IHRocmVhZC0+Z2V0VHJhY2tOYW1lX2woY2hhbm5lbE1hc2ssIHNlc3Npb25JZCk7CisgICAgaWYgKG1OYW1lIDwgMCkgeworICAgICAgICBBTE9HRSgibm8gbW9yZSB0cmFjayBuYW1lcyBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQorICAgIGlmIChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKKyAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlJc0NhbGxlZEJ5TXVsdGlwbGVUaHJlYWRzKCk7CisgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAhPSAwKTsKKyAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayk7CisgICAgICAgIEFMT0dfQVNTRVJUKDAgPCBpICYmIGkgPCAoaW50KUZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7CisgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIGVhZ2VyLiAgV2UgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGJlZm9yZSB0aGUKKyAgICAgICAgLy8gICAgICAgZmFzdCB0cmFjayBiZWNvbWVzIGFjdGl2ZS4gIFNpbmNlIGZhc3QgdHJhY2tzIGFyZSBhIHNjYXJjZSByZXNvdXJjZSwKKyAgICAgICAgLy8gICAgICAgdGhpcyBtZWFucyB3ZSBhcmUgcG90ZW50aWFsbHkgZGVueWluZyBvdGhlciBtb3JlIGltcG9ydGFudCBmYXN0IHRyYWNrcyBmcm9tCisgICAgICAgIC8vICAgICAgIGJlaW5nIGNyZWF0ZWQuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYWxsb2NhdGUgdGhlIGluZGV4IGR5bmFtaWNhbGx5LgorICAgICAgICBtRmFzdEluZGV4ID0gaTsKKyAgICAgICAgLy8gUmVhZCB0aGUgaW5pdGlhbCB1bmRlcnJ1bnMgYmVjYXVzZSB0aGlzIGZpZWxkIGlzIG5ldmVyIGNsZWFyZWQgYnkgdGhlIGZhc3QgbWl4ZXIKKyAgICAgICAgbU9ic2VydmVkVW5kZXJydW5zID0gdGhyZWFkLT5nZXRGYXN0VHJhY2tVbmRlcnJ1bnMoaSk7CisgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CisgICAgfQogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6flRyYWNrKCkKQEAgLTM5Niw2ICs0MDAsMTUgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppbml0Q2hlY2soKSBjb25zdAoreworICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWNrQmFzZTo6aW5pdENoZWNrKCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBtTmFtZSA8IDApIHsKKyAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkZXN0cm95KCkKIHsKICAgICAvLyBOT1RFOiBkZXN0cm95VHJhY2tfbCgpIGNhbiByZW1vdmUgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoaXMgVHJhY2sKQEAgLTQyMiwxNyArNDM1LDE5IEBACiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgTmFtZSBDbGllbnQgVHlwZSAgICAgIEZtdCBDaG4gbWFzayBTZXNzaW9uIGZDb3VudCBTIEYgU1JhdGUgICIKKyAgICByZXN1bHQuYXBwZW5kKCIgICAgTmFtZSBBY3RpdmUgQ2xpZW50IFR5cGUgICAgICBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBmQ291bnQgUyBGIFNSYXRlICAiCiAgICAgICAgICAgICAgICAgICAiTCBkQiAgUiBkQiAgICBTZXJ2ZXIgTWFpbiBidWYgIEF1eCBCdWYgRmxhZ3MgVW5kRnJtQ250XG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKIHsKICAgICB1aW50MzJfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOwogICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgRiAlMmQiLCBtRmFzdEluZGV4KTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgRiAlMmQiLCBtRmFzdEluZGV4KTsKKyAgICB9IGVsc2UgaWYgKG1OYW1lID49IEF1ZGlvTWl4ZXI6OlRSQUNLMCkgeworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICAlNGQiLCBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAlNGQiLCBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCk7CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgIG5vbmUiKTsKICAgICB9CiAgICAgdHJhY2tfc3RhdGUgc3RhdGUgPSBtU3RhdGU7CiAgICAgY2hhciBzdGF0ZUNoYXI7CkBAIC00ODcsOCArNTAyLDkgQEAKICAgICAgICAgbm93SW5VbmRlcnJ1biA9ICc/JzsKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHNucHJpbnRmKCZidWZmZXJbN10sIHNpemUtNywgIiAlNnUgJTR1ICUwOFggJTA4WCAlN3UgJTZ6dSAlMWMgJTFkICU1dSAlNS4yZyAlNS4yZyAgIgorICAgIHNucHJpbnRmKCZidWZmZXJbOF0sIHNpemUtOCwgIiAlNnMgJTZ1ICU0dSAlMDhYICUwOFggJTd1ICU2enUgJTFjICUxZCAlNXUgJTUuMmcgJTUuMmcgICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICVwICVwIDB4JTAzWCAlOXUlY1xuIiwKKyAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICBtRm9ybWF0LApAQCAtNTE0LDcgKzUzMCw3IEBACiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0TmV4dEJ1ZmZlcigKLSAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKQorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgX191bnVzZWQpCiB7CiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgc2l6ZV90IGRlc2lyZWRGcmFtZXMgPSBidWZmZXItPmZyYW1lQ291bnQ7CkBAIC01NTEsNyArNTY3LDE0IEBACiAKIC8vIERvbid0IGNhbGwgZm9yIGZhc3QgdHJhY2tzOyB0aGUgZnJhbWVzUmVhZHkoKSBjb3VsZCByZXN1bHQgaW4gcHJpb3JpdHkgaW52ZXJzaW9uCiBib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppc1JlYWR5KCkgY29uc3QgewotICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzICE9IEZTX0ZJTExJTkcgfHwgaXNTdG9wcGVkKCkgfHwgaXNQYXVzaW5nKCkgfHwgaXNTdG9wcGluZygpKSB7CisgICAgaWYgKG1GaWxsaW5nVXBTdGF0dXMgIT0gRlNfRklMTElORyB8fCBpc1N0b3BwZWQoKSB8fCBpc1BhdXNpbmcoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaXNTdG9wcGluZygpKSB7CisgICAgICAgIGlmIChmcmFtZXNSZWFkeSgpID4gMCkgeworICAgICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExFRDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTU2NCw4ICs1ODcsOCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIEFMT0dWKCJzdGFydCglZCksIGNhbGxpbmcgcGlkICVkIHNlc3Npb24gJWQiLApAQCAtNTg4LDcgKzYxMSwxMCBAQAogICAgICAgICAvLyBoZXJlIHRoZSB0cmFjayBjb3VsZCBiZSBlaXRoZXIgbmV3LCBvciByZXN0YXJ0ZWQKICAgICAgICAgLy8gaW4gYm90aCBjYXNlcyAidW5zdG9wIiB0aGUgdHJhY2sKIAotICAgICAgICBpZiAoc3RhdGUgPT0gUEFVU0VEKSB7CisgICAgICAgIC8vIGluaXRpYWwgc3RhdGUtc3RvcHBpbmcuIG5leHQgc3RhdGUtcGF1c2luZy4KKyAgICAgICAgLy8gV2hhdCBpZiByZXN1bWUgaXMgY2FsbGVkID8KKworICAgICAgICBpZiAoc3RhdGUgPT0gUEFVU0VEIHx8IHN0YXRlID09IFBBVVNJTkcpIHsKICAgICAgICAgICAgIGlmIChtUmVzdW1lVG9TdG9wcGluZykgewogICAgICAgICAgICAgICAgIC8vIGhhcHBlbmVkIHdlIG5lZWQgdG8gcmVzdW1lIHRvIFNUT1BQSU5HXzEKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQSU5HXzE7CkBAIC03MTksNiArNzQ1LDcgQEAKICAgICAgICAgICAgICAgICBtUmV0cnlDb3VudCA9IFBsYXliYWNrVGhyZWFkOjprTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgbUZsdXNoSHdQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUT1BQSU5HXzEgJiYgbVN0YXRlICE9IFNUT1BQSU5HXzIgJiYgbVN0YXRlICE9IFNUT1BQRUQgJiYKQEAgLTczOSwxMSArNzY2LDE5IEBACiAgICAgICAgIC8vIFByZXZlbnQgZmx1c2ggYmVpbmcgbG9zdCBpZiB0aGUgdHJhY2sgaXMgZmx1c2hlZCBhbmQgdGhlbiByZXN1bWVkCiAgICAgICAgIC8vIGJlZm9yZSBtaXhlciB0aHJlYWQgY2FuIHJ1bi4gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiBvZmZsb2FkaW5nCiAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGJ1ZmZlciBjb3VsZCBob2xkIGEgbGFyZ2UgYW1vdW50IG9mIGF1ZGlvCi0gICAgICAgIHBsYXliYWNrVGhyZWFkLT5mbHVzaE91dHB1dF9sKCk7CiAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgIH0KIH0KIAorLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpmbHVzaEFjaygpCit7CisgICAgaWYgKCFpc09mZmxvYWRlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtRmx1c2hId1BlbmRpbmcgPSBmYWxzZTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cmVzZXQoKQogewogICAgIC8vIERvIG5vdCByZXNldCB0d2ljZSB0byBhdm9pZCBkaXNjYXJkaW5nIGRhdGEgd3JpdHRlbiBqdXN0IGFmdGVyIGEgZmx1c2ggYW5kIGJlZm9yZQpAQCAtOTY2LDYgKzEwMDEsMzMgQEAKICAgICB9CiB9CiAKKy8vVG8gYmUgY2FsbGVkIHdpdGggdGhyZWFkIGxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aXNSZXN1bWVQZW5kaW5nKCkgeworCisgICAgaWYgKG1TdGF0ZSA9PSBSRVNVTUlORykKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLyogUmVzdW1lIGlzIHBlbmRpbmcgaWYgdHJhY2sgd2FzIHN0b3BwaW5nIGJlZm9yZSBwYXVzZSB3YXMgY2FsbGVkICovCisgICAgaWYgKG1TdGF0ZSA9PSBTVE9QUElOR18xICYmCisgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy9UbyBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpyZXN1bWVBY2soKSB7CisKKworICAgIGlmIChtU3RhdGUgPT0gUkVTVU1JTkcpCisgICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKKworICAgIC8vIE90aGVyIHBvc3NpYmlsaXR5IG9mICBwZW5kaW5nIHJlc3VtZSBpcyBzdG9wcGluZ18xIHN0YXRlCisgICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgc3RhdGUgZnJvbSBzdG9wcGluZyBhcyB0aGlzIHByZXZlbnRzCisgICAgLy8gZHJhaW4gYmVpbmcgY2FsbGVkLgorICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkdfMSkgeworICAgICAgICBtUmVzdW1lVG9TdG9wcGluZyA9IGZhbHNlOworICAgIH0KK30KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjaz4KQEAgLTk3OSw3ICsxMDQxLDggQEAKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCi0gICAgICAgICAgICBpbnQgdWlkKSB7CisgICAgICAgICAgICBpbnQgdWlkKQorewogICAgIGlmICghY2xpZW50LT5yZXNlcnZlVGltZWRUcmFjaygpKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtMTA0NSwxNSArMTEwOCwxNCBAQAogCiAgICAgICAgIG1UaW1lZE1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa1RpbWVkQnVmZmVySGVhcFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1ZGlvRmxpbmdlclRpbWVkIik7Ci0gICAgICAgIGlmIChtVGltZWRNZW1vcnlEZWFsZXIgPT0gTlVMTCkKKyAgICAgICAgaWYgKG1UaW1lZE1lbW9yeURlYWxlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CiAgICAgfQogCiAgICAgc3A8SU1lbW9yeT4gbmV3QnVmZmVyID0gbVRpbWVkTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKLSAgICBpZiAobmV3QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgbmV3QnVmZmVyID0gbVRpbWVkTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKLSAgICAgICAgaWYgKG5ld0J1ZmZlciA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICBpZiAobmV3QnVmZmVyID09IDAgfHwgbmV3QnVmZmVyLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgIH0KIAogICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CkBAIC0xMTUyLDcgKzEyMTQsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRpbWVkVHJhY2s6OnVwZGF0ZUZyYW1lc1BlbmRpbmdBZnRlclRyaW1fbCgKICAgICAgICAgY29uc3QgVGltZWRCdWZmZXImIGJ1ZiwKLSAgICAgICAgY29uc3QgY2hhciogbG9nVGFnKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGxvZ1RhZyBfX3VudXNlZCkgewogICAgIHVpbnQzMl90IGJ1ZkJ5dGVzICAgICAgICA9IGJ1Zi5idWZmZXIoKS0+c2l6ZSgpOwogICAgIHVpbnQzMl90IGNvbnN1bWVkQWxyZWFkeSA9IGJ1Zi5wb3NpdGlvbigpOwogCkBAIC0xNDYzLDcgKzE1MjUsNyBAQAogICAgICAgICAgICAgbVRyaW1RdWV1ZUhlYWRPblJlbGVhc2UgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19GQVRBTCgiVGltZWRUcmFjazo6cmVsZWFzZUJ1ZmZlciBvZiBub24tc2lsZW5jZSBidWZmZXIgd2l0aCBubyIKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVGltZWRUcmFjazo6cmVsZWFzZUJ1ZmZlciBvZiBub24tc2lsZW5jZSBidWZmZXIgd2l0aCBubyIKICAgICAgICAgICAgICAgICAgICIgYnVmZmVycyBpbiB0aGUgdGltZWQgYnVmZmVyIHF1ZXVlIik7CiAgICAgfQogCkBAIC0xNTA0LDkgKzE1NjYsOSBAQAogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICBwbGF5YmFja1RocmVhZC0+bVRyYWNrcy5hZGQodGhpcyk7CiAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgIgotICAgICAgICAgICAgICAgICJtQ2Jsay0+ZnJhbWVDb3VudF8gJXUsIG1DaGFubmVsTWFzayAweCUwOHgiLAorICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV1LCBtQ2hhbm5lbE1hc2sgMHglMDh4IiwKICAgICAgICAgICAgICAgICBtQ2JsaywgbUJ1ZmZlciwKLSAgICAgICAgICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudF8sIG1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUNoYW5uZWxNYXNrKTsKICAgICAgICAgLy8gc2luY2UgY2xpZW50IGFuZCBzZXJ2ZXIgYXJlIGluIHRoZSBzYW1lIHByb2Nlc3MsCiAgICAgICAgIC8vIHRoZSBidWZmZXIgaGFzIHRoZSBzYW1lIHZpcnR1YWwgYWRkcmVzcyBvbiBib3RoIHNpZGVzCiAgICAgICAgIG1DbGllbnRQcm94eSA9IG5ldyBBdWRpb1RyYWNrQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplKTsKQEAgLTE3NDgsNyArMTgxMCw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gUmVjb3JkVHJhY2sgY29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKKy8vIFJlY29yZFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpSZWNvcmRUcmFjaygKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqdGhyZWFkLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LApAQCAtMTc2MCwyNCArMTgyMiw0MCBAQAogICAgICAgICAgICAgaW50IHVpZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgMCAvKnNoYXJlZEJ1ZmZlciovLCBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyppc091dCovKSwKLSAgICAgICAgbU92ZXJmbG93KGZhbHNlKQorICAgICAgICBtT3ZlcmZsb3coZmFsc2UpLCBtUmVzYW1wbGVyKE5VTEwpLCBtUnNtcE91dEJ1ZmZlcihOVUxMKSwgbVJzbXBPdXRGcmFtZUNvdW50KDApLAorICAgICAgICAvLyBTZWUgcmVhbCBpbml0aWFsaXphdGlvbiBvZiBtUnNtcEluRnJvbnQgYXQgUmVjb3JkVGhyZWFkOjpzdGFydCgpCisgICAgICAgIG1Sc21wSW5VbnJlbCgwKSwgbVJzbXBJbkZyb250KDApLCBtRnJhbWVzVG9Ecm9wKDApLCBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoTlVMTCkKIHsKLSAgICBBTE9HVigiUmVjb3JkVHJhY2sgY29uc3RydWN0b3IiKTsKLSAgICBpZiAobUNibGsgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1JlY29yZFNlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIG1GcmFtZVNpemUpOwotICAgICAgICBtU2VydmVyUHJveHkgPSBtQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eTsKKyAgICBpZiAobUNibGsgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVNlcnZlclByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUpOworCisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOworICAgIC8vIEZJWE1FIEkgZG9uJ3QgdW5kZXJzdGFuZCBlaXRoZXIgb2YgdGhlIGNoYW5uZWwgY291bnQgY2hlY2tzCisgICAgaWYgKHRocmVhZC0+bVNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSAmJiB0aHJlYWQtPm1DaGFubmVsQ291bnQgPD0gRkNDXzIgJiYKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA8PSBGQ0NfMikgeworICAgICAgICAvLyBzaW5rIFNSCisgICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKDE2LCB0aHJlYWQtPm1DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgICAgICAvLyBzb3VyY2UgU1IKKyAgICAgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSh0aHJlYWQtPm1TYW1wbGVSYXRlKTsKKyAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU4sIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU4pOworICAgICAgICBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIodGhpcyk7CiAgICAgfQogfQogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6On5SZWNvcmRUcmFjaygpCiB7CiAgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBtUmVzYW1wbGVyOworICAgIGRlbGV0ZVtdIG1Sc21wT3V0QnVmZmVyOworICAgIGRlbGV0ZSBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI7CiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsCi0gICAgICAgIGludDY0X3QgcHRzKQorICAgICAgICBpbnQ2NF90IHB0cyBfX3VudXNlZCkKIHsKICAgICBTZXJ2ZXJQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CkBAIC0xODQ1LDE5ICsxOTIzLDQ1IEBACiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIkNsaWVudCBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBTICAgU2VydmVyIGZDb3VudFxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiICAgIEFjdGl2ZSBDbGllbnQgRm10IENobiBtYXNrIFNlc3Npb24gUyAgIFNlcnZlciBmQ291bnQgUmVzYW1wbGluZ1xuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlNnUgJTN1ICUwOFggJTd1ICUxZCAlMDhYICU2enVcbiIsCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgICU2cyAlNnUgJTN1ICUwOFggJTd1ICUxZCAlMDhYICU2enUgJTEwZFxuIiwKKyAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICBtU3RhdGUsCiAgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKLSAgICAgICAgICAgIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIG1GcmFtZUNvdW50LAorICAgICAgICAgICAgbVJlc2FtcGxlciAhPSBOVUxMKTsKKworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCit7CisgICAgaWYgKGV2ZW50ID09IG1TeW5jU3RhcnRFdmVudCkgeworICAgICAgICBzc2l6ZV90IGZyYW1lc1RvRHJvcCA9IDA7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHRocmVhZEJhc2UgIT0gMCkgeworICAgICAgICAgICAgLy8gVE9ETzogdXNlIGFjdHVhbCBidWZmZXIgZmlsbGluZyBzdGF0dXMgaW5zdGVhZCBvZiAyIGJ1ZmZlcnMgd2hlbiBpbmZvIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgLy8gZnJvbSBhdWRpbyBIQUwKKyAgICAgICAgICAgIGZyYW1lc1RvRHJvcCA9IHRocmVhZEJhc2UtPm1GcmFtZUNvdW50ICogMjsKKyAgICAgICAgfQorICAgICAgICBtRnJhbWVzVG9Ecm9wID0gZnJhbWVzVG9Ecm9wOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmNsZWFyU3luY1N0YXJ0RXZlbnQoKQoreworICAgIGlmIChtU3luY1N0YXJ0RXZlbnQgIT0gMCkgeworICAgICAgICBtU3luY1N0YXJ0RXZlbnQtPmNhbmNlbCgpOworICAgICAgICBtU3luY1N0YXJ0RXZlbnQuY2xlYXIoKTsKKyAgICB9CisgICAgbUZyYW1lc1RvRHJvcCA9IDA7CiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAKaW5kZXggN2EzMTRjZi4uZTE0YjRhZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0LXJlc2FtcGxlLmNwcApAQCAtMjQsODEgKzI0LDExMiBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotc3RydWN0IEhlYWRlcldhdiB7Ci0gICAgSGVhZGVyV2F2KHNpemVfdCBzaXplLCBpbnQgbmMsIGludCBzciwgaW50IGJpdHMpIHsKLSAgICAgICAgc3RybmNweShSSUZGLCAiUklGRiIsIDQpOwotICAgICAgICBjaHVua1NpemUgPSBzaXplICsgc2l6ZW9mKEhlYWRlcldhdik7Ci0gICAgICAgIHN0cm5jcHkoV0FWRSwgIldBVkUiLCA0KTsKLSAgICAgICAgc3RybmNweShmbXQsICAiZm10ICIsIDQpOwotICAgICAgICBmbXRTaXplID0gMTY7Ci0gICAgICAgIGF1ZGlvRm9ybWF0ID0gMTsKLSAgICAgICAgbnVtQ2hhbm5lbHMgPSBuYzsKLSAgICAgICAgc2FtcGxlc1JhdGUgPSBzcjsKLSAgICAgICAgYnl0ZVJhdGUgPSBzciAqIG51bUNoYW5uZWxzICogKGJpdHMvOCk7Ci0gICAgICAgIGFsaWduID0gbmMqKGJpdHMvOCk7Ci0gICAgICAgIGJpdHNQZXJTYW1wbGUgPSBiaXRzOwotICAgICAgICBzdHJuY3B5KGRhdGEsICJkYXRhIiwgNCk7Ci0gICAgICAgIGRhdGFTaXplID0gc2l6ZTsKLSAgICB9Ci0KLSAgICBjaGFyIFJJRkZbNF07ICAgICAgICAgICAvLyBSSUZGCi0gICAgdWludDMyX3QgY2h1bmtTaXplOyAgICAgLy8gRmlsZSBzaXplCi0gICAgY2hhciBXQVZFWzRdOyAgICAgICAgLy8gV0FWRQotICAgIGNoYXIgZm10WzRdOyAgICAgICAgICAgIC8vIGZtdFwwCi0gICAgdWludDMyX3QgZm10U2l6ZTsgICAgICAgLy8gZm10IHNpemUKLSAgICB1aW50MTZfdCBhdWRpb0Zvcm1hdDsgICAvLyAxPVBDTQotICAgIHVpbnQxNl90IG51bUNoYW5uZWxzOyAgIC8vIG51bSBjaGFubmVscwotICAgIHVpbnQzMl90IHNhbXBsZXNSYXRlOyAgIC8vIHNhbXBsZSByYXRlIGluIGh6Ci0gICAgdWludDMyX3QgYnl0ZVJhdGU7ICAgICAgLy8gQnBzCi0gICAgdWludDE2X3QgYWxpZ247ICAgICAgICAgLy8gMj0xNi1iaXQgbW9ubywgND0xNi1iaXQgc3RlcmVvCi0gICAgdWludDE2X3QgYml0c1BlclNhbXBsZTsgLy8gYml0cyBwZXIgc2FtcGxlCi0gICAgY2hhciBkYXRhWzRdOyAgICAgICAgICAgLy8gImRhdGEiCi0gICAgdWludDMyX3QgZGF0YVNpemU7ICAgICAgLy8gc2l6ZQotfTsKK3N0YXRpYyBib29sIGdWZXJib3NlID0gZmFsc2U7CiAKIHN0YXRpYyBpbnQgdXNhZ2UoY29uc3QgY2hhciogbmFtZSkgewotICAgIGZwcmludGYoc3RkZXJyLCJVc2FnZTogJXMgWy1wXSBbLWhdIFstc10gWy1xIHtkcXxscXxtcXxocXx2aHF9XSBbLWkgaW5wdXQtc2FtcGxlLXJhdGVdICIKLSAgICAgICAgICAgICAgICAgICAiWy1vIG91dHB1dC1zYW1wbGUtcmF0ZV0gWzxpbnB1dC1maWxlPl0gPG91dHB1dC1maWxlPlxuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsIlVzYWdlOiAlcyBbLXBdIFstZl0gWy1GXSBbLXZdIFstYyBjaGFubmVsc10iCisgICAgICAgICAgICAgICAgICAgIiBbLXEge2RxfGxxfG1xfGhxfHZocXxkbHF8ZG1xfGRocX1dIgorICAgICAgICAgICAgICAgICAgICIgWy1pIGlucHV0LXNhbXBsZS1yYXRlXSBbLW8gb3V0cHV0LXNhbXBsZS1yYXRlXSIKKyAgICAgICAgICAgICAgICAgICAiIFstTyBjc3ZdIFstUCBjc3ZdIFs8aW5wdXQtZmlsZT5dIgorICAgICAgICAgICAgICAgICAgICIgPG91dHB1dC1maWxlPlxuIiwgbmFtZSk7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAtcCAgICBlbmFibGUgcHJvZmlsaW5nXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1oICAgIGNyZWF0ZSB3YXYgZmlsZVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsIiAgICAtcyAgICBzdGVyZW9cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLWYgICAgZW5hYmxlIGZpbHRlciBwcm9maWxpbmdcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLUYgICAgZW5hYmxlIGZsb2F0aW5nIHBvaW50IC1xIHtkbHF8ZG1xfGRocX0gb25seSIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLXYgICAgdmVyYm9zZSA6IGxvZyBidWZmZXIgcHJvdmlkZXIgY2FsbHNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLWMgICAgIyBjaGFubmVscyAoMS0yIGZvciBscXxtcXxocTsgMS04IGZvciBkbHF8ZG1xfGRocSlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgLXEgICAgcmVzYW1wbGVyIHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRxICA6IGRlZmF1bHQgcXVhbGl0eVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgbHEgIDogbG93IHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIG1xICA6IG1lZGl1bSBxdWFsaXR5XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICBocSAgOiBoaWdoIHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIHZocSA6IHZlcnkgaGlnaCBxdWFsaXR5XG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1pICAgIGlucHV0IGZpbGUgc2FtcGxlIHJhdGVcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRscSA6IGR5bmFtaWMgbG93IHF1YWxpdHlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRtcSA6IGR5bmFtaWMgbWVkaXVtIHF1YWxpdHlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRocSA6IGR5bmFtaWMgaGlnaCBxdWFsaXR5XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1pICAgIGlucHV0IGZpbGUgc2FtcGxlIHJhdGUgKGlnbm9yZWQgaWYgaW5wdXQgZmlsZSBpcyBzcGVjaWZpZWQpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1vICAgIG91dHB1dCBmaWxlIHNhbXBsZSByYXRlXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1PICAgICMgZnJhbWVzIG91dHB1dCBwZXIgY2FsbCB0byByZXNhbXBsZSgpIGluIENTViBmb3JtYXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLVAgICAgIyBmcmFtZXMgcHJvdmlkZWQgcGVyIGNhbGwgdG8gcmVzYW1wbGUoKSBpbiBDU1YgZm9ybWF0XG4iKTsKICAgICByZXR1cm4gLTE7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKy8vIENvbnZlcnQgYSBsaXN0IG9mIGludGVnZXJzIGluIENTViBmb3JtYXQgdG8gYSBWZWN0b3Igb2YgdGhvc2UgdmFsdWVzLgorLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LCBvciAtMSBvbiBlcnJvci4KK2ludCBwYXJzZUNTVihjb25zdCBjaGFyICpzdHJpbmcsIFZlY3RvcjxpbnQ+JiB2YWx1ZXMpCit7CisgICAgLy8gcGFzcyAxOiBjb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBhbmQgZG8gc3ludGF4IGNoZWNrCisgICAgc2l6ZV90IG51bVZhbHVlcyA9IDA7CisgICAgYm9vbCBoYWREaWdpdCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgY2hhciAqcCA9IHN0cmluZzsgOyApIHsKKyAgICAgICAgc3dpdGNoICgqcCsrKSB7CisgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorICAgICAgICAgICAgaGFkRGlnaXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIGlmIChoYWREaWdpdCkgeworICAgICAgICAgICAgICAgIC8vIHBhc3MgMjogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdmVjdG9yIG9mIHZhbHVlcworICAgICAgICAgICAgICAgIHZhbHVlcy5yZXNpemUoKytudW1WYWx1ZXMpOworICAgICAgICAgICAgICAgIHZhbHVlcy5lZGl0SXRlbUF0KDApID0gYXRvaShwID0gb3B0YXJnKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bVZhbHVlczsgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcCsrID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmVkaXRJdGVtQXQoaSsrKSA9IGF0b2kocCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bVZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgIGlmIChoYWREaWdpdCkgeworICAgICAgICAgICAgICAgIGhhZERpZ2l0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbnVtVmFsdWVzKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KK30KIAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICAgIGNvbnN0IGNoYXIqIGNvbnN0IHByb2duYW1lID0gYXJndlswXTsKLSAgICBib29sIHByb2ZpbGluZyA9IGZhbHNlOwotICAgIGJvb2wgd3JpdGVIZWFkZXIgPSBmYWxzZTsKKyAgICBib29sIHByb2ZpbGVSZXNhbXBsZSA9IGZhbHNlOworICAgIGJvb2wgcHJvZmlsZUZpbHRlciA9IGZhbHNlOworICAgIGJvb2wgdXNlRmxvYXQgPSBmYWxzZTsKICAgICBpbnQgY2hhbm5lbHMgPSAxOwogICAgIGludCBpbnB1dF9mcmVxID0gMDsKICAgICBpbnQgb3V0cHV0X2ZyZXEgPSAwOwogICAgIEF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRFRkFVTFRfUVVBTElUWTsKKyAgICBWZWN0b3I8aW50PiBPdmFsdWVzOworICAgIFZlY3RvcjxpbnQ+IFB2YWx1ZXM7CiAKICAgICBpbnQgY2g7Ci0gICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAicGhzcTppOm86IikpICE9IC0xKSB7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAicGZGdmM6cTppOm86TzpQOiIpKSAhPSAtMSkgewogICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgcHJvZmlsaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHByb2ZpbGVSZXNhbXBsZSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgICAgICB3cml0ZUhlYWRlciA9IHRydWU7CisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgcHJvZmlsZUZpbHRlciA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICBjaGFubmVscyA9IDI7CisgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgdXNlRmxvYXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgZ1ZlcmJvc2UgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgY2hhbm5lbHMgPSBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAncSc6CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsICJkcSIpKQpAQCAtMTExLDYgKzE0MiwxMiBAQAogICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZOwogICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJ2aHEiKSkKICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJkbHEiKSkKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZG1xIikpCisgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFk7CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgImRocSIpKQorICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWTsKICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHVzYWdlKHByb2duYW1lKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0xMjIsMTIgKzE1OSwzNSBAQAogICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgIG91dHB1dF9mcmVxID0gYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ08nOgorICAgICAgICAgICAgaWYgKHBhcnNlQ1NWKG9wdGFyZywgT3ZhbHVlcykgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvcnJlY3Qgc3ludGF4IGZvciAtTyBvcHRpb25cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgIGlmIChwYXJzZUNTVihvcHRhcmcsIFB2YWx1ZXMpIDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb3JyZWN0IHN5bnRheCBmb3IgLVAgb3B0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB1c2FnZShwcm9nbmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBpZiAoY2hhbm5lbHMgPCAxCisgICAgICAgICAgICB8fCBjaGFubmVscyA+IChxdWFsaXR5IDwgQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSA/IDIgOiA4KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzICVkXG4iLCBjaGFubmVscyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHVzZUZsb2F0ICYmIHF1YWxpdHkgPCBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmxvYXQgcHJvY2Vzc2luZyBpcyBvbmx5IHBvc3NpYmxlIGZvciBkeW5hbWljIHJlc2FtcGxlcnNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiAgICAgYXJnYyAtPSBvcHRpbmQ7CiAgICAgYXJndiArPSBvcHRpbmQ7CiAKQEAgLTE0OCwyNSArMjA4LDIyIEBACiAgICAgc2l6ZV90IGlucHV0X3NpemU7CiAgICAgdm9pZCogaW5wdXRfdmFkZHI7CiAgICAgaWYgKGFyZ2MgPT0gMikgewotICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICAgICAgaWYgKHN0YXQoZmlsZV9pbiwgJnN0KSA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic3RhdDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFNGX0lORk8gaW5mbzsKKyAgICAgICAgaW5mby5mb3JtYXQgPSAwOworICAgICAgICBTTkRGSUxFICpzZiA9IHNmX29wZW4oZmlsZV9pbiwgU0ZNX1JFQUQsICZpbmZvKTsKKyAgICAgICAgaWYgKHNmID09IE5VTEwpIHsKKyAgICAgICAgICAgIHBlcnJvcihmaWxlX2luKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiAgICAgICAgIH0KLQotICAgICAgICBpbnQgaW5wdXRfZmQgPSBvcGVuKGZpbGVfaW4sIE9fUkRPTkxZKTsKLSAgICAgICAgaWYgKGlucHV0X2ZkIDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGVuOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlucHV0X3NpemUgPSBzdC5zdF9zaXplOwotICAgICAgICBpbnB1dF92YWRkciA9IG1tYXAoMCwgaW5wdXRfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgaW5wdXRfZmQsIDApOwotICAgICAgICBpZiAoaW5wdXRfdmFkZHIgPT0gTUFQX0ZBSUxFRCApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibW1hcDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgICAgaW5wdXRfc2l6ZSA9IGluZm8uZnJhbWVzICogaW5mby5jaGFubmVscyAqIHNpemVvZihzaG9ydCk7CisgICAgICAgIGlucHV0X3ZhZGRyID0gbWFsbG9jKGlucHV0X3NpemUpOworICAgICAgICAodm9pZCkgc2ZfcmVhZGZfc2hvcnQoc2YsIChzaG9ydCAqKSBpbnB1dF92YWRkciwgaW5mby5mcmFtZXMpOworICAgICAgICBzZl9jbG9zZShzZik7CisgICAgICAgIGNoYW5uZWxzID0gaW5mby5jaGFubmVsczsKKyAgICAgICAgaW5wdXRfZnJlcSA9IGluZm8uc2FtcGxlcmF0ZTsKICAgICB9IGVsc2UgeworICAgICAgICAvLyBkYXRhIGZvciB0ZXN0aW5nIGlzIGV4YWN0bHkgKGlucHV0IHNhbXBsaW5nIHJhdGUvMTAwMCkvMiBzZWNvbmRzCisgICAgICAgIC8vIHNvIDQ0LjFraHogaW5wdXQgaXMgMjIuMDUgc2Vjb25kcwogICAgICAgICBkb3VibGUgayA9IDEwMDA7IC8vIEh6IC8gcwogICAgICAgICBkb3VibGUgdGltZSA9IChpbnB1dF9mcmVxIC8gMikgLyBrOwogICAgICAgICBzaXplX3QgaW5wdXRfZnJhbWVzID0gc2l6ZV90KGlucHV0X2ZyZXEgKiB0aW1lKTsKQEAgLTE3Nyw5OCArMjM0LDI4NyBAQAogICAgICAgICAgICAgZG91YmxlIHQgPSBkb3VibGUoaSkgLyBpbnB1dF9mcmVxOwogICAgICAgICAgICAgZG91YmxlIHkgPSBzaW4oTV9QSSAqIGsgKiB0ICogdCk7CiAgICAgICAgICAgICBpbnQxNl90IHlpID0gZmxvb3IoeSAqIDMyNzY3LjAgKyAwLjUpOwotICAgICAgICAgICAgZm9yIChzaXplX3Qgaj0wIDsgajwoc2l6ZV90KWNoYW5uZWxzIDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW5baSpjaGFubmVscyArIGpdID0geWkgLyAoMStqKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgICAgIGluW2kqY2hhbm5lbHMgKyBqXSA9IHlpIC8gKDEgKyBqKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICBzaXplX3QgaW5wdXRfZnJhbWVzaXplID0gY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgc2l6ZV90IGlucHV0X2ZyYW1lcyA9IGlucHV0X3NpemUgLyBpbnB1dF9mcmFtZXNpemU7CisKKyAgICAvLyBGb3IgZmxvYXQgcHJvY2Vzc2luZywgY29udmVydCBpbnB1dCBpbnQxNl90IHRvIGZsb2F0IGFycmF5CisgICAgaWYgKHVzZUZsb2F0KSB7CisgICAgICAgIHZvaWQgKm5ld192YWRkcjsKKworICAgICAgICBpbnB1dF9mcmFtZXNpemUgPSBjaGFubmVscyAqIHNpemVvZihmbG9hdCk7CisgICAgICAgIGlucHV0X3NpemUgPSBpbnB1dF9mcmFtZXMgKiBpbnB1dF9mcmFtZXNpemU7CisgICAgICAgIG5ld192YWRkciA9IG1hbGxvYyhpbnB1dF9zaXplKTsKKyAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihuZXdfdmFkZHIpLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KGlucHV0X3ZhZGRyKSwgaW5wdXRfZnJhbWVzICogY2hhbm5lbHMpOworICAgICAgICBmcmVlKGlucHV0X3ZhZGRyKTsKKyAgICAgICAgaW5wdXRfdmFkZHIgPSBuZXdfdmFkZHI7CisgICAgfQogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgY2xhc3MgUHJvdmlkZXI6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKLSAgICAgICAgaW50MTZfdCogbUFkZHI7Ci0gICAgICAgIHNpemVfdCBtTnVtRnJhbWVzOworICAgICAgICBjb25zdCB2b2lkKiAgICAgbUFkZHI7ICAgICAgLy8gYmFzZSBhZGRyZXNzCisgICAgICAgIGNvbnN0IHNpemVfdCAgICBtTnVtRnJhbWVzOyAvLyB0b3RhbCBmcmFtZXMKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgIG1GcmFtZVNpemU7IC8vIHNpemUgb2YgZWFjaCBmcmFtZSBpbiBieXRlcworICAgICAgICBzaXplX3QgICAgICAgICAgbU5leHRGcmFtZTsgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBwcm92aWRlCisgICAgICAgIHNpemVfdCAgICAgICAgICBtVW5yZWw7ICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIG5vdCB5ZXQgcmVsZWFzZWQKKyAgICAgICAgY29uc3QgVmVjdG9yPGludD4gbVB2YWx1ZXM7IC8vIG51bWJlciBvZiBmcmFtZXMgcHJvdmlkZWQgcGVyIGNhbGwKKyAgICAgICAgc2l6ZV90ICAgICAgICAgIG1OZXh0UGlkeDsgIC8vIGluZGV4IG9mIG5leHQgZW50cnkgaW4gbVB2YWx1ZXMgdG8gdXNlCiAgICAgcHVibGljOgotICAgICAgICBQcm92aWRlcihjb25zdCB2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGNoYW5uZWxzKSB7Ci0gICAgICAgICAgICBtQWRkciA9IChpbnQxNl90KikgYWRkcjsKLSAgICAgICAgICAgIG1OdW1GcmFtZXMgPSBzaXplIC8gKGNoYW5uZWxzKnNpemVvZihpbnQxNl90KSk7CisgICAgICAgIFByb3ZpZGVyKGNvbnN0IHZvaWQqIGFkZHIsIHNpemVfdCBmcmFtZXMsIHNpemVfdCBmcmFtZVNpemUsIGNvbnN0IFZlY3RvcjxpbnQ+JiBQdmFsdWVzKQorICAgICAgICAgIDogbUFkZHIoYWRkciksCisgICAgICAgICAgICBtTnVtRnJhbWVzKGZyYW1lcyksCisgICAgICAgICAgICBtRnJhbWVTaXplKGZyYW1lU2l6ZSksCisgICAgICAgICAgICBtTmV4dEZyYW1lKDApLCBtVW5yZWwoMCksIG1QdmFsdWVzKFB2YWx1ZXMpLCBtTmV4dFBpZHgoMCkgewogICAgICAgICB9CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cyA9IGtJbnZhbGlkUFRTKSB7Ci0gICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBtTnVtRnJhbWVzOwotICAgICAgICAgICAgYnVmZmVyLT5pMTYgPSBtQWRkcjsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICh2b2lkKXB0czsgLy8gc3VwcHJlc3Mgd2FybmluZworICAgICAgICAgICAgc2l6ZV90IHJlcXVlc3RlZEZyYW1lcyA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRGcmFtZXMgPiBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtUHZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgcHJvdmlkZWQgPSBtUHZhbHVlc1ttTmV4dFBpZHgrK107CisgICAgICAgICAgICAgICAgcHJpbnRmKCJtUHZhbHVlWyV6dV09JXp1IG5vdCAlenVcbiIsIG1OZXh0UGlkeC0xLCBwcm92aWRlZCwgYnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAocHJvdmlkZWQgPCBidWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gcHJvdmlkZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtTmV4dFBpZHggPj0gbVB2YWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0UGlkeCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJnZXROZXh0QnVmZmVyKCkgcmVxdWVzdGVkICV6dSBmcmFtZXMgb3V0IG9mICV6dSBmcmFtZXMgYXZhaWxhYmxlLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIHJldHVybmVkICV6dSBmcmFtZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRGcmFtZXMsIChzaXplX3QpIChtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSksIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVW5yZWwgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gKGNoYXIgKiltQWRkciArIG1GcmFtZVNpemUgKiBtTmV4dEZyYW1lOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtVW5yZWwpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIHJlbGVhc2VCdWZmZXIoKSByZWxlYXNlZCAlenUgZnJhbWVzIGJ1dCBvbmx5ICV6dSBhdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInRvIHJlbGVhc2VcbiIsIGJ1ZmZlci0+ZnJhbWVDb3VudCwgbVVucmVsKTsKKyAgICAgICAgICAgICAgICBtTmV4dEZyYW1lICs9IG1VbnJlbDsKKyAgICAgICAgICAgICAgICBtVW5yZWwgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJyZWxlYXNlQnVmZmVyKCkgcmVsZWFzZWQgJXp1IGZyYW1lcyBvdXQgb2YgJXp1IGZyYW1lcyBhdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byByZWxlYXNlXG4iLCBidWZmZXItPmZyYW1lQ291bnQsIG1VbnJlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1OZXh0RnJhbWUgKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgIG1VbnJlbCAtPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOwogICAgICAgICB9Ci0gICAgfSBwcm92aWRlcihpbnB1dF92YWRkciwgaW5wdXRfc2l6ZSwgY2hhbm5lbHMpOworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgbU5leHRGcmFtZSA9IDA7CisgICAgICAgIH0KKyAgICB9IHByb3ZpZGVyKGlucHV0X3ZhZGRyLCBpbnB1dF9mcmFtZXMsIGlucHV0X2ZyYW1lc2l6ZSwgUHZhbHVlcyk7CiAKLSAgICBzaXplX3QgaW5wdXRfZnJhbWVzID0gaW5wdXRfc2l6ZSAvIChjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgc2l6ZV90IG91dHB1dF9zaXplID0gMiAqIDQgKiAoKGludDY0X3QpIGlucHV0X2ZyYW1lcyAqIG91dHB1dF9mcmVxKSAvIGlucHV0X2ZyZXE7Ci0gICAgb3V0cHV0X3NpemUgJj0gfjc7IC8vIGFsd2F5cyBzdGVyZW8sIDMyLWJpdHMKKyAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCIlenUgaW5wdXQgZnJhbWVzXG4iLCBpbnB1dF9mcmFtZXMpOworICAgIH0KIAotICAgIHZvaWQqIG91dHB1dF92YWRkciA9IG1hbGxvYyhvdXRwdXRfc2l6ZSk7CisgICAgaW50IGJpdF9kZXB0aCA9IHVzZUZsb2F0ID8gMzIgOiAxNjsKKyAgICBpbnQgb3V0cHV0X2NoYW5uZWxzID0gY2hhbm5lbHMgPiAyID8gY2hhbm5lbHMgOiAyOyAvLyBvdXRwdXQgaXMgYXQgbGVhc3Qgc3RlcmVvIHNhbXBsZXMKKyAgICBzaXplX3Qgb3V0cHV0X2ZyYW1lc2l6ZSA9IG91dHB1dF9jaGFubmVscyAqICh1c2VGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MzJfdCkpOworICAgIHNpemVfdCBvdXRwdXRfZnJhbWVzID0gKChpbnQ2NF90KSBpbnB1dF9mcmFtZXMgKiBvdXRwdXRfZnJlcSkgLyBpbnB1dF9mcmVxOworICAgIHNpemVfdCBvdXRwdXRfc2l6ZSA9IG91dHB1dF9mcmFtZXMgKiBvdXRwdXRfZnJhbWVzaXplOwogCi0gICAgaWYgKHByb2ZpbGluZykgewotICAgICAgICBBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgxNiwgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgb3V0cHV0X2ZyZXEsIHF1YWxpdHkpOwotCi0gICAgICAgIHNpemVfdCBvdXRfZnJhbWVzID0gb3V0cHV0X3NpemUvODsKLSAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGlucHV0X2ZyZXEpOwotICAgICAgICByZXNhbXBsZXItPnNldFZvbHVtZSgweDEwMDAsIDB4MTAwMCk7Ci0KLSAgICAgICAgbWVtc2V0KG91dHB1dF92YWRkciwgMCwgb3V0cHV0X3NpemUpOworICAgIGlmIChwcm9maWxlRmlsdGVyKSB7CisgICAgICAgIC8vIENoZWNrIGhvdyBmYXN0IHNhbXBsZSByYXRlIGNoYW5nZXMgYXJlIHRoYXQgcmVxdWlyZSBmaWx0ZXIgY2hhbmdlcy4KKyAgICAgICAgLy8gVGhlIGRlbHRhIHNhbXBsZSByYXRlIGNoYW5nZXMgbXVzdCBpbmRpY2F0ZSBhIGRvd25zYW1wbGluZyByYXRpbywKKyAgICAgICAgLy8gYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gMTAlIGNoYW5nZXMuCisgICAgICAgIC8vCisgICAgICAgIC8vIE9uIGZhc3QgZGV2aWNlcywgZmlsdGVycyBzaG91bGQgYmUgZ2VuZXJhdGVkIGJldHdlZW4gMC4xbXMgLSAxbXMuCisgICAgICAgIC8vIChzaW5nbGUgdGhyZWFkZWQpLgorICAgICAgICBBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShiaXRfZGVwdGgsIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgIDgwMDAsIHF1YWxpdHkpOworICAgICAgICBpbnQgbG9vcGxpbWl0ID0gMTAwOwogICAgICAgICB0aW1lc3BlYyBzdGFydCwgZW5kOwogICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnN0YXJ0KTsKLSAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRfZnJhbWVzLCAmcHJvdmlkZXIpOwotICAgICAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIsIG91dF9mcmFtZXMsICZwcm92aWRlcik7Ci0gICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopIG91dHB1dF92YWRkciwgb3V0X2ZyYW1lcywgJnByb3ZpZGVyKTsKLSAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRfZnJhbWVzLCAmcHJvdmlkZXIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BsaW1pdDsgKytpKSB7CisgICAgICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoOTAwMCk7CisgICAgICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoMTIwMDApOworICAgICAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDIwMDAwKTsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSgzMDAwMCk7CisgICAgICAgIH0KICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZlbmQpOwogICAgICAgICBpbnQ2NF90IHN0YXJ0X25zID0gc3RhcnQudHZfc2VjICogMTAwMDAwMDAwMExMICsgc3RhcnQudHZfbnNlYzsKICAgICAgICAgaW50NjRfdCBlbmRfbnMgPSBlbmQudHZfc2VjICogMTAwMDAwMDAwMExMICsgZW5kLnR2X25zZWM7Ci0gICAgICAgIGludDY0X3QgdGltZSA9IChlbmRfbnMgLSBzdGFydF9ucykvNDsKLSAgICAgICAgcHJpbnRmKCIlZiBNc3BsL3NcbiIsIG91dF9mcmFtZXMvKHRpbWUvMWU5KS8xZTYpOworICAgICAgICBpbnQ2NF90IHRpbWUgPSBlbmRfbnMgLSBzdGFydF9uczsKKyAgICAgICAgcHJpbnRmKCIlLjJmIHNhbXBsZSByYXRlIGNoYW5nZXMgd2l0aCBmaWx0ZXIgY2FsY3VsYXRpb24vc2VjXG4iLAorICAgICAgICAgICAgICAgIGxvb3BsaW1pdCAqIDQgLyAodGltZSAvIDFlOSkpOwogCisgICAgICAgIC8vIENoZWNrIGhvdyBmYXN0IHNhbXBsZSByYXRlIGNoYW5nZXMgYXJlIHdpdGhvdXQgZmlsdGVyIGNoYW5nZXMuCisgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHZlcnkgZmFzdCwgcHJvYmFibHkgMC4xdXMgLSAxdXMgcGVyIHNhbXBsZSByYXRlCisgICAgICAgIC8vIGNoYW5nZS4KKyAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDEwMDApOworICAgICAgICBsb29wbGltaXQgPSAxMDAwOworICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnN0YXJ0KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29wbGltaXQ7ICsraSkgeworICAgICAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDEwMDAraSk7CisgICAgICAgIH0KKyAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZlbmQpOworICAgICAgICBzdGFydF9ucyA9IHN0YXJ0LnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIHN0YXJ0LnR2X25zZWM7CisgICAgICAgIGVuZF9ucyA9IGVuZC50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyBlbmQudHZfbnNlYzsKKyAgICAgICAgdGltZSA9IGVuZF9ucyAtIHN0YXJ0X25zOworICAgICAgICBwcmludGYoIiUuMmYgc2FtcGxlIHJhdGUgY2hhbmdlcyB3aXRob3V0IGZpbHRlciBjYWxjdWxhdGlvbi9zZWNcbiIsCisgICAgICAgICAgICAgICAgbG9vcGxpbWl0IC8gKHRpbWUgLyAxZTkpKTsKKyAgICAgICAgcmVzYW1wbGVyLT5yZXNldCgpOwogICAgICAgICBkZWxldGUgcmVzYW1wbGVyOwogICAgIH0KIAotICAgIEF1ZGlvUmVzYW1wbGVyKiByZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKDE2LCBjaGFubmVscywKKyAgICB2b2lkKiBvdXRwdXRfdmFkZHIgPSBtYWxsb2Mob3V0cHV0X3NpemUpOworICAgIEF1ZGlvUmVzYW1wbGVyKiByZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGJpdF9kZXB0aCwgY2hhbm5lbHMsCiAgICAgICAgICAgICBvdXRwdXRfZnJlcSwgcXVhbGl0eSk7Ci0gICAgc2l6ZV90IG91dF9mcmFtZXMgPSBvdXRwdXRfc2l6ZS84OworCisKKyAgICAvKiBzZXQgdm9sdW1lIHByZWNpc2lvbiB0byAxMiBiaXRzLCBzbyB0aGUgdm9sdW1lIHNjYWxlIGlzIDE8PDEyLgorICAgICAqIFRoZSBvdXRwdXQgaW50MzJfdCBpcyByZXByZXNlbnRlZCBhcyBRNC4yNywgd2l0aCA0IGJpdHMgb2YgZ3VhcmQKKyAgICAgKiBmb2xsb3dlZCBieSB0aGUgaW50MTZfdCBRLjE1IHBvcnRpb24sIGFuZCB0aGVuIDEyIHRyYWlsaW5nIGJpdHMgb2YKKyAgICAgKiBhZGRpdGlvbmFsIHByZWNpc2lvbi4KKyAgICAgKgorICAgICAqIEdlbmVyYWxseSAwIDwgdm9sdW1lUHJlY2lzaW9uIDw9IDE0IChkdWUgdG8gdGhlIGxpbWl0cyBvZgorICAgICAqIGludDE2X3QgdmFsdWVzIGZvciBWb2x1bWUpLiB2b2x1bWVQcmVjaXNpb24gY2Fubm90IGJlIDAgZHVlCisgICAgICogdG8gcm91bmRpbmcgYW5kIHNoaWZ0cy4KKyAgICAgKi8KKyAgICBjb25zdCBpbnQgdm9sdW1lUHJlY2lzaW9uID0gMTI7IC8vIGluIGJpdHMKKwogICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpbnB1dF9mcmVxKTsKLSAgICByZXNhbXBsZXItPnNldFZvbHVtZSgweDEwMDAsIDB4MTAwMCk7CisgICAgcmVzYW1wbGVyLT5zZXRWb2x1bWUoMSA8PCB2b2x1bWVQcmVjaXNpb24sIDEgPDwgdm9sdW1lUHJlY2lzaW9uKTsKKworICAgIGlmIChwcm9maWxlUmVzYW1wbGUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIHByb2ZpbGluZyBvbiBtb2JpbGUgZGV2aWNlcywgdXBvbiBleHBlcmltZW50YXRpb24KKyAgICAgICAgICogaXQgaXMgYmV0dGVyIHRvIHJ1biBhIGZldyB0cmlhbHMgd2l0aCBhIHNob3J0ZXIgbG9vcCBsaW1pdCwKKyAgICAgICAgICogYW5kIHRha2UgdGhlIG1pbmltdW0gdGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogTG9uZyB0ZXN0cyBjYW4gY2F1c2UgQ1BVIHRlbXBlcmF0dXJlIHRvIGJ1aWxkIHVwIGFuZCB0aGVybWFsIHRocm90dGxpbmcKKyAgICAgICAgICogdG8gcmVkdWNlIENQVSBmcmVxdWVuY3kuCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBmcmVxdWVuY3kgY2hlY2tzIChpbmRleD0wLCBvciAxLCBldGMuKToKKyAgICAgICAgICogImNhdCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUke2luZGV4fS9jcHVmcmVxL3NjYWxpbmdfKl9mcmVxIgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgdGVtcGVyYXR1cmUgY2hlY2tzIChpbmRleD0wLCBvciAxLCBldGMuKToKKyAgICAgICAgICogImNhdCAvc3lzL2NsYXNzL3RoZXJtYWwvdGhlcm1hbF96b25lJHtpbmRleH0vdGVtcCIKKyAgICAgICAgICoKKyAgICAgICAgICogQW5vdGhlciB3YXkgdG8gYXZvaWQgdGhlcm1hbCB0aHJvdHRsaW5nIGlzIHRvIGZpeCB0aGUgQ1BVIGZyZXF1ZW5jeQorICAgICAgICAgKiBhdCBhIGxvd2VyIGxldmVsIHdoaWNoIHByZXZlbnRzIGV4Y2Vzc2l2ZSB0ZW1wZXJhdHVyZXMuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBpbnQgdHJpYWxzID0gNDsKKyAgICAgICAgY29uc3QgaW50IGxvb3BsaW1pdCA9IDQ7CisgICAgICAgIHRpbWVzcGVjIHN0YXJ0LCBlbmQ7CisgICAgICAgIGludDY0X3QgdGltZSA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCB0cmlhbHM7ICsrbikgeworICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzdGFydCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BsaW1pdDsgKytpKSB7CisgICAgICAgICAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRwdXRfZnJhbWVzLCAmcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlc2V0KCk7IC8vICBkdXJpbmcgYmVuY2htYXJraW5nIHJlc2V0IG9ubHkgdGhlIHByb3ZpZGVyCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmVuZCk7CisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0X25zID0gc3RhcnQudHZfc2VjICogMTAwMDAwMDAwMExMICsgc3RhcnQudHZfbnNlYzsKKyAgICAgICAgICAgIGludDY0X3QgZW5kX25zID0gZW5kLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIGVuZC50dl9uc2VjOworICAgICAgICAgICAgaW50NjRfdCBkaWZmX25zID0gZW5kX25zIC0gc3RhcnRfbnM7CisgICAgICAgICAgICBpZiAobiA9PSAwIHx8IGRpZmZfbnMgPCB0aW1lKSB7CisgICAgICAgICAgICAgICAgdGltZSA9IGRpZmZfbnM7ICAgLy8gc2F2ZSB0aGUgYmVzdCBvdXQgb2Ygb3VyIHRyaWFscy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBNZnJtcy9zIGlzICJNaWxsaW9ucyBvZiBvdXRwdXQgZnJhbWVzIHBlciBzZWNvbmQiLgorICAgICAgICBwcmludGYoInF1YWxpdHk6ICVkICBjaGFubmVsczogJWQgIG1zZWM6ICUiIFBSSWQ2NCAiICBNZnJtcy9zOiAlLjJsZlxuIiwKKyAgICAgICAgICAgICAgICBxdWFsaXR5LCBjaGFubmVscywgdGltZS8xMDAwMDAwLCBvdXRwdXRfZnJhbWVzICogbG9vcGxpbWl0IC8gKHRpbWUgLyAxZTkpIC8gMWU2KTsKKyAgICAgICAgcmVzYW1wbGVyLT5yZXNldCgpOworICAgIH0KIAogICAgIG1lbXNldChvdXRwdXRfdmFkZHIsIDAsIG91dHB1dF9zaXplKTsKLSAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIsIG91dF9mcmFtZXMsICZwcm92aWRlcik7CisgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigicmVzYW1wbGUoKSAlenUgb3V0cHV0IGZyYW1lc1xuIiwgb3V0cHV0X2ZyYW1lcyk7CisgICAgfQorICAgIGlmIChPdmFsdWVzLmlzRW1wdHkoKSkgeworICAgICAgICBPdmFsdWVzLnB1c2gob3V0cHV0X2ZyYW1lcyk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwLCBqID0gMDsgaSA8IG91dHB1dF9mcmFtZXM7ICkgeworICAgICAgICBzaXplX3QgdGhpc0ZyYW1lcyA9IE92YWx1ZXNbaisrXTsKKyAgICAgICAgaWYgKGogPj0gT3ZhbHVlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzRnJhbWVzID09IDAgfHwgdGhpc0ZyYW1lcyA+IG91dHB1dF9mcmFtZXMgLSBpKSB7CisgICAgICAgICAgICB0aGlzRnJhbWVzID0gb3V0cHV0X2ZyYW1lcyAtIGk7CisgICAgICAgIH0KKyAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyICsgb3V0cHV0X2NoYW5uZWxzKmksIHRoaXNGcmFtZXMsICZwcm92aWRlcik7CisgICAgICAgIGkgKz0gdGhpc0ZyYW1lczsKKyAgICB9CisgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigicmVzYW1wbGUoKSBjb21wbGV0ZVxuIik7CisgICAgfQorICAgIHJlc2FtcGxlci0+cmVzZXQoKTsKKyAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCJyZXNldCgpIGNvbXBsZXRlXG4iKTsKKyAgICB9CisgICAgZGVsZXRlIHJlc2FtcGxlcjsKKyAgICByZXNhbXBsZXIgPSBOVUxMOwogCi0gICAgLy8gZG93bi1taXggKHdlIGp1c3QgdHJ1bmNhdGUgYW5kIGtlZXAgdGhlIGxlZnQgY2hhbm5lbCkKKyAgICAvLyBGb3IgZmxvYXQgcHJvY2Vzc2luZywgY29udmVydCBvdXRwdXQgZm9ybWF0IGZyb20gZmxvYXQgdG8gUTQuMjcsCisgICAgLy8gd2hpY2ggaXMgdGhlbiBjb252ZXJ0ZWQgdG8gaW50MTZfdCBmb3IgZmluYWwgc3RvcmFnZS4KKyAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgbWVtY3B5X3RvX3E0XzI3X2Zyb21fZmxvYXQocmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4ob3V0cHV0X3ZhZGRyKSwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGZsb2F0Kj4ob3V0cHV0X3ZhZGRyKSwgb3V0cHV0X2ZyYW1lcyAqIG91dHB1dF9jaGFubmVscyk7CisgICAgfQorCisgICAgLy8gbW9ubyB0YWtlcyBsZWZ0IGNoYW5uZWwgb25seSAob3V0IG9mIHN0ZXJlbyBvdXRwdXQgcGFpcikKKyAgICAvLyBzdGVyZW8gYW5kIG11bHRpY2hhbm5lbCBwcmVzZXJ2ZSBhbGwgY2hhbm5lbHMuCiAgICAgaW50MzJfdCogb3V0ID0gKGludDMyX3QqKSBvdXRwdXRfdmFkZHI7Ci0gICAgaW50MTZfdCogY29udmVydCA9IChpbnQxNl90KikgbWFsbG9jKG91dF9mcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRfZnJhbWVzOyBpKyspIHsKLSAgICAgICAgZm9yIChpbnQgaj0wIDsgajxjaGFubmVscyA7IGorKykgewotICAgICAgICAgICAgaW50MzJfdCBzID0gb3V0W2kgKiAyICsgal0gPj4gMTI7Ci0gICAgICAgICAgICBpZiAocyA+IDMyNzY3KSAgICAgICBzID0gIDMyNzY3OwotICAgICAgICAgICAgZWxzZSBpZiAocyA8IC0zMjc2OCkgcyA9IC0zMjc2ODsKKyAgICBpbnQxNl90KiBjb252ZXJ0ID0gKGludDE2X3QqKSBtYWxsb2Mob3V0cHV0X2ZyYW1lcyAqIGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKKworICAgIC8vIHJvdW5kIHRvIGhhbGYgdG93YXJkcyB6ZXJvIGFuZCBzYXR1cmF0ZSBhdCBpbnQxNiAobm9uLWRpdGhlcmVkKQorICAgIGNvbnN0IGludCByb3VuZFZhbCA9ICgxPDwodm9sdW1lUHJlY2lzaW9uLTEpKSAtIDE7IC8vIHZvbHVtZVByZWNpc2lvbiA+IDAKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0X2ZyYW1lczsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgaW50MzJfdCBzID0gb3V0W2kgKiBvdXRwdXRfY2hhbm5lbHMgKyBqXSArIHJvdW5kVmFsOyAvLyBhZGQgb2Zmc2V0IGhlcmUKKyAgICAgICAgICAgIGlmIChzIDwgMCkgeworICAgICAgICAgICAgICAgIHMgPSAocyArIDEpID4+IHZvbHVtZVByZWNpc2lvbjsgLy8gcm91bmQgdG8gMAorICAgICAgICAgICAgICAgIGlmIChzIDwgLTMyNzY4KSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSAtMzI3Njg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzID0gcyA+PiB2b2x1bWVQcmVjaXNpb247CisgICAgICAgICAgICAgICAgaWYgKHMgPiAzMjc2NykgeworICAgICAgICAgICAgICAgICAgICBzID0gMzI3Njc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udmVydFtpICogY2hhbm5lbHMgKyBqXSA9IGludDE2X3Qocyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyB3cml0ZSBvdXRwdXQgdG8gZGlzawotICAgIGludCBvdXRwdXRfZmQgPSBvcGVuKGZpbGVfb3V0LCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAotICAgICAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7Ci0gICAgaWYgKG91dHB1dF9mZCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGVuOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgIFNGX0lORk8gaW5mbzsKKyAgICBpbmZvLmZyYW1lcyA9IDA7CisgICAgaW5mby5zYW1wbGVyYXRlID0gb3V0cHV0X2ZyZXE7CisgICAgaW5mby5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIGluZm8uZm9ybWF0ID0gU0ZfRk9STUFUX1dBViB8IFNGX0ZPUk1BVF9QQ01fMTY7CisgICAgU05ERklMRSAqc2YgPSBzZl9vcGVuKGZpbGVfb3V0LCBTRk1fV1JJVEUsICZpbmZvKTsKKyAgICBpZiAoc2YgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZV9vdXQpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0KKyAgICAodm9pZCkgc2Zfd3JpdGVmX3Nob3J0KHNmLCBjb252ZXJ0LCBvdXRwdXRfZnJhbWVzKTsKKyAgICBzZl9jbG9zZShzZik7CiAKLSAgICBpZiAod3JpdGVIZWFkZXIpIHsKLSAgICAgICAgSGVhZGVyV2F2IHdhdihvdXRfZnJhbWVzICogY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCksIGNoYW5uZWxzLCBvdXRwdXRfZnJlcSwgMTYpOwotICAgICAgICB3cml0ZShvdXRwdXRfZmQsICZ3YXYsIHNpemVvZih3YXYpKTsKLSAgICB9Ci0KLSAgICB3cml0ZShvdXRwdXRfZmQsIGNvbnZlcnQsIG91dF9mcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgY2xvc2Uob3V0cHV0X2ZkKTsKLQotICAgIHJldHVybiAwOworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjcwYmZjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ0IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisKK1VTRV9MRUdBQ1lfQVVESU9fUE9MSUNZID0gMQoraWZlcSAoJChVU0VfTEVHQUNZX0FVRElPX1BPTElDWSksIDEpCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAgXAorICAgIEF1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAKKworICAgIExPQ0FMX0NGTEFHUyArPSAtRFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCitlbHNlCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgXAorICAgIEF1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAgXAorICAgIEF1ZGlvUG9saWN5TWFuYWdlci5jcHAKK2VuZGlmCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGlibG9nIFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYm1lZGlhIFwKKyAgICBsaWJoYXJkd2FyZSBcCisgICAgbGliaGFyZHdhcmVfbGVnYWN5CisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGlic2VydmljZXV0aWxpdHkKKworTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3kKKworTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjNDdjMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5Q2xpZW50SW1wbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGllbnQgaW50ZXJmYWNlIGZyb20gdGhlIHBvbGljeSBtYW5hZ2VyICovCisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50Ojpsb2FkSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBhZi0+bG9hZEh3TW9kdWxlKG5hbWUpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQobW9kdWxlLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvcGVuRHVwbGljYXRlT3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYWYtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0MSwgb3V0cHV0Mik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OmNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmNsb3NlT3V0cHV0KG91dHB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+c3VzcGVuZE91dHB1dChvdXRwdXQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpyZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPnJlc3RvcmVPdXRwdXQob3V0cHV0KTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPm9wZW5JbnB1dChtb2R1bGUsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2spOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+Y2xvc2VJbnB1dChpbnB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlfbXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjppbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKQoreworICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPnNldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkZWxheV9tcyk7Cit9CisKK1N0cmluZzggQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Z2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYga2V5cykKK3sKKyAgICBTdHJpbmc4IHJlc3VsdCA9IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwga2V5cyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKKyAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnN0YXJ0VG9uZSh0b25lLCBzdHJlYW0pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzdG9wVG9uZSgpCit7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnN0b3BUb25lKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUsIGRlbGF5X21zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bW92ZUVmZmVjdHMoaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0X291dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPm1vdmVFZmZlY3RzKHNlc3Npb24sIHNyY19vdXRwdXQsIGRzdF9vdXRwdXQpOworfQorCisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjNlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeVNlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjdW5kZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIF9fU1RESU5UX0xJTUlUUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisvLyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlIHRvIHRoZSBwb2xpY3kgbWFuYWdlciAqLworZXh0ZXJuICJDIiB7CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBhcHNfbG9hZF9od19tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmxvYWRId01vZHVsZShuYW1lKTsKK30KKworLy8gZGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSgpCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQoKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCkwLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncyk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBhZi0+b3Blbk91dHB1dChtb2R1bGUsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXRlbmN5TXMsIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2R1cF9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dDEsIG91dHB1dDIpOworfQorCitpbnQgYXBzX2Nsb3NlX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5jbG9zZU91dHB1dChvdXRwdXQpOworfQorCitpbnQgYXBzX3N1c3BlbmRfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPnN1c3BlbmRPdXRwdXQob3V0cHV0KTsKK30KKworaW50IGFwc19yZXN0b3JlX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5yZXN0b3JlT3V0cHV0KG91dHB1dCk7Cit9CisKKy8vIGRlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSgpLCBhbmQgYWNvdXN0aWNzIHBhcmFtZXRlciBpcyBpZ25vcmVkCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MgX191bnVzZWQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPm9wZW5JbnB1dCgoYXVkaW9fbW9kdWxlX2hhbmRsZV90KTAsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2spOworfQorCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5vcGVuSW5wdXQobW9kdWxlLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrKTsKK30KKworaW50IGFwc19jbG9zZV9pbnB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmNsb3NlSW5wdXQoaW5wdXQpOworfQorCitpbnQgYXBzX2ludmFsaWRhdGVfc3RyZWFtKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOworfQorCitpbnQgYXBzX21vdmVfZWZmZWN0cyh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0X291dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPm1vdmVFZmZlY3RzKHNlc3Npb24sIHNyY19vdXRwdXQsIGRzdF9vdXRwdXQpOworfQorCitjaGFyICogYXBzX2dldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlzKQoreworICAgIFN0cmluZzggcmVzdWx0ID0gQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBTdHJpbmc4KGtleXMpKTsKKyAgICByZXR1cm4gc3RyZHVwKHJlc3VsdC5zdHJpbmcoKSk7Cit9CisKK3ZvaWQgYXBzX3NldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3ZfcGFpcnMsIGludCBkZWxheV9tcykKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwga3ZfcGFpcnMsIGRlbGF5X21zKTsKK30KKworaW50IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpCit7CisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKKworICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9tcyk7Cit9CisKK2ludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RhcnRUb25lKHRvbmUsIHN0cmVhbSk7Cit9CisKK2ludCBhcHNfc3RvcF90b25lKHZvaWQgKnNlcnZpY2UpCit7CisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKKworICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnN0b3BUb25lKCk7Cit9CisKK2ludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7Cit9CisKK307IC8vIGV4dGVybiAiQyIKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjYwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPUE9MSUNZX0lOVEVSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9QT0xJQ1lfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgYW5kIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlIGNsYXNzZXMgZGVmaW5lIHRoZSBjb21tdW5pY2F0aW9uIGludGVyZmFjZXMKKy8vIGJldHdlZW4gdGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCBBbmRyb2lkIGdlbmVyaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIuCisvLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgbXVzdCBpbXBsZW1lbnQgbWV0aG9kcyBvZiB0aGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgY2xhc3MuCisvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHVzZSBvZiB0aGUgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgdG8gY29udHJvbCB0aGUgYWN0aXZpdHkgYW5kCisvLyBjb25maWd1cmF0aW9uIG9mIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKy8vCisvLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMgaW4gY2hhcmdlIG9mIHRoZSBhdWRpbyByb3V0aW5nIGFuZCB2b2x1bWUgY29udHJvbAorLy8gcG9saWNpZXMgZm9yIGEgZ2l2ZW4gcGxhdGZvcm0uCisvLyBUaGUgbWFpbiByb2xlcyBvZiB0aGlzIG1vZHVsZSBhcmU6CisvLyAgIC0ga2VlcCB0cmFjayBvZiBjdXJyZW50IHN5c3RlbSBzdGF0ZSAocmVtb3ZhYmxlIGRldmljZSBjb25uZWN0aW9ucywgcGhvbmUgc3RhdGUsIHVzZXIgcmVxdWVzdHMuLi4pLgorLy8gICBTeXN0ZW0gc3RhdGUgY2hhbmdlcyBhbmQgdXNlciBhY3Rpb25zIGFyZSBub3RpZmllZCB0byBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aXRoIG1ldGhvZHMgb2YgdGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlLgorLy8gICAtIHByb2Nlc3MgZ2V0T3V0cHV0KCkgcXVlcmllcyByZWNlaXZlZCB3aGVuIEF1ZGlvVHJhY2sgb2JqZWN0cyBhcmUgY3JlYXRlZDogVGhvc2UgcXVlcmllcworLy8gICByZXR1cm4gYSBoYW5kbGVyIG9uIGFuIG91dHB1dCB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb25maWd1cmVkIGFuZCBvcGVuZWQgYnkgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCB0aGF0CisvLyAgIG11c3QgYmUgdXNlZCBieSB0aGUgQXVkaW9UcmFjayB3aGVuIHJlZ2lzdGVyaW5nIHRvIHRoZSBBdWRpb0ZsaW5nZXIgd2l0aCB0aGUgY3JlYXRlVHJhY2soKSBtZXRob2QuCisvLyAgIFdoZW4gdGhlIEF1ZGlvVHJhY2sgb2JqZWN0IGlzIHJlbGVhc2VkLCBhIHB1dE91dHB1dCgpIHF1ZXJ5IGlzIHJlY2VpdmVkIGFuZCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgY2FuIGRlY2lkZQorLy8gICB0byBjbG9zZSBvciByZWNvbmZpZ3VyZSB0aGUgb3V0cHV0IGRlcGVuZGluZyBvbiBvdGhlciBzdHJlYW1zIHVzaW5nIHRoaXMgb3V0cHV0IGFuZCBjdXJyZW50IHN5c3RlbSBzdGF0ZS4KKy8vICAgLSBzaW1pbGFybHkgcHJvY2VzcyBnZXRJbnB1dCgpIGFuZCBwdXRJbnB1dCgpIHF1ZXJpZXMgcmVjZWl2ZWQgZnJvbSBBdWRpb1JlY29yZCBvYmplY3RzIGFuZCBjb25maWd1cmUgYXVkaW8gaW5wdXRzLgorLy8gICAtIHByb2Nlc3Mgdm9sdW1lIGNvbnRyb2wgcmVxdWVzdHM6IHRoZSBzdHJlYW0gdm9sdW1lIGlzIGNvbnZlcnRlZCBmcm9tIGFuIGluZGV4IHZhbHVlIChyZWNlaXZlZCBmcm9tIFVJKSB0byBhIGZsb2F0IHZhbHVlCisvLyAgIGFwcGxpY2FibGUgdG8gZWFjaCBvdXRwdXQgYXMgYSBmdW5jdGlvbiBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBzZXR0aW5ncyBhbmQgY3VycmVudCBvdXRwdXQgcm91dGUgKGRlc3RpbmF0aW9uIGRldmljZSkuIEl0CisvLyAgIGFsc28gbWFrZSBzdXJlIHRoYXQgc3RyZWFtcyBhcmUgbm90IG11dGVkIGlmIG5vdCBhbGxvd2VkIChlLmcuIGNhbWVyYSBzaHV0dGVyIHNvdW5kIGluIHNvbWUgY291bnRyaWVzKS4KKy8vCisvLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMgcHJvdmlkZWQgYXMgYSBzaGFyZWQgbGlicmFyeSBieSBwbGF0Zm9ybSB2ZW5kb3JzIChhcyBmb3IgbGliYXVkaW8uc28pCisvLyBhbmQgaXMgbGlua2VkIHdpdGggbGliYXVkaW9mbGluZ2VyLnNvCisKKworLy8gICAgQXVkaW8gUG9saWN5IE1hbmFnZXIgSW50ZXJmYWNlCitjbGFzcyBBdWRpb1BvbGljeUludGVyZmFjZQoreworCitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lJbnRlcmZhY2UoKSB7fQorICAgIC8vCisgICAgLy8gY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdHVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOworICAgIC8vIHJldHJpZXZlIGEgZGV2aWNlIGNvbm5lY3Rpb24gc3RhdHVzCisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CisgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gcGhvbmUgc3RhdGUuIFZhbGlkIHBob25lcyBzdGF0ZXMgYXJlIGRlZmluZWQgYnkgYXVkaW9fbW9kZV90CisgICAgdmlydHVhbCB2b2lkIHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKSA9IDA7CisgICAgLy8gZm9yY2UgdXNpbmcgYSBzcGVjaWZpYyBkZXZpY2UgY2F0ZWdvcnkgZm9yIHRoZSBzcGVjaWZpZWQgdXNhZ2UKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgPSAwOworICAgIC8vIHJldHJpZXZlIGN1cnJlbnQgZGV2aWNlIGNhdGVnb3J5IGZvcmNlZCBmb3IgYSBnaXZlbiB1c2FnZQorICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpID0gMDsKKyAgICAvLyBzZXQgYSBzeXN0ZW0gcHJvcGVydHkgKGUuZy4gY2FtZXJhIHNvdW5kIGFsd2F5cyBhdWRpYmxlKQorICAgIHZpcnR1YWwgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpID0gMDsKKyAgICAvLyBjaGVjayBwcm9wZXIgaW5pdGlhbGl6YXRpb24KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpID0gMDsKKworICAgIC8vCisgICAgLy8gQXVkaW8gcm91dGluZyBxdWVyeSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gcmVxdWVzdCBhbiBvdXRwdXQgYXBwcm9wcmlhdGUgZm9yIHBsYXliYWNrIG9mIHRoZSBzdXBwbGllZCBzdHJlYW0gdHlwZSBhbmQgcGFyYW1ldGVycworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKSA9IDA7CisgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RhcnRzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCkgPSAwOworICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0b3BzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCkgPSAwOworICAgIC8vIHJlbGVhc2VzIHRoZSBvdXRwdXQuCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisKKyAgICAvLyByZXF1ZXN0IGFuIGlucHV0IGFwcHJvcHJpYXRlIGZvciByZWNvcmQgZnJvbSB0aGUgc3VwcGxpZWQgZGV2aWNlIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MpID0gMDsKKyAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOworICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOworICAgIC8vIHJlbGVhc2VzIHRoZSBpbnB1dC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CisKKyAgICAvLworICAgIC8vIHZvbHVtZSBjb250cm9sIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBpbml0aWFsaXNlcyBzdHJlYW0gdm9sdW1lIGNvbnZlcnNpb24gcGFyYW1ldGVycyBieSBzcGVjaWZ5aW5nIHZvbHVtZSBpbmRleCByYW5nZS4KKyAgICB2aXJ0dWFsIHZvaWQgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpID0gMDsKKworICAgIC8vIHNldHMgdGhlIG5ldyBzdHJlYW0gdm9sdW1lIGF0IGEgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgc3VwcGxpZWQgaW5kZXggZm9yIHRoZQorICAgIC8vIHN1cHBsaWVkIGRldmljZS4gQnkgY29udmVudGlvbiwgc3BlY2lmeWluZyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQgbWVhbnMKKyAgICAvLyBzZXR0aW5nIHZvbHVtZSBmb3IgYWxsIGRldmljZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworCisgICAgLy8gcmV0cmlldmUgY3VycmVudCB2b2x1bWUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtIGFuZCB0aGUKKyAgICAvLyBzcGVjaWZpZWQgZGV2aWNlLiBCeSBjb252ZW50aW9uLCBzcGVjaWZ5aW5nIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCBtZWFucworICAgIC8vIHF1ZXJ5aW5nIHRoZSB2b2x1bWUgb2YgdGhlIGFjdGl2ZSBkZXZpY2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisKKyAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKworICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOworCisgICAgLy8gQXVkaW8gZWZmZWN0IG1hbmFnZW1lbnQKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdCA9IDA7CisKKyAgICAvL2R1bXAgc3RhdGUKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykgPSAwOworfTsKKworCisvLyBBdWRpbyBQb2xpY3kgY2xpZW50IEludGVyZmFjZQorY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSgpIHt9CisKKyAgICAvLworICAgIC8vIEF1ZGlvIEhXIG1vZHVsZSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gbG9hZHMgYSBIVyBtb2R1bGUuCisgICAgdmlydHVhbCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpID0gMDsKKworICAgIC8vCisgICAgLy8gQXVkaW8gb3V0cHV0IENvbnRyb2wgZnVuY3Rpb25zCisgICAgLy8KKworICAgIC8vIG9wZW5zIGFuIGF1ZGlvIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycy4gVGhlIHBhcmFtZXRlciB2YWx1ZXMgY2FuIGluZGljYXRlIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMKKyAgICAvLyBpbiBjYXNlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBoYXMgbm8gc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciB0aGUgb3V0cHV0IGJlaW5nIG9wZW5lZC4KKyAgICAvLyBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLCB0aGUgcGFyYW1ldGVyIHZhbHVlcyByZWZsZWN0IHRoZSBhY3R1YWwgdmFsdWVzIHVzZWQgYnkgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uCisgICAgLy8gVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiBjaGVjayBpZiB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycyBhcmUgc3VpdGFibGUgb3Igbm90IGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKSA9IDA7CisgICAgLy8gY3JlYXRlcyBhIHNwZWNpYWwgb3V0cHV0IHRoYXQgaXMgZHVwbGljYXRlZCB0byB0aGUgdHdvIG91dHB1dHMgcGFzc2VkIGFzIGFyZ3VtZW50cy4gVGhlIGR1cGxpY2F0aW9uIGlzIHBlcmZvcm1lZCBieQorICAgIC8vIGEgc3BlY2lhbCBtaXhlciB0aHJlYWQgaW4gdGhlIEF1ZGlvRmxpbmdlci4KKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgPSAwOworICAgIC8vIGNsb3NlcyB0aGUgb3V0cHV0IHN0cmVhbQorICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgLy8gc3VzcGVuZHMgdGhlIG91dHB1dC4gV2hlbiBhbiBvdXRwdXQgaXMgc3VzcGVuZGVkLCB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtIGlzIHBsYWNlZCBpbgorICAgIC8vIHN0YW5kYnkgYW5kIHRoZSBBdWRpb1RyYWNrcyBhdHRhY2hlZCB0byB0aGUgbWl4ZXIgdGhyZWFkIGFyZSBzdGlsbCBwcm9jZXNzZWQgYnV0IHRoZSBvdXRwdXQgbWl4IGlzIGRpc2NhcmRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgLy8gcmVzdG9yZXMgYSBzdXNwZW5kZWQgb3V0cHV0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKKworICAgIC8vCisgICAgLy8gQXVkaW8gaW5wdXQgQ29udHJvbCBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gb3BlbnMgYW4gYXVkaW8gaW5wdXQKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykgPSAwOworICAgIC8vIGNsb3NlcyBhbiBhdWRpbyBpbnB1dAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOworICAgIC8vCisgICAgLy8gbWlzYyBjb250cm9sIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBzZXQgYSBzdHJlYW0gdm9sdW1lIGZvciBhIHBhcnRpY3VsYXIgb3V0cHV0LiBGb3IgdGhlIHNhbWUgdXNlciBzZXR0aW5nLCBhIGdpdmVuIHN0cmVhbSB0eXBlIGNhbiBoYXZlIGRpZmZlcmVudCB2b2x1bWVzCisgICAgLy8gZm9yIGVhY2ggb3V0cHV0IChkZXN0aW5hdGlvbiBkZXZpY2UpIGl0IGlzIGF0dGFjaGVkIHRvLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKSA9IDA7CisKKyAgICAvLyBpbnZhbGlkYXRlIGEgc3RyZWFtIHR5cGUsIGNhdXNpbmcgYSByZXJvdXRlIHRvIGFuIHVuc3BlY2lmaWVkIG5ldyBvdXRwdXQKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKworICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHNlbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlLgorICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApID0gMDsKKyAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOworCisgICAgLy8gcmVxdWVzdCB0aGUgcGxheWJhY2sgb2YgYSB0b25lIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtOiB1c2VkIGZvciBpbnN0YW5jZSB0byByZXBsYWNlIG5vdGlmaWNhdGlvbiBzb3VuZHMgd2hlbiBwbGF5aW5nCisgICAgLy8gb3ZlciBhIHRlbGVwaG9ueSBkZXZpY2UgZHVyaW5nIGEgcGhvbmUgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpID0gMDsKKworICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApID0gMDsKKworICAgIC8vIG1vdmUgZWZmZWN0IHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0CisgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KSA9IDA7CisKK307CisKK2V4dGVybiAiQyIgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKK2V4dGVybiAiQyIgdm9pZCBkZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5SW50ZXJmYWNlICppbnRlcmZhY2UpOworCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPUE9MSUNZX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTdjNGZhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApAQCAtMCwwICsxLDQ2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lJbnRlZmFjZUltcGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKKyAgICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0YXRlKSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkiKTsKKworICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKKyAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFBob25lU3RhdGUoc3RhdGUpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChjb25maWcgPCAwIHx8IGNvbmZpZyA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfQ0ZHX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigic2V0Rm9yY2VVc2UoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEZvcmNlVXNlKHVzYWdlKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dChzdHJlYW0sIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgQUxPR1YoImRvU3RvcE91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KG91dHB1dCk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAorICAgIGlmIChpbnB1dFNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQorICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SW5wdXQoaW5wdXRTb3VyY2UsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIChhdWRpb19pbl9hY291c3RpY3NfdCkgMCk7CisKKyAgICBpZiAoaW5wdXQgPT0gMCkgeworICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorICAgIC8vIGNyZWF0ZSBhdWRpbyBwcmUgcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gaW5wdXQgc291cmNlCisgICAgYXVkaW9fc291cmNlX3QgYWxpYXNTb3VyY2UgPSAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiA6IGlucHV0U291cmNlOworCisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dFNvdXJjZXMuaW5kZXhPZktleShhbGlhc1NvdXJjZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorICAgIHNzaXplX3QgaWR4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBJbnB1dERlc2MgKmlucHV0RGVzYzsKKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICBpbnB1dERlc2MgPSBuZXcgSW5wdXREZXNjKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIG1JbnB1dHMuYWRkKGlucHV0LCBpbnB1dERlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpZHgpOworICAgIH0KKworICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzID0gbUlucHV0U291cmNlcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGVmZmVjdHNbaV07CisgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgLTEsIDAsIDAsIGF1ZGlvU2Vzc2lvbiwgaW5wdXQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGNyZWF0ZSBGeCAlcyBvbiBpbnB1dCAlZCIsIGVmZmVjdC0+bU5hbWUsIGlucHV0KTsKKyAgICAgICAgICAgIC8vIGZ4IGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBzdHJvbmcgcmVmIG9uIEF1ZGlvRWZmZWN0IGlzIHJlbGVhc2VkCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGVmZmVjdC0+bVBhcmFtcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgZngtPnNldFBhcmFtZXRlcihlZmZlY3QtPm1QYXJhbXNbal0pOworICAgICAgICB9CisgICAgICAgIGlucHV0RGVzYy0+bUVmZmVjdHMuYWRkKGZ4KTsKKyAgICB9CisgICAgc2V0UHJlUHJvY2Vzc29yRW5hYmxlZChpbnB1dERlc2MsIHRydWUpOworICAgIHJldHVybiBpbnB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dChpbnB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcElucHV0KGlucHV0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoaW5wdXQpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIElucHV0RGVzYyAqaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBzZXRQcmVQcm9jZXNzb3JFbmFibGVkKGlucHV0RGVzYywgZmFsc2UpOworICAgIGRlbGV0ZSBpbnB1dERlc2M7CisgICAgbUlucHV0cy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKKy8vYXVkaW8gcG9saWN5OiB1c2UgYXVkaW9fZGV2aWNlX3QgYXBwcm9wcmlhdGVseQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpMDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKyAgICAvLyBGSVhNRSBjaGFuZ2UgcmV0dXJuIHR5cGUgdG8gc3RhdHVzX3QsIGFuZCByZXR1cm4gTk9fSU5JVCBoZXJlCisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yRWZmZWN0KGRlc2MpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnVucmVnaXN0ZXJFZmZlY3QoaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTb3VyY2VBY3RpdmUoc291cmNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQoreworCisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIHNpemVfdCBpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBpZiAobUlucHV0cy52YWx1ZUF0KGluZGV4KS0+bVNlc3Npb25JZCA9PSBhdWRpb1Nlc3Npb24pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbmRleCA9PSBtSW5wdXRzLnNpemUoKSkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBWZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+IGVmZmVjdHMgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3RzW2ldLT5kZXNjcmlwdG9yKCk7CisgICAgICAgIGlmIChpIDwgKmNvdW50KSB7CisgICAgICAgICAgICBkZXNjcmlwdG9yc1tpXSA9IGRlc2M7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVmZmVjdHMuc2l6ZSgpID4gKmNvdW50KSB7CisgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKKyAgICB9CisgICAgKmNvdW50ID0gZWZmZWN0cy5zaXplKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7Cit9CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNjJhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeVNlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKKyAgICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2RldmljZV9jb25uZWN0aW9uX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0YXRlKSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkiKTsKKworICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKKyAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9waG9uZV9zdGF0ZShtcEF1ZGlvUG9saWN5LCBzdGF0ZSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGNvbmZpZyA8IDAgfHwgY29uZmlnID49IEFVRElPX1BPTElDWV9GT1JDRV9DRkdfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtcEF1ZGlvUG9saWN5LT5zZXRfZm9yY2VfdXNlKG1wQXVkaW9Qb2xpY3ksIHVzYWdlLCBjb25maWcpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZm9yY2VfdXNlKG1wQXVkaW9Qb2xpY3ksIHVzYWdlKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9vdXRwdXQobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RhcnRfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBTE9HVigic3RvcE91dHB1dCgpIik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0b3Bfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIGFscmVhZHkgY2hlY2tlZCBieSBjbGllbnQsIGJ1dCBkb3VibGUtY2hlY2sgaW4gY2FzZSB0aGUgY2xpZW50IHdyYXBwZXIgaXMgYnlwYXNzZWQKKyAgICBpZiAoaW5wdXRTb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyB0aGUgYXVkaW9faW5fYWNvdXN0aWNzX3QgcGFyYW1ldGVyIGlzIGlnbm9yZWQgYnkgZ2V0X2lucHV0KCkKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IG1wQXVkaW9Qb2xpY3ktPmdldF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX2luX2Fjb3VzdGljc190KSAwKTsKKworICAgIGlmIChpbnB1dCA9PSAwKSB7CisgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisgICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKKyAgICBhdWRpb19zb3VyY2VfdCBhbGlhc1NvdXJjZSA9IChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIDogaW5wdXRTb3VyY2U7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0U291cmNlcy5pbmRleE9mS2V5KGFsaWFzU291cmNlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisgICAgc3NpemVfdCBpZHggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIElucHV0RGVzYyAqaW5wdXREZXNjOworICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIGlucHV0RGVzYyA9IG5ldyBJbnB1dERlc2MoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlkeCk7CisgICAgfQorCisgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKKyAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwgMCwgYXVkaW9TZXNzaW9uLCBpbnB1dCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY3JlYXRlIEZ4ICVzIG9uIGlucHV0ICVkIiwgZWZmZWN0LT5tTmFtZSwgaW5wdXQpOworICAgICAgICAgICAgLy8gZnggZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIHN0cm9uZyByZWYgb24gQXVkaW9FZmZlY3QgaXMgcmVsZWFzZWQKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZWZmZWN0LT5tUGFyYW1zLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBmeC0+c2V0UGFyYW1ldGVyKGVmZmVjdC0+bVBhcmFtc1tqXSk7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXREZXNjLT5tRWZmZWN0cy5hZGQoZngpOworICAgIH0KKyAgICBzZXRQcmVQcm9jZXNzb3JFbmFibGVkKGlucHV0RGVzYywgdHJ1ZSk7CisgICAgcmV0dXJuIGlucHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RvcF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbXBBdWRpb1BvbGljeS0+cmVsZWFzZV9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgSW5wdXREZXNjICppbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIHNldFByZVByb2Nlc3NvckVuYWJsZWQoaW5wdXREZXNjLCBmYWxzZSk7CisgICAgZGVsZXRlIGlucHV0RGVzYzsKKyAgICBtSW5wdXRzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbXBBdWRpb1BvbGljeS0+aW5pdF9zdHJlYW1fdm9sdW1lKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKSB7CisgICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKG1wQXVkaW9Qb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXgpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UpIHsKKyAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UobXBBdWRpb1BvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyYXRlZ3lfZm9yX3N0cmVhbShtcEF1ZGlvUG9saWN5LCBzdHJlYW0pOworfQorCisvL2F1ZGlvIHBvbGljeTogdXNlIGF1ZGlvX2RldmljZV90IGFwcHJvcHJpYXRlbHkKKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KTA7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlc19mb3Jfc3RyZWFtKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgLy8gRklYTUUgY2hhbmdlIHJldHVybiB0eXBlIHRvIHN0YXR1c190LCBhbmQgcmV0dXJuIE5PX0lOSVQgaGVyZQorICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9vdXRwdXRfZm9yX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBkZXNjKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnJlZ2lzdGVyX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+dW5yZWdpc3Rlcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9lZmZlY3RfZW5hYmxlZChtcEF1ZGlvUG9saWN5LCBpZCwgZW5hYmxlZCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc3RyZWFtX2FjdGl2ZShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3N0cmVhbV9hY3RpdmVfcmVtb3RlbHkobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Cit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5LT5pc19zb3VyY2VfYWN0aXZlID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zb3VyY2VfYWN0aXZlKG1wQXVkaW9Qb2xpY3ksIHNvdXJjZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBzaXplX3QgaW5kZXg7CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbUlucHV0cy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKG1JbnB1dHMudmFsdWVBdChpbmRleCktPm1TZXNzaW9uSWQgPT0gYXVkaW9TZXNzaW9uKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5kZXggPT0gbUlucHV0cy5zaXplKCkpIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgVmVjdG9yPCBzcDxBdWRpb0VmZmVjdD4gPiBlZmZlY3RzID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gZWZmZWN0c1tpXS0+ZGVzY3JpcHRvcigpOworICAgICAgICBpZiAoaSA8ICpjb3VudCkgeworICAgICAgICAgICAgZGVzY3JpcHRvcnNbaV0gPSBkZXNjOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlZmZlY3RzLnNpemUoKSA+ICpjb3VudCkgeworICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CisgICAgfQorICAgICpjb3VudCA9IGVmZmVjdHMuc2l6ZSgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigibXBBdWRpb1BvbGljeSA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobXBBdWRpb1BvbGljeS0+aXNfb2ZmbG9hZF9zdXBwb3J0ZWQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiSEFMIGRvZXMgbm90IGltcGxlbWVudCBpc19vZmZsb2FkX3N1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX29mZmxvYWRfc3VwcG9ydGVkKG1wQXVkaW9Qb2xpY3ksICZpbmZvKTsKK30KKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmOThkMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTAsMCArMSw0Mjk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeU1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInZpcnR1YWwiIHdoZW4gZXZhbHVhdGluZworLy8gYWN0aXZlIGlucHV0cyBpbiBnZXRBY3RpdmVJbnB1dCgpCisjZGVmaW5lIEFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwgIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYCisvLyBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gb3V0cHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAicmVtb3RlIiB3aGVuIGV2YWx1YXRpbmcKKy8vIGFjdGl2ZSBvdXRwdXQgZGV2aWNlcyBpbiBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KCkKKyNkZWZpbmUgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvYXVkaW9fcG9saWN5X2NvbmYuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVmaW5pdGlvbnMgZm9yIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgU3RyaW5nVG9FbnVtIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHVpbnQzMl90IHZhbHVlOworfTsKKworI2RlZmluZSBTVFJJTkdfVE9fRU5VTShzdHJpbmcpIHsgI3N0cmluZywgc3RyaW5nIH0KKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisKK2NvbnN0IFN0cmluZ1RvRW51bSBzRGV2aWNlTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FMTF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQU5MR19ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9ER1RMX0RPQ0tfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9BQ0NFU1NPUlkpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNGbGFnTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19GQVNUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzRm9ybWF0TmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfMjRfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNX0ZMT0FUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9NUDMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9WT1JCSVMpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOX01PTk8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0spLAorfTsKKworCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmluZ1RvRW51bShjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAodGFibGVbaV0ubmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoInN0cmluZ1RvRW51bSgpIGZvdW5kICVzIiwgdGFibGVbaV0ubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gdGFibGVbaV0udmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKkF1ZGlvUG9saWN5TWFuYWdlcjo6ZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICh0YWJsZVtpXS52YWx1ZSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLm5hbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyaW5nVG9Cb29sKGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIHJldHVybiAoKHN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkgPT0gMCkgfHwgKHN0cmNtcCgiMSIsIHZhbHVlKSA9PSAwKSk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW9Qb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKyAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKworICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2U6ICV4LCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyIsIGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKKworICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlcworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisKKyAgICAgICAgLy8gc2F2ZSBhIGNvcHkgb2YgdGhlIG9wZW5lZCBvdXRwdXQgZGVzY3JpcHRvcnMgYmVmb3JlIGFueSBvdXRwdXQgaXMgb3BlbmVkIG9yIGNsb3NlZAorICAgICAgICAvLyBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKS4gVGhpcyB3aWxsIGJlIG5lZWRlZCBieSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgY29ubmVjdGlvbgorICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOgorICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvbm5lY3RpbmcgZGV2aWNlICV4IiwgZGV2aWNlKTsKKworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBvdXRwdXRzLCBhZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCAlZCBvdXRwdXRzIiwKKyAgICAgICAgICAgICAgICAgIG91dHB1dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5ldyBkZXZpY2UgYXMgYXZhaWxhYmxlCisgICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworCisgICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgb3V0cHV0cywgYWRkcmVzcyk7CisgICAgICAgICAgICAvLyBub3QgY3VycmVudGx5IGhhbmRsaW5nIG11bHRpcGxlIHNpbXVsdGFuZW91cyBzdWJtaXhlczogaWdub3JpbmcgcmVtb3RlIHN1Ym1peAorICAgICAgICAgICAgLy8gICBjYXNlIGFuZCBhZGRyZXNzCisgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2tBMmRwU3VzcGVuZCBtdXN0IHJ1biBiZWZvcmUgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIHNvIHRoYXQgQTJEUAorICAgICAgICAvLyBvdXRwdXQgaXMgc3VzcGVuZGVkIGJlZm9yZSBhbnkgdHJhY2tzIGFyZSBtb3ZlZCB0byBpdAorICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgICAgICAvLyBvdXRwdXRzIG11c3QgYmUgY2xvc2VkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpIGlzIGV4ZWN1dGVkCisgICAgICAgIGlmICghb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZSBiZWVuCisgICAgICAgICAgICAgICAgLy8gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycworICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0c1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gYWZ0ZXIgY2xvc2luZyBBMkRQIG91dHB1dCB0byByZXNldCBtQTJkcFN1c3BlbmRlZCBpZiBuZWVkZWQKKyAgICAgICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBmb3JjZSBkZXZpY2UgY2hhbmdlIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IGJlY2F1c2UgaWYgZGV2aWNlIGlzIDAsIGl0IHdpbGwKKyAgICAgICAgICAgIC8vIGFsc28gZm9yY2UgYSBkZXZpY2UgMCBmb3IgdGhlIHR3byBvdXRwdXRzIGl0IGlzIGR1cGxpY2F0ZWQgdG8gd2hpY2ggbWF5IG92ZXJyaWRlCisgICAgICAgICAgICAvLyBhIHZhbGlkIGRldmljZSBzZWxlY3Rpb24gb24gdGhvc2Ugb3V0cHV0cy4KKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShtT3V0cHV0cy5rZXlBdChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdEZXZpY2UobU91dHB1dHMua2V5QXQoaSksIHRydWUgLypmcm9tQ2FjaGUqLyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1PdXRwdXRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08gfHwKKyAgICAgICAgICAgICAgICAgICBkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQgfHwKKyAgICAgICAgICAgICAgICAgICBkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlcworICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2UgZGlzY29ubmVjdGlvbgorICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGdldEFjdGl2ZUlucHV0KCk7CisgICAgICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwKSB7CisgICAgICAgICAgICBBdWRpb0lucHV0RGVzY3JpcHRvciAqaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihhY3RpdmVJbnB1dCk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOworICAgICAgICAgICAgaWYgKChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmIChuZXdEZXZpY2UgIT0gaW5wdXREZXNjLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjaGFuZ2luZyBkZXZpY2UgZnJvbSAleCB0byAleCBmb3IgaW5wdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLCBuZXdEZXZpY2UsIGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBuZXdEZXZpY2U7CisgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCluZXdEZXZpY2UpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGFjdGl2ZUlucHV0LCBwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2U6ICV4IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCithdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlID0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGRldmljZV9hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgc3NpemVfdCBpbmRleDsKKyAgICBEZXZpY2VWZWN0b3IgKmRldmljZVZlY3RvcjsKKworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVPdXRwdXREZXZpY2VzOworICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVJbnB1dERldmljZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlIHR5cGUgJTA4eCIsIGRldmljZSk7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKworICAgIGluZGV4ID0gZGV2aWNlVmVjdG9yLT5pbmRleE9mKGRldkRlc2MpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOworICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID49IEFVRElPX01PREVfQ05UKSB7CisgICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgaW52YWxpZCBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBtUGhvbmVTdGF0ZSApIHsKKyAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBzZXR0aW5nIHNhbWUgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBpZiBsZWF2aW5nIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKKyAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKKyAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOworICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgZmFsc2UsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc3RvcmUgcHJldmlvdXMgcGhvbmUgc3RhdGUgZm9yIG1hbmFnZW1lbnQgb2Ygc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGJlbG93CisgICAgaW50IG9sZFN0YXRlID0gbVBob25lU3RhdGU7CisgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKKyAgICBib29sIGZvcmNlID0gZmFsc2U7CisKKyAgICAvLyBhcmUgd2UgZW50ZXJpbmcgb3Igc3RhcnRpbmcgYSBjYWxsCisgICAgaWYgKCFpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiBpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBzdGFydGluZyBhIGNhbGwKKyAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAorICAgICAgICBmb3JjZSA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgREVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7CisgICAgICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fRFRNRl0ubVZvbHVtZUN1cnZlW2pdID0KKyAgICAgICAgICAgICAgICAgICAgc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9WT0lDRV9DQUxMXVtqXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgIWlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIEV4aXRpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gZXhpdGluZyBhIGNhbGwKKyAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAorICAgICAgICBmb3JjZSA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgREVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7CisgICAgICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fRFRNRl0ubVZvbHVtZUN1cnZlW2pdID0KKyAgICAgICAgICAgICAgICAgICAgc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9EVE1GXVtqXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkgJiYgKHN0YXRlICE9IG9sZFN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBTd2l0Y2hpbmcgYmV0d2VlbiB0ZWxlcGhvbnkgYW5kIFZvSVAgaW4gc2V0UGhvbmVTdGF0ZSgpIik7CisgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIHRlbGVwaG9ueSBhbmQgVm9JUAorICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgICAgIGZvcmNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCisgICAgbmV3RGV2aWNlID0gZ2V0TmV3RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworCisgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gZW5kaW5nIGNhbGwKKyAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIG5ld0RldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBuZXdEZXZpY2UgPSBod091dHB1dERlc2MtPmRldmljZSgpOworICAgIH0KKworICAgIGludCBkZWxheU1zID0gMDsKKyAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKKyAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKmRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgLy8gbXV0ZSBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIHN0cmF0ZWdpZXMgYW5kIGRlbGF5IGRldmljZSBzd2l0Y2ggYnkgdGhlIGxhcmdlc3QKKyAgICAgICAgICAgIC8vIGxhdGVuY3kgb2YgYW55IG91dHB1dCB3aGVyZSBlaXRoZXIgc3RyYXRlZ3kgaXMgYWN0aXZlLgorICAgICAgICAgICAgLy8gVGhpcyBhdm9pZCBzZW5kaW5nIHRoZSByaW5nIHRvbmUgb3IgbXVzaWMgdGFpbCBpbnRvIHRoZSBlYXJwaWVjZSBvciBoZWFkc2V0LgorICAgICAgICAgICAgaWYgKChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX01FRElBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpIHx8CisgICAgICAgICAgICAgICAgICAgIGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkpICYmCisgICAgICAgICAgICAgICAgICAgIChkZWxheU1zIDwgKGludClkZXNjLT5tTGF0ZW5jeSoyKSkgeworICAgICAgICAgICAgICAgIGRlbGF5TXMgPSBkZXNjLT5tTGF0ZW5jeSoyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIGZhbHNlLCBtT3V0cHV0cy5rZXlBdChpKSwgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBtT3V0cHV0cy5rZXlBdChpKSwgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjaGFuZ2Ugcm91dGluZyBpcyBuZWNlc3NhcnkKKyAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIG5ld0RldmljZSwgZm9yY2UsIGRlbGF5TXMpOworCisgICAgLy8gaWYgZW50ZXJpbmcgaW4gY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcworICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQorICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOworICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGbGFnIHRoYXQgcmluZ3RvbmUgdm9sdW1lIG11c3QgYmUgbGltaXRlZCB0byBtdXNpYyB2b2x1bWUgdW50aWwgd2UgZXhpdCBNT0RFX1JJTkdUT05FCisgICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfUklOR1RPTkUgJiYKKyAgICAgICAgaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKK3sKKyAgICBBTE9HVigic2V0Rm9yY2VVc2UoKSB1c2FnZSAlZCwgY29uZmlnICVkLCBtUGhvbmVTdGF0ZSAlZCIsIHVzYWdlLCBjb25maWcsIG1QaG9uZVN0YXRlKTsKKworICAgIGJvb2wgZm9yY2VWb2x1bWVSZWV2YWwgPSBmYWxzZTsKKyAgICBzd2l0Y2godXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUiAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0NPTU1VTklDQVRJT04iLCBjb25maWcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRUFEUEhPTkVTICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQTJEUCAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRElHSVRBTF9ET0NLICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX01FRElBIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9SRUNPUkQiLCBjb25maWcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQ0FSX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfREVTS19ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9ESUdJVEFMX0RPQ0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfRE9DSyIsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlOworICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9TWVNURU0iLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCB1c2FnZSAlZCIsIHVzYWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBmb3JjZSB1c2FnZQorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdEZXZpY2Uob3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpKTsKKyAgICAgICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsICYmIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpKSB7CisgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0LCBuZXdEZXZpY2UsIDAsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBnZXRBY3RpdmVJbnB1dCgpOworICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwKSB7CisgICAgICAgIEF1ZGlvSW5wdXREZXNjcmlwdG9yICppbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGFjdGl2ZUlucHV0KTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKGlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKKyAgICAgICAgaWYgKChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmIChuZXdEZXZpY2UgIT0gaW5wdXREZXNjLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgQUxPR1YoInNldEZvcmNlVXNlKCkgY2hhbmdpbmcgZGV2aWNlIGZyb20gJXggdG8gJXggZm9yIGlucHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLCBuZXdEZXZpY2UsIGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IG5ld0RldmljZTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCluZXdEZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoYWN0aXZlSW5wdXQsIHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCit9CisKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCit7CisgICAgcmV0dXJuIG1Gb3JjZVVzZVt1c2FnZV07Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpCit7CisgICAgQUxPR1YoInNldFN5c3RlbVByb3BlcnR5KCkgcHJvcGVydHkgJXMsIHZhbHVlICVzIiwgcHJvcGVydHksIHZhbHVlKTsKK30KKworLy8gRmluZCBhIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLCBldmVuIGlmIHRoZSBpbnB1dCBmbGFncyBkbworLy8gbm90IGV4cGxpY2l0bHkgcmVxdWVzdCBhIGRpcmVjdCBvdXRwdXQKK0F1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlICpBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIElPUHJvZmlsZSAqcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvdW5kICYmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IDA7CisgICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7CisgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZGV2aWNlICVkLCBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICV4LCBjaGFubmVsTWFzayAleCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGRldmljZSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgaWYgKG1DdXJPdXRwdXQgIT0gMCkgeworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgdGVzdCBvdXRwdXQgbUN1ck91dHB1dCAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4LCBtRGlyZWN0T3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICBtQ3VyT3V0cHV0LCBtVGVzdFNhbXBsaW5nUmF0ZSwgbVRlc3RGb3JtYXQsIG1UZXN0Q2hhbm5lbHMsIG1EaXJlY3RPdXRwdXQpOworCisgICAgICAgIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIG9wZW5pbmcgdGVzdCBvdXRwdXQiKTsKKyAgICAgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoTlVMTCk7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gbVRlc3REZXZpY2U7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gbVRlc3RTYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gbVRlc3RGb3JtYXQ7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBtVGVzdENoYW5uZWxzOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBtVGVzdExhdGVuY3lNczsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9CisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkobURpcmVjdE91dHB1dCA/IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCA6IDApOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICAgICAgbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQoMCwgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvKTsKKyAgICAgICAgICAgIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0pIHsKKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksbUN1ck91dHB1dCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLG91dHB1dENtZC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBhZGRPdXRwdXQobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICAvLyBvcGVuIGEgZGlyZWN0IG91dHB1dCBpZiByZXF1aXJlZCBieSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KKyAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZworICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgYWxsb3cgb2ZmbG9hZGluZyBpZiBvbmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCBpcyBlbmFibGVkLiBUaGlzIHByZXZlbnRzIGZyb20KKyAgICAvLyBjcmVhdGluZyBhbiBvZmZsb2FkZWQgdHJhY2sgYW5kIHRlYXJpbmcgaXQgZG93biBpbW1lZGlhdGVseSBhZnRlciBzdGFydCB3aGVuIGF1ZGlvZmxpbmdlcgorICAgIC8vIGRldGVjdHMgdGhlcmUgaXMgYW4gYWN0aXZlIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QuCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayB0aGUgYXVkaW8gc2Vzc2lvbiBoZXJlIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCBpbiB0aGlzIGNvbnRleHQuCisgICAgLy8gVGhpcyBtYXkgcHJldmVudCBvZmZsb2FkaW5nIGluIHJhcmUgc2l0dWF0aW9ucyB3aGVyZSBlZmZlY3RzIGFyZSBsZWZ0IGFjdGl2ZSBieSBhcHBzCisgICAgLy8gaW4gdGhlIGJhY2tncm91bmQuCisgICAgSU9Qcm9maWxlICpwcm9maWxlID0gTlVMTDsKKyAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CisgICAgICAgICAgICAhaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpZmxhZ3MpOworICAgIH0KKworICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKKyAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gTlVMTDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKmRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAocHJvZmlsZSA9PSBkZXNjLT5tUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjID0gZGVzYzsKKyAgICAgICAgICAgICAgICAvLyByZXVzZSBkaXJlY3Qgb3V0cHV0IGlmIGN1cnJlbnRseSBvcGVuIGFuZCBjb25maWd1cmVkIHdpdGggc2FtZSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgaWYgKChzYW1wbGluZ1JhdGUgPT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgPT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIHJldXNpbmcgZGlyZWN0IG91dHB1dCAlZCIsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBjbG9zZSBkaXJlY3Qgb3V0cHV0IGlmIGN1cnJlbnRseSBvcGVuIGFuZCBjb25maWd1cmVkIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKG91dHB1dERlc2MgIT0gTlVMTCkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0RGVzYy0+bUlkKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gMDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzID0oYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChvdXRwdXREZXNjLT5tRmxhZ3MgfCBmbGFncyk7CisgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSAwOworICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50ID0gMTsKKyAgICAgICAgb3V0cHV0ID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8pOworCisgICAgICAgIC8vIG9ubHkgYWNjZXB0IGFuIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycworICAgICAgICBpZiAob3V0cHV0ID09IDAgfHwKKyAgICAgICAgICAgIChzYW1wbGluZ1JhdGUgIT0gMCAmJiBzYW1wbGluZ1JhdGUgIT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgfHwKKyAgICAgICAgICAgIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQgJiYgZm9ybWF0ICE9IG91dHB1dERlc2MtPm1Gb3JtYXQpIHx8CisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgIT0gMCAmJiBjaGFubmVsTWFzayAhPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZmFpbGVkIG9wZW5pbmcgZGlyZWN0IG91dHB1dDogb3V0cHV0ICVkIHNhbXBsaW5nUmF0ZSAlZCAlZCwiCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJWQgJWQsIGNoYW5uZWxNYXNrICUwNHggJTA0eCIsIG91dHB1dCwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBmb3JtYXQsIG91dHB1dERlc2MtPm1Gb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgaWYgKG91dHB1dCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGUgb3V0cHV0RGVzYzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOworICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7CisgICAgICAgIGlmIChkc3RPdXRwdXQgPT0gb3V0cHV0KSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorCisgICAgLy8gaWdub3JpbmcgY2hhbm5lbCBtYXNrIGR1ZSB0byBkb3dubWl4IGNhcGFiaWxpdHkgaW4gbWl4ZXIKKworICAgIC8vIG9wZW4gYSBub24gZGlyZWN0IG91dHB1dAorCisgICAgLy8gZm9yIG5vbiBkaXJlY3Qgb3V0cHV0cywgb25seSBQQ00gaXMgc3VwcG9ydGVkCisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICAvLyBnZXQgd2hpY2ggb3V0cHV0IGlzIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbS4gVGhlIGFjdHVhbAorICAgICAgICAvLyByb3V0aW5nIGNoYW5nZSB3aWxsIGhhcHBlbiB3aGVuIHN0YXJ0T3V0cHV0KCkgd2lsbCBiZSBjYWxsZWQKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgZmxhZ3MpOworICAgIH0KKyAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0KCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwiCisgICAgICAgICAgICAiZm9ybWF0ICVkLCBjaGFubmVscyAleCwgZmxhZ3MgJXgiLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworCisgICAgQUxPR1YoImdldE91dHB1dCgpIHJldHVybnMgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCB0aGF0IHByb3ZpZGUgYSBwYXRoIHRvIGEgcGFydGljdWxhciBkZXZpY2Ugb3Igc2V0IG9mCisgICAgLy8gZGV2aWNlcyAodGhlIGxpc3Qgd2FzIHByZXZpb3VzbHkgYnVpbGQgYnkgZ2V0T3V0cHV0c0ZvckRldmljZSgpKS4KKyAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKKyAgICAvLyAxOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBwb2xpY3kgZmxhZ3MKKyAgICAvLyAyOiB0aGUgcHJpbWFyeSBvdXRwdXQKKyAgICAvLyAzOiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CisKKyAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dHNbMF07CisgICAgfQorCisgICAgaW50IG1heENvbW1vbkZsYWdzID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGbGFncyA9IDA7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0UHJpbWFyeSA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgIGludCBjb21tb25GbGFncyA9IHBvcGNvdW50KG91dHB1dERlc2MtPm1Qcm9maWxlLT5tRmxhZ3MgJiBmbGFncyk7CisgICAgICAgICAgICBpZiAoY29tbW9uRmxhZ3MgPiBtYXhDb21tb25GbGFncykgeworICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgICAgICBtYXhDb21tb25GbGFncyA9IGNvbW1vbkZsYWdzOworICAgICAgICAgICAgICAgIEFMT0dWKCJzZWxlY3RPdXRwdXQoKSBjb21tb25GbGFncyBmb3Igb3V0cHV0ICVkLCAlMDR4Iiwgb3V0cHV0c1tpXSwgY29tbW9uRmxhZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1Qcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0UHJpbWFyeSA9IG91dHB1dHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0cHV0RmxhZ3MgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0RmxhZ3M7CisgICAgfQorICAgIGlmIChvdXRwdXRQcmltYXJ5ICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dFByaW1hcnk7CisgICAgfQorCisgICAgcmV0dXJuIG91dHB1dHNbMF07Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RhcnRPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0T3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgLy8gaW5jcmVtZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKKyAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCisgICAgLy8gbmVjZXNzYXJ5IGZvciBhIGNvcnJlY3QgY29udHJvbCBvZiBoYXJkd2FyZSBvdXRwdXQgcm91dGluZyBieSBzdGFydE91dHB1dCgpIGFuZCBzdG9wT3V0cHV0KCkKKyAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIDEpOworCisgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEpIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld0RldmljZShvdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICAgICAgYm9vbCBzaG91bGRXYWl0ID0gKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOworICAgICAgICB1aW50MzJfdCB3YWl0TXMgPSAwOworICAgICAgICBib29sIGZvcmNlID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSBvdXRwdXREZXNjKSB7CisgICAgICAgICAgICAgICAgLy8gZm9yY2UgYSBkZXZpY2UgY2hhbmdlIGlmIGFueSBvdGhlciBvdXRwdXQgaXMgbWFuYWdlZCBieSB0aGUgc2FtZSBodworICAgICAgICAgICAgICAgIC8vIG1vZHVsZSBhbmQgaGFzIGEgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIHRoYXQgZGlmZmVycyBmcm9tIHNlbGVjdGVkIGRldmljZS4KKyAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBhdWRpbyBIQUwgbXVzdCByZWNlaXZlIHRoZSBuZXcgZGV2aWNlIHNlbGVjdGlvbiBzbyB0aGF0IGl0IGNhbgorICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZGV2aWNlIGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgb3RoZXIgYWN0aXZlIG91dHB1dC4KKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpICYmCisgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRldmljZSgpICE9IG5ld0RldmljZSkgeworICAgICAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIGF1ZGlvIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIHRvIGJlIHByZXNlbnRlZCB3aGVuIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgLy8gYSBub3RpZmljYXRpb24gc28gdGhhdCBhdWRpbyBmb2N1cyBlZmZlY3QgY2FuIHByb3BhZ2F0ZS4KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gZGVzYy0+bGF0ZW5jeSgpOworICAgICAgICAgICAgICAgIGlmIChzaG91bGRXYWl0ICYmIGRlc2MtPmlzQWN0aXZlKGxhdGVuY3kgKiAyKSAmJiAod2FpdE1zIDwgbGF0ZW5jeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd2FpdE1zID0gbGF0ZW5jeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgZm9yY2UpOworCisgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCisgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbc3RyZWFtXS5nZXRWb2x1bWVJbmRleChuZXdEZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZSk7CisKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KKyAgICAgICAgLy8gcm91dGluZworICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7CisgICAgICAgIGlmICh3YWl0TXMgPiBtdXRlV2FpdE1zKSB7CisgICAgICAgICAgICB1c2xlZXAoKHdhaXRNcyAtIG11dGVXYWl0TXMpICogMiAqIDEwMDApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisKKyAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAorICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID4gMCkgeworICAgICAgICAvLyBkZWNyZW1lbnQgdXNhZ2UgY291bnQgb2YgdGhpcyBzdHJlYW0gb24gdGhlIG91dHB1dAorICAgICAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIC0xKTsKKyAgICAgICAgLy8gc3RvcmUgdGltZSBhdCB3aGljaCB0aGUgc3RyZWFtIHdhcyBzdG9wcGVkIC0gc2VlIGlzU3RyZWFtQWN0aXZlKCkKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld0RldmljZShvdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgLy8gZGVsYXkgdGhlIGRldmljZSBzd2l0Y2ggYnkgdHdpY2UgdGhlIGxhdGVuY3kgYmVjYXVzZSBzdG9wT3V0cHV0KCkgaXMgZXhlY3V0ZWQgd2hlbgorICAgICAgICAgICAgLy8gdGhlIHRyYWNrIHN0b3AoKSBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBhdCB0aGF0IHRpbWUgdGhlIGF1ZGlvIHRyYWNrIGJ1ZmZlciBjYW4KKyAgICAgICAgICAgIC8vIHN0aWxsIGNvbnRhaW4gZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGRyYWluZWQuIFRoZSBsYXRlbmN5IG9ubHkgY292ZXJzIHRoZSBhdWRpbyBIQUwKKyAgICAgICAgICAgIC8vIGFuZCBrZXJuZWwgYnVmZmVycy4gQWxzbyB0aGUgbGF0ZW5jeSBkb2VzIG5vdCBhbHdheXMgaW5jbHVkZSBhZGRpdGlvbmFsIGRlbGF5IGluIHRoZQorICAgICAgICAgICAgLy8gYXVkaW8gcGF0aCAoYXVkaW8gRFNQLCBDT0RFQyAuLi4pCisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIGZhbHNlLCBvdXRwdXREZXNjLT5tTGF0ZW5jeSoyKTsKKworICAgICAgICAgICAgLy8gZm9yY2UgcmVzdG9yaW5nIHRoZSBkZXZpY2Ugc2VsZWN0aW9uIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vIG9uZSBiZWluZyBzZWxlY3RlZCBmb3IgdGhpcyBvdXRwdXQKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBjdXJPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKmRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChjdXJPdXRwdXQgIT0gb3V0cHV0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc0FjdGl2ZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXdEZXZpY2UgIT0gZGVzYy0+ZGV2aWNlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShjdXJPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdEZXZpY2UoY3VyT3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSoyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RvcHBpbmcgb25lIHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbiByb3V0aW5nCisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgcmVmY291bnQgaXMgYWxyZWFkeSAwIGZvciBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgcmVsZWFzaW5nIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgaW50IHRlc3RJbmRleCA9IHRlc3RPdXRwdXRJbmRleChvdXRwdXQpOworICAgIGlmICh0ZXN0SW5kZXggIT0gMCkgeworICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgZGVsZXRlIG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOworICAgICAgICAgICAgbVRlc3RPdXRwdXRzW3Rlc3RJbmRleF0gPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpkZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgaWYgKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICBpZiAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA8PSAwKSB7CisgICAgICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBmb3Igb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoLS1kZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAvLyBJZiBlZmZlY3RzIHdoZXJlIHByZXNlbnQgb24gdGhlIG91dHB1dCwgYXVkaW9mbGluZ2VyIG1vdmVkIHRoZW0gdG8gdGhlIHByaW1hcnkKKyAgICAgICAgICAgIC8vIG91dHB1dCBieSBkZWZhdWx0OiBtb3ZlIHRoZW0gYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0LgorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7CisgICAgICAgICAgICBpZiAoZHN0T3V0cHV0ICE9IG1QcmltYXJ5T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgbVByaW1hcnlPdXRwdXQsIGRzdE91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5fYWNvdXN0aWNzX3QgYWNvdXN0aWNzKQoreworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gMDsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOworCisgICAgQUxPR1YoImdldElucHV0KCkgaW5wdXRTb3VyY2UgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwgYWNvdXN0aWNzICV4IiwKKyAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBhY291c3RpY3MpOworCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBBTE9HVygiZ2V0SW5wdXQoKSBjb3VsZCBub3QgZmluZCBkZXZpY2UgZm9yIGlucHV0U291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBhZGFwdCBjaGFubmVsIHNlbGVjdGlvbiB0byBpbnB1dCBzb3VyY2UKKyAgICBzd2l0Y2goaW5wdXRTb3VyY2UpIHsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6CisgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTks7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgorICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgorICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LIHwgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTks7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIElPUHJvZmlsZSAqcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzayk7CisgICAgaWYgKHByb2ZpbGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZ2V0SW5wdXQoKSBjb3VsZCBub3QgZmluZCBwcm9maWxlIGZvciBkZXZpY2UgJTA0eCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsICIKKyAgICAgICAgICAgICAgICAiY2hhbm5lbE1hc2sgJTA0eCIsCisgICAgICAgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRJbnB1dCgpOiBIVyBtb2R1bGUgJXMgbm90IG9wZW5lZCIsIHByb2ZpbGUtPm1Nb2R1bGUtPm1OYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQXVkaW9JbnB1dERlc2NyaXB0b3IgKmlucHV0RGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKworICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIGlucHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBpbnB1dERlc2MtPm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudCA9IDA7CisgICAgaW5wdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlc2MtPm1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2spOworCisgICAgLy8gb25seSBhY2NlcHQgaW5wdXQgd2l0aCB0aGUgZXhhY3QgcmVxdWVzdGVkIHNldCBvZiBwYXJhbWV0ZXJzCisgICAgaWYgKGlucHV0ID09IDAgfHwKKyAgICAgICAgKHNhbXBsaW5nUmF0ZSAhPSBpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGUpIHx8CisgICAgICAgIChmb3JtYXQgIT0gaW5wdXREZXNjLT5tRm9ybWF0KSB8fAorICAgICAgICAoY2hhbm5lbE1hc2sgIT0gaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dJKCJnZXRJbnB1dCgpIGZhaWxlZCBvcGVuaW5nIGlucHV0OiBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgiLAorICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIGlmIChpbnB1dCAhPSAwKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGlucHV0RGVzYzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1JbnB1dHMuYWRkKGlucHV0LCBpbnB1dERlc2MpOworICAgIHJldHVybiBpbnB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIEFMT0dWKCJzdGFydElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEF1ZGlvSW5wdXREZXNjcmlwdG9yICppbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBpZiAobVRlc3RJbnB1dCA9PSAwKQorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKyAgICB7CisgICAgICAgIC8vIHJlZnVzZSAyIGFjdGl2ZSBBdWRpb1JlY29yZCBjbGllbnRzIGF0IHRoZSBzYW1lIHRpbWUgZXhjZXB0IGlmIHRoZSBhY3RpdmUgaW5wdXQKKyAgICAgICAgLy8gdXNlcyBBVURJT19TT1VSQ0VfSE9UV09SRCBpbiB3aGljaCBjYXNlIGl0IGlzIGNsb3NlZC4KKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBnZXRBY3RpdmVJbnB1dCgpOworICAgICAgICBpZiAoIWlzVmlydHVhbElucHV0RGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkgJiYgYWN0aXZlSW5wdXQgIT0gMCkgeworICAgICAgICAgICAgQXVkaW9JbnB1dERlc2NyaXB0b3IgKmFjdGl2ZURlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5tSW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHByZWVtcHRpbmcgYWxyZWFkeSBzdGFydGVkIGxvdy1wcmlvcml0eSBpbnB1dCAlZCIsIGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dChhY3RpdmVJbnB1dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgaW5wdXQgJWQgZmFpbGVkOiBvdGhlciBpbnB1dCBhbHJlYWR5IHN0YXJ0ZWQiLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKGlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKKyAgICBpZiAoKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKG5ld0RldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IG5ld0RldmljZTsKKyAgICB9CisKKyAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkCisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKyAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwgQVVESU9fUkVNT1RFX1NVQk1JWF9ERVZJQ0VfQUREUkVTUyk7CisgICAgfQorCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludClpbnB1dERlc2MtPm1EZXZpY2UpOworCisgICAgaW50IGFsaWFzU291cmNlID0gKGlucHV0RGVzYy0+bUlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIDogaW5wdXREZXNjLT5tSW5wdXRTb3VyY2U7CisKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLCBhbGlhc1NvdXJjZSk7CisgICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dCgpIGlucHV0IHNvdXJjZSA9ICVkIiwgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOworCisgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQgPSAxOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgQUxPR1YoInN0b3BJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEF1ZGlvSW5wdXREZXNjcmlwdG9yICppbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIGlucHV0ICVkIGFscmVhZHkgc3RvcHBlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLCBBVURJT19SRU1PVEVfU1VCTUlYX0RFVklDRV9BRERSRVNTKTsKKyAgICAgICAgfQorCisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAwKTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICBpbnB1dERlc2MtPm1SZWZDb3VudCA9IDA7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHJlbGVhc2luZyB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICBkZWxldGUgbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOworICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0Iik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKK3sKKyAgICBBTE9HVigiaW5pdFN0cmVhbVZvbHVtZSgpIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNaW4gPj0gaW5kZXhNYXgpIHsKKyAgICAgICAgQUxPR1coImluaXRTdHJlYW1Wb2x1bWUoKSBpbnZhbGlkIGluZGV4IGxpbWl0cyBmb3Igc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4gPSBpbmRleE1pbjsKKyAgICBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heCA9IGluZGV4TWF4OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKworICAgIGlmICgoaW5kZXggPCBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1pbikgfHwgKGluZGV4ID4gbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gRm9yY2UgbWF4IHZvbHVtZSBpZiBzdHJlYW0gY2Fubm90IGJlIG11dGVkCisgICAgaWYgKCFtU3RyZWFtc1tzdHJlYW1dLm1DYW5CZU11dGVkKSBpbmRleCA9IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OworCisgICAgQUxPR1YoInNldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkLCBkZXZpY2UgJTA0eCwgaW5kZXggJWQiLAorICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLCBpbmRleCk7CisKKyAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUIHNldCBkZWZhdWx0IHZhbHVlIGFuZAorICAgIC8vIGNsZWFyIGFsbCBkZXZpY2Ugc3BlY2lmaWMgdmFsdWVzCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHsKKyAgICAgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIuY2xlYXIoKTsKKyAgICB9CisgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOworCisgICAgLy8gY29tcHV0ZSBhbmQgYXBwbHkgc3RyZWFtIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyBhY2NvcmRpbmcgdG8gY29ubmVjdGVkIGRldmljZQorICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9CisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yVm9sdW1lKG1PdXRwdXRzLnZhbHVlQXQoaSktPmRldmljZSgpKTsKKyAgICAgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB8fCAoZGV2aWNlID09IGN1ckRldmljZSkpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgaW5kZXgsIG1PdXRwdXRzLmtleUF0KGkpLCBjdXJEZXZpY2UpOworICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAvLyB0aGUgc3RyYXRlZ3kgdGhlIHN0cmVhbSBiZWxvbmdzIHRvLgorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgfQorICAgIGRldmljZSA9IGdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworCisgICAgKmluZGV4ID0gIG1TdHJlYW1zW3N0cmVhbV0uZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKKyAgICBBTE9HVigiZ2V0U3RyZWFtVm9sdW1lSW5kZXgoKSBzdHJlYW0gJWQgZGV2aWNlICUwOHggaW5kZXggJWQiLCBzdHJlYW0sIGRldmljZSwgKmluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0Rm9yRWZmZWN0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cykKK3sKKyAgICAvLyBzZWxlY3Qgb25lIG91dHB1dCBhbW9uZyBzZXZlcmFsIHN1aXRhYmxlIGZvciBnbG9iYWwgZWZmZWN0cy4KKyAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKKyAgICAvLyAxOiBBbiBvZmZsb2FkZWQgb3V0cHV0LiBJZiB0aGUgZWZmZWN0IGVuZHMgdXAgbm90IGJlaW5nIG9mZmxvYWRhYmxlLAorICAgIC8vICAgIEF1ZGlvRmxpbmdlciB3aWxsIGludmFsaWRhdGUgdGhlIHRyYWNrIGFuZCB0aGUgb2ZmbG9hZGVkIG91dHB1dAorICAgIC8vICAgIHdpbGwgYmUgY2xvc2VkIGNhdXNpbmcgdGhlIGVmZmVjdCB0byBiZSBtb3ZlZCB0byBhIFBDTSBvdXRwdXQuCisgICAgLy8gMjogQSBkZWVwIGJ1ZmZlciBvdXRwdXQKKyAgICAvLyAzOiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CisKKyAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRPZmZsb2FkZWQgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dERlZXBCdWZmZXIgPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyBvdXRwdXRzWyVkXSBmbGFncyAleCIsIGksIGRlc2MtPm1GbGFncyk7CisgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICAgICAgb3V0cHV0T2ZmbG9hZGVkID0gb3V0cHV0c1tpXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSAhPSAwKSB7CisgICAgICAgICAgICBvdXRwdXREZWVwQnVmZmVyID0gb3V0cHV0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JFZmZlY3RzIG91dHB1dE9mZmxvYWRlZCAlZCBvdXRwdXREZWVwQnVmZmVyICVkIiwKKyAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQsIG91dHB1dERlZXBCdWZmZXIpOworICAgIGlmIChvdXRwdXRPZmZsb2FkZWQgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0T2ZmbG9hZGVkOworICAgIH0KKyAgICBpZiAob3V0cHV0RGVlcEJ1ZmZlciAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXREZWVwQnVmZmVyOworICAgIH0KKworICAgIHJldHVybiBvdXRwdXRzWzBdOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQoreworICAgIC8vIGFwcGx5IHNpbXBsZSBydWxlIHdoZXJlIGdsb2JhbCBlZmZlY3RzIGFyZSBhdHRhY2hlZCB0byB0aGUgc2FtZSBvdXRwdXQgYXMgTVVTSUMgc3RyZWFtcworCisgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworCisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyhkc3RPdXRwdXRzKTsKKyAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yRWZmZWN0KCkgZ290IG91dHB1dCAlZCBmb3IgZnggJXMgZmxhZ3MgJXgiLAorICAgICAgICAgIG91dHB1dCwgKGRlc2MgPT0gTlVMTCkgPyAidW5zcGVjaWZpZWQiIDogZGVzYy0+bmFtZSwgIChkZXNjID09IE5VTEwpID8gMCA6IGRlc2MtPmZsYWdzKTsKKworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KGlvKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlvKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBpbyAlZCIsIGlvKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ICsgZGVzYy0+bWVtb3J5VXNhZ2UgPiBnZXRNYXhFZmZlY3RzTWVtb3J5KCkpIHsKKyAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5IGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgTWVtb3J5ICVkIEtCIiwKKyAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBkZXNjLT5tZW1vcnlVc2FnZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgbVRvdGFsRWZmZWN0c01lbW9yeSArPSBkZXNjLT5tZW1vcnlVc2FnZTsKKyAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIGlvICVkLCBzdHJhdGVneSAlZCBzZXNzaW9uICVkIGlkICVkIiwKKyAgICAgICAgICAgIGRlc2MtPm5hbWUsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCwgdG90YWwgbWVtb3J5ICVkIiwgZGVzYy0+bWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworCisgICAgRWZmZWN0RGVzY3JpcHRvciAqcERlc2MgPSBuZXcgRWZmZWN0RGVzY3JpcHRvcigpOworICAgIG1lbWNweSAoJnBEZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBwRGVzYy0+bUlvID0gaW87CisgICAgcERlc2MtPm1TdHJhdGVneSA9IChyb3V0aW5nX3N0cmF0ZWd5KXN0cmF0ZWd5OworICAgIHBEZXNjLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgcERlc2MtPm1FbmFibGVkID0gZmFsc2U7CisKKyAgICBtRWZmZWN0cy5hZGQoaWQsIHBEZXNjKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVmZmVjdHMuaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgRWZmZWN0RGVzY3JpcHRvciAqcERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIHNldEVmZmVjdEVuYWJsZWQocERlc2MsIGZhbHNlKTsKKworICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5IDwgcERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlKSB7CisgICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkIHRvbyBiaWcgZm9yIHRvdGFsICVkIiwKKyAgICAgICAgICAgICAgICBwRGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworICAgICAgICBwRGVzYy0+bURlc2MubWVtb3J5VXNhZ2UgPSBtVG90YWxFZmZlY3RzTWVtb3J5OworICAgIH0KKyAgICBtVG90YWxFZmZlY3RzTWVtb3J5IC09IHBEZXNjLT5tRGVzYy5tZW1vcnlVc2FnZTsKKyAgICBBTE9HVigidW5yZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgSUQgJWQsIG1lbW9yeSAlZCB0b3RhbCBtZW1vcnkgJWQiLAorICAgICAgICAgICAgcERlc2MtPm1EZXNjLm5hbWUsIGlkLCBwRGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworCisgICAgbUVmZmVjdHMucmVtb3ZlSXRlbShpZCk7CisgICAgZGVsZXRlIHBEZXNjOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1FZmZlY3RzLmluZGV4T2ZLZXkoaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKG1FZmZlY3RzLnZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFZmZlY3RFbmFibGVkKEVmZmVjdERlc2NyaXB0b3IgKnBEZXNjLCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQgPT0gcERlc2MtPm1FbmFibGVkKSB7CisgICAgICAgIEFMT0dWKCJzZXRFZmZlY3RFbmFibGVkKCVzKSBlZmZlY3QgYWxyZWFkeSAlcyIsCisgICAgICAgICAgICAgZW5hYmxlZD8idHJ1ZSI6ImZhbHNlIiwgZW5hYmxlZD8iZW5hYmxlZCI6ImRpc2FibGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBpZiAobVRvdGFsRWZmZWN0c0NwdUxvYWQgKyBwRGVzYy0+bURlc2MuY3B1TG9hZCA+IGdldE1heEVmZmVjdHNDcHVMb2FkKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKHRydWUpIENQVSBMb2FkIGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgQ1BVICVmIE1JUFMiLAorICAgICAgICAgICAgICAgICBwRGVzYy0+bURlc2MubmFtZSwgKGZsb2F0KXBEZXNjLT5tRGVzYy5jcHVMb2FkLzEwKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCArPSBwRGVzYy0+bURlc2MuY3B1TG9hZDsKKyAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQodHJ1ZSkgdG90YWwgQ1BVICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCA8IHBEZXNjLT5tRGVzYy5jcHVMb2FkKSB7CisgICAgICAgICAgICBBTE9HVygic2V0RWZmZWN0RW5hYmxlZChmYWxzZSkgQ1BVIGxvYWQgJWQgdG9vIGhpZ2ggZm9yIHRvdGFsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgcERlc2MtPm1EZXNjLmNwdUxvYWQsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICAgICAgICAgIHBEZXNjLT5tRGVzYy5jcHVMb2FkID0gbVRvdGFsRWZmZWN0c0NwdUxvYWQ7CisgICAgICAgIH0KKyAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgLT0gcERlc2MtPm1EZXNjLmNwdUxvYWQ7CisgICAgICAgIEFMT0dWKCJzZXRFZmZlY3RFbmFibGVkKGZhbHNlKSB0b3RhbCBDUFUgJWQiLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7CisgICAgfQorICAgIHBEZXNjLT5tRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciAqIGNvbnN0IHBEZXNjID0gbUVmZmVjdHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHBEZXNjLT5tRW5hYmxlZCAmJiAocERlc2MtPm1TdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKKyAgICAgICAgICAgICAgICAoKHBEZXNjLT5tRGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEKSA9PSAwKSkgeworICAgICAgICAgICAgQUxPR1YoImlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCAlcyBlbmFibGVkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgcERlc2MtPm1EZXNjLm5hbWUsIHBEZXNjLT5tU2Vzc2lvbik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICgoKG91dHB1dERlc2MtPmRldmljZSgpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBBdWRpb0lucHV0RGVzY3JpcHRvciAqIGlucHV0RGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKChpbnB1dERlc2NyaXB0b3ItPm1JbnB1dFNvdXJjZSA9PSAoaW50KXNvdXJjZSB8fAorICAgICAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OICYmCisgICAgICAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci0+bUlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSkKKyAgICAgICAgICAgICAmJiAoaW5wdXREZXNjcmlwdG9yLT5tUmVmQ291bnQgPiAwKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwgbVByaW1hcnlPdXRwdXQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUGhvbmUgc3RhdGU6ICVkXG4iLCBtUGhvbmVTdGF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGNvbW11bmljYXRpb25zICVkXG4iLAorICAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHJlY29yZCAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGRvY2sgJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3Igc3lzdGVtICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzOlxuIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIERldmljZURlc2NyaXB0b3I6OmR1bXBIZWFkZXIoZmQsIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPmR1bXAoZmQsIDIpOworICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiBBdmFpbGFibGUgaW5wdXQgZGV2aWNlczpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yOjpkdW1wSGVhZGVyKGZkLCAyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+ZHVtcChmZCwgMik7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5IVyBNb2R1bGVzIGR1bXA6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSFcgTW9kdWxlICVkOlxuIiwgaSArIDEpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1Id01vZHVsZXNbaV0tPmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBtT3V0cHV0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0cyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIElucHV0ICVkIGR1bXA6XG4iLCBtSW5wdXRzLmtleUF0KGkpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBtSW5wdXRzLnZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3RyZWFtcyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKKyAgICAgICAgICAgICAiIFN0cmVhbSAgQ2FuIGJlIG11dGVkICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyIFtkZXZpY2UgOiBpbmRleF0uLi5cbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyZCAgICAgICIsIGkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1TdHJlYW1zW2ldLmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuVG90YWwgRWZmZWN0cyBDUFU6ICVmIE1JUFMsIFRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQlxuIiwKKyAgICAgICAgICAgIChmbG9hdCltVG90YWxFZmZlY3RzQ3B1TG9hZC8xMCwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVnaXN0ZXJlZCBlZmZlY3RzOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBFZmZlY3QgJWQgZHVtcDpcbiIsIG1FZmZlY3RzLmtleUF0KGkpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBtRWZmZWN0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICB9CisKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSBvZmZsb2FkZWQuCisvLyBUaGlzIGNhbiBiZSBlbmhhbmNlZCBkZXBlbmRpbmcgb24gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIERTUCBhbmQgcG9saWN5CisvLyBvZiB0aGUgc3lzdGVtLgorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pCit7CisgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogU1I9JXUsIENNPTB4JXgsIEZvcm1hdD0weCV4LCBTdHJlYW1UeXBlPSVkLCIKKyAgICAgIiBCaXRSYXRlPSV1LCBkdXJhdGlvbj0lbGxkIHVzLCBoYXNfdmlkZW89JWQiLAorICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSwgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAorICAgICBvZmZsb2FkSW5mby5mb3JtYXQsCisgICAgIG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlLCBvZmZsb2FkSW5mby5iaXRfcmF0ZSwgb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMsCisgICAgIG9mZmxvYWRJbmZvLmhhc192aWRlbyk7CisKKyAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGhhcyBiZWVuIGRpc2FibGVkCisgICAgY2hhciBwcm9wVmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBwcm9wVmFsdWUsICIwIikpIHsKKyAgICAgICAgaWYgKGF0b2kocHJvcFZhbHVlKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigib2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGU9JXMiLCBwcm9wVmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGlmIHN0cmVhbSB0eXBlIGlzIG11c2ljLCB0aGVuIG9ubHkgYWxsb3cgb2ZmbG9hZCBhcyBvZiBub3cuCisgICAgaWYgKG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykKKyAgICB7CisgICAgICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IHN0cmVhbV90eXBlICE9IE1VU0lDLCByZXR1cm5pbmcgZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vVE9ETzogZW5hYmxlIGF1ZGlvIG9mZmxvYWRpbmcgd2l0aCB2aWRlbyB3aGVuIHJlYWR5CisgICAgaWYgKG9mZmxvYWRJbmZvLmhhc192aWRlbykKKyAgICB7CisgICAgICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IGhhc192aWRlbyA9PSB0cnVlLCByZXR1cm5pbmcgZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCisgICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIHByb3BWYWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgKGF0b2kocHJvcFZhbHVlKSAqIDEwMDAwMDAgKSkgeworICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JXMpIiwgcHJvcFZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgKiAxMDAwMDAwKSB7CisgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGRlZmF1bHQgbWluKD0ldSkiLCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCisgICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKKyAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgorICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcworICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgorICAgIGlmIChpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBwcm9maWxlIHRvIHN1cHBvcnQgdGhpcy4KKyAgICAvLyBBVURJT19ERVZJQ0VfTk9ORQorICAgIElPUHJvZmlsZSAqcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoQVVESU9fREVWSUNFX05PTkUgLyppZ25vcmUgZGV2aWNlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQoKSBwcm9maWxlICVzZm91bmQiLCBwcm9maWxlICE9IE5VTEwgPyAiIiA6ICJOT1QgIik7CisgICAgcmV0dXJuIChwcm9maWxlICE9IE5VTEwpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeU1hbmFnZXIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0VW5pcXVlSWQoKQoreworICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorICAgIDoKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIFRocmVhZChmYWxzZSksCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgIG1QcmltYXJ5T3V0cHV0KChhdWRpb19pb19oYW5kbGVfdCkwKSwKKyAgICBtUGhvbmVTdGF0ZShBVURJT19NT0RFX05PUk1BTCksCisgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKKyAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCgwKSwgbVRvdGFsRWZmZWN0c01lbW9yeSgwKSwKKyAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCisgICAgbVNwZWFrZXJEcmNFbmFibGVkKGZhbHNlKSwgbU5leHRVbmlxdWVJZCgwKQoreworICAgIG1wQ2xpZW50SW50ZXJmYWNlID0gY2xpZW50SW50ZXJmYWNlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVDsgaSsrKSB7CisgICAgICAgIG1Gb3JjZVVzZVtpXSA9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KKworICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKKyAgICBpZiAobG9hZEF1ZGlvUG9saWN5Q29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChsb2FkQXVkaW9Qb2xpY3lDb25maWcoQVVESU9fUE9MSUNZX0NPTkZJR19GSUxFKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBsb2FkIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUsIHNldHRpbmcgZGVmYXVsdHMiKTsKKyAgICAgICAgICAgIGRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZygpOworICAgICAgICB9CisgICAgfQorICAgIC8vIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGFuZCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIG5vdyBjb250YWluIGFsbCBhdHRhY2hlZCBkZXZpY2VzCisKKyAgICAvLyBtdXN0IGJlIGRvbmUgYWZ0ZXIgcmVhZGluZyB0aGUgcG9saWN5CisgICAgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpOworCisgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCisgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgaW5wdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID0gbXBDbGllbnRJbnRlcmZhY2UtPmxvYWRId01vZHVsZShtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3Qgb3BlbiBIVyBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKKyAgICAgICAgLy8gZXhjZXB0IGZvciBkaXJlY3Qgb3V0cHV0IHN0cmVhbXMgdGhhdCBhcmUgb25seSBvcGVuZWQgd2hlbiB0aGV5IGFyZSBhY3R1YWxseQorICAgICAgICAvLyByZXF1aXJlZCBieSBhbiBhcHAuCisgICAgICAgIC8vIFRoaXMgYWxzbyB2YWxpZGF0ZXMgbUF2YWlsYWJsZU91dHB1dERldmljZXMgbGlzdAorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgSU9Qcm9maWxlICpvdXRQcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworCisgICAgICAgICAgICBpZiAob3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk91dHB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZXMgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpOworICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZXMgJiBvdXRwdXREZXZpY2VUeXBlcykgJiYKKyAgICAgICAgICAgICAgICAgICAgKChvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApKSB7CisgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihvdXRQcm9maWxlKTsKKworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KShtRGVmYXVsdE91dHB1dERldmljZS0+bVR5cGUgJiBwcm9maWxlVHlwZXMpOworICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3V0cHV0RGVzYzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1tpXS0+bVR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbmRleCA+PSAwKSAmJiAobUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tSWQgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBvdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG9wZW4gaW5wdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMgdG8gdmFsaWRhdGUKKyAgICAgICAgLy8gbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBsaXN0CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IElPUHJvZmlsZSAqaW5Qcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal07CisKKyAgICAgICAgICAgIGlmIChpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZXMgPSBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICBpZiAocHJvZmlsZVR5cGVzICYgaW5wdXREZXZpY2VUeXBlcykgeworICAgICAgICAgICAgICAgIEF1ZGlvSW5wdXREZXNjcmlwdG9yICppbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IoaW5Qcm9maWxlKTsKKworICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzWzBdLT5tVHlwZTsKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXREZXNjLT5tRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlc2MtPm1DaGFubmVsTWFzayk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNbaV0tPm1UeXBlOworICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID49IDApICYmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+bUlkID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gaW5wdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIGlucHV0RGVzYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBtYWtlIHN1cmUgYWxsIGF0dGFjaGVkIGRldmljZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhIHVuaXF1ZSBJRAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTspIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5tSWQgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIklucHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPm1UeXBlKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOykgeworICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUlkID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1UeXBlKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKyAgICAvLyBtYWtlIHN1cmUgZGVmYXVsdCBkZXZpY2UgaXMgcmVhY2hhYmxlCisgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YobURlZmF1bHRPdXRwdXREZXZpY2UpIDwgMCkgeworICAgICAgICBBTE9HRSgiRGVmYXVsdCBkZXZpY2UgJTA4eCBpcyB1bnJlYWNoYWJsZSIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tVHlwZSk7CisgICAgfQorCisgICAgQUxPR0VfSUYoKG1QcmltYXJ5T3V0cHV0ID09IDApLCAiRmFpbGVkIHRvIG9wZW4gcHJpbWFyeSBvdXRwdXQiKTsKKworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGlmIChtUHJpbWFyeU91dHB1dCAhPSAwKSB7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtUHJpbWFyeU91dHB1dCwgb3V0cHV0Q21kLnRvU3RyaW5nKCkpOworCisgICAgICAgIG1UZXN0RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgICAgICBtVGVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICBtVGVzdENoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgbVRlc3RMYXRlbmN5TXMgPSAwOworICAgICAgICBtQ3VyT3V0cHV0ID0gMDsKKyAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RPdXRwdXRzW2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCIpOworICAgICAgICBydW4oYnVmZmVyLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICB9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorfQorCitBdWRpb1BvbGljeU1hbmFnZXI6On5BdWRpb1BvbGljeU1hbmFnZXIoKQoreworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgZXhpdCgpOworI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKyAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgZGVsZXRlIG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICB9CisgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpKSk7CisgICAgICAgIGRlbGV0ZSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICB9CisgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1Id01vZHVsZXNbaV07CisgICB9CisgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jbGVhcigpOworICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jbGVhcigpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRDaGVjaygpCit7CisgICAgcmV0dXJuIChtUHJpbWFyeU91dHB1dCA9PSAwKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsKK30KKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dGhyZWFkTG9vcCgpCit7CisgICAgQUxPR1YoImVudGVyaW5nIHRocmVhZExvb3AoKSIpOworICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKKyAgICB7CisgICAgICAgIFN0cmluZzggY29tbWFuZDsKKyAgICAgICAgaW50IHZhbHVlSW50OworICAgICAgICBTdHJpbmc4IHZhbHVlOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgbWlsbGlzZWNvbmRzKDUwKSk7CisKKyAgICAgICAgY29tbWFuZCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpKTsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihjb21tYW5kKTsKKworICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IgJiYKKyAgICAgICAgICAgIHZhbHVlSW50ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJUZXN0IGNvbW1hbmQgJXMgcmVjZWl2ZWQiLCBjb21tYW5kLnN0cmluZygpKTsKKyAgICAgICAgICAgIFN0cmluZzggdGFyZ2V0OworICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0YXJnZXQiKSwgdGFyZ2V0KSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHRhcmdldCA9ICJNYW5hZ2VyIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpKTsKKyAgICAgICAgICAgICAgICBtQ3VyT3V0cHV0ID0gdmFsdWVJbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJmYWxzZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gInRydWUiKSB7CisgICAgICAgICAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2lucHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSk7CisgICAgICAgICAgICAgICAgbVRlc3RJbnB1dCA9IHZhbHVlSW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSk7CisgICAgICAgICAgICAgICAgaW50IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiUENNIDE2IGJpdHMiKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIlBDTSA4IGJpdHMiKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiQ29tcHJlc3NlZCBNUDMiKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9NUDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Rm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiZm9ybWF0IiksIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfY2hhbm5lbHMiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpKTsKKyAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJDaGFubmVscyBTdGVyZW8iKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDaGFubmVscyBNb25vIikgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9ICBBVURJT19DSEFOTkVMX09VVF9NT05POworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RDaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiY2hhbm5lbHMiKSwgY2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIikpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZUludCA+PSAwICYmIHZhbHVlSW50IDw9IDk2MDAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGluZ1JhdGUgPSB2YWx1ZUludDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgic2FtcGxpbmdfcmF0ZSIpLCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIiksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIikpOworCisgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtUHJpbWFyeU91dHB1dCk7CisKKyAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlID0gb3V0cHV0RGVzYy0+bU1vZHVsZS0+bUhhbmRsZTsKKworICAgICAgICAgICAgICAgIGRlbGV0ZSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShtUHJpbWFyeU91dHB1dCk7CisKKyAgICAgICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwpOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtb2R1bGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKKyAgICAgICAgICAgICAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlb3BlbiBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLCBzYW1wbGluZ1JhdGU6ICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBvdXRwdXREZXNjLT5tRm9ybWF0LCBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtUHJpbWFyeU91dHB1dCwgb3V0cHV0Q21kLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQobVByaW1hcnlPdXRwdXQsIG91dHB1dERlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycygwLCBTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3k9IikpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmV4aXQoKQoreworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICAgICAgcmVxdWVzdEV4aXQoKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgfQorICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOworfQorCitpbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0ZXN0T3V0cHV0SW5kZXgoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7CisgICAgICAgIGlmIChvdXRwdXQgPT0gbVRlc3RPdXRwdXRzW2ldKSByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisvLyAtLS0KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBpZCwgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjKQoreworICAgIG91dHB1dERlc2MtPm1JZCA9IGlkOworICAgIG1PdXRwdXRzLmFkZChpZCwgb3V0cHV0RGVzYyk7Cit9CisKKworU3RyaW5nOCBBdWRpb1BvbGljeU1hbmFnZXI6OmFkZHJlc3NUb1BhcmFtZXRlcihhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBTdHJpbmc4IGFkZHJlc3MpCit7CisgICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImEyZHBfc2lua19hZGRyZXNzPSIpK2FkZHJlc3M7CisgICAgfQorICAgIHJldHVybiBhZGRyZXNzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKmRlc2M7CisKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKKyAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIiwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgU29ydGVkVmVjdG9yPElPUHJvZmlsZSAqPiBwcm9maWxlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJWQgZnJvbSBtb2R1bGUgJWQiLCBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3BlbiBvdXRwdXRzIGZvciBtYXRjaGluZyBwcm9maWxlcyBpZiBuZWVkZWQuIERpcmVjdCBvdXRwdXRzIGFyZSBhbHNvIG9wZW5lZCB0bworICAgICAgICAvLyBxdWVyeSBmb3IgZHluYW1pYyBwYXJhbWV0ZXJzIGFuZCB3aWxsIGJlIGNsb3NlZCBsYXRlciBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQorICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgeworICAgICAgICAgICAgSU9Qcm9maWxlICpwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIG91dHB1dCBpcyBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlCisgICAgICAgICAgICBzaXplX3QgajsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtT3V0cHV0cy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOworICAgICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiAhPSBtT3V0cHV0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyIsIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICBkZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBvZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOworCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1TYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZmxvYWRJbmZvKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBhZGRyZXNzVG9QYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcGx5OworICAgICAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUykpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGRpcmVjdCBvdXRwdXQgc3VwIHNhbXBsaW5nIHJhdGVzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFNhbXBsaW5nUmF0ZXModmFsdWUgKyAxLCBwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUykpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGRpcmVjdCBvdXRwdXQgc3VwIGZvcm1hdHMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRm9ybWF0cyh2YWx1ZSArIDEsIHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9DSEFOTkVMUykpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGRpcmVjdCBvdXRwdXQgc3VwIGNoYW5uZWwgbWFza3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkT3V0Q2hhbm5lbHModmFsdWUgKyAxLCBwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA8IDIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGRpcmVjdCBvdXRwdXQgbWlzc2luZyBwYXJhbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG91dHB1dCBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIGRlc2MpOworICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaW5pdGlhbCBzdHJlYW0gdm9sdW1lIGZvciBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgZGV2aWNlLCAwLCB0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGNvbmZpZ3VyZSBhdWRpbyBlZmZlY3Qgb3V0cHV0IHN0YWdlIGhlcmUKKworICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIGEgZHVwbGljYXRpbmcgb3V0cHV0IHRocmVhZCBmb3IgdGhlIG5ldyBvdXRwdXQgYW5kIHRoZSBwcmltYXJ5IG91dHB1dAorICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkT3V0cHV0ID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlZE91dHB1dCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgZHVwbGljYXRlZCBvdXRwdXQgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpkdXBPdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDIgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tRm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1MYXRlbmN5ID0gZGVzYy0+bUxhdGVuY3k7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQoZHVwbGljYXRlZE91dHB1dCwgZHVwT3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMoZHVwbGljYXRlZE91dHB1dCwgZGV2aWNlLCAwLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBkdXAgb3V0cHV0IGZvciAlZCBhbmQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGRlc2M7CisgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChvdXRwdXQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIG91dHB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIShkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIG91dHB1dCAlZCIsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJT1Byb2ZpbGUgKnByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisgICAgICAgICAgICAgICAgaWYgKChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJWQgb24gbW9kdWxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJjbG9zZU91dHB1dCglZCkiLCBvdXRwdXQpOworCisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJjbG9zZU91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGxvb2sgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cyBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBiZWluZyByZW1vdmVkLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpkdXBPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmCisgICAgICAgICAgICAgICAgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MgfHwKKyAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9PSBvdXRwdXREZXNjKSkgeworICAgICAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjMjsKKyAgICAgICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFzIGFsbCBhY3RpdmUgdHJhY2tzIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IHdpbGwgYmUgZGVsZXRlZCwKKyAgICAgICAgICAgIC8vIGFuZCBhcyB0aGV5IHdlcmUgYWxzbyByZWZlcmVuY2VkIG9uIHRoZSBvdGhlciBvdXRwdXQsIHRoZSByZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIGNvdW50IGZvciB0aGVpciBzdHJlYW0gdHlwZSBtdXN0IGJlIGFkanVzdGVkIGFjY29yZGluZ2x5IG9uCisgICAgICAgICAgICAvLyB0aGUgb3RoZXIgb3V0cHV0LgorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBBVURJT19TVFJFQU1fQ05UOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVmQ291bnQgPSBkdXBPdXRwdXREZXNjLT5tUmVmQ291bnRbal07CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPmNoYW5nZVJlZkNvdW50KChhdWRpb19zdHJlYW1fdHlwZV90KWosLXJlZkNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpIGNsb3NpbmcgYWxzbyBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIGR1cGxpY2F0ZWRPdXRwdXQpOworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQoZHVwbGljYXRlZE91dHB1dCk7CisgICAgICAgICAgICBkZWxldGUgbU91dHB1dHMudmFsdWVGb3IoZHVwbGljYXRlZE91dHB1dCk7CisgICAgICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKGR1cGxpY2F0ZWRPdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgZGVsZXRlIG91dHB1dERlc2M7CisgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOworICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKK30KKworU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgQXVkaW9PdXRwdXREZXNjcmlwdG9yICo+IG9wZW5PdXRwdXRzKQoreworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKworICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWVigib3V0cHV0ICVkIGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JTA0eCIsCisgICAgICAgICAgICAgICAgaSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGVkKCksIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIGlmICgoZGV2aWNlICYgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSBkZXZpY2UpIHsKKyAgICAgICAgICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGZvdW5kIG91dHB1dCAlZCIsIG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgIG91dHB1dHMuYWRkKG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0cHV0czsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czIpCit7CisgICAgaWYgKG91dHB1dHMxLnNpemUoKSAhPSBvdXRwdXRzMi5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMxLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChvdXRwdXRzMVtpXSAhPSBvdXRwdXRzMltpXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQoreworICAgIGF1ZGlvX2RldmljZXNfdCBvbGREZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc3JjT3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2Uob2xkRGV2aWNlLCBtUHJldmlvdXNPdXRwdXRzKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG5ld0RldmljZSwgbU91dHB1dHMpOworCisgICAgaWYgKCF2ZWN0b3JzRXF1YWwoc3JjT3V0cHV0cyxkc3RPdXRwdXRzKSkgeworICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBtb3ZpbmcgZnJvbSBvdXRwdXQgJWQgdG8gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgc3RyYXRlZ3ksIHNyY091dHB1dHNbMF0sIGRzdE91dHB1dHNbMF0pOworICAgICAgICAvLyBtdXRlIHN0cmF0ZWd5IHdoaWxlIG1vdmluZyB0cmFja3MgZnJvbSBvbmUgb3V0cHV0IHRvIGFub3RoZXIKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzcmNPdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKmRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihzcmNPdXRwdXRzW2ldKTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHN0cmF0ZWd5KSkgeworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgdHJ1ZSwgc3JjT3V0cHV0c1tpXSk7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCBmYWxzZSwgc3JjT3V0cHV0c1tpXSwgTVVURV9USU1FX01TLCBuZXdEZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTW92ZSBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgeworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZnhPdXRwdXQgPSBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGRzdE91dHB1dHMpOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBtb3ZlZDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBFZmZlY3REZXNjcmlwdG9yICpkZXNjID0gbUVmZmVjdHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy0+bVNlc3Npb24gPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tSW8gIT0gZnhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkLmluZGV4T2YoZGVzYy0+bUlvKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgbW92aW5nIGVmZmVjdCAlZCB0byBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHMua2V5QXQoaSksIGZ4T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIGRlc2MtPm1JbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeE91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlZC5hZGQoZGVzYy0+bUlvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZXNjLT5tSW8gPSBmeE91dHB1dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTW92ZSB0cmFja3MgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KWkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKK3sKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEEyZHBPdXRwdXQoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCit7CisgICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IGdldEEyZHBPdXRwdXQoKTsKKyAgICBpZiAoYTJkcE91dHB1dCA9PSAwKSB7CisgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGlzU2NvQ29ubmVjdGVkID0KKyAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSAhPSAwOworICAgIC8vIHN1c3BlbmQgQTJEUCBvdXRwdXQgaWY6CisgICAgLy8gICAgICAoTk9UIGFscmVhZHkgc3VzcGVuZGVkKSAmJgorICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIGNvbm5lY3RlZCAmJgorICAgIC8vICAgICAgIChmb3JjZWQgdXNhZ2UgZm9yIGNvbW11bmljYXRpb24gfHwgZm9yIHJlY29yZCBpcyBTQ08pKSkgfHwKKyAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyByaW5naW5nIHx8IGluIGNhbGwpCisgICAgLy8KKyAgICAvLyByZXN0b3JlIEEyRFAgb3V0cHV0IGlmOgorICAgIC8vICAgICAgKEFscmVhZHkgc3VzcGVuZGVkKSAmJgorICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIE5PVCBjb25uZWN0ZWQgfHwKKyAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIE5PVCBmb3IgY29tbXVuaWNhdGlvbiAmJiBOT1QgZm9yIHJlY29yZCBpcyBTQ08pKSkgJiYKKyAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyBOT1QgcmluZ2luZyAmJiBOT1QgaW4gY2FsbCkKKyAgICAvLworICAgIGlmIChtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICBpZiAoKCFpc1Njb0Nvbm5lY3RlZCB8fAorICAgICAgICAgICAgICgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKKyAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpKSAmJgorICAgICAgICAgICAgICgobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgorICAgICAgICAgICAgICAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9SSU5HVE9ORSkpKSB7CisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZXN0b3JlT3V0cHV0KGEyZHBPdXRwdXQpOworICAgICAgICAgICAgbUEyZHBTdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoaXNTY29Db25uZWN0ZWQgJiYKKyAgICAgICAgICAgICAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgfHwKKyAgICAgICAgICAgICAoKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKKyAgICAgICAgICAgICAgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfUklOR1RPTkUpKSkgeworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3VzcGVuZE91dHB1dChhMmRwT3V0cHV0KTsKKyAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBmcm9tQ2FjaGUpCit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAvLyBjaGVjayB0aGUgZm9sbG93aW5nIGJ5IG9yZGVyIG9mIHByaW9yaXR5IHRvIHJlcXVlc3QgYSByb3V0aW5nIGNoYW5nZSBpZiBuZWNlc3Nhcnk6CisgICAgLy8gMTogdGhlIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCisgICAgLy8gMjogd2UgYXJlIGluIGNhbGwgb3IgdGhlIHN0cmF0ZWd5IHBob25lIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgcGhvbmUKKyAgICAvLyAzOiB0aGUgc3RyYXRlZ3kgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgc29uaWZpY2F0aW9uCisgICAgLy8gNDogdGhlIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uCisgICAgLy8gNTogdGhlIHN0cmF0ZWd5IG1lZGlhIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgbWVkaWEKKyAgICAvLyA2OiB0aGUgc3RyYXRlZ3kgRFRNRiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IERUTUYKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNJbkNhbGwoKSB8fAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1BIT05FKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfTUVESUEpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9EVE1GKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GLCBmcm9tQ2FjaGUpOworICAgIH0KKworICAgIEFMT0dWKCJnZXROZXdEZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICByZXR1cm4gKHVpbnQzMl90KWdldFN0cmF0ZWd5KHN0cmVhbSk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlczsKKyAgICAvLyBCeSBjaGVja2luZyB0aGUgcmFuZ2Ugb2Ygc3RyZWFtIGJlZm9yZSBjYWxsaW5nIGdldFN0cmF0ZWd5LCB3ZSBhdm9pZAorICAgIC8vIGdldFN0cmF0ZWd5J3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4gIGdldFN0cmF0ZWd5IHdvdWxkIGRvIGEgQUxPR0UKKyAgICAvLyBhbmQgdGhlbiByZXR1cm4gU1RSQVRFR1lfTUVESUEsIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgorICAgIGlmIChzdHJlYW0gPCAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgMCB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICAgICAgZGV2aWNlcyA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3koCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgLy8gc3RyZWFtIHRvIHN0cmF0ZWd5IG1hcHBpbmcKKyAgICBzd2l0Y2ggKHN0cmVhbSkgeworICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6CisgICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1BIT05FOworICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6CisgICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047CisgICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7CisgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0RUTUY7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoInVua25vd24gc3RyZWFtIHR5cGUiKTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CisgICAgICAgIC8vIE5PVEU6IFNZU1RFTSBzdHJlYW0gdXNlcyBNRURJQSBzdHJhdGVneSBiZWNhdXNlIG11dGluZyBtdXNpYyBhbmQgc3dpdGNoaW5nIG91dHB1dHMKKyAgICAgICAgLy8gd2hpbGUga2V5IGNsaWNrcyBhcmUgcGxheWVkIHByb2R1Y2VzIGEgcG9vciByZXN1bHQKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6CisgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgc3dpdGNoKHN0cmVhbSkgeworICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgorICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQoreworICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgaWYgKGZyb21DYWNoZSkgeworICAgICAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgZnJvbSBjYWNoZSBzdHJhdGVneSAlZCwgZGV2aWNlICV4IiwKKyAgICAgICAgICAgICAgc3RyYXRlZ3ksIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV0pOworICAgICAgICByZXR1cm4gbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XTsKKyAgICB9CisgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKyAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7CisKKyAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOgorICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKKyAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdGVzdCB0aGlzIHVzZWNhc2UgYmVmb3JlIHRlc3RpbmcgaWYgbWVkaWEgaXMgcGxheWluZyBiZWNhdXNlCisgICAgICAgICAgICAvLyAgIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKKyAgICAgICAgICAgIC8vICAgaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgKG9yIGhhcyByZWNlbnRseSBwbGF5ZWQpLCB1c2UgdGhlIHNhbWUgZGV2aWNlCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3aGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUUkFURUdZX0RUTUY6CisgICAgICAgIGlmICghaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgLy8gd2hlbiBvZmYgY2FsbCwgRFRNRiBzdHJhdGVneSBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIE1FRElBIHN0cmF0ZWd5CisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyB3aGVuIGluIGNhbGwsIERUTUYgYW5kIFBIT05FIHN0cmF0ZWdpZXMgZm9sbG93IHRoZSBzYW1lIHJ1bGVzCisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9QSE9ORToKKyAgICAgICAgLy8gZm9yIHBob25lIHN0cmF0ZWd5LCB3ZSBmaXJzdCBjb25zaWRlciB0aGUgZm9yY2VkIHVzZSBhbmQgdGhlbiB0aGUgYXZhaWxhYmxlIGRldmljZXMgYnkgb3JkZXIKKyAgICAgICAgLy8gb2YgcHJpb3JpdHkKKyAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgeworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086CisgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgfHwgc3RyYXRlZ3kgIT0gU1RSQVRFR1lfRFRNRikgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKKyAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKKyAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgorICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApICYmICFtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBpZiAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tVHlwZTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX1BIT05FIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgorICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KKyAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgorICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApICYmICFtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tVHlwZTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX1BIT05FLCBGT1JDRV9TUEVBS0VSIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CisKKyAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlOiBUaGUgcmVzdCBvZiB0aGUgYmVoYXZpb3IgaXMgaGFuZGxlZCBieQorICAgICAgICAvLyBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKS4KKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFOgorICAgICAgICAvLyBzdHJhdGVneSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIHVzZXMgc2FtZSByb3V0aW5nIHBvbGljeSBhcyBTVFJBVEVHWV9TT05JRklDQVRJT04KKyAgICAgICAgLy8gZXhjZXB0OgorICAgICAgICAvLyAgIC0gd2hlbiBpbiBjYWxsIHdoZXJlIGl0IGRvZXNuJ3QgZGVmYXVsdCB0byBTVFJBVEVHWV9QSE9ORSBiZWhhdmlvcgorICAgICAgICAvLyAgIC0gaW4gY291bnRyaWVzIHdoZXJlIG5vdCBlbmZvcmNlZCBpbiB3aGljaCBjYXNlIGl0IGZvbGxvd3MgU1RSQVRFR1lfTUVESUEKKworICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKKyAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSkgeworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3BlYWtlciBkZXZpY2Ugbm90IGZvdW5kIGZvciBTVFJBVEVHWV9TT05JRklDQVRJT04iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgc2Vjb25kIGRldmljZSB1c2VkIGZvciBzb25pZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGRldmljZSB1c2VkIGJ5IG1lZGlhIHN0cmF0ZWd5CisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9NRURJQTogeworICAgICAgICB1aW50MzJfdCBkZXZpY2UyID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIGlmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKKyAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApICYmICFtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKKyAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKHN0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKKyAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiBhdXggZGlnaXRhbCAoZS5nLiBIRE1JKQorICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID09IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSykpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRldmljZSBpcyBERVZJQ0VfT1VUX1NQRUFLRVIgaWYgd2UgY29tZSBmcm9tIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIG9yCisgICAgICAgIC8vIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIEFVRElPX0RFVklDRV9OT05FIG90aGVyd2lzZQorICAgICAgICBkZXZpY2UgfD0gZGV2aWNlMjsKKyAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tVHlwZTsKKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciBTVFJBVEVHWV9NRURJQSIpOworICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSB1bmtub3duIHN0cmF0ZWd5OiAlZCIsIHN0cmF0ZWd5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQUxPR1ZWKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLCBzdHJhdGVneSwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICBtRGV2aWNlRm9yU3RyYXRlZ3lbaV0gPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICB9CisgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpCit7CisgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCisgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCisgICAgLy8gaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IDA7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIGJvb2wgc2hvdWxkTXV0ZSA9IG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKHBvcGNvdW50KGRldmljZSkgPj0gMik7CisgICAgLy8gdGVtcG9yYXJ5IG11dGUgb3V0cHV0IGlmIGRldmljZSBzZWxlY3Rpb24gY2hhbmdlcyB0byBhdm9pZCB2b2x1bWUgYnVyc3RzIGR1ZSB0bworICAgIC8vIGRpZmZlcmVudCBwZXIgZGV2aWNlIHZvbHVtZXMKKyAgICBib29sIHRlbXBNdXRlID0gb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlICE9IHByZXZEZXZpY2UpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgYm9vbCBtdXRlID0gc2hvdWxkTXV0ZSAmJiAoY3VyRGV2aWNlICYgZGV2aWNlKSAmJiAoY3VyRGV2aWNlICE9IGRldmljZSk7CisgICAgICAgIGJvb2wgZG9NdXRlID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG11dGUgJiYgIW91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0pIHsKKyAgICAgICAgICAgIGRvTXV0ZSA9IHRydWU7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghbXV0ZSAmJiBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldKXsKKyAgICAgICAgICAgIGRvTXV0ZSA9IHRydWU7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvTXV0ZSB8fCB0ZW1wTXV0ZSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtT3V0cHV0cy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaik7CisgICAgICAgICAgICAgICAgLy8gc2tpcCBvdXRwdXQgaWYgaXQgZG9lcyBub3Qgc2hhcmUgYW55IGRldmljZSB3aXRoIGN1cnJlbnQgb3V0cHV0CisgICAgICAgICAgICAgICAgaWYgKChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgY3VyT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaik7CisgICAgICAgICAgICAgICAgQUxPR1ZWKCJjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkgJXMgc3RyYXRlZ3kgJWQgKGN1ckRldmljZSAlMDR4KSBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIG11dGUgPyAibXV0aW5nIiA6ICJ1bm11dGluZyIsIGksIGN1ckRldmljZSwgY3VyT3V0cHV0KTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgbXV0ZSwgY3VyT3V0cHV0LCBtdXRlID8gMCA6IGRlbGF5TXMpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRvIHRlbXBNdXRlIG9ubHkgZm9yIGN1cnJlbnQgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wTXV0ZSAmJiAoZGVzYyA9PSBvdXRwdXREZXNjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIHRydWUsIGN1ck91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UsIGN1ck91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bGF0ZW5jeSgpICogMiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKHRlbXBNdXRlICYmIChkZXNjID09IG91dHB1dERlc2MpKSB8fCBtdXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IGRlc2MtPmxhdGVuY3koKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGVXYWl0TXMgPSBkZXNjLT5sYXRlbmN5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGSVhNRTogc2hvdWxkIG5vdCBuZWVkIHRvIGRvdWJsZSBsYXRlbmN5IGlmIHZvbHVtZSBjb3VsZCBiZSBhcHBsaWVkIGltbWVkaWF0ZWx5IGJ5IHRoZQorICAgIC8vIGF1ZGlvZmxpbmdlciBtaXhlci4gV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgZGVsYXkgYmV0d2VlbiBub3cgYW5kIHRoZSBuZXh0IHRpbWUKKyAgICAvLyB0aGUgYXVkaW9mbGluZ2VyIHRocmVhZCBmb3IgdGhpcyBvdXRwdXQgd2lsbCBwcm9jZXNzIGEgYnVmZmVyICh3aGljaCBjb3JyZXNwb25kcyB0bworICAgIC8vIG9uZSBidWZmZXIgc2l6ZSwgdXN1YWxseSAxLzIgb3IgMS80IG9mIHRoZSBsYXRlbmN5KS4KKyAgICBtdXRlV2FpdE1zICo9IDI7CisgICAgLy8gd2FpdCBmb3IgdGhlIFBDTSBvdXRwdXQgYnVmZmVycyB0byBlbXB0eSBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kCisgICAgaWYgKG11dGVXYWl0TXMgPiBkZWxheU1zKSB7CisgICAgICAgIG11dGVXYWl0TXMgLT0gZGVsYXlNczsKKyAgICAgICAgdXNsZWVwKG11dGVXYWl0TXMgKiAxMDAwKTsKKyAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBvdXRwdXQgJWQgZGV2aWNlICUwNHggZGVsYXlNcyAlZCIsIG91dHB1dCwgZGV2aWNlLCBkZWxheU1zKTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIHVpbnQzMl90IG11dGVXYWl0TXM7CisKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5tT3V0cHV0MS0+bUlkLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKKyAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bU91dHB1dDItPm1JZCwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcyk7CisgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgIH0KKyAgICAvLyBubyBuZWVkIHRvIHByb2NlZWQgaWYgbmV3IGRldmljZSBpcyBub3QgQVVESU9fREVWSUNFX05PTkUgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudAorICAgIC8vIG91dHB1dCBwcm9maWxlCisgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAoKGRldmljZSAmIG91dHB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKSA9PSAwKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBmaWx0ZXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gb3V0cHV0IHNlbGVjdGVkCisgICAgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkoZGV2aWNlICYgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOworCisgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UgPSBvdXRwdXREZXNjLT5tRGV2aWNlOworCisgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHByZXZEZXZpY2UgJTA0eCIsIHByZXZEZXZpY2UpOworCisgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIH0KKyAgICBtdXRlV2FpdE1zID0gY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhvdXRwdXREZXNjLCBwcmV2RGV2aWNlLCBkZWxheU1zKTsKKworICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIHJvdXRpbmcgaWY6CisgICAgLy8gIC0gdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgQVVESU9fREVWSUNFX05PTkUKKyAgICAvLyAgLSB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IGRldmljZSBhbmQgZm9yY2UgaXMgbm90IHNwZWNpZmllZC4KKyAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2UoKSB3aXRob3V0IGNvbmRpdGlvbnMKKyAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fCBkZXZpY2UgPT0gcHJldkRldmljZSkgJiYgIWZvcmNlKSB7CisgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBzZXR0aW5nIHNhbWUgZGV2aWNlICUwNHggb3IgbnVsbCBkZXZpY2UgZm9yIG91dHB1dCAlZCIsIGRldmljZSwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgfQorCisgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNoYW5naW5nIGRldmljZSIpOworICAgIC8vIGRvIHRoZSByb3V0aW5nCisgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAoaW50KWRldmljZSk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBwYXJhbS50b1N0cmluZygpLCBkZWxheU1zKTsKKworICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQorICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7CisKKyAgICByZXR1cm4gbXV0ZVdhaXRNczsKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGUgKkF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykKK3sKKyAgICAvLyBDaG9vc2UgYW4gaW5wdXQgcHJvZmlsZSBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGNhcHR1cmUgcGFyYW1ldGVyczogc2VsZWN0IHRoZSBmaXJzdCBhdmFpbGFibGUKKyAgICAvLyBwcm9maWxlIHN1cHBvcnRpbmcgYWxsIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgSU9Qcm9maWxlICpwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal07CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIEFVRElPX09VVFBVVF9GTEFHX05PTkUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKQoreworICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6CisgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgeworICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOgorICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgorICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSBpbnZhbGlkIGlucHV0IHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIEFMT0dWKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpaW5wdXQgc291cmNlICVkLCBkZXZpY2UgJTA4eCIsIGlucHV0U291cmNlLCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1ZpcnR1YWxJbnB1dERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmICgoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgeworICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIGlmICgocG9wY291bnQoZGV2aWNlKSA9PSAxKSAmJiAoKGRldmljZSAmIH5BUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMKSA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QWN0aXZlSW5wdXQoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBBdWRpb0lucHV0RGVzY3JpcHRvciAqIGlucHV0X2Rlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICgoaW5wdXRfZGVzY3JpcHRvci0+bVJlZkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAmJiAoIWlnbm9yZVZpcnR1YWxJbnB1dHMgfHwgIWlzVmlydHVhbElucHV0RGV2aWNlKGlucHV0X2Rlc2NyaXB0b3ItPm1EZXZpY2UpKSkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnB1dHMua2V5QXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAvLyB0aGlzIGhhcHBlbnMgd2hlbiBmb3JjaW5nIGEgcm91dGUgdXBkYXRlIGFuZCBubyB0cmFjayBpcyBhY3RpdmUgb24gYW4gb3V0cHV0LgorICAgICAgICAvLyBJbiB0aGlzIGNhc2UgdGhlIHJldHVybmVkIGNhdGVnb3J5IGlzIG5vdCBpbXBvcnRhbnQuCisgICAgICAgIGRldmljZSA9ICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgfSBlbHNlIGlmIChwb3Bjb3VudChkZXZpY2UpID4gMSkgeworICAgICAgICAvLyBNdWx0aXBsZSBkZXZpY2Ugc2VsZWN0aW9uIGlzIGVpdGhlcjoKKyAgICAgICAgLy8gIC0gc3BlYWtlciArIG9uZSBvdGhlciBkZXZpY2U6IGdpdmUgcHJpb3JpdHkgdG8gc3BlYWtlciBpbiB0aGlzIGNhc2UuCisgICAgICAgIC8vICAtIG9uZSBBMkRQIGRldmljZSArIGFub3RoZXIgZGV2aWNlOiBoYXBwZW5zIHdpdGggZHVwbGljYXRlZCBvdXRwdXQuIEluIHRoaXMgY2FzZQorICAgICAgICAvLyByZXRhaW4gdGhlIGRldmljZSBvbiB0aGUgQTJEUCBvdXRwdXQgYXMgdGhlIG90aGVyIG11c3Qgbm90IGNvcnJlc3BvbmQgdG8gYW4gYWN0aXZlCisgICAgICAgIC8vIHNlbGVjdGlvbiBpZiBub3QgdGhlIHNwZWFrZXIuCisgICAgICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1dfSUYocG9wY291bnQoZGV2aWNlKSAhPSAxLAorICAgICAgICAgICAgImdldERldmljZUZvclZvbHVtZSgpIGludmFsaWQgZGV2aWNlIGNvbWJpbmF0aW9uOiAlMDh4IiwKKyAgICAgICAgICAgIGRldmljZSk7CisKKyAgICByZXR1cm4gZGV2aWNlOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OmRldmljZV9jYXRlZ29yeSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUNhdGVnb3J5KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgc3dpdGNoKGdldERldmljZUZvclZvbHVtZShkZXZpY2UpKSB7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRToKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0U7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVDsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUjsKKyAgICB9Cit9CisKK2Zsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6dm9sSW5kZXhUb0FtcGwoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKKyAgICAgICAgaW50IGluZGV4SW5VaSkKK3sKKyAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkgPSBnZXREZXZpY2VDYXRlZ29yeShkZXZpY2UpOworICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmN1cnZlID0gc3RyZWFtRGVzYy5tVm9sdW1lQ3VydmVbZGV2aWNlQ2F0ZWdvcnldOworCisgICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbSB0eXBlCisgICAgaW50IG5iU3RlcHMgPSAxICsgY3VydmVbVk9MTUFYXS5tSW5kZXggLQorICAgICAgICAgICAgY3VydmVbVk9MTUlOXS5tSW5kZXg7CisgICAgaW50IHZvbElkeCA9IChuYlN0ZXBzICogKGluZGV4SW5VaSAtIHN0cmVhbURlc2MubUluZGV4TWluKSkgLworICAgICAgICAgICAgKHN0cmVhbURlc2MubUluZGV4TWF4IC0gc3RyZWFtRGVzYy5tSW5kZXhNaW4pOworCisgICAgLy8gZmluZCB3aGF0IHBhcnQgb2YgdGhlIGN1cnZlIHRoaXMgaW5kZXggdm9sdW1lIGJlbG9uZ3MgdG8sIG9yIGlmIGl0J3Mgb3V0IG9mIGJvdW5kcworICAgIGludCBzZWdtZW50ID0gMDsKKyAgICBpZiAodm9sSWR4IDwgY3VydmVbVk9MTUlOXS5tSW5kZXgpIHsgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIHJldHVybiAwLjBmOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVk9MS05FRTFdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMDsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZPTEtORUUyXS5tSW5kZXgpIHsKKyAgICAgICAgc2VnbWVudCA9IDE7CisgICAgfSBlbHNlIGlmICh2b2xJZHggPD0gY3VydmVbVk9MTUFYXS5tSW5kZXgpIHsKKyAgICAgICAgc2VnbWVudCA9IDI7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKworICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgorICAgIGZsb2F0IGRlY2liZWxzID0gY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24gKworICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKgorICAgICAgICAgICAgICAgICggKGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24gLQorICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24pIC8KKyAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkoY3VydmVbc2VnbWVudCsxXS5tSW5kZXggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICk7CisKKyAgICBmbG9hdCBhbXBsaWZpY2F0aW9uID0gZXhwKCBkZWNpYmVscyAqIDAuMTE1MTI5Zik7IC8vIGV4cCggZEIgKiBsbigxMCkgLyAyMCApCisKKyAgICBBTE9HVlYoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSBhbXBsPSUuNWYiLAorICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4LCB2b2xJZHgsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uLAorICAgICAgICAgICAgZGVjaWJlbHMsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uLAorICAgICAgICAgICAgYW1wbGlmaWNhdGlvbik7CisKKyAgICByZXR1cm4gYW1wbGlmaWNhdGlvbjsKK30KKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTQ5LjVmfSwgezMzLCAtMzMuNWZ9LCB7NjYsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtNTYuMGZ9LCB7MjAsIC0zNC4wZn0sIHs2MCwgLTExLjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC0yOS43Zn0sIHszMywgLTIwLjFmfSwgezY2LCAtMTAuMmZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTM1LjdmfSwgezMzLCAtMjYuMWZ9LCB7NjYsIC0xMy4yZn0sIHsxMDAsIDAuMGZ9Cit9OworCisvLyBBVURJT19TVFJFQU1fU1lTVEVNLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSBhbmQgQVVESU9fU1RSRUFNX0RUTUYgdm9sdW1lIHRyYWNrcworLy8gQVVESU9fU1RSRUFNX1JJTkcgb24gcGhvbmVzIGFuZCBBVURJT19TVFJFQU1fTVVTSUMgb24gdGFibGV0cy4KKy8vIEFVRElPX1NUUkVBTV9EVE1GIHRyYWNrcyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB3aGlsZSBpbiBjYWxsIChTZWUgQXVkaW9TZXJ2aWNlLmphdmEpLgorLy8gVGhlIHJhbmdlIGlzIGNvbnN0cmFpbmVkIGJldHdlZW4gLTI0ZEIgYW5kIC02ZEIgb3ZlciBzcGVha2VyIGFuZCAtMzBkQiBhbmQgLTE4ZEIgb3ZlciBoZWFkc2V0LgorCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMjQuMGZ9LCB7MzMsIC0xOC4wZn0sIHs2NiwgLTEyLjBmfSwgezEwMCwgLTYuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMzQuMGZ9LCB7MzMsIC0yNC4wZn0sIHs2NiwgLTE1LjBmfSwgezEwMCwgLTYuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMzAuMGZ9LCB7MzMsIC0yNi4wZn0sIHs2NiwgLTIyLjBmfSwgezEwMCwgLTE4LjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHswLCAtNDIuMGZ9LCB7MzMsIC0yOC4wZn0sIHs2NiwgLTE0LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgLTI0LjBmfSwgezMzLCAtMTYuMGZ9LCB7NjYsIC04LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgICAgICAgICAgKkF1ZGlvUG9saWN5TWFuYWdlcjo6c1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpERVZJQ0VfQ0FURUdPUllfQ05UXSA9IHsKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMCisgICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fU1lTVEVNCisgICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fUklORworICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX01VU0lDCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fQUxBUk0KKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04KKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPCisgICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRQorICAgICAgICBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICB9LAorICAgIHsgIC8vIEFVRElPX1NUUkVBTV9EVE1GCisgICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgIH0sCit9OworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKKyAgICAgICAgICAgIG1TdHJlYW1zW2ldLm1Wb2x1bWVDdXJ2ZVtqXSA9CisgICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tpXVtqXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGF2YWlsYWJpbGl0eSBvZiBEUkMgb24gc3BlYWtlciBwYXRoOiBpZiBhdmFpbGFibGUsIG92ZXJyaWRlIHNvbWUgb2YgdGhlIHNwZWFrZXIgY3VydmVzCisgICAgaWYgKG1TcGVha2VyRHJjRW5hYmxlZCkgeworICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fU1lTVEVNXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KKyAgICAgICAgICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjOworICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fUklOR10ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9CisgICAgICAgICAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYzsKKyAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FMQVJNXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KKyAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOworICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KKyAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOworICAgIH0KK30KKworZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBmbG9hdCB2b2x1bWUgPSAxLjA7CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBTdHJlYW1EZXNjcmlwdG9yICZzdHJlYW1EZXNjID0gbVN0cmVhbXNbc3RyZWFtXTsKKworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgfQorCisgICAgLy8gaWYgdm9sdW1lIGlzIG5vdCAwIChub3QgbXV0ZWQpLCBmb3JjZSBtZWRpYSB2b2x1bWUgdG8gbWF4IG9uIGRpZ2l0YWwgb3V0cHV0CisgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMgJiYKKyAgICAgICAgaW5kZXggIT0gbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4gJiYKKyAgICAgICAgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMIHx8CisgICAgICAgICBkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCB8fAorICAgICAgICAgZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSB8fAorICAgICAgICAgZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSkpIHsKKyAgICAgICAgcmV0dXJuIDEuMDsKKyAgICB9CisKKyAgICB2b2x1bWUgPSB2b2xJbmRleFRvQW1wbChkZXZpY2UsIHN0cmVhbURlc2MsIGluZGV4KTsKKworICAgIC8vIGlmIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQsIGFwcGx5IHRoZSBmb2xsb3dpbmcgcnVsZXMgdG8gcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucworICAgIC8vIHRvIGF2b2lkIHNvdW5kIGxldmVsIGJ1cnN0cyBpbiB1c2VyJ3MgZWFyczoKKyAgICAvLyAtIGFsd2F5cyBhdHRlbnVhdGUgcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucyB2b2x1bWUgYnkgNmRCCisgICAgLy8gLSBpZiBtdXNpYyBpcyBwbGF5aW5nLCBhbHdheXMgbGltaXQgdGhlIHZvbHVtZSB0byBjdXJyZW50IG11c2ljIHZvbHVtZSwKKyAgICAvLyB3aXRoIGEgbWluaW11bSB0aHJlc2hvbGQgYXQgLTM2ZEIgc28gdGhhdCBub3RpZmljYXRpb24gaXMgYWx3YXlzIHBlcmNlaXZlZC4KKyAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgaWYgKChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8CisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUIHwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSkgJiYKKyAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKQorICAgICAgICAgICAgICAgIHx8IChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpCisgICAgICAgICAgICAgICAgfHwgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKQorICAgICAgICAgICAgICAgIHx8ICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCisgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpICYmCisgICAgICAgIHN0cmVhbURlc2MubUNhbkJlTXV0ZWQpIHsKKyAgICAgICAgdm9sdW1lICo9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1I7CisgICAgICAgIC8vIHdoZW4gdGhlIHBob25lIGlzIHJpbmdpbmcgd2UgbXVzdCBjb25zaWRlciB0aGF0IG11c2ljIGNvdWxkIGhhdmUgYmVlbiBwYXVzZWQganVzdCBiZWZvcmUKKyAgICAgICAgLy8gYnkgdGhlIG11c2ljIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgbXVzaWMgd2FzIGFjdGl2ZSBpZiB0aGUgbGFzdCBtdXNpYyB0cmFjayB3YXMKKyAgICAgICAgLy8ganVzdCBzdG9wcGVkCisgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSB8fAorICAgICAgICAgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIGZsb2F0IG11c2ljVm9sID0gY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX01VU0lDXS5nZXRWb2x1bWVJbmRleChtdXNpY0RldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKTsKKyAgICAgICAgICAgIGZsb2F0IG1pblZvbCA9IChtdXNpY1ZvbCA+IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU4pID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNWb2wgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOOworICAgICAgICAgICAgaWYgKHZvbHVtZSA+IG1pblZvbCkgeworICAgICAgICAgICAgICAgIHZvbHVtZSA9IG1pblZvbDsKKyAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBsaW1pdGluZyB2b2x1bWUgdG8gJWYgbXVzaWNWb2wgJWYiLCBtaW5Wb2wsIG11c2ljVm9sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2b2x1bWU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworCisgICAgLy8gZG8gbm90IGNoYW5nZSBhY3R1YWwgc3RyZWFtIHZvbHVtZSBpZiB0aGUgc3RyZWFtIGlzIG11dGVkCisgICAgaWYgKG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1NdXRlQ291bnRbc3RyZWFtXSAhPSAwKSB7CisgICAgICAgIEFMT0dWVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBzdHJlYW0gJWQgbXV0ZWQgY291bnQgJWQiLAorICAgICAgICAgICAgICBzdHJlYW0sIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1NdXRlQ291bnRbc3RyZWFtXSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBkbyBub3QgY2hhbmdlIGluIGNhbGwgdm9sdW1lIGlmIGJsdWV0b290aCBpcyBjb25uZWN0ZWQgYW5kIHZpY2UgdmVyc2EKKyAgICBpZiAoKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJgorICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgfHwKKyAgICAgICAgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyAmJgorICAgICAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSB7CisgICAgICAgIEFMT0dWKCJjaGVja0FuZFNldFZvbHVtZSgpIGNhbm5vdCBzZXQgc3RyZWFtICVkIHZvbHVtZSB3aXRoIGZvcmNlIHVzZSA9ICVkIGZvciBjb21tIiwKKyAgICAgICAgICAgICBzdHJlYW0sIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGZsb2F0IHZvbHVtZSA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgb3V0cHV0LCBkZXZpY2UpOworICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgorICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCisgICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKKyAgICBpZiAodm9sdW1lICE9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSB8fAorICAgICAgICAgICAgZm9yY2UpIHsKKyAgICAgICAgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOworICAgICAgICBBTE9HVlYoImNoZWNrQW5kU2V0Vm9sdW1lKCkgZm9yIG91dHB1dCAlZCBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBvdXRwdXQsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgLy8gRm9yY2UgVk9JQ0VfQ0FMTCB0byB0cmFjayBCTFVFVE9PVEhfU0NPIHN0cmVhbSB2b2x1bWUgd2hlbiBibHVldG9vdGggYXVkaW8gaXMKKyAgICAgICAgLy8gZW5hYmxlZAorICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7CisgICAgICAgIH0KKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LCBkZWxheU1zKTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8CisgICAgICAgIHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZTsKKyAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTyBhcyB2b2x1bWUgaXMgbWFuYWdlZCBieSB0aGUgaGVhZHNldAorICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lICYmIG91dHB1dCA9PSBtUHJpbWFyeU91dHB1dCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFwcGx5U3RyZWFtVm9sdW1lcyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworICAgIEFMT0dWVigiYXBwbHlTdHJlYW1Wb2x1bWVzKCkgZm9yIG91dHB1dCAlZCBhbmQgZGV2aWNlICV4Iiwgb3V0cHV0LCBkZXZpY2UpOworCisgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tzdHJlYW1dLmdldFZvbHVtZUluZGV4KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIEFMT0dWVigic2V0U3RyYXRlZ3lNdXRlKCkgc3RyYXRlZ3kgJWQsIG11dGUgJWQsIG91dHB1dCAlZCIsIHN0cmF0ZWd5LCBvbiwgb3V0cHV0KTsKKyAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgeworICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG9uLCBvdXRwdXQsIGRlbGF5TXMsIGRldmljZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1TdHJlYW1zW3N0cmVhbV07CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIH0KKworICAgIEFMT0dWVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgb3V0cHV0ICVkLCBtTXV0ZUNvdW50ICVkIGRldmljZSAlMDR4IiwKKyAgICAgICAgICBzdHJlYW0sIG9uLCBvdXRwdXQsIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSwgZGV2aWNlKTsKKworICAgIGlmIChvbikgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjLm1DYW5CZU11dGVkICYmCisgICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgeworICAgICAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgMCwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKKyAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSkKK3sKKyAgICAvLyBpZiB0aGUgc3RyZWFtIHBlcnRhaW5zIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBhbmQgd2UgYXJlIGluIGNhbGwgd2UgbXVzdAorICAgIC8vIG11dGUgdGhlIHN0cmVhbSBpZiBpdCBpcyBsb3cgdmlzaWJpbGl0eS4gSWYgaXQgaXMgaGlnaCB2aXNpYmlsaXR5LCB3ZSBtdXN0IHBsYXkgYSB0b25lCisgICAgLy8gaW4gdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneSBhbmQgcGxheSB0aGUgdG9uZSBpZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRvZXMgbm90CisgICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneQorICAgIC8vIGlmIHN0YXRlQ2hhbmdlIGlzIHRydWUsIHdlIGFyZSBjYWxsZWQgZnJvbSBzZXRQaG9uZVN0YXRlKCkgYW5kIHdlIG11c3QgbXV0ZSBvciB1bm11dGUgYXMKKyAgICAvLyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBhY3RpdmUgdHJhY2tzIG9uIHRoZSBvdXRwdXQKKyAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgaWYgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSkgeworICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBzdHJlYW0gJWQgc3RhcnRpbmcgJWQgZGV2aWNlICV4IHN0YXRlQ2hhbmdlICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW0sIHN0YXJ0aW5nLCBvdXRwdXREZXNjLT5tRGV2aWNlLCBzdGF0ZUNoYW5nZSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSkgeworICAgICAgICAgICAgaW50IG11dGVDb3VudCA9IDE7CisgICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICBtdXRlQ291bnQgPSBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdWRpb19pc19sb3dfdmlzaWJpbGl0eShzdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGxvdyB2aXNpYmlsaXR5LCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5Iik7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmRldmljZSgpICYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCB0cnVlIC8qZnJvbUNhY2hlKi8pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkgbXV0ZWQsIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGFydGluZykgeworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RhcnRUb25lKEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RvcFRvbmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0luQ2FsbCgpCit7CisgICAgcmV0dXJuIGlzU3RhdGVJbkNhbGwobVBob25lU3RhdGUpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpIHsKKyAgICByZXR1cm4gKChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8CisgICAgICAgICAgICAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKSk7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TWF4RWZmZWN0c0NwdUxvYWQoKQoreworICAgIHJldHVybiBNQVhfRUZGRUNUU19DUFVfTE9BRDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNYXhFZmZlY3RzTWVtb3J5KCkKK3sKKyAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOworfQorCisvLyAtLS0gQXVkaW9PdXRwdXREZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpBdWRpb091dHB1dERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IElPUHJvZmlsZSAqcHJvZmlsZSkKKyAgICA6IG1JZCgwKSwgbVNhbXBsaW5nUmF0ZSgwKSwgbUZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCksCisgICAgICBtQ2hhbm5lbE1hc2soMCksIG1MYXRlbmN5KDApLAorICAgIG1GbGFncygoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpMCksIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLAorICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbVByb2ZpbGUocHJvZmlsZSksIG1EaXJlY3RPcGVuQ291bnQoMCkKK3sKKyAgICAvLyBjbGVhciB1c2FnZSBjb3VudCBmb3IgYWxsIHN0cmVhbSB0eXBlcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIG1SZWZDb3VudFtpXSA9IDA7CisgICAgICAgIG1DdXJWb2x1bWVbaV0gPSAtMS4wOworICAgICAgICBtTXV0ZUNvdW50W2ldID0gMDsKKyAgICAgICAgbVN0b3BUaW1lW2ldID0gMDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgeworICAgICAgICBtU2FtcGxpbmdSYXRlID0gcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF07CisgICAgICAgIG1Gb3JtYXQgPSBwcm9maWxlLT5tRm9ybWF0c1swXTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gcHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXTsKKyAgICAgICAgbUZsYWdzID0gcHJvZmlsZS0+bUZsYWdzOworICAgIH0KK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPm1EZXZpY2UgfCBtT3V0cHV0Mi0+bURldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2U7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6bGF0ZW5jeSgpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAobU91dHB1dDEtPm1MYXRlbmN5ID4gbU91dHB1dDItPm1MYXRlbmN5KSA/IG1PdXRwdXQxLT5tTGF0ZW5jeSA6IG1PdXRwdXQyLT5tTGF0ZW5jeTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUxhdGVuY3k7CisgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzaGFyZXNId01vZHVsZVdpdGgoCisgICAgICAgIGNvbnN0IEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYykKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXQxLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYykgfHwgbU91dHB1dDItPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKXsKKyAgICAgICAgcmV0dXJuIHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5tT3V0cHV0MSkgfHwgc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPm1PdXRwdXQyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKG1Qcm9maWxlLT5tTW9kdWxlID09IG91dHB1dERlc2MtPm1Qcm9maWxlLT5tTW9kdWxlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3sKKyAgICAvLyBmb3J3YXJkIHVzYWdlIGNvdW50IGNoYW5nZSB0byBhdHRhY2hlZCBvdXRwdXRzCisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIG1PdXRwdXQxLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKyAgICAgICAgbU91dHB1dDItPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOworICAgIH0KKyAgICBpZiAoKGRlbHRhICsgKGludCltUmVmQ291bnRbc3RyZWFtXSkgPCAwKSB7CisgICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZm9yIHN0cmVhbSAlZCwgcmVmQ291bnQgJWQiLAorICAgICAgICAgICAgICBkZWx0YSwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7CisgICAgICAgIG1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUmVmQ291bnRbc3RyZWFtXSArPSBkZWx0YTsKKyAgICBBTE9HVigiY2hhbmdlUmVmQ291bnQoKSBzdHJlYW0gJWQsIGNvdW50ICVkIiwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KShtT3V0cHV0MS0+c3VwcG9ydGVkRGV2aWNlcygpIHwgbU91dHB1dDItPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpIDsKKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIHJldHVybiBpc1N0cmF0ZWd5QWN0aXZlKE5VTV9TVFJBVEVHSUVTLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyYXRlZ3lBY3RpdmUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKK3sKKyAgICBpZiAoKHN5c1RpbWUgPT0gMCkgJiYgKGluUGFzdE1zICE9IDApKSB7CisgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgaWYgKCgoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHx8CisgICAgICAgICAgICAgICAgKE5VTV9TVFJBVEVHSUVTID09IHN0cmF0ZWd5KSkgJiYKKyAgICAgICAgICAgICAgICBpc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgaWYgKG1SZWZDb3VudFtzdHJlYW1dICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChpblBhc3RNcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHN5c1RpbWUgPT0gMCkgeworICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIH0KKyAgICBpZiAobnMybXMoc3lzVGltZSAtIG1TdG9wVGltZVtzdHJlYW1dKSA8IGluUGFzdE1zKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsCisgICAgICAgICAgICAgICAgIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLSBBdWRpb0lucHV0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjpBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBJT1Byb2ZpbGUgKnByb2ZpbGUpCisgICAgOiBtU2FtcGxpbmdSYXRlKDApLCBtRm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKSwgbUNoYW5uZWxNYXNrKDApLAorICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1SZWZDb3VudCgwKSwKKyAgICAgIG1JbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfREVGQVVMVCksIG1Qcm9maWxlKHByb2ZpbGUpCit7CisgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgeworICAgICAgICBtU2FtcGxpbmdSYXRlID0gcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF07CisgICAgICAgIG1Gb3JtYXQgPSBwcm9maWxlLT5tRm9ybWF0c1swXTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gcHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIG1EZXZpY2UpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUmVmIENvdW50ICVkXG4iLCBtUmVmQ291bnQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tIFN0cmVhbURlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpTdHJlYW1EZXNjcmlwdG9yKCkKKyAgICA6ICAgbUluZGV4TWluKDApLCBtSW5kZXhNYXgoMSksIG1DYW5CZU11dGVkKHRydWUpCit7CisgICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQsIDApOworfQorCitpbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGRldmljZSA9IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVAorICAgIGlmIChtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpIDwgMCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQ7CisgICAgfQorICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OlN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCisgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKKyAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAorICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCisvLyAtLS0gRWZmZWN0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkVmZmVjdERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEkvTzogJWRcbiIsIG1Jbyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJhdGVneTogJWRcbiIsIG1TdHJhdGVneSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTZXNzaW9uOiAlZFxuIiwgbVNlc3Npb24pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTmFtZTogJXNcbiIsICBtRGVzYy5uYW1lKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICVzXG4iLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLSBJT1Byb2ZpbGUgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6SHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKKyAgICA6IG1OYW1lKHN0cm5kdXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01BWF9MRU4pKSwgbUhhbmRsZSgwKQoreworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjp+SHdNb2R1bGUoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+bVN1cHBvcnRlZERldmljZXMuY2xlYXIoKTsKKyAgICAgICAgZGVsZXRlIG1PdXRwdXRQcm9maWxlc1tpXTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+bVN1cHBvcnRlZERldmljZXMuY2xlYXIoKTsKKyAgICAgICAgZGVsZXRlIG1JbnB1dFByb2ZpbGVzW2ldOworICAgIH0KKyAgICBmcmVlKCh2b2lkICopbU5hbWUpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIG5hbWU6ICVzXG4iLCBtTmFtZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1PdXRwdXRQcm9maWxlcy5zaXplKCkpIHsKKyAgICAgICAgd3JpdGUoZmQsICIgIC0gb3V0cHV0czpcbiIsIHN0cmxlbigiICAtIG91dHB1dHM6XG4iKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgb3V0cHV0ICVkOlxuIiwgaSk7CisgICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKKyAgICAgICAgd3JpdGUoZmQsICIgIC0gaW5wdXRzOlxuIiwgc3RybGVuKCIgIC0gaW5wdXRzOlxuIikpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgaW5wdXQgJWQ6XG4iLCBpKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgfQorICAgIH0KK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OklPUHJvZmlsZShId01vZHVsZSAqbW9kdWxlKQorICAgIDogbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbU1vZHVsZShtb2R1bGUpCit7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjp+SU9Qcm9maWxlKCkKK3sKK30KKworLy8gY2hlY2tzIGlmIHRoZSBJTyBwcm9maWxlIGlzIGNvbXBhdGlibGUgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKy8vIFNhbXBsaW5nIHJhdGUsIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrIG11c3QgYmUgc3BlY2lmaWVkIGluIG9yZGVyIHRvCisvLyBnZXQgYSB2YWxpZCBhIG1hdGNoCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjppc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKSBjb25zdAoreworICAgIGlmIChzYW1wbGluZ1JhdGUgPT0gMCB8fCAhYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgY2hhbm5lbE1hc2sgPT0gMCkgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICB9CisKKyAgICAgaWYgKChtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSAhPSBkZXZpY2UpIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgfQorICAgICBpZiAoKG1GbGFncyAmIGZsYWdzKSAhPSBmbGFncykgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICB9CisgICAgIHNpemVfdCBpOworICAgICBmb3IgKGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspCisgICAgIHsKKyAgICAgICAgIGlmIChtU2FtcGxpbmdSYXRlc1tpXSA9PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICBpZiAoaSA9PSBtU2FtcGxpbmdSYXRlcy5zaXplKCkpIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgfQorICAgICBmb3IgKGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpKyspCisgICAgIHsKKyAgICAgICAgIGlmIChtRm9ybWF0c1tpXSA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICBpZiAoaSA9PSBtRm9ybWF0cy5zaXplKCkpIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgfQorICAgICBmb3IgKGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykKKyAgICAgeworICAgICAgICAgaWYgKG1DaGFubmVsTWFza3NbaV0gPT0gY2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICBpZiAoaSA9PSBtQ2hhbm5lbE1hc2tzLnNpemUoKSkgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICB9CisgICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIHNhbXBsaW5nIHJhdGVzOiAiKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIlxuIiA6ICIsICIpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGNoYW5uZWwgbWFza3M6ICIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIlxuIiA6ICIsICIpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGZvcm1hdHM6ICIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIjB4JTA4eCIsIG1Gb3JtYXRzW2ldKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1Gb3JtYXRzLnNpemUoKSAtIDEpID8gIlxuIiA6ICIsICIpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGRldmljZXM6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgRGV2aWNlRGVzY3JpcHRvcjo6ZHVtcEhlYWRlcihmZCwgNik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtU3VwcG9ydGVkRGV2aWNlc1tpXS0+ZHVtcChmZCwgNik7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gZmxhZ3M6IDB4JTA0eFxuIiwgbUZsYWdzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK30KKworLy8gLS0tIERldmljZURlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OmVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0Cit7CisgICAgLy8gRGV2aWNlcyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5OgorICAgIC8vIC0gYXJlIG9mIHRoZSBzYW1lIHR5cGUgKGEgZGV2aWNlIHR5cGUgY2Fubm90IGJlIEFVRElPX0RFVklDRV9OT05FKQorICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBhZGRyZXNzIG9yIG9uZSBkZXZpY2UgZG9lcyBub3Qgc3BlY2lmeSB0aGUgYWRkcmVzcworICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBjaGFubmVsIG1hc2sgb3Igb25lIGRldmljZSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBjaGFubmVsIG1hc2sKKyAgICByZXR1cm4gKG1UeXBlID09IG90aGVyLT5tVHlwZSkgJiYKKyAgICAgICAgICAgKG1BZGRyZXNzID09ICIiIHx8IG90aGVyLT5tQWRkcmVzcyA9PSAiIiB8fCBtQWRkcmVzcyA9PSBvdGhlci0+bUFkZHJlc3MpICYmCisgICAgICAgICAgIChtQ2hhbm5lbE1hc2sgPT0gMCB8fCBvdGhlci0+bUNoYW5uZWxNYXNrID09IDAgfHwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gb3RoZXItPm1DaGFubmVsTWFzayk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpCit7CisgICAgbVR5cGVzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIG1UeXBlcyB8PSBpdGVtQXQoaSktPm1UeXBlOworICAgIH0KKyAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKSBtVHlwZXMgJTA4eCIsIG1UeXBlcyk7Cit9CisKK3NzaXplX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0Cit7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtLT5lcXVhbHMoaXRlbUF0KGkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjphZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCit7CisgICAgc3NpemVfdCByZXQgPSBpbmRleE9mKGl0ZW0pOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0ID0gU29ydGVkVmVjdG9yOjphZGQoaXRlbSk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjphZGQgZGV2aWNlICUwOHggYWxyZWFkeSBpbiIsIGl0ZW0tPm1UeXBlKTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OnJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkKK3sKKyAgICBzaXplX3QgaTsKKyAgICBzc2l6ZV90IHJldCA9IGluZGV4T2YoaXRlbSk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjpyZW1vdmUgZGV2aWNlICUwOHggbm90IGluIiwgaXRlbS0+bVR5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6cmVtb3ZlQXQocmV0KTsKKyAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICByZWZyZXNoVHlwZXMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKKworICAgIHVpbnQzMl90IHJvbGVfYml0ID0gQVVESU9fREVWSUNFX0JJVF9JTiAmIHR5cGVzOworICAgIHR5cGVzICY9IH5yb2xlX2JpdDsKKworICAgIHdoaWxlICh0eXBlcykgeworICAgICAgICB1aW50MzJfdCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHR5cGVzKTsKKyAgICAgICAgdWludDMyX3QgdHlwZSA9IDEgPDwgaTsKKyAgICAgICAgdHlwZXMgJj0gfnR5cGU7CisgICAgICAgIGFkZChuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlIHwgcm9sZV9iaXQpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjpkdW1wSGVhZGVyKGludCBmZCwgaW50IHNwYWNlcykKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcyUtNDhzICUtMnMgJS04cyAlLTMycyBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzLCAiIiwgIlR5cGUiLCAiSUQiLCAiQ25sIE1hc2siLCAiQWRkcmVzcyIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcyUtNDhzICUyZCAlMDh4ICUtMzJzIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Ub1N0cmluZyhzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbUlkLCBtQ2hhbm5lbE1hc2ssIG1BZGRyZXNzLnN0cmluZygpKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworLy8gLS0tIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZworCithdWRpb19vdXRwdXRfZmxhZ3NfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnBhcnNlRmxhZ05hbWVzKGNoYXIgKm5hbWUpCit7CisgICAgdWludDMyX3QgZmxhZyA9IDA7CisKKyAgICAvLyBpdCBpcyBPSyB0byBjYXN0IG5hbWUgdG8gbm9uIGNvbnN0IGhlcmUgYXMgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgaXQgYWZ0ZXIKKyAgICAvLyBzdHJ0b2soKSBtb2RpZmllcyBpdAorICAgIGNoYXIgKmZsYWdOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGZsYWdOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihmbGFnTmFtZSkgIT0gMCkgeworICAgICAgICAgICAgZmxhZyB8PSBzdHJpbmdUb0VudW0oc0ZsYWdOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRmxhZ05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ05hbWUpOworICAgICAgICB9CisgICAgICAgIGZsYWdOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KKyAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZworICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisgICAgaWYgKChmbGFnICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICBmbGFnIHw9IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWc7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBkZXZpY2UgPSAwOworCisgICAgY2hhciAqZGV2TmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOworICAgIHdoaWxlIChkZXZOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihkZXZOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgfD0gc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7CisgICAgICAgICB9CisgICAgICAgIGRldk5hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkU2FtcGxpbmdSYXRlcyhjaGFyICpuYW1lLCBJT1Byb2ZpbGUgKnByb2ZpbGUpCit7CisgICAgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1TYW1wbGluZ1JhdGVzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIHNhbXBsaW5nCisgICAgLy8gcmF0ZXMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7CisgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCByYXRlID0gYXRvaShzdHIpOworICAgICAgICBpZiAocmF0ZSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZFNhbXBsaW5nUmF0ZXMoKSBhZGRpbmcgcmF0ZSAlZCIsIHJhdGUpOworICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKHJhdGUpOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkRm9ybWF0cyhjaGFyICpuYW1lLCBJT1Byb2ZpbGUgKnByb2ZpbGUpCit7CisgICAgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1Gb3JtYXRzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIGZvcm1hdHMKKyAgICAvLyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3Qpc3RyaW5nVG9FbnVtKHNGb3JtYXROYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRm9ybWF0TmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSwgSU9Qcm9maWxlICpwcm9maWxlKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgQUxPR1YoImxvYWRJbkNoYW5uZWxzKCkgJXMiLCBuYW1lKTsKKworICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpIGFkZGluZyBjaGFubmVsTWFzayAlMDR4IiwgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2spOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkT3V0Q2hhbm5lbHMoY2hhciAqbmFtZSwgSU9Qcm9maWxlICpwcm9maWxlKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgQUxPR1YoImxvYWRPdXRDaGFubmVscygpICVzIiwgbmFtZSk7CisKKyAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1DaGFubmVsTWFza3MgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgY2hhbm5lbAorICAgIC8vIG1hc2tzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2spOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZElucHV0KGNub2RlICpyb290LCBId01vZHVsZSAqbW9kdWxlKQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisKKyAgICBJT1Byb2ZpbGUgKnByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKG1vZHVsZSk7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIFNBTVBMSU5HX1JBVEVTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgbG9hZFNhbXBsaW5nUmF0ZXMoKGNoYXIgKilub2RlLT52YWx1ZSwgcHJvZmlsZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBsb2FkRm9ybWF0cygoY2hhciAqKW5vZGUtPnZhbHVlLCBwcm9maWxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBsb2FkSW5DaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlLCBwcm9maWxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbVR5cGUocGFyc2VEZXZpY2VOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBkZXZpY2VzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBmb3JtYXRzIik7CisgICAgaWYgKCFwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSAhPSAwKSkgeworCisgICAgICAgIEFMT0dWKCJsb2FkSW5wdXQoKSBhZGRpbmcgaW5wdXQgU3VwcG9ydGVkIERldmljZXMgJTA0eCIsCisgICAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOworCisgICAgICAgIG1vZHVsZS0+bUlucHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsZXRlIHByb2ZpbGU7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRPdXRwdXQoY25vZGUgKnJvb3QsIEh3TW9kdWxlICptb2R1bGUpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIElPUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUobW9kdWxlKTsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgU0FNUExJTkdfUkFURVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBsb2FkU2FtcGxpbmdSYXRlcygoY2hhciAqKW5vZGUtPnZhbHVlLCBwcm9maWxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIGxvYWRGb3JtYXRzKChjaGFyICopbm9kZS0+dmFsdWUsIHByb2ZpbGUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIGxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlLCBwcm9maWxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbVR5cGUocGFyc2VEZXZpY2VOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gcGFyc2VGbGFnTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOworICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKKworICAgICAgICBBTE9HVigibG9hZE91dHB1dCgpIGFkZGluZyBvdXRwdXQgU3VwcG9ydGVkIERldmljZXMgJTA0eCwgbUZsYWdzICUwNHgiLAorICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpLCBwcm9maWxlLT5tRmxhZ3MpOworCisgICAgICAgIG1vZHVsZS0+bU91dHB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlbGV0ZSBwcm9maWxlOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRId01vZHVsZShjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVFNfVEFHKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKworICAgIEh3TW9kdWxlICptb2R1bGUgPSBuZXcgSHdNb2R1bGUocm9vdC0+bmFtZSk7CisKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIG91dHB1dCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZE91dHB1dChub2RlLCBtb2R1bGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgSU5QVVRTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBpbnB1dCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZElucHV0KG5vZGUsIG1vZHVsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWxldGUgbW9kdWxlOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBBVURJT19IV19NT0RVTEVfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZXMoKSBsb2FkaW5nIG1vZHVsZSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBsb2FkSHdNb2R1bGUobm9kZSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKEFUVEFDSEVEX09VVFBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMubG9hZERldmljZXNGcm9tVHlwZShwYXJzZURldmljZU5hbWVzKChjaGFyICopbm9kZS0+dmFsdWUpKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXR0YWNoZWQgT3V0cHV0IERldmljZXMgJTA4eCIsCisgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3Qpc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJsb2FkR2xvYmFsQ29uZmlnKCkgZGVmYXVsdCBkZXZpY2Ugbm90IHNwZWNpZmllZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtRGVmYXVsdE91dHB1dERldmljZSAlMDh4IiwgbURlZmF1bHRPdXRwdXREZXZpY2UtPm1UeXBlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVRUQUNIRURfSU5QVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMubG9hZERldmljZXNGcm9tVHlwZShwYXJzZURldmljZU5hbWVzKChjaGFyICopbm9kZS0+dmFsdWUpKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXZhaWxhYmxlIElucHV0RGV2aWNlcyAlMDh4IiwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIG1TcGVha2VyRHJjRW5hYmxlZCA9IHN0cmluZ1RvQm9vbCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbVNwZWFrZXJEcmNFbmFibGVkID0gJWQiLCBtU3BlYWtlckRyY0VuYWJsZWQpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQXVkaW9Qb2xpY3lDb25maWcoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworCisgICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOworICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOworCisgICAgbG9hZEdsb2JhbENvbmZpZyhyb290KTsKKyAgICBsb2FkSHdNb2R1bGVzKHJvb3QpOworCisgICAgY29uZmlnX2ZyZWUocm9vdCk7CisgICAgZnJlZShyb290KTsKKyAgICBmcmVlKGRhdGEpOworCisgICAgQUxPR0koImxvYWRBdWRpb1BvbGljeUNvbmZpZygpIGxvYWRlZCAlc1xuIiwgcGF0aCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcodm9pZCkKK3sKKyAgICBId01vZHVsZSAqbW9kdWxlOworICAgIElPUHJvZmlsZSAqcHJvZmlsZTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0SW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpOworICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CisgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKKworICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZSgicHJpbWFyeSIpOworCisgICAgcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUobW9kdWxlKTsKKyAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoNDQxMDApOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKyAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2UpOworICAgIHByb2ZpbGUtPm1GbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlk7CisgICAgbW9kdWxlLT5tT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUobW9kdWxlKTsKKyAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoODAwMCk7CisgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX0lOX01PTk8pOworICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOworICAgIG1vZHVsZS0+bUlucHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2MzFiYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBdHRlbnVhdGlvbiBhcHBsaWVkIHRvIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gYSBoZWFkc2V0IGlzIGNvbm5lY3RlZDogNmRCCisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1IgMC41CisvLyBNaW4gdm9sdW1lIGZvciBTVFJBVEVHWV9TT05JRklDQVRJT04gc3RyZWFtcyB3aGVuIGxpbWl0ZWQgYnkgbXVzaWMgdm9sdW1lOiAtMzZkQgorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOICAwLjAxNgorLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgbXVzaWMgaXMgc3RpbGwgYWN0aXZlIGFmdGVyIGEgbXVzaWMKKy8vIHRyYWNrIHdhcyBzdG9wcGVkIC0gc2VlIGNvbXB1dGVWb2x1bWUoKQorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSAgNTAwMAorLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgbWVkaWEgc3RvcHBlZCBwbGF5aW5nIGR1cmluZyB3aGljaCB3ZSBjb25zaWRlciB0aGF0IHRoZQorLy8gc29uaWZpY2F0aW9uIHNob3VsZCBiZSBhcyB1bm9idHJ1c2l2ZSBhcyBkdXJpbmcgdGhlIHRpbWUgbWVkaWEgd2FzIHBsYXlpbmcuCisjZGVmaW5lIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZIDUwMDAKKy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGR1cmluZyB3aXRjaCBzb21lIHN0cmVhbXMgYXJlIG11dGVkIHdoaWxlIHRoZSBhdWRpbyBwYXRoCisvLyBpcyBzd2l0Y2hlZAorI2RlZmluZSBNVVRFX1RJTUVfTVMgMjAwMAorCisjZGVmaW5lIE5VTV9URVNUX09VVFBVVFMgNQorCisjZGVmaW5lIE5VTV9WT0xfQ1VSVkVfS05FRVMgMgorCisvLyBEZWZhdWx0IG1pbmltdW0gbGVuZ3RoIGFsbG93ZWQgZm9yIG9mZmxvYWRpbmcgYSBjb21wcmVzc2VkIHRyYWNrCisvLyBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyBwcm9wZXJ0eQorI2RlZmluZSBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgNjAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyIGltcGxlbWVudHMgYXVkaW8gcG9saWN5IG1hbmFnZXIgYmVoYXZpb3IgY29tbW9uIHRvIGFsbCBwbGF0Zm9ybXMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlcjogcHVibGljIEF1ZGlvUG9saWN5SW50ZXJmYWNlCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICAsIHB1YmxpYyBUaHJlYWQKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCit7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CisgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlcigpOworCisgICAgICAgIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5fYWNvdXN0aWNzX3QgYWNvdXN0aWNzKTsKKworICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworCisgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEwpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgICAgICAvLyByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKKyAgICAgICAgLy8gICBsb2NhbC9yZW1vdGUgcGxheWJhY2ssIHVzZWQgZm9yIGluc3RhbmNlIGJ5IG5vdGlmaWNhdGlvbiBtYW5hZ2VyIHRvIG5vdCBtYWtlCisgICAgICAgIC8vICAgbWVkaWEgcGxheWVycyBsb3NlIGF1ZGlvIGZvY3VzIHdoZW4gbm90IHBsYXlpbmcgbG9jYWxseQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pOworCitwcm90ZWN0ZWQ6CisKKyAgICAgICAgZW51bSByb3V0aW5nX3N0cmF0ZWd5IHsKKyAgICAgICAgICAgIFNUUkFURUdZX01FRElBLAorICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsCisgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sCisgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwKKyAgICAgICAgICAgIFNUUkFURUdZX0RUTUYsCisgICAgICAgICAgICBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLAorICAgICAgICAgICAgTlVNX1NUUkFURUdJRVMKKyAgICAgICAgfTsKKworICAgICAgICAvLyA0IHBvaW50cyB0byBkZWZpbmUgdGhlIHZvbHVtZSBhdHRlbnVhdGlvbiBjdXJ2ZSwgZWFjaCBjaGFyYWN0ZXJpemVkIGJ5IHRoZSB2b2x1bWUKKyAgICAgICAgLy8gaW5kZXggKGZyb20gMCB0byAxMDApIGF0IHdoaWNoIHRoZXkgYXBwbHksIGFuZCB0aGUgYXR0ZW51YXRpb24gaW4gZEIgYXQgdGhhdCBpbmRleC4KKyAgICAgICAgLy8gd2UgdXNlIDEwMCBzdGVwcyB0byBhdm9pZCByb3VuZGluZyBlcnJvcnMgd2hlbiBjb21wdXRpbmcgdGhlIHZvbHVtZSBpbiB2b2xJbmRleFRvQW1wbCgpCisKKyAgICAgICAgZW51bSB7IFZPTE1JTiA9IDAsIFZPTEtORUUxID0gMSwgVk9MS05FRTIgPSAyLCBWT0xNQVggPSAzLCBWT0xDTlQgPSA0fTsKKworICAgICAgICBjbGFzcyBWb2x1bWVDdXJ2ZVBvaW50CisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaW50IG1JbmRleDsKKyAgICAgICAgICAgIGZsb2F0IG1EQkF0dGVudWF0aW9uOworICAgICAgICB9OworCisgICAgICAgIC8vIGRldmljZSBjYXRlZ29yaWVzIHVzZWQgZm9yIHZvbHVtZSBjdXJ2ZSBtYW5hZ2VtZW50LgorICAgICAgICBlbnVtIGRldmljZV9jYXRlZ29yeSB7CisgICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCwKKyAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAorICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFLAorICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0NOVAorICAgICAgICB9OworCisgICAgICAgIGNsYXNzIElPUHJvZmlsZTsKKworICAgICAgICBjbGFzcyBEZXZpY2VEZXNjcmlwdG9yOiBwdWJsaWMgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIERldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlKHR5cGUpLCBtQWRkcmVzcyhhZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayhjaGFubmVsTWFzayksIG1JZCgwKSB7fQorCisgICAgICAgICAgICBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZSh0eXBlKSwgbUFkZHJlc3MoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrKDApLCBtSWQoMCkge30KKworICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OworICAgICAgICAgICAgc3RhdGljIHZvaWQgZHVtcEhlYWRlcihpbnQgZmQsIGludCBzcGFjZXMpOworCisgICAgICAgICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0OworCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbVR5cGU7CisgICAgICAgICAgICBTdHJpbmc4IG1BZGRyZXNzOworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOworICAgICAgICAgICAgdWludDMyX3QgbUlkOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIERldmljZVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8IHNwPERldmljZURlc2NyaXB0b3I+ID4KKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IoKSA6IFNvcnRlZFZlY3RvcigpLCBtVHlwZXMoQVVESU9fREVWSUNFX05PTkUpIHt9CisKKyAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CisgICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3Q7CisKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlcygpIGNvbnN0IHsgcmV0dXJuIG1UeXBlczsgfQorCisgICAgICAgICAgICB2b2lkIGxvYWREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKTsKKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCByZWZyZXNoVHlwZXMoKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtVHlwZXM7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgSHdNb2R1bGUgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgIEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpOworICAgICAgICAgICAgICAgICAgICB+SHdNb2R1bGUoKTsKKworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1OYW1lOyAvLyBiYXNlIG5hbWUgb2YgdGhlIGF1ZGlvIEhXIG1vZHVsZSAocHJpbWFyeSwgYTJkcCAuLi4pCisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbUhhbmRsZTsKKyAgICAgICAgICAgIFZlY3RvciA8SU9Qcm9maWxlICo+IG1PdXRwdXRQcm9maWxlczsgLy8gb3V0cHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKKyAgICAgICAgICAgIFZlY3RvciA8SU9Qcm9maWxlICo+IG1JbnB1dFByb2ZpbGVzOyAgLy8gaW5wdXQgcHJvZmlsZXMgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQorICAgICAgICB9OworCisgICAgICAgIC8vIHRoZSBJT1Byb2ZpbGUgY2xhc3MgZGVzY3JpYmVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgYW4gb3V0cHV0IG9yIGlucHV0IHN0cmVhbS4KKyAgICAgICAgLy8gSXQgaXMgY3VycmVudGx5IGFzc3VtZWQgdGhhdCBhbGwgY29tYmluYXRpb24gb2YgbGlzdGVkIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZC4KKyAgICAgICAgLy8gSXQgaXMgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgdG8gZGV0ZXJtaW5lIGlmIGFuIG91dHB1dCBvciBpbnB1dCBpcyBzdWl0YWJsZSBmb3IKKyAgICAgICAgLy8gYSBnaXZlbiB1c2UgY2FzZSwgIG9wZW4vY2xvc2UgaXQgYWNjb3JkaW5nbHkgYW5kIGNvbm5lY3QvZGlzY29ubmVjdCBhdWRpbyB0cmFja3MKKyAgICAgICAgLy8gdG8vZnJvbSBpdC4KKyAgICAgICAgY2xhc3MgSU9Qcm9maWxlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgSU9Qcm9maWxlKEh3TW9kdWxlICptb2R1bGUpOworICAgICAgICAgICAgfklPUHJvZmlsZSgpOworCisgICAgICAgICAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKSBjb25zdDsKKworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbVNhbXBsaW5nUmF0ZXMsIG1DaGFubmVsTWFza3Mgb3IgbUZvcm1hdHMKKyAgICAgICAgICAgIC8vIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgICAgLy8gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgICAgICAgICAgVmVjdG9yIDx1aW50MzJfdD4gbVNhbXBsaW5nUmF0ZXM7IC8vIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcworICAgICAgICAgICAgVmVjdG9yIDxhdWRpb19jaGFubmVsX21hc2tfdD4gbUNoYW5uZWxNYXNrczsgLy8gc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MKKyAgICAgICAgICAgIFZlY3RvciA8YXVkaW9fZm9ybWF0X3Q+IG1Gb3JtYXRzOyAvLyBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0cworICAgICAgICAgICAgRGV2aWNlVmVjdG9yICBtU3VwcG9ydGVkRGV2aWNlczsgLy8gc3VwcG9ydGVkIGRldmljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChkZXZpY2VzIHRoaXMgb3V0cHV0IGNhbiBiZSByb3V0ZWQgdG8pCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7IC8vIGF0dHJpYnV0ZSBmbGFncyAoZS5nIHByaW1hcnkgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0IG91dHB1dC4uLikuIEZvciBvdXRwdXRzIG9ubHkuCisgICAgICAgICAgICBId01vZHVsZSAqbU1vZHVsZTsgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCisgICAgICAgIH07CisKKyAgICAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneQorICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmVzIHBlciBzdHJlYW0gYW5kIGRldmljZSBjYXRlZ29yeS4gU2VlIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQorICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdW0RFVklDRV9DQVRFR09SWV9DTlRdOworCisgICAgICAgIC8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIG91dHB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIG91dHB1dAorICAgICAgICAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBvdXRwdXQgYnkgZWFjaCBhdWRpbyBzdHJlYW0gdHlwZS4KKyAgICAgICAgY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IElPUHJvZmlsZSAqcHJvZmlsZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OworICAgICAgICAgICAgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKKworICAgICAgICAgICAgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiAobU91dHB1dDEgIT0gTlVMTCAmJiBtT3V0cHV0MiAhPSBOVUxMKTsgfQorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3koKTsKKyAgICAgICAgICAgIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyk7CisgICAgICAgICAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgICAgICAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworICAgICAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JZDsgICAgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKKyAgICAgICAgICAgIHVpbnQzMl90IG1TYW1wbGluZ1JhdGU7ICAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OyAgICAgICAgICAgICAvLworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOyAgICAgLy8gb3V0cHV0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIHVpbnQzMl90IG1MYXRlbmN5OyAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7ICAgLy8KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlOyAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8KKyAgICAgICAgICAgIHVpbnQzMl90IG1SZWZDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgLy8gbnVtYmVyIG9mIHN0cmVhbXMgb2YgZWFjaCB0eXBlIHVzaW5nIHRoaXMgb3V0cHV0CisgICAgICAgICAgICBuc2Vjc190IG1TdG9wVGltZVtBVURJT19TVFJFQU1fQ05UXTsKKyAgICAgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqbU91dHB1dDE7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBmaXJzdCBvdXRwdXQKKyAgICAgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqbU91dHB1dDI7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBzZWNvbmQgb3V0cHV0CisgICAgICAgICAgICBmbG9hdCBtQ3VyVm9sdW1lW0FVRElPX1NUUkVBTV9DTlRdOyAgIC8vIGN1cnJlbnQgc3RyZWFtIHZvbHVtZQorICAgICAgICAgICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgorICAgICAgICAgICAgY29uc3QgSU9Qcm9maWxlICptUHJvZmlsZTsgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisgICAgICAgICAgICBib29sIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbTlVNX1NUUkFURUdJRVNdOyAvLyBzdHJhdGVnaWVzIG11dGVkIGJlY2F1c2Ugb2YgaW5jb21wYXRpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2Ugc2VsZWN0aW9uLiBTZWUgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCisgICAgICAgICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKKyAgICAgICAgfTsKKworICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CisgICAgICAgIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIGlucHV0LgorICAgICAgICBjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcgorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IElPUHJvZmlsZSAqcHJvZmlsZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgdWludDMyX3QgbVNhbXBsaW5nUmF0ZTsgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCBjb25maWd1cmF0aW9uCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7ICAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZTsgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgaW5wdXQgaXMgcm91dGVkIHRvCisgICAgICAgICAgICB1aW50MzJfdCBtUmVmQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBBdWRpb1JlY29yZCBjbGllbnRzIHVzaW5nIHRoaXMgb3V0cHV0CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBtSW5wdXRTb3VyY2U7ICAgICAgICAgICAgICAgIC8vIGlucHV0IHNvdXJjZSBzZWxlY3RlZCBieSBhcHBsaWNhdGlvbiAobWVkaWFyZWNvcmRlci5oKQorICAgICAgICAgICAgY29uc3QgSU9Qcm9maWxlICptUHJvZmlsZTsgICAgICAgICAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KKyAgICAgICAgfTsKKworICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvciB1c2VkIGZvciB2b2x1bWUgY29udHJvbAorICAgICAgICBjbGFzcyBTdHJlYW1EZXNjcmlwdG9yCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgU3RyZWFtRGVzY3JpcHRvcigpOworCisgICAgICAgICAgICBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgaW50IG1JbmRleE1pbjsgICAgICAvLyBtaW4gdm9sdW1lIGluZGV4CisgICAgICAgICAgICBpbnQgbUluZGV4TWF4OyAgICAgIC8vIG1heCB2b2x1bWUgaW5kZXgKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7ICAgLy8gY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZQorICAgICAgICAgICAgYm9vbCBtQ2FuQmVNdXRlZDsgICAvLyB0cnVlIGlzIHRoZSBzdHJlYW0gY2FuIGJlIG11dGVkCisKKyAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvciB1c2VkIGZvciB2b2x1bWUgY29udHJvbAorICAgICAgICBjbGFzcyBFZmZlY3REZXNjcmlwdG9yCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorCisgICAgICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGludCBtSW87ICAgICAgICAgICAgICAgIC8vIGlvIHRoZSBlZmZlY3QgaXMgYXR0YWNoZWQgdG8KKyAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bworICAgICAgICAgICAgaW50IG1TZXNzaW9uOyAgICAgICAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBtRGVzYzsgIC8vIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgICAgICAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZTogQ1BVIGxvYWQgYmVpbmcgdXNlZCBvciBub3QKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkIGFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBpZCwgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICBzdGF0aWMgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgLy8gcmV0dXJuIGFwcHJvcHJpYXRlIGRldmljZSBmb3Igc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgYWNjb3JkaW5nIHRvIGN1cnJlbnQKKyAgICAgICAgLy8gcGhvbmUgc3RhdGUsIGNvbm5lY3RlZCBkZXZpY2VzLi4uCisgICAgICAgIC8vIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gbURldmljZUZvclN0cmF0ZWd5W10sCisgICAgICAgIC8vIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmUgYnkgY3VycmVudCBzdGF0ZQorICAgICAgICAvLyAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBhMmRwIG91dHB1dC4uLikKKyAgICAgICAgLy8gVGhpcyBhbGxvd3MgdG86CisgICAgICAgIC8vICAxIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgc3RhdGUgaXMgc3RhYmxlICh3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIGFuIG91dHB1dCkKKyAgICAgICAgLy8gIDIgYWNjZXNzIHRvIGVpdGhlciBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSB0cnVlKSBvcgorICAgICAgICAvLyAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0CisgICAgICAgIC8vICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECisgICAgICAgIC8vICBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKKworICAgICAgICAvLyBjaGFuZ2UgdGhlIHJvdXRlIG9mIHRoZSBzcGVjaWZpZWQgb3V0cHV0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2UgaGF2ZSBzbGVwdCB0bworICAgICAgICAvLyBhbGxvdyBuZXcgcm91dGluZyB0byB0YWtlIGVmZmVjdCBpbiBjZXJ0YWluIGNhc2VzLgorICAgICAgICB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCk7CisKKyAgICAgICAgLy8gc2VsZWN0IGlucHV0IGRldmljZSBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3RlZCBhdWRpbyBzb3VyY2UKKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpOworCisgICAgICAgIC8vIHJldHVybiBpbyBoYW5kbGUgb2YgYWN0aXZlIGlucHV0IG9yIDAgaWYgbm8gaW5wdXQgaXMgYWN0aXZlCisgICAgICAgIC8vICAgIE9ubHkgY29uc2lkZXJzIGlucHV0cyBmcm9tIHBoeXNpY2FsIGRldmljZXMgKGUuZy4gbWFpbiBtaWMsIGhlYWRzZXQgbWljKSB3aGVuCisgICAgICAgIC8vICAgIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0QWN0aXZlSW5wdXQoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzID0gdHJ1ZSk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB2b2x1bWUgY3VydmVzIGZvciBlYWNoIHN0cmF0ZWd5IGFuZCBkZXZpY2UgY2F0ZWdvcnkKKyAgICAgICAgdm9pZCBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCk7CisKKyAgICAgICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHZvbHVtZSBmb3IgYSBnaXZlbiBzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgaW5kZXggYW5kIGEgcGFydGljdWxhcgorICAgICAgICAvLyBkZXZpY2UKKyAgICAgICAgdmlydHVhbCBmbG9hdCBjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBwZXJtaXR0ZWQsIGNvbXB1dGUgYW5kIHNlbmQgbmV3IHZvbHVtZSB0byBhdWRpbyBoYXJkd2FyZQorICAgICAgICBzdGF0dXNfdCBjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBkZWxheU1zID0gMCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKKworICAgICAgICAvLyBhcHBseSBhbGwgc3RyZWFtIHZvbHVtZXMgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgYW5kIGRldmljZQorICAgICAgICB2b2lkIGFwcGx5U3RyZWFtVm9sdW1lcyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBkZWxheU1zID0gMCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKKworICAgICAgICAvLyBNdXRlIG9yIHVubXV0ZSBhbGwgc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgdm9pZCBzZXRTdHJhdGVneU11dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworCisgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworCisgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgd2hpbGUgaW4gY2FsbDogbXV0ZSBzdHJlYW1zIG9yIHJlcGxhY2UgYnkKKyAgICAgICAgLy8gYSBzcGVjaWFsIHRvbmUgaW4gdGhlIGRldmljZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uCisgICAgICAgIHZvaWQgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKTsKKworICAgICAgICAvLyB0cnVlIGlmIGRldmljZSBpcyBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5DYWxsKCk7CisKKyAgICAgICAgLy8gdHJ1ZSBpZiBnaXZlbiBzdGF0ZSByZXByZXNlbnRzIGEgZGV2aWNlIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpOworCisgICAgICAgIC8vIHdoZW4gYSBkZXZpY2UgaXMgY29ubmVjdGVkLCBjaGVja3MgaWYgYW4gb3BlbiBvdXRwdXQgY2FuIGJlIHJvdXRlZAorICAgICAgICAvLyB0byB0aGlzIGRldmljZS4gSWYgbm9uZSBpcyBvcGVuLCB0cmllcyB0byBvcGVuIG9uZSBvZiB0aGUgYXZhaWxhYmxlIG91dHB1dHMuCisgICAgICAgIC8vIFJldHVybnMgYW4gb3V0cHV0IHN1aXRhYmxlIHRvIHRoaXMgZGV2aWNlIG9yIDAuCisgICAgICAgIC8vIHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBjaGVja3MgaWYgYW4gb3V0cHV0IGlzIG5vdCB1c2VkIGFueSBtb3JlIGFuZAorICAgICAgICAvLyByZXR1cm5zIGl0cyBoYW5kbGUgaWYgYW55LgorICAgICAgICAvLyB0cmFuc2ZlcnMgdGhlIGF1ZGlvIHRyYWNrcyBhbmQgZWZmZWN0cyBmcm9tIG9uZSBvdXRwdXQgdGhyZWFkIHRvIGFub3RoZXIgYWNjb3JkaW5nbHkuCisgICAgICAgIHN0YXR1c190IGNoZWNrT3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyk7CisKKyAgICAgICAgLy8gY2xvc2UgYW4gb3V0cHV0IGFuZCBpdHMgY29tcGFuaW9uIGR1cGxpY2F0aW5nIG91dHB1dC4KKyAgICAgICAgdm9pZCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworCisgICAgICAgIC8vIGNoZWNrcyBhbmQgaWYgbmVjZXNzYXJ5IGNoYW5nZXMgb3V0cHV0cyB1c2VkIGZvciBhbGwgc3RyYXRlZ2llcy4KKyAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIG91dHB1dCBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kKKyAgICAgICAgLy8gY2hhbmdlczogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQorICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSk7CisKKyAgICAgICAgLy8gU2FtZSBhcyBjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgYnV0IGZvciBhIGFsbCBzdHJhdGVnaWVzIGluIG9yZGVyIG9mIHByaW9yaXR5CisgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisKKyAgICAgICAgLy8gbWFuYWdlcyBBMkRQIG91dHB1dCBzdXNwZW5kL3Jlc3RvcmUgYWNjb3JkaW5nIHRvIHBob25lIHN0YXRlIGFuZCBCVCBTQ08gdXNhZ2UKKyAgICAgICAgdm9pZCBjaGVja0EyZHBTdXNwZW5kKCk7CisKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgQTJEUCBvdXRwdXQgaGFuZGxlIGlmIGl0IGlzIG9wZW4gb3IgMCBvdGhlcndpc2UKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0QTJkcE91dHB1dCgpOworCisgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIG91dHB1dCBmb3IgY3VycmVudCBzdGF0ZQorICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBvdXRwdXQgaXMKKyAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgb3V0cHV0IHN0YXJ0LCBvdXRwdXQgc3RvcC4uCisgICAgICAgIC8vIHNlZSBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZvciB0aGUgdXNlIG9mIGZyb21DYWNoZSBwYXJhbWV0ZXIKKworICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBmcm9tQ2FjaGUpOworICAgICAgICAvLyB1cGRhdGVzIGNhY2hlIG9mIGRldmljZSB1c2VkIGJ5IGFsbCBzdHJhdGVnaWVzIChtRGV2aWNlRm9yU3RyYXRlZ3lbXSkKKyAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kgaXMKKyAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAvLyBjYWNoZWQgdmFsdWVzIGFyZSB1c2VkIGJ5IGdldERldmljZUZvclN0cmF0ZWd5KCkgaWYgcGFyYW1ldGVyIGZyb21DYWNoZSBpcyB0cnVlLgorICAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKworICAgICAgICB2b2lkIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpOworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKTsKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKKyAgICAgICAgaW50IHRlc3RPdXRwdXRJbmRleChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworICAgICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKEVmZmVjdERlc2NyaXB0b3IgKnBEZXNjLCBib29sIGVuYWJsZWQpOworCisgICAgICAgIC8vIHJldHVybnMgdGhlIGNhdGVnb3J5IHRoZSBkZXZpY2UgYmVsb25ncyB0byB3aXRoIHJlZ2FyZCB0byB2b2x1bWUgY3VydmUgbWFuYWdlbWVudAorICAgICAgICBzdGF0aWMgZGV2aWNlX2NhdGVnb3J5IGdldERldmljZUNhdGVnb3J5KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIC8vIGV4dHJhY3Qgb25lIGRldmljZSByZWxldmFudCBmb3Igdm9sdW1lIGNvbnRyb2wgZnJvbSBtdWx0aXBsZSBkZXZpY2Ugc2VsZWN0aW9uCisgICAgICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBBdWRpb091dHB1dERlc2NyaXB0b3IgKj4gb3Blbk91dHB1dHMpOworICAgICAgICBib29sIHZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMik7CisKKyAgICAgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCisgICAgICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgICAgICAvLyBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQorICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2FpdGVkCisgICAgICAgIHVpbnQzMl90ICBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOworCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICBJT1Byb2ZpbGUgKmdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spOworICAgICAgICBJT1Byb2ZpbGUgKmdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpOworCisgICAgICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKTsKKworICAgICAgICAvLworICAgICAgICAvLyBBdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIHBhcnNpbmcgKGF1ZGlvX3BvbGljeS5jb25mKQorICAgICAgICAvLworICAgICAgICBzdGF0aWMgdWludDMyX3Qgc3RyaW5nVG9FbnVtKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpOworICAgICAgICBzdGF0aWMgYm9vbCBzdHJpbmdUb0Jvb2woY29uc3QgY2hhciAqdmFsdWUpOworICAgICAgICBzdGF0aWMgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgcGFyc2VGbGFnTmFtZXMoY2hhciAqbmFtZSk7CisgICAgICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgcGFyc2VEZXZpY2VOYW1lcyhjaGFyICpuYW1lKTsKKyAgICAgICAgdm9pZCBsb2FkU2FtcGxpbmdSYXRlcyhjaGFyICpuYW1lLCBJT1Byb2ZpbGUgKnByb2ZpbGUpOworICAgICAgICB2b2lkIGxvYWRGb3JtYXRzKGNoYXIgKm5hbWUsIElPUHJvZmlsZSAqcHJvZmlsZSk7CisgICAgICAgIHZvaWQgbG9hZE91dENoYW5uZWxzKGNoYXIgKm5hbWUsIElPUHJvZmlsZSAqcHJvZmlsZSk7CisgICAgICAgIHZvaWQgbG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSwgSU9Qcm9maWxlICpwcm9maWxlKTsKKyAgICAgICAgc3RhdHVzX3QgbG9hZE91dHB1dChjbm9kZSAqcm9vdCwgIEh3TW9kdWxlICptb2R1bGUpOworICAgICAgICBzdGF0dXNfdCBsb2FkSW5wdXQoY25vZGUgKnJvb3QsICBId01vZHVsZSAqbW9kdWxlKTsKKyAgICAgICAgdm9pZCBsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QpOworICAgICAgICB2b2lkIGxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QpOworICAgICAgICB2b2lkIGxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QpOworICAgICAgICBzdGF0dXNfdCBsb2FkQXVkaW9Qb2xpY3lDb25maWcoY29uc3QgY2hhciAqcGF0aCk7CisgICAgICAgIHZvaWQgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKHZvaWQpOworCisKKyAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1wQ2xpZW50SW50ZXJmYWNlOyAgLy8gYXVkaW8gcG9saWN5IGNsaWVudCBpbnRlcmZhY2UKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbVByaW1hcnlPdXRwdXQ7ICAgICAgICAgICAgICAvLyBwcmltYXJ5IG91dHB1dCBoYW5kbGUKKyAgICAgICAgLy8gbGlzdCBvZiBkZXNjcmlwdG9ycyBmb3Igb3V0cHV0cyBjdXJyZW50bHkgb3BlbmVkCisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgQXVkaW9PdXRwdXREZXNjcmlwdG9yICo+IG1PdXRwdXRzOworICAgICAgICAvLyBjb3B5IG9mIG1PdXRwdXRzIGJlZm9yZSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBvcGVucyBuZXcgb3V0cHV0cworICAgICAgICAvLyByZXNldCB0byBtT3V0cHV0cyB3aGVuIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgorICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqPiBtUHJldmlvdXNPdXRwdXRzOworICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIEF1ZGlvSW5wdXREZXNjcmlwdG9yICo+IG1JbnB1dHM7ICAgICAvLyBsaXN0IG9mIGlucHV0IGRlc2NyaXB0b3JzCisgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZU91dHB1dERldmljZXM7IC8vIGJpdCBmaWVsZCBvZiBhbGwgYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCisgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZUlucHV0RGV2aWNlczsgLy8gYml0IGZpZWxkIG9mIGFsbCBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBBVURJT19ERVZJQ0VfQklUX0lOIHRvIGFsbG93IGRpcmVjdCBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGNvbXBhcmlzb25zCisgICAgICAgIGludCBtUGhvbmVTdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBwaG9uZSBzdGF0ZQorICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF07ICAgLy8gY3VycmVudCBmb3JjZWQgdXNlIGNvbmZpZ3VyYXRpb24KKworICAgICAgICBTdHJlYW1EZXNjcmlwdG9yIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9DTlRdOyAgICAgICAgICAgLy8gc3RyZWFtIGRlc2NyaXB0b3JzIGZvciB2b2x1bWUgY29udHJvbAorICAgICAgICBib29sICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbWl0IHJpbmd0b25lIHZvbHVtZSB0byBtdXNpYyB2b2x1bWUgaWYgaGVhZHNldCBjb25uZWN0ZWQKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VGb3JTdHJhdGVneVtOVU1fU1RSQVRFR0lFU107CisgICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCB2b2ljZSB2b2x1bWUgdmFsdWUgc2VudCB0byBhdWRpbyBIQUwKKworICAgICAgICAvLyBNYXhpbXVtIENQVSBsb2FkIGFsbG9jYXRlZCB0byBhdWRpbyBlZmZlY3RzIGluIDAuMSBNSVBTIChBUk12NVRFLCAwIFdTIG1lbW9yeSkgdW5pdHMKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX0NQVV9MT0FEID0gMTAwMDsKKyAgICAgICAgLy8gTWF4aW11bSBtZW1vcnkgYWxsb2NhdGVkIHRvIGF1ZGlvIGVmZmVjdHMgaW4gS0IKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX01FTU9SWSA9IDUxMjsKKyAgICAgICAgdWludDMyX3QgbVRvdGFsRWZmZWN0c0NwdUxvYWQ7IC8vIGN1cnJlbnQgQ1BVIGxvYWQgdXNlZCBieSBlZmZlY3RzCisgICAgICAgIHVpbnQzMl90IG1Ub3RhbEVmZmVjdHNNZW1vcnk7ICAvLyBjdXJyZW50IG1lbW9yeSB1c2VkIGJ5IGVmZmVjdHMKKyAgICAgICAgS2V5ZWRWZWN0b3I8aW50LCBFZmZlY3REZXNjcmlwdG9yICo+IG1FZmZlY3RzOyAgLy8gbGlzdCBvZiByZWdpc3RlcmVkIGF1ZGlvIGVmZmVjdHMKKyAgICAgICAgYm9vbCAgICBtQTJkcFN1c3BlbmRlZDsgIC8vIHRydWUgaWYgQTJEUCBvdXRwdXQgaXMgc3VzcGVuZGVkCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOyAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgYXQgYm9vdCB0aW1lCisgICAgICAgIGJvb2wgbVNwZWFrZXJEcmNFbmFibGVkOy8vIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlIERFVklDRV9DQVRFR09SWV9TUEVBS0VSIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYm9vc3Qgc29mdCBzb3VuZHMsIHVzZWQgdG8gYWRqdXN0IHZvbHVtZSBjdXJ2ZXMgYWNjb3JkaW5nbHkKKworICAgICAgICBWZWN0b3IgPEh3TW9kdWxlICo+IG1Id01vZHVsZXM7CisgICAgICAgIHZvbGF0aWxlIGludDMyX3QgbU5leHRVbmlxdWVJZDsKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgICAgIE11dGV4ICAgbUxvY2s7CisgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKKworICAgICAgICBpbnQgICAgICAgICAgICAgbUN1ck91dHB1dDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQ7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1UZXN0T3V0cHV0c1tOVU1fVEVTVF9PVVRQVVRTXTsKKyAgICAgICAgaW50ICAgICAgICAgICAgIG1UZXN0SW5wdXQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdERldmljZTsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RGb3JtYXQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdENoYW5uZWxzOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RMYXRlbmN5TXM7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCitwcml2YXRlOgorICAgICAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0FtcGwoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKTsKKyAgICAgICAgLy8gdXBkYXRlcyBkZXZpY2UgY2FjaGluZyBhbmQgb3V0cHV0IGZvciBzdHJlYW1zIHRoYXQgY2FuIGluZmx1ZW5jZSB0aGUKKyAgICAgICAgLy8gICAgcm91dGluZyBvZiBub3RpZmljYXRpb25zCisgICAgICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgICAgIHN0YXRpYyBib29sIGlzVmlydHVhbElucHV0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICB1aW50MzJfdCBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgLy8gY29udmVydHMgZGV2aWNlIGFkZHJlc3MgdG8gc3RyaW5nIHNlbnQgdG8gYXVkaW8gSEFMIHZpYSBzZXRQYXJhbWV0ZXJzCisgICAgICAgIHN0YXRpYyBTdHJpbmc4IGFkZHJlc3NUb1BhcmFtZXRlcihhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBTdHJpbmc4IGFkZHJlc3MpOworfTsKKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDYzJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBhMzcyNzJkLi40YTcwOGEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC02MCw3ICs2MCw4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lTZXJ2aWNlKCkKLSAgICA6IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgLCBtcEF1ZGlvUG9saWN5RGV2KE5VTEwpICwgbXBBdWRpb1BvbGljeShOVUxMKQorICAgIDogQm5BdWRpb1BvbGljeVNlcnZpY2UoKSwgbXBBdWRpb1BvbGljeURldihOVUxMKSwgbXBBdWRpb1BvbGljeShOVUxMKSwKKyAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXIoTlVMTCksIG1BdWRpb1BvbGljeUNsaWVudChOVUxMKQogewogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QgKm1vZHVsZTsKQEAgLTc1LDI4ICs3Niw0MCBAQAogICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbUF1ZGlvIiksIHRoaXMpOwogICAgIC8vIHN0YXJ0IG91dHB1dCBhY3Rpdml0eSBjb21tYW5kIHRocmVhZAogICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1PdXRwdXQiKSwgdGhpcyk7CisKKyNpZmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorICAgIEFMT0dJKCJBdWRpb1BvbGljeVNlcnZpY2UgQ1NUT1IgaW4gbGVnYWN5IG1vZGUiKTsKKwogICAgIC8qIGluc3RhbnRpYXRlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciAqLwogICAgIHJjID0gaHdfZ2V0X21vZHVsZShBVURJT19QT0xJQ1lfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKTsKLSAgICBpZiAocmMpCisgICAgaWYgKHJjKSB7CiAgICAgICAgIHJldHVybjsKLQorICAgIH0KICAgICByYyA9IGF1ZGlvX3BvbGljeV9kZXZfb3Blbihtb2R1bGUsICZtcEF1ZGlvUG9saWN5RGV2KTsKICAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IG9wZW4gYXVkaW8gcG9saWN5IGRldmljZSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgaWYgKHJjKQorICAgIGlmIChyYykgewogICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgcmMgPSBtcEF1ZGlvUG9saWN5RGV2LT5jcmVhdGVfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsICZhcHNfb3BzLCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXBBdWRpb1BvbGljeSk7CiAgICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBjcmVhdGUgYXVkaW8gcG9saWN5ICglcykiLCBzdHJlcnJvcigtcmMpKTsKLSAgICBpZiAocmMpCisgICAgaWYgKHJjKSB7CiAgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICByYyA9IG1wQXVkaW9Qb2xpY3ktPmluaXRfY2hlY2sobXBBdWRpb1BvbGljeSk7CiAgICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBpbml0X2NoZWNrIHRoZSBhdWRpbyBwb2xpY3kgKCVzKSIsIHN0cmVycm9yKC1yYykpOwotICAgIGlmIChyYykKKyAgICBpZiAocmMpIHsKICAgICAgICAgcmV0dXJuOwotCisgICAgfQogICAgIEFMT0dJKCJMb2FkZWQgYXVkaW8gcG9saWN5IGZyb20gJXMgKCVzKSIsIG1vZHVsZS0+bmFtZSwgbW9kdWxlLT5pZCk7CisjZWxzZQorICAgIEFMT0dJKCJBdWRpb1BvbGljeVNlcnZpY2UgQ1NUT1IgaW4gbmV3IG1vZGUiKTsKKworICAgIG1BdWRpb1BvbGljeUNsaWVudCA9IG5ldyBBdWRpb1BvbGljeUNsaWVudCh0aGlzKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyID0gbmV3IEF1ZGlvUG9saWN5TWFuYWdlcihtQXVkaW9Qb2xpY3lDbGllbnQpOworI2VuZGlmCiAKICAgICAvLyBsb2FkIGF1ZGlvIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKICAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKQEAgLTEyNiw0NTAgKzEzOSwxOSBAQAogICAgIH0KICAgICBtSW5wdXRzLmNsZWFyKCk7CiAKLSAgICBpZiAobXBBdWRpb1BvbGljeSAhPSBOVUxMICYmIG1wQXVkaW9Qb2xpY3lEZXYgIT0gTlVMTCkKKyNpZmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorICAgIGlmIChtcEF1ZGlvUG9saWN5ICE9IE5VTEwgJiYgbXBBdWRpb1BvbGljeURldiAhPSBOVUxMKSB7CiAgICAgICAgIG1wQXVkaW9Qb2xpY3lEZXYtPmRlc3Ryb3lfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsIG1wQXVkaW9Qb2xpY3kpOwotICAgIGlmIChtcEF1ZGlvUG9saWN5RGV2ICE9IE5VTEwpCisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5RGV2ICE9IE5VTEwpIHsKICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9jbG9zZShtcEF1ZGlvUG9saWN5RGV2KTsKKyAgICB9CisjZWxzZQorICAgIGRlbGV0ZSBtQXVkaW9Qb2xpY3lNYW5hZ2VyOworICAgIGRlbGV0ZSBtQXVkaW9Qb2xpY3lDbGllbnQ7CisjZW5kaWYKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSAmJgotICAgICAgICAgICAgc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9kZXZpY2VfY29ubmVjdGlvbl9zdGF0ZShtcEF1ZGlvUG9saWN5LCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOwotfQotCi1hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RhdGUpID49IEFVRElPX01PREVfQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQUxPR1YoInNldFBob25lU3RhdGUoKSIpOwotCi0gICAgLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgbW9yZSBhcHByb3ByaWF0ZSB0byBkbyBpdCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xpY3kgbWFuYWdlcgotICAgIEF1ZGlvU3lzdGVtOjpzZXRNb2RlKHN0YXRlKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+c2V0X3Bob25lX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIHN0YXRlKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoY29uZmlnIDwgMCB8fCBjb25maWcgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX0NGR19DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR1YoInNldEZvcmNlVXNlKCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9mb3JjZV91c2UobXBBdWRpb1BvbGljeSwgdXNhZ2UsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1hdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOwotICAgIH0KLSAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9mb3JjZV91c2UobXBBdWRpb1BvbGljeSwgdXNhZ2UpOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQUxPR1YoImdldE91dHB1dCgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkiKTsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+c3RvcE91dHB1dENvbW1hbmQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQotewotICAgIEFMT0dWKCJkb1N0b3BPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RvcF9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkiKTsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQob3V0cHV0KTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgQUxPR1YoImRvUmVsZWFzZU91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wQXVkaW9Qb2xpY3ktPnJlbGVhc2Vfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCk7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAotICAgIGlmIChpbnB1dFNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQotICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gbXBBdWRpb1BvbGljeS0+Z2V0X2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCAoYXVkaW9faW5fYWNvdXN0aWNzX3QpIDApOwotCi0gICAgaWYgKGlucHV0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLSAgICAvLyBjcmVhdGUgYXVkaW8gcHJlIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIGlucHV0IHNvdXJjZQotICAgIGF1ZGlvX3NvdXJjZV90IGFsaWFzU291cmNlID0gKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gOiBpbnB1dFNvdXJjZTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRTb3VyY2VzLmluZGV4T2ZLZXkoYWxpYXNTb3VyY2UpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLSAgICBzc2l6ZV90IGlkeCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgSW5wdXREZXNjICppbnB1dERlc2M7Ci0gICAgaWYgKGlkeCA8IDApIHsKLSAgICAgICAgaW5wdXREZXNjID0gbmV3IElucHV0RGVzYyhhdWRpb1Nlc3Npb24pOwotICAgICAgICBtSW5wdXRzLmFkZChpbnB1dCwgaW5wdXREZXNjKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaWR4KTsKLSAgICB9Ci0KLSAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0cyA9IG1JbnB1dFNvdXJjZXMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewotICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBlZmZlY3RzW2ldOwotICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgJmVmZmVjdC0+bVV1aWQsIC0xLCAwLCAwLCBhdWRpb1Nlc3Npb24sIGlucHV0KTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjcmVhdGUgRnggJXMgb24gaW5wdXQgJWQiLCBlZmZlY3QtPm1OYW1lLCBpbnB1dCk7Ci0gICAgICAgICAgICAvLyBmeCBnb2VzIG91dCBvZiBzY29wZSBhbmQgc3Ryb25nIHJlZiBvbiBBdWRpb0VmZmVjdCBpcyByZWxlYXNlZAotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBlZmZlY3QtPm1QYXJhbXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIGZ4LT5zZXRQYXJhbWV0ZXIoZWZmZWN0LT5tUGFyYW1zW2pdKTsKLSAgICAgICAgfQotICAgICAgICBpbnB1dERlc2MtPm1FZmZlY3RzLmFkZChmeCk7Ci0gICAgfQotICAgIHNldFByZVByb2Nlc3NvckVuYWJsZWQoaW5wdXREZXNjLCB0cnVlKTsKLSAgICByZXR1cm4gaW5wdXQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0YXJ0X2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdG9wX2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBJbnB1dERlc2MgKmlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgc2V0UHJlUHJvY2Vzc29yRW5hYmxlZChpbnB1dERlc2MsIGZhbHNlKTsKLSAgICBkZWxldGUgaW5wdXREZXNjOwotICAgIG1JbnB1dHMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcEF1ZGlvUG9saWN5LT5pbml0X3N0cmVhbV92b2x1bWUobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UobXBBdWRpb1BvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZSkgewotICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZShtcEF1ZGlvUG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyZWFtX3ZvbHVtZV9pbmRleChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4KTsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJhdGVneV9mb3Jfc3RyZWFtKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSk7Ci19Ci0KLS8vYXVkaW8gcG9saWN5OiB1c2UgYXVkaW9fZGV2aWNlX3QgYXBwcm9wcmlhdGVseQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9kZXZpY2VzX2Zvcl9zdHJlYW0obXBBdWRpb1BvbGljeSwgc3RyZWFtKTsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfb3V0cHV0X2Zvcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgZGVzYyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5yZWdpc3Rlcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnVucmVnaXN0ZXJfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGlkKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZWZmZWN0X2VuYWJsZWQobXBBdWRpb1BvbGljeSwgaWQsIGVuYWJsZWQpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3N0cmVhbV9hY3RpdmUobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpblBhc3RNcyk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zdHJlYW1fYWN0aXZlX3JlbW90ZWx5KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5QYXN0TXMpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeS0+aXNfc291cmNlX2FjdGl2ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc291cmNlX2FjdGl2ZShtcEF1ZGlvUG9saWN5LCBzb3VyY2UpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoaW50IGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCi17Ci0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgICpjb3VudCA9IDA7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgc2l6ZV90IGluZGV4OwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmIChtSW5wdXRzLnZhbHVlQXQoaW5kZXgpLT5tU2Vzc2lvbklkID09IGF1ZGlvU2Vzc2lvbikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGluZGV4ID09IG1JbnB1dHMuc2l6ZSgpKSB7Ci0gICAgICAgICpjb3VudCA9IDA7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIFZlY3Rvcjwgc3A8QXVkaW9FZmZlY3Q+ID4gZWZmZWN0cyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IGVmZmVjdHNbaV0tPmRlc2NyaXB0b3IoKTsKLSAgICAgICAgaWYgKGkgPCAqY291bnQpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0b3JzW2ldID0gZGVzYzsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZWZmZWN0cy5zaXplKCkgPiAqY291bnQpIHsKLSAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwotICAgIH0KLSAgICAqY291bnQgPSBlZmZlY3RzLnNpemUoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CiAgICAgQUxPR1coImJpbmRlckRpZWQoKSAlcCwgY2FsbGluZyBwaWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLApAQCAtNTk1LDcgKzE3NywxMSBAQAogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCisjaWZkZWYgVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQb2xpY3lNYW5hZ2VyIEludGVyZmFjZTogJXBcbiIsIG1wQXVkaW9Qb2xpY3kpOworI2Vsc2UKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1BvbGljeU1hbmFnZXI6ICVwXG4iLCBtQXVkaW9Qb2xpY3lNYW5hZ2VyKTsKKyNlbmRpZgogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDb21tYW5kIFRocmVhZDogJXBcbiIsIG1BdWRpb0NvbW1hbmRUaHJlYWQuZ2V0KCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKQEAgLTYwNiw3ICsxOTIsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgaWYgKCFkdW1wQWxsb3dlZCgpKSB7CiAgICAgICAgIGR1bXBQZXJtaXNzaW9uRGVuaWFsKGZkKTsKQEAgLTYyNSw5ICsyMTEsMTUgQEAKICAgICAgICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmR1bXAoZmQpOwogICAgICAgICB9CiAKKyNpZmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQogICAgICAgICBpZiAobXBBdWRpb1BvbGljeSkgewogICAgICAgICAgICAgbXBBdWRpb1BvbGljeS0+ZHVtcChtcEF1ZGlvUG9saWN5LCBmZCk7CiAgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5kdW1wKGZkKTsKKyAgICAgICAgfQorI2VuZGlmCiAKICAgICAgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7CiAgICAgfQpAQCAtMTExNCwxMSArNzA2LDEzIEBACiBpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewotICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKQorICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKSB7CiAgICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgdG9uZSByZXF1ZXN0ZWQgKCVkKSIsIHRvbmUpOwotICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpCisgICAgfQorICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKICAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCBzdHJlYW0gKCVkKSByZXF1ZXN0ZWQgZm9yIHRvbmUgJWQiLCBzdHJlYW0sCiAgICAgICAgICAgICB0b25lKTsKKyAgICB9CiAgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjpUT05FX1NVUF9DQUxMX1dBSVRJTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CiAgICAgcmV0dXJuIDA7CkBAIC0xMTM1LDIxICs3MjksNiBAQAogICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvaWNlVm9sdW1lQ29tbWFuZCh2b2x1bWUsIGRlbGF5TXMpOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIm1wQXVkaW9Qb2xpY3kgPT0gTlVMTCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmlzX29mZmxvYWRfc3VwcG9ydGVkID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIkhBTCBkb2VzIG5vdCBpbXBsZW1lbnQgaXNfb2ZmbG9hZF9zdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19vZmZsb2FkX3N1cHBvcnRlZChtcEF1ZGlvUG9saWN5LCAmaW5mbyk7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEF1ZGlvIHByZS1wcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE0NDgsNDIgKzEwMjcsMTggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8qIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHBvbGljeSBtYW5hZ2VyICovCiBleHRlcm4gIkMiIHsKLQotCi1zdGF0aWMgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGFwc19sb2FkX2h3X21vZHVsZSh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+bG9hZEh3TW9kdWxlKG5hbWUpOwotfQotCi0vLyBkZXByZWNhdGVkOiByZXBsYWNlZCBieSBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKCkKLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXQodm9pZCAqc2VydmljZSwKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBhcHNfbG9hZF9od19tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CiAKLSAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQoKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCkwLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UsCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLApAQCAtMTQ5MSwxOTIgKzEwNDYsNjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBhZi0+b3Blbk91dHB1dChtb2R1bGUsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXRlbmN5TXMsIGZsYWdzLCBvZmZsb2FkSW5mbyk7Ci19Ci0KLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9kdXBfb3V0cHV0KHZvaWQgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fZHVwX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gYWYtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0MSwgb3V0cHV0Mik7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX2Nsb3NlX291dHB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgcmV0dXJuIGFmLT5jbG9zZU91dHB1dChvdXRwdXQpOwotfQotCi1zdGF0aWMgaW50IGFwc19zdXNwZW5kX291dHB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5zdXNwZW5kT3V0cHV0KG91dHB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3Jlc3RvcmVfb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPnJlc3RvcmVPdXRwdXQob3V0cHV0KTsKLX0KLQotLy8gZGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgYXBzX29wZW5faW5wdXRfb25fbW9kdWxlKCksIGFuZCBhY291c3RpY3MgcGFyYW1ldGVyIGlzIGlnbm9yZWQKLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dCh2b2lkICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpOworaW50IGFwc19jbG9zZV9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKK2ludCBhcHNfc3VzcGVuZF9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKK2ludCBhcHNfcmVzdG9yZV9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2lucHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljc190IGFjb3VzdGljcykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+b3BlbklucHV0KChhdWRpb19tb2R1bGVfaGFuZGxlX3QpMCwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzayk7Ci19Ci0KLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MgX191bnVzZWQpOworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+b3BlbklucHV0KG1vZHVsZSwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzayk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX2Nsb3NlX2lucHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApCi0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+Y2xvc2VJbnB1dChpbnB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3NldF9zdHJlYW1fb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKQotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPnNldFN0cmVhbU91dHB1dChzdHJlYW0sIG91dHB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX21vdmVfZWZmZWN0cyh2b2lkICpzZXJ2aWNlLCBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzayk7CitpbnQgYXBzX2Nsb3NlX2lucHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKK2ludCBhcHNfaW52YWxpZGF0ZV9zdHJlYW0odm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworaW50IGFwc19tb3ZlX2VmZmVjdHModm9pZCAqc2VydmljZSBfX3VudXNlZCwgaW50IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY19vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdF9vdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgcmV0dXJuIGFmLT5tb3ZlRWZmZWN0cyhzZXNzaW9uLCBzcmNfb3V0cHV0LCBkc3Rfb3V0cHV0KTsKLX0KLQotc3RhdGljIGNoYXIgKiBhcHNfZ2V0X3BhcmFtZXRlcnModm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleXMpCi17Ci0gICAgU3RyaW5nOCByZXN1bHQgPSBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIFN0cmluZzgoa2V5cykpOwotICAgIHJldHVybiBzdHJkdXAocmVzdWx0LnN0cmluZygpKTsKLX0KLQotc3RhdGljIHZvaWQgYXBzX3NldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3ZfcGFpcnMsIGludCBkZWxheV9tcykKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwga3ZfcGFpcnMsIGRlbGF5X21zKTsKLX0KLQotc3RhdGljIGludCBhcHNfc2V0X3N0cmVhbV92b2x1bWUodm9pZCAqc2VydmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdF9vdXRwdXQpOworY2hhciAqIGFwc19nZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5cyk7Cit2b2lkIGFwc19zZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmt2X3BhaXJzLCBpbnQgZGVsYXlfbXMpOworaW50IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpCi17Ci0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKLQotICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9tcyk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3N0YXJ0X3RvbmUodm9pZCAqc2VydmljZSwgYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKLQotICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnN0YXJ0VG9uZSh0b25lLCBzdHJlYW0pOwotfQotCi1zdGF0aWMgaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSkKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RvcFRvbmUoKTsKLX0KLQotc3RhdGljIGludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7Ci19Ci0KLX07IC8vIGV4dGVybiAiQyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpOworaW50IGFwc19zdGFydF90b25lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKK2ludCBhcHNfc3RvcF90b25lKHZvaWQgKnNlcnZpY2UpOworaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKTsKK307CiAKIG5hbWVzcGFjZSB7CiAgICAgc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBhcHNfb3BzID0gewotICAgICAgICBvcGVuX291dHB1dCAgICAgICAgICAgOiBhcHNfb3Blbl9vdXRwdXQsCi0gICAgICAgIG9wZW5fZHVwbGljYXRlX291dHB1dCA6IGFwc19vcGVuX2R1cF9vdXRwdXQsCi0gICAgICAgIGNsb3NlX291dHB1dCAgICAgICAgICA6IGFwc19jbG9zZV9vdXRwdXQsCi0gICAgICAgIHN1c3BlbmRfb3V0cHV0ICAgICAgICA6IGFwc19zdXNwZW5kX291dHB1dCwKLSAgICAgICAgcmVzdG9yZV9vdXRwdXQgICAgICAgIDogYXBzX3Jlc3RvcmVfb3V0cHV0LAotICAgICAgICBvcGVuX2lucHV0ICAgICAgICAgICAgOiBhcHNfb3Blbl9pbnB1dCwKLSAgICAgICAgY2xvc2VfaW5wdXQgICAgICAgICAgIDogYXBzX2Nsb3NlX2lucHV0LAotICAgICAgICBzZXRfc3RyZWFtX3ZvbHVtZSAgICAgOiBhcHNfc2V0X3N0cmVhbV92b2x1bWUsCi0gICAgICAgIHNldF9zdHJlYW1fb3V0cHV0ICAgICA6IGFwc19zZXRfc3RyZWFtX291dHB1dCwKLSAgICAgICAgc2V0X3BhcmFtZXRlcnMgICAgICAgIDogYXBzX3NldF9wYXJhbWV0ZXJzLAotICAgICAgICBnZXRfcGFyYW1ldGVycyAgICAgICAgOiBhcHNfZ2V0X3BhcmFtZXRlcnMsCi0gICAgICAgIHN0YXJ0X3RvbmUgICAgICAgICAgICA6IGFwc19zdGFydF90b25lLAotICAgICAgICBzdG9wX3RvbmUgICAgICAgICAgICAgOiBhcHNfc3RvcF90b25lLAotICAgICAgICBzZXRfdm9pY2Vfdm9sdW1lICAgICAgOiBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSwKLSAgICAgICAgbW92ZV9lZmZlY3RzICAgICAgICAgIDogYXBzX21vdmVfZWZmZWN0cywKLSAgICAgICAgbG9hZF9od19tb2R1bGUgICAgICAgIDogYXBzX2xvYWRfaHdfbW9kdWxlLAotICAgICAgICBvcGVuX291dHB1dF9vbl9tb2R1bGUgOiBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlLAotICAgICAgICBvcGVuX2lucHV0X29uX21vZHVsZSAgOiBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUsCisgICAgICAgIC5vcGVuX291dHB1dCAgICAgICAgICAgPSBhcHNfb3Blbl9vdXRwdXQsCisgICAgICAgIC5vcGVuX2R1cGxpY2F0ZV9vdXRwdXQgPSBhcHNfb3Blbl9kdXBfb3V0cHV0LAorICAgICAgICAuY2xvc2Vfb3V0cHV0ICAgICAgICAgID0gYXBzX2Nsb3NlX291dHB1dCwKKyAgICAgICAgLnN1c3BlbmRfb3V0cHV0ICAgICAgICA9IGFwc19zdXNwZW5kX291dHB1dCwKKyAgICAgICAgLnJlc3RvcmVfb3V0cHV0ICAgICAgICA9IGFwc19yZXN0b3JlX291dHB1dCwKKyAgICAgICAgLm9wZW5faW5wdXQgICAgICAgICAgICA9IGFwc19vcGVuX2lucHV0LAorICAgICAgICAuY2xvc2VfaW5wdXQgICAgICAgICAgID0gYXBzX2Nsb3NlX2lucHV0LAorICAgICAgICAuc2V0X3N0cmVhbV92b2x1bWUgICAgID0gYXBzX3NldF9zdHJlYW1fdm9sdW1lLAorICAgICAgICAuaW52YWxpZGF0ZV9zdHJlYW0gICAgID0gYXBzX2ludmFsaWRhdGVfc3RyZWFtLAorICAgICAgICAuc2V0X3BhcmFtZXRlcnMgICAgICAgID0gYXBzX3NldF9wYXJhbWV0ZXJzLAorICAgICAgICAuZ2V0X3BhcmFtZXRlcnMgICAgICAgID0gYXBzX2dldF9wYXJhbWV0ZXJzLAorICAgICAgICAuc3RhcnRfdG9uZSAgICAgICAgICAgID0gYXBzX3N0YXJ0X3RvbmUsCisgICAgICAgIC5zdG9wX3RvbmUgICAgICAgICAgICAgPSBhcHNfc3RvcF90b25lLAorICAgICAgICAuc2V0X3ZvaWNlX3ZvbHVtZSAgICAgID0gYXBzX3NldF92b2ljZV92b2x1bWUsCisgICAgICAgIC5tb3ZlX2VmZmVjdHMgICAgICAgICAgPSBhcHNfbW92ZV9lZmZlY3RzLAorICAgICAgICAubG9hZF9od19tb2R1bGUgICAgICAgID0gYXBzX2xvYWRfaHdfbW9kdWxlLAorICAgICAgICAub3Blbl9vdXRwdXRfb25fbW9kdWxlID0gYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSwKKyAgICAgICAgLm9wZW5faW5wdXRfb25fbW9kdWxlICA9IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSwKICAgICB9OwogfTsgLy8gbmFtZXNwYWNlIDx1bm5hbWVkPgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaApzaW1pbGFyaXR5IGluZGV4IDc1JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IGFlMDUzYTkuLmNkYzkwZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9Ub25lR2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zOCw3ICs0MCw2IEBACiBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgogICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT4sCiAgICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlLAotLy8gICAgcHVibGljIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlLAogICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogewogICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT47CkBAIC0zMTMsNiArMzE0LDkxIEBACiAgICAgICAgIFZlY3Rvcjwgc3A8QXVkaW9FZmZlY3Q+ID5tRWZmZWN0czsKICAgICB9OwogCisgICAgY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnQgOiBwdWJsaWMgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UKKyAgICB7CisgICAgIHB1YmxpYzoKKyAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnQoQXVkaW9Qb2xpY3lTZXJ2aWNlICpzZXJ2aWNlKSA6IG1BdWRpb1BvbGljeVNlcnZpY2Uoc2VydmljZSkge30KKyAgICAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lDbGllbnQoKSB7fQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEF1ZGlvIEhXIG1vZHVsZSBmdW5jdGlvbnMKKyAgICAgICAgLy8KKworICAgICAgICAvLyBsb2FkcyBhIEhXIG1vZHVsZS4KKyAgICAgICAgdmlydHVhbCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEF1ZGlvIG91dHB1dCBDb250cm9sIGZ1bmN0aW9ucworICAgICAgICAvLworCisgICAgICAgIC8vIG9wZW5zIGFuIGF1ZGlvIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycy4gVGhlIHBhcmFtZXRlciB2YWx1ZXMgY2FuIGluZGljYXRlIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMKKyAgICAgICAgLy8gaW4gY2FzZSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaGFzIG5vIHNwZWNpZmljIHJlcXVpcmVtZW50cyBmb3IgdGhlIG91dHB1dCBiZWluZyBvcGVuZWQuCisgICAgICAgIC8vIFdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHJlZmxlY3QgdGhlIGFjdHVhbCB2YWx1ZXMgdXNlZCBieSB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgLy8gVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiBjaGVjayBpZiB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycyBhcmUgc3VpdGFibGUgb3Igbm90IGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOworICAgICAgICAvLyBjcmVhdGVzIGEgc3BlY2lhbCBvdXRwdXQgdGhhdCBpcyBkdXBsaWNhdGVkIHRvIHRoZSB0d28gb3V0cHV0cyBwYXNzZWQgYXMgYXJndW1lbnRzLiBUaGUgZHVwbGljYXRpb24gaXMgcGVyZm9ybWVkIGJ5CisgICAgICAgIC8vIGEgc3BlY2lhbCBtaXhlciB0aHJlYWQgaW4gdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpOworICAgICAgICAvLyBjbG9zZXMgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgICAgICAvLyBzdXNwZW5kcyB0aGUgb3V0cHV0LiBXaGVuIGFuIG91dHB1dCBpcyBzdXNwZW5kZWQsIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0gaXMgcGxhY2VkIGluCisgICAgICAgIC8vIHN0YW5kYnkgYW5kIHRoZSBBdWRpb1RyYWNrcyBhdHRhY2hlZCB0byB0aGUgbWl4ZXIgdGhyZWFkIGFyZSBzdGlsbCBwcm9jZXNzZWQgYnV0IHRoZSBvdXRwdXQgbWl4IGlzIGRpc2NhcmRlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgIC8vIHJlc3RvcmVzIGEgc3VzcGVuZGVkIG91dHB1dC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXVkaW8gaW5wdXQgQ29udHJvbCBmdW5jdGlvbnMKKyAgICAgICAgLy8KKworICAgICAgICAvLyBvcGVucyBhbiBhdWRpbyBpbnB1dAorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spOworICAgICAgICAvLyBjbG9zZXMgYW4gYXVkaW8gaW5wdXQKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gbWlzYyBjb250cm9sIGZ1bmN0aW9ucworICAgICAgICAvLworCisgICAgICAgIC8vIHNldCBhIHN0cmVhbSB2b2x1bWUgZm9yIGEgcGFydGljdWxhciBvdXRwdXQuIEZvciB0aGUgc2FtZSB1c2VyIHNldHRpbmcsIGEgZ2l2ZW4gc3RyZWFtIHR5cGUgY2FuIGhhdmUgZGlmZmVyZW50IHZvbHVtZXMKKyAgICAgICAgLy8gZm9yIGVhY2ggb3V0cHV0IChkZXN0aW5hdGlvbiBkZXZpY2UpIGl0IGlzIGF0dGFjaGVkIHRvLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7CisKKyAgICAgICAgLy8gaW52YWxpZGF0ZSBhIHN0cmVhbSB0eXBlLCBjYXVzaW5nIGEgcmVyb3V0ZSB0byBhbiB1bnNwZWNpZmllZCBuZXcgb3V0cHV0CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gc2VuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0byBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UuCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICAgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpOworCisgICAgICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZworICAgICAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOworCisgICAgICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKKworICAgICAgICAvLyBtb3ZlIGVmZmVjdCB0byB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCk7CisKKyAgICAgcHJpdmF0ZToKKyAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICptQXVkaW9Qb2xpY3lTZXJ2aWNlOworICAgIH07CisKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtJbnB1dFNvdXJjZU5hbWVzW0FVRElPX1NPVVJDRV9DTlQgLTFdOwogCiAgICAgdm9pZCBzZXRQcmVQcm9jZXNzb3JFbmFibGVkKGNvbnN0IElucHV0RGVzYyAqaW5wdXREZXNjLCBib29sIGVuYWJsZWQpOwpAQCAtMzQ0LDYgKzQzMCw5IEBACiAgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtT3V0cHV0Q29tbWFuZFRocmVhZDsgICAgLy8gcHJvY2VzcyBzdG9wIGFuZCByZWxlYXNlIG91dHB1dAogICAgIHN0cnVjdCBhdWRpb19wb2xpY3lfZGV2aWNlICptcEF1ZGlvUG9saWN5RGV2OwogICAgIHN0cnVjdCBhdWRpb19wb2xpY3kgKm1wQXVkaW9Qb2xpY3k7CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyICptQXVkaW9Qb2xpY3lNYW5hZ2VyOworICAgIEF1ZGlvUG9saWN5Q2xpZW50ICptQXVkaW9Qb2xpY3lDbGllbnQ7CisKICAgICBLZXllZFZlY3RvcjwgYXVkaW9fc291cmNlX3QsIElucHV0U291cmNlRGVzYyogPiBtSW5wdXRTb3VyY2VzOwogICAgIEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgSW5wdXREZXNjKiA+IG1JbnB1dHM7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggNTFiYTY5OC4uMmY0ODViOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCkBAIC0xLDMgKzEsMTcgQEAKKyMgQ29weXJpZ2h0IDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKwogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKICMKQEAgLTUzLDYgKzY3LDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKyAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCiAgICAgZXh0ZXJuYWwvanBlZwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRGV2aWNlRmFjdG9yeS5jcHAKaW5kZXggN2ZkZjMwNC4uYmZlZjUwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRGV2aWNlRmFjdG9yeS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRGV2aWNlRmFjdG9yeS5jcHAKQEAgLTQ2LDYgKzQ2LDggQEAKICAgICAgICAgICAgIGRldmljZSA9IG5ldyBDYW1lcmEyRGV2aWNlKGNhbWVyYUlkKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgICAgZGV2aWNlID0gbmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDljZTdkYWYuLjAyYmNhMWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0xLDI0ICsxLDI0IEBACiAvKgotKioKLSoqIENvcHlyaWdodCAoQykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU2VydmljZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCkBAIC0zMiwxMCArMzIsMTMgQEAKICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KIAogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKICNpbmNsdWRlICJhcGkxL0NhbWVyYUNsaWVudC5oIgpAQCAtMTMwLDYgKzEzMywxMiBAQAogICAgICAgICAgICAgbU1vZHVsZS0+c2V0X2NhbGxiYWNrcyh0aGlzKTsKICAgICAgICAgfQogCisgICAgICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworCisgICAgICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8yKSB7CisgICAgICAgICAgICBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICAgICAgfQorCiAgICAgICAgIENhbWVyYURldmljZUZhY3Rvcnk6OnJlZ2lzdGVyU2VydmljZSh0aGlzKTsKICAgICB9CiB9CkBAIC0xNDEsNiArMTUwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwogICAgIGdDYW1lcmFTZXJ2aWNlID0gTlVMTDsKIH0KIApAQCAtMjY5LDYgKzI3OSwyMiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoLypvdXQqL3NwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjKSB7CisgICAgaWYgKCFtTW9kdWxlKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGhhcmR3YXJlIG1vZHVsZSBkb2Vzbid0IGV4aXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgaWYgKG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMikgeworICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBjaGVjayBvbmNlIEhBTDEgc2hpbSBpcyBpbiBwbGFjZS4KKyAgICAgICAgQUxPR1coIiVzOiBPbmx5IEhBTCBtb2R1bGUgdmVyc2lvbiBWMi4yIG9yIGhpZ2hlciBzdXBwb3J0cyB2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICB9CisKKyAgICBkZXNjID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIHJldHVybiBPSzsKK30KKwogaW50IENhbWVyYVNlcnZpY2U6OmdldERldmljZVZlcnNpb24oaW50IGNhbWVyYUlkLCBpbnQqIGZhY2luZykgewogICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOwogICAgIGlmIChtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKSAhPSBPSykgewpAQCAtMjk4LDYgKzMyNCw4IEBACiAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgogICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zMDYsNiArMzM0LDQ0IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIENhbWVyYVNlcnZpY2U6OnNldFVwVmVuZG9yVGFncygpIHsKKyAgICB2ZW5kb3JfdGFnX29wc190IHZPcHMgPSB2ZW5kb3JfdGFnX29wc190KCk7CisKKyAgICAvLyBDaGVjayBpZiB2ZW5kb3Igb3BlcmF0aW9ucyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQKKyAgICBpZiAobU1vZHVsZS0+Z2V0X3ZlbmRvcl90YWdfb3BzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0koIiVzOiBObyB2ZW5kb3IgdGFncyBkZWZpbmVkIGZvciB0aGlzIGRldmljZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMiKTsKKyAgICBtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMoJnZPcHMpOworICAgIEFUUkFDRV9FTkQoKTsKKworICAgIC8vIEVuc3VyZSBhbGwgdmVuZG9yIG9wZXJhdGlvbnMgYXJlIHByZXNlbnQKKyAgICBpZiAodk9wcy5nZXRfdGFnX2NvdW50ID09IE5VTEwgfHwgdk9wcy5nZXRfYWxsX3RhZ3MgPT0gTlVMTCB8fAorICAgICAgICAgICAgdk9wcy5nZXRfc2VjdGlvbl9uYW1lID09IE5VTEwgfHwgdk9wcy5nZXRfdGFnX25hbWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgdk9wcy5nZXRfdGFnX3R5cGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgb3BlcmF0aW9ucyBub3QgZnVsbHkgZGVmaW5lZC4gSWdub3JpbmcgZGVmaW5pdGlvbnMuIgorICAgICAgICAgICAgICAgLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgorICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2M7CisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICgocmVzID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21PcHMoJnZPcHMsIC8qb3V0Ki9kZXNjKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgorICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCisgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNldCB0aGUgZ2xvYmFsIGRlc2NyaXB0b3IgdG8gdXNlIHdpdGggY2FtZXJhIG1ldGFkYXRhCisgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6c2V0QXNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKGRlc2MpOworICAgIHJldHVybiB0cnVlOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNvbm5lY3QoaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppbm91dCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGNsaWVudFVpZCkgY29uc3QgewpAQCAtNDU1LDYgKzUyMSw4IEBACiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAogICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwKQEAgLTU0MSw2ICs2MDksOCBAQAogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBQcm9DYW1lcmEyQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBTdHJpbmcxNigpLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjYWxsaW5nUGlkLCBVU0VfQ0FMTElOR19VSUQsIGdldHBpZCgpKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjE5LDYgKzY4OSw4IEBACiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYURldmljZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgU3RyaW5nMTYoKSwKICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGZhY2luZywgY2FsbGluZ1BpZCwgVVNFX0NBTExJTkdfVUlELCBnZXRwaWQoKSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTg3Niw3ICs5NDgsNyBAQAogCiBNZWRpYVBsYXllciogQ2FtZXJhU2VydmljZTo6bmV3TWVkaWFQbGF5ZXIoY29uc3QgY2hhciAqZmlsZSkgewogICAgIE1lZGlhUGxheWVyKiBtcCA9IG5ldyBNZWRpYVBsYXllcigpOwotICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgeworICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgewogICAgICAgICBtcC0+c2V0QXVkaW9TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKTsKICAgICAgICAgbXAtPnByZXBhcmUoKTsKICAgICB9IGVsc2UgewpAQCAtMTA0NCw3ICsxMTE2LDggQEAKICAgICAgICAgLy8gUmVzZXQgdGhlIGNsaWVudCBQSUQgdG8gYWxsb3cgc2VydmVyLWluaXRpYXRlZCBkaXNjb25uZWN0LAogICAgICAgICAvLyBhbmQgdG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIGJ5IGNsaWVudC4KICAgICAgICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgbm90aWZ5RXJyb3IoKTsKKyAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7IC8vIGEgZHVtbXkgcmVzdWx0IChpbnZhbGlkKQorICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfU0VSVklDRSwgcmVzdWx0RXh0cmFzKTsKICAgICAgICAgZGlzY29ubmVjdCgpOwogICAgIH0KIH0KQEAgLTEwNzMsNyArMTE0Niw4IEBACiAgICAgcmV0dXJuIGNsaWVudDsKIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeUVycm9yKCkgewordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogICAgIG1SZW1vdGVDYWxsYmFjay0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19FUlJPUiwgQ0FNRVJBX0VSUk9SX1JFTEVBU0VELCAwKTsKIH0KIApAQCAtMTEyNyw3ICsxMjAxLDggQEAKIENhbWVyYVNlcnZpY2U6OlByb0NsaWVudDo6flByb0NsaWVudCgpIHsKIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6Om5vdGlmeUVycm9yKCkgewordm9pZCBDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6Om5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogICAgIG1SZW1vdGVDYWxsYmFjay0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19FUlJPUiwgQ0FNRVJBX0VSUk9SX1JFTEVBU0VELCAwKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IGFkNmE1ODIuLjc2ZWE3YmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTEsMTkgKzEsMTggQEAKIC8qCi0qKgotKiogQ29weXJpZ2h0IChDKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLworICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSApAQCAtMzEsNiArMzAsOCBAQAogI2luY2x1ZGUgPGNhbWVyYS9JUHJvQ2FtZXJhQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KIApAQCAtNzMsNiArNzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoLypvdXQqLyBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLApAQCAtMTgxLDcgKzE4Myw5IEBACiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoQ2FtZXJhT3BzKCk7CiAKICAgICAgICAgLy8gTm90aWZ5IGNsaWVudCBhYm91dCBhIGZhdGFsIGVycm9yCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKICAgICBwcml2YXRlOgogICAgICAgICBBcHBPcHNNYW5hZ2VyICAgICAgICAgICAgICAgICAgIG1BcHBPcHNNYW5hZ2VyOwogCkBAIC0yNTgsNyArMjYyLDggQEAKICAgICAgICAgLy8gY29udmVydCBjbGllbnQgZnJvbSBjb29raWUuIENsaWVudCBsb2NrIHNob3VsZCBiZSBhY3F1aXJlZCBiZWZvcmUgZ2V0dGluZyBDbGllbnQuCiAgICAgICAgIHN0YXRpYyBDbGllbnQqICAgICAgIGdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcik7CiAKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgbm90aWZ5RXJyb3IoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAogICAgICAgICAvLyBJbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgogCkBAIC0zMDYsNyArMzExLDggQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG9uRXhjbHVzaXZlTG9ja1N0b2xlbigpID0gMDsKIAogICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAogICAgICAgICBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiBtUmVtb3RlQ2FsbGJhY2s7CiAgICAgfTsgLy8gY2xhc3MgUHJvQ2xpZW50CkBAIC0zODcsNiArMzkzLDggQEAKICAgICAvLyBIZWxwZXJzCiAKICAgICBib29sICAgICAgICAgICAgICAgIGlzVmFsaWRDYW1lcmFJZChpbnQgY2FtZXJhSWQpOworCisgICAgYm9vbCAgICAgICAgICAgICAgICBzZXRVcFZlbmRvclRhZ3MoKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCmluZGV4IGFmMjM1NTcuLjA0NDc5NzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcApAQCAtMTE4LDcgKzExOCw5IEBACiAgICAgICAgICAgICBtWnNsUHJvY2Vzc29yVGhyZWFkID0genNsUHJvYzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6eworICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOiB7CiAgICAgICAgICAgICBzcDxac2xQcm9jZXNzb3IzPiB6c2xQcm9jID0KICAgICAgICAgICAgICAgICAgICAgbmV3IFpzbFByb2Nlc3NvcjModGhpcywgbUNhcHR1cmVTZXF1ZW5jZXIpOwogICAgICAgICAgICAgbVpzbFByb2Nlc3NvciA9IHpzbFByb2M7CkBAIC0yMzgsNyArMjQwLDcgQEAKIAogICAgIHJlc3VsdC5hcHBlbmQoIiAgICBTY2VuZSBtb2RlOiAiKTsKICAgICBzd2l0Y2ggKHAuc2NlbmVNb2RlKSB7Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ6CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJBVVRPXG4iKTsgYnJlYWs7CiAgICAgICAgIENBU0VfQVBQRU5EX0VOVU0oQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfQUNUSU9OKQogICAgICAgICBDQVNFX0FQUEVORF9FTlVNKEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1BPUlRSQUlUKQpAQCAtODE2LDYgKzgxOCw4IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIG91dHB1dFN0cmVhbXMucHVzaChnZXRac2xTdHJlYW1JZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtWnNsUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKICAgICB9CiAKICAgICBvdXRwdXRTdHJlYW1zLnB1c2goZ2V0UHJldmlld1N0cmVhbUlkKCkpOwpAQCAtMTE2Miw3ICsxMTY2LDcgQEAKICAgICAgICAgICogSGFuZGxlIHF1aXJrIG1vZGUgZm9yIEFGIGluIHNjZW5lIG1vZGVzCiAgICAgICAgICAqLwogICAgICAgICBpZiAobC5tUGFyYW1ldGVycy5xdWlya3MudHJpZ2dlckFmV2l0aEF1dG8gJiYKLSAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnNjZW5lTW9kZSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRCAmJgorICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuc2NlbmVNb2RlICE9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEICYmCiAgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5mb2N1c01vZGUgIT0gUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9BVVRPICYmCiAgICAgICAgICAgICAgICAgIWwubVBhcmFtZXRlcnMuZm9jdXNpbmdBcmVhc1swXS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogUXVpcms6IFN3aXRjaGluZyBmcm9tIGZvY3VzTW9kZSAlZCB0byBBVVRPIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCmluZGV4IGQyYWM3OWMuLmMyNjYyMTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcApAQCAtMTEwLDExICsxMTAsMTMgQEAKICAgICBpZiAoIW1DYWxsYmFja1RvQXBwICYmIG1DYWxsYmFja0NvbnN1bWVyID09IDApIHsKICAgICAgICAgLy8gQ3JlYXRlIENQVSBidWZmZXIgcXVldWUgZW5kcG9pbnQsIHNpbmNlIGFwcCBoYXNuJ3QgZ2l2ZW4gdXMgb25lCiAgICAgICAgIC8vIE1ha2UgaXQgYXN5bmMgdG8gYXZvaWQgZGlzY29ubmVjdCBkZWFkbG9ja3MKLSAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgIG1DYWxsYmFja0NvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGJxLCBrQ2FsbGJhY2tIZWFwQ291bnQpOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgIG1DYWxsYmFja0NvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCBrQ2FsbGJhY2tIZWFwQ291bnQpOwogICAgICAgICBtQ2FsbGJhY2tDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6Q2FsbGJhY2tDb25zdW1lciIpKTsKLSAgICAgICAgbUNhbGxiYWNrV2luZG93ID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICBtQ2FsbGJhY2tXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgfQogCiAgICAgaWYgKG1DYWxsYmFja1N0cmVhbUlkICE9IE5PX1NUUkVBTSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCmluZGV4IGY1YzI4ZWQuLjgyNjhmNjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKQEAgLTEwNiwxMyArMTA2LDEyIEBACiAgICAgfQogfQogCi12b2lkIENhcHR1cmVTZXF1ZW5jZXI6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSkgewotICAgIEFMT0dWKCIlczogTGlzdGVuZXIgZm91bmQgbmV3IGZyYW1lIiwgX19GVU5DVElPTl9fKTsKK3ZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXM6IE5ldyByZXN1bHQgYXZhaWxhYmxlLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwotICAgIG1OZXdGcmFtZUlkID0gcmVxdWVzdElkOwotICAgIG1OZXdGcmFtZSA9IGZyYW1lOworICAgIG1OZXdGcmFtZUlkID0gcmVzdWx0Lm1SZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIG1OZXdGcmFtZSA9IHJlc3VsdC5tTWV0YWRhdGE7CiAgICAgaWYgKCFtTmV3RnJhbWVSZWNlaXZlZCkgewogICAgICAgICBtTmV3RnJhbWVSZWNlaXZlZCA9IHRydWU7CiAgICAgICAgIG1OZXdGcmFtZVNpZ25hbC5zaWduYWwoKTsKQEAgLTU4NSwxMiArNTg0LDE1IEBACiAgICAgICAgIGVudHJ5ID0gbU5ld0ZyYW1lLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJObyB0aW1lc3RhbXAgZmllbGQgaW4gY2FwdHVyZSBmcmFtZSEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW50cnkuZGF0YS5pNjRbMF0gIT0gbUNhcHR1cmVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIEFMT0dXKCJNaXNtYXRjaGVkIGNhcHR1cmUgdGltZXN0YW1wczogTWV0YWRhdGEgZnJhbWUgJSIgUFJJZDY0ICIsIgotICAgICAgICAgICAgICAgICAgICAiIGNhcHR1cmVkIGJ1ZmZlciAlIiBQUklkNjQsCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTY0WzBdLAotICAgICAgICAgICAgICAgICAgICBtQ2FwdHVyZVRpbWVzdGFtcCk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEuaTY0WzBdICE9IG1DYXB0dXJlVGltZXN0YW1wKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk1pc21hdGNoZWQgY2FwdHVyZSB0aW1lc3RhbXBzOiBNZXRhZGF0YSBmcmFtZSAlIiBQUklkNjQgIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGNhcHR1cmVkIGJ1ZmZlciAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmk2NFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlVGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJUaW1lc3RhbXAgbWV0YWRhdGEgaXMgbWFsZm9ybWVkISIpOwogICAgICAgICB9CiAgICAgICAgIGNsaWVudC0+cmVtb3ZlRnJhbWVMaXN0ZW5lcihtQ2FwdHVyZUlkLCBtQ2FwdHVyZUlkICsgMSwgdGhpcyk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCmluZGV4IDlmYjRlZTcuLmQ0MmFiMTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CiAjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCIKICNpbmNsdWRlICJQYXJhbWV0ZXJzLmgiCiAjaW5jbHVkZSAiRnJhbWVQcm9jZXNzb3IuaCIKIApAQCAtNjEsOCArNjIsOCBAQAogICAgIC8vIE5vdGlmaWNhdGlvbnMgYWJvdXQgQUUgc3RhdGUgY2hhbmdlcwogICAgIHZvaWQgbm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwogCi0gICAgLy8gTm90aWZpY2F0aW9ucyBmcm9tIHRoZSBmcmFtZSBwcm9jZXNzb3IKLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKTsKKyAgICAvLyBOb3RpZmljYXRpb24gZnJvbSB0aGUgZnJhbWUgcHJvY2Vzc29yCisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCk7CiAKICAgICAvLyBOb3RpZmljYXRpb25zIGZyb20gdGhlIEpQRUcgcHJvY2Vzc29yCiAgICAgdm9pZCBvbkNhcHR1cmVBdmFpbGFibGUobnNlY3NfdCB0aW1lc3RhbXAsIHNwPE1lbW9yeUJhc2U+IGNhcHR1cmVCdWZmZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKaW5kZXggZGQ1YjI3Yy4uNjliZWEyNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCkBAIC01NSw3ICs1NSw3IEBACiBGcmFtZVByb2Nlc3Nvcjo6fkZyYW1lUHJvY2Vzc29yKCkgewogfQogCi1ib29sIEZyYW1lUHJvY2Vzc29yOjpwcm9jZXNzU2luZ2xlRnJhbWUoQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorYm9vbCBGcmFtZVByb2Nlc3Nvcjo6cHJvY2Vzc1NpbmdsZUZyYW1lKENhcHR1cmVSZXN1bHQgJmZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKIAogICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOwpAQCAtNjYsMTkgKzY2LDE5IEBACiAgICAgYm9vbCBwYXJ0aWFsUmVzdWx0ID0gZmFsc2U7CiAgICAgaWYgKG1Vc2VQYXJ0aWFsUXVpcmspIHsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7Ci0gICAgICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCk7CisgICAgICAgIGVudHJ5ID0gZnJhbWUubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOwogICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwICYmCiAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS51OFswXSA9PSBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMKSB7CiAgICAgICAgICAgICBwYXJ0aWFsUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghcGFydGlhbFJlc3VsdCAmJiBwcm9jZXNzRmFjZURldGVjdChmcmFtZSwgY2xpZW50KSAhPSBPSykgeworICAgIGlmICghcGFydGlhbFJlc3VsdCAmJiBwcm9jZXNzRmFjZURldGVjdChmcmFtZS5tTWV0YWRhdGEsIGNsaWVudCkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmIChtU3ludGhlc2l6ZTNBTm90aWZ5KSB7Ci0gICAgICAgIHByb2Nlc3MzYVN0YXRlKGZyYW1lLCBjbGllbnQpOworICAgICAgICBwcm9jZXNzM2FTdGF0ZShmcmFtZS5tTWV0YWRhdGEsIGNsaWVudCk7CiAgICAgfQogCiAgICAgcmV0dXJuIEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc1NpbmdsZUZyYW1lKGZyYW1lLCBkZXZpY2UpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAppbmRleCA4NTZhZDMyLi41MTRiZDFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaApAQCAtNTEsNyArNTEsNyBAQAogCiAgICAgdm9pZCBwcm9jZXNzTmV3RnJhbWVzKGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpOwogCi0gICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCisgICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYXB0dXJlUmVzdWx0ICZmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpOwogCiAgICAgc3RhdHVzX3QgcHJvY2Vzc0ZhY2VEZXRlY3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IDJkZTdhMmIuLjk2NGQyNzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTgzLDExICs4MywxMyBAQAogCiAgICAgaWYgKG1DYXB0dXJlQ29uc3VtZXIgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludAotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbUNhcHR1cmVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihicSwgMSk7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbUNhcHR1cmVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgMSk7CiAgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6Q2FwdHVyZUNvbnN1bWVyIikpOwotICAgICAgICBtQ2FwdHVyZVdpbmRvdyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgbUNhcHR1cmVXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgICAgIC8vIENyZWF0ZSBtZW1vcnkgZm9yIEFQSSBjb25zdW1wdGlvbgogICAgICAgICBtQ2FwdHVyZUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UobWF4SnBlZ1NpemUuZGF0YS5pMzJbMF0sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhMkNsaWVudDo6Q2FwdHVyZUhlYXAiKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCAwNzY1NGMwLi41YmZiOTY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMi1QYXJhbWV0ZXJzIgogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAorLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KQEAgLTkyLDYgKzkyLDI2IEBACiAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX0FFX0FWQUlMQUJMRV9UQVJHRVRfRlBTX1JBTkdFUywgMik7CiAgICAgaWYgKCFhdmFpbGFibGVGcHNSYW5nZXMuY291bnQpIHJldHVybiBOT19JTklUOwogCisgICAgcHJldmlld0Zwc1JhbmdlWzBdID0gYXZhaWxhYmxlRnBzUmFuZ2VzLmRhdGEuaTMyWzBdOworICAgIHByZXZpZXdGcHNSYW5nZVsxXSA9IGF2YWlsYWJsZUZwc1Jhbmdlcy5kYXRhLmkzMlsxXTsKKworICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlBTX1JBTkdFLAorICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCwlZCIsCisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdGcHNSYW5nZVswXSAqIGtGcHNUb0FwaVNjYWxlLAorICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RnBzUmFuZ2VbMV0gKiBrRnBzVG9BcGlTY2FsZSkpOworCisgICAgeworICAgICAgICBTdHJpbmc4IHN1cHBvcnRlZFByZXZpZXdGcHNSYW5nZTsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlRnBzUmFuZ2VzLmNvdW50OyBpICs9IDIpIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApIHN1cHBvcnRlZFByZXZpZXdGcHNSYW5nZSArPSAiLCI7CisgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3RnBzUmFuZ2UgKz0gU3RyaW5nODo6Zm9ybWF0KCIoJWQsJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlRnBzUmFuZ2VzLmRhdGEuaTMyW2ldICoga0Zwc1RvQXBpU2NhbGUsCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUZwc1Jhbmdlcy5kYXRhLmkzMltpKzFdICoga0Zwc1RvQXBpU2NhbGUpOworICAgICAgICB9CisgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QUkVWSUVXX0ZQU19SQU5HRSwKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3RnBzUmFuZ2UpOworICAgIH0KKwogICAgIHByZXZpZXdGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9QUkVWSUVXX0ZPUk1BVCwKICAgICAgICAgICAgIGZvcm1hdEVudW1Ub1N0cmluZyhwcmV2aWV3Rm9ybWF0KSk7IC8vIE5WMjEKQEAgLTE1OSw5ICsxNzksNiBAQAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzKTsKICAgICB9CiAKLSAgICBwcmV2aWV3RnBzUmFuZ2VbMF0gPSBhdmFpbGFibGVGcHNSYW5nZXMuZGF0YS5pMzJbMF07Ci0gICAgcHJldmlld0Zwc1JhbmdlWzFdID0gYXZhaWxhYmxlRnBzUmFuZ2VzLmRhdGEuaTMyWzFdOwotCiAgICAgLy8gUFJFVklFV19GUkFNRV9SQVRFIC8gU1VQUE9SVEVEX1BSRVZJRVdfRlJBTUVfUkFURVMgYXJlIGRlcHJlY2F0ZWQsIGJ1dAogICAgIC8vIHN0aWxsIGhhdmUgdG8gZG8gc29tZXRoaW5nIHNhbmUgZm9yIHRoZW0KIApAQCAtMTcwLDI3ICsxODcsNiBAQAogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlJBTUVfUkFURSwKICAgICAgICAgICAgIHByZXZpZXdGcHMpOwogCi0gICAgLy8gUFJFVklFV19GUFNfUkFOR0UKLSAgICAvLyAtLSBPcmRlciBtYXR0ZXJzLiBTZXQgcmFuZ2UgYWZ0ZXIgc2luZ2xlIHZhbHVlIHRvIHNvIHRoYXQgYSByb3VuZHRyaXAKLSAgICAvLyAgICBvZiBzZXRQYXJhbWV0ZXJzKGdldFBhcmFtZXRlcnMoKSkgd291bGQga2VlcCB0aGUgRlBTIHJhbmdlIGluIGhpZ2hlcgotICAgIC8vICAgIG9yZGVyLgotICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlBTX1JBTkdFLAotICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCwlZCIsCi0gICAgICAgICAgICAgICAgICAgIHByZXZpZXdGcHNSYW5nZVswXSAqIGtGcHNUb0FwaVNjYWxlLAotICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RnBzUmFuZ2VbMV0gKiBrRnBzVG9BcGlTY2FsZSkpOwotCi0gICAgewotICAgICAgICBTdHJpbmc4IHN1cHBvcnRlZFByZXZpZXdGcHNSYW5nZTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlRnBzUmFuZ2VzLmNvdW50OyBpICs9IDIpIHsKLSAgICAgICAgICAgIGlmIChpICE9IDApIHN1cHBvcnRlZFByZXZpZXdGcHNSYW5nZSArPSAiLCI7Ci0gICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3RnBzUmFuZ2UgKz0gU3RyaW5nODo6Zm9ybWF0KCIoJWQsJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlRnBzUmFuZ2VzLmRhdGEuaTMyW2ldICoga0Zwc1RvQXBpU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUZwc1Jhbmdlcy5kYXRhLmkzMltpKzFdICoga0Zwc1RvQXBpU2NhbGUpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QUkVWSUVXX0ZQU19SQU5HRSwKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3RnBzUmFuZ2UpOwotICAgIH0KLQogICAgIHsKICAgICAgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IHNvcnRlZFByZXZpZXdGcmFtZVJhdGVzOwogCkBAIC00NzAsNyArNDY2LDcgQEAKICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRBbnRpYmFuZGluZyk7CiAgICAgfQogCi0gICAgc2NlbmVNb2RlID0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQ7CisgICAgc2NlbmVNb2RlID0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ7CiAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU0NFTkVfTU9ERSwKICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OlNDRU5FX01PREVfQVVUTyk7CiAKQEAgLTQ4Niw3ICs0ODIsNyBAQAogICAgICAgICAgICAgaWYgKGFkZENvbW1hKSBzdXBwb3J0ZWRTY2VuZU1vZGVzICs9ICIsIjsKICAgICAgICAgICAgIGFkZENvbW1hID0gdHJ1ZTsKICAgICAgICAgICAgIHN3aXRjaCAoYXZhaWxhYmxlU2NlbmVNb2Rlcy5kYXRhLnU4W2ldKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDoKKyAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOgogICAgICAgICAgICAgICAgICAgICBub1NjZW5lTW9kZXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0ZBQ0VfUFJJT1JJVFk6CkBAIC02NjgsMTMgKzY2NCwxMyBAQAogICAgIGZvY3VzU3RhdGUgPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfSU5BQ1RJVkU7CiAgICAgc2hhZG93Rm9jdXNNb2RlID0gRk9DVVNfTU9ERV9JTlZBTElEOwogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWF4M2FSZWdpb25zID0KLSAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsIDEsIDEpOwotICAgIGlmICghbWF4M2FSZWdpb25zLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBtYXgzYVJlZ2lvbnMgPSBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pOworICAgIGlmIChtYXgzYVJlZ2lvbnMuY291bnQgIT0gUGFyYW1ldGVyczo6TlVNX1JFR0lPTikgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICBpbnQzMl90IG1heE51bUZvY3VzQXJlYXMgPSAwOwogICAgIGlmIChmb2N1c01vZGUgIT0gUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9GSVhFRCkgewotICAgICAgICBtYXhOdW1Gb2N1c0FyZWFzID0gbWF4M2FSZWdpb25zLmRhdGEuaTMyWzBdOworICAgICAgICBtYXhOdW1Gb2N1c0FyZWFzID0gbWF4M2FSZWdpb25zLmRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRl07CiAgICAgfQogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9OVU1fRk9DVVNfQVJFQVMsIG1heE51bUZvY3VzQXJlYXMpOwogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0FSRUFTLApAQCAtNzM0LDcgKzczMCw3IEBACiAKICAgICBtZXRlcmluZ0FyZWFzLmFkZChQYXJhbWV0ZXJzOjpBcmVhKDAsIDAsIDAsIDAsIDApKTsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NQVhfTlVNX01FVEVSSU5HX0FSRUFTLAotICAgICAgICAgICAgbWF4M2FSZWdpb25zLmRhdGEuaTMyWzBdKTsKKyAgICAgICAgICAgIG1heDNhUmVnaW9ucy5kYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQUVdKTsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NRVRFUklOR19BUkVBUywKICAgICAgICAgICAgICIoMCwwLDAsMCwwKSIpOwogCkBAIC0xMDg4LDcgKzEwODQsNyBAQAogc3RhdHVzX3QgUGFyYW1ldGVyczo6c2V0KGNvbnN0IFN0cmluZzgmIHBhcmFtU3RyaW5nKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCi0gICAgQ2FtZXJhUGFyYW1ldGVyczIgbmV3UGFyYW1zKHBhcmFtU3RyaW5nKTsKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIG5ld1BhcmFtcyhwYXJhbVN0cmluZyk7CiAKICAgICAvLyBUT0RPOiBDdXJyZW50bHkgaWdub3JpbmcgYW55IGNoYW5nZXMgdG8gc3VwcG9zZWRseSByZWFkLW9ubHkgcGFyYW1ldGVycwogICAgIC8vIHN1Y2ggYXMgc3VwcG9ydGVkIHByZXZpZXcgc2l6ZXMsIGV0Yy4gU2hvdWxkIHByb2JhYmx5IHByb2R1Y2UgYW4gZXJyb3IgaWYKQEAgLTExMzEsNzMgKzExMjcsMjkgQEAKICAgICAvLyBSRUNPUkRJTkdfSElOVCAoYWx3YXlzIHN1cHBvcnRlZCkKICAgICB2YWxpZGF0ZWRQYXJhbXMucmVjb3JkaW5nSGludCA9IGJvb2xGcm9tU3RyaW5nKAogICAgICAgICBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9SRUNPUkRJTkdfSElOVCkgKTsKLSAgICBJRl9BTE9HVigpIHsgLy8gQXZvaWQgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcKLSAgICAgICAgYm9vbCByZWNvcmRpbmdIaW50Q2hhbmdlZCA9Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnJlY29yZGluZ0hpbnQgIT0gcmVjb3JkaW5nSGludDsKLSAgICAgICAgaWYgKHJlY29yZGluZ0hpbnRDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXM6IFJlY29yZGluZyBoaW50IGNoYW5nZWQgdG8gJWQiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB2YWxpZGF0ZWRQYXJhbXMucmVjb3JkaW5nSGludCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgYm9vbCByZWNvcmRpbmdIaW50Q2hhbmdlZCA9IHZhbGlkYXRlZFBhcmFtcy5yZWNvcmRpbmdIaW50ICE9IHJlY29yZGluZ0hpbnQ7CisgICAgQUxPR1ZfSUYocmVjb3JkaW5nSGludENoYW5nZWQsICIlczogUmVjb3JkaW5nIGhpbnQgY2hhbmdlZCB0byAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlY29yZGluZ0hpbnRDaGFuZ2VkKTsKIAogICAgIC8vIFBSRVZJRVdfRlBTX1JBTkdFCisgICAgYm9vbCBmcHNSYW5nZUNoYW5nZWQgPSBmYWxzZTsKKyAgICBpbnQzMl90IGxhc3RTZXRGcHNSYW5nZVsyXTsKIAotICAgIC8qKgotICAgICAqIFVzZSB0aGUgc2luZ2xlIEZQUyB2YWx1ZSBpZiBpdCB3YXMgc2V0IGxhdGVyIHRoYW4gdGhlIHJhbmdlLgotICAgICAqIE90aGVyd2lzZSwgdXNlIHRoZSByYW5nZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBib29sIGZwc1VzZVNpbmdsZVZhbHVlOwotICAgIHsKLSAgICAgICAgY29uc3QgY2hhciAqZnBzUmFuZ2UsICpmcHNTaW5nbGU7CisgICAgcGFyYW1zLmdldFByZXZpZXdGcHNSYW5nZSgmbGFzdFNldEZwc1JhbmdlWzBdLCAmbGFzdFNldEZwc1JhbmdlWzFdKTsKKyAgICBsYXN0U2V0RnBzUmFuZ2VbMF0gLz0ga0Zwc1RvQXBpU2NhbGU7CisgICAgbGFzdFNldEZwc1JhbmdlWzFdIC89IGtGcHNUb0FwaVNjYWxlOwogCi0gICAgICAgIGZwc1JhbmdlID0gbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19GUkFNRV9SQVRFKTsKLSAgICAgICAgZnBzU2luZ2xlID0gbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19GUFNfUkFOR0UpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQaWNrIGVpdGhlciB0aGUgcmFuZ2Ugb3IgdGhlIHNpbmdsZSBrZXkgaWYgb25seSBvbmUgd2FzIHNldC4KLSAgICAgICAgICoKLSAgICAgICAgICogSWYgYm90aCBhcmUgc2V0LCBwaWNrIHRoZSBvbmUgdGhhdCBoYXMgZ3JlYXRlciBzZXQgb3JkZXIuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZnBzUmFuZ2UgPT0gTlVMTCAmJiBmcHNTaW5nbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGUFMgd2FzIG5vdCBzZXQuIE9uZSBvZiAlcyBvciAlcyBtdXN0IGJlIHNldC4iLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19GUkFNRV9SQVRFLAotICAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlBTX1JBTkdFKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZnBzUmFuZ2UgPT0gTlVMTCkgewotICAgICAgICAgICAgZnBzVXNlU2luZ2xlVmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgQUxPR1YoIiVzOiBGUFMgcmFuZ2Ugbm90IHNldCwgdXNpbmcgRlBTIHNpbmdsZSB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICB9IGVsc2UgaWYgKGZwc1NpbmdsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmcHNVc2VTaW5nbGVWYWx1ZSA9IGZhbHNlOwotICAgICAgICAgICAgQUxPR1YoIiVzOiBGUFMgc2luZ2xlIG5vdCBzZXQsIHVzaW5nIEZQUyByYW5nZSB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGZwc0tleU9yZGVyOwotICAgICAgICAgICAgcmVzID0gbmV3UGFyYW1zLmNvbXBhcmVTZXRPcmRlcigKLSAgICAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlJBTUVfUkFURSwKLSAgICAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlBTX1JBTkdFLAotICAgICAgICAgICAgICAgICAgICAmZnBzS2V5T3JkZXIpOwotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXMgIT0gT0ssICJJbXBvc3NpYmx5IGJhZCBGUFMga2V5cyIpOwotCi0gICAgICAgICAgICBmcHNVc2VTaW5nbGVWYWx1ZSA9IChmcHNLZXlPcmRlciA+IDApOwotCi0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigiJXM6IFByZXZpZXcgRlBTIHZhbHVlIGlzIHVzZWQgZnJvbSAnJXMnIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmcHNVc2VTaW5nbGVWYWx1ZSA/ICJzaW5nbGUiIDogInJhbmdlIik7Ci0gICAgfQogICAgIG5ld1BhcmFtcy5nZXRQcmV2aWV3RnBzUmFuZ2UoJnZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3RnBzUmFuZ2VbMF0sCiAgICAgICAgICAgICAmdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGcHNSYW5nZVsxXSk7Ci0KICAgICB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zwc1JhbmdlWzBdIC89IGtGcHNUb0FwaVNjYWxlOwogICAgIHZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3RnBzUmFuZ2VbMV0gLz0ga0Zwc1RvQXBpU2NhbGU7CiAKLSAgICAvLyBJZ25vcmUgdGhlIEZQUyByYW5nZSBpZiB0aGUgRlBTIHNpbmdsZSBoYXMgaGlnaGVyIHByZWNlZGVuY2UKLSAgICBpZiAoIWZwc1VzZVNpbmdsZVZhbHVlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogUHJldmlldyBGUFMgcmFuZ2UgKCVkLCAlZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGcHNSYW5nZVswXSwKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zwc1JhbmdlWzFdKTsKKyAgICAvLyBDb21wYXJlIHRoZSBGUFMgcmFuZ2UgdmFsdWUgZnJvbSB0aGUgbGFzdCBzZXQoKSB0byB0aGUgY3VycmVudCBzZXQoKQorICAgIC8vIHRvIGRldGVybWluZSBpZiB0aGUgY2xpZW50IGhhcyBjaGFuZ2VkIGl0CisgICAgaWYgKHZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3RnBzUmFuZ2VbMF0gIT0gbGFzdFNldEZwc1JhbmdlWzBdIHx8CisgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zwc1JhbmdlWzFdICE9IGxhc3RTZXRGcHNSYW5nZVsxXSkgewogCisgICAgICAgIGZwc1JhbmdlQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVByZXZpZXdGcHNSYW5nZXMgPQogICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfQUVfQVZBSUxBQkxFX1RBUkdFVF9GUFNfUkFOR0VTLCAyKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZVByZXZpZXdGcHNSYW5nZXMuY291bnQ7IGkgKz0gMikgewpAQCAtMTI0OCwxMyArMTIwMCwxNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gUFJFVklFV19GUkFNRV9SQVRFIERlcHJlY2F0ZWQKLSAgICAvLyAtIFVzZSBvbmx5IGlmIHRoZSBzaW5nbGUgRlBTIHZhbHVlIHdhcyBzZXQgbGF0ZXIgdGhhbiB0aGUgRlBTIHJhbmdlCi0gICAgaWYgKGZwc1VzZVNpbmdsZVZhbHVlKSB7CisgICAgLy8gUFJFVklFV19GUkFNRV9SQVRFIERlcHJlY2F0ZWQsIG9ubHkgdXNlIGlmIHRoZSBwcmV2aWV3IGZwcyByYW5nZSBpcworICAgIC8vIHVuY2hhbmdlZCB0aGlzIHRpbWUuICBUaGUgc2luZ2xlLXZhbHVlIEZQUyBpcyB0aGUgc2FtZSBhcyB0aGUgbWluaW11bSBvZgorICAgIC8vIHRoZSByYW5nZS4gIFRvIGRldGVjdCB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBoYXMgY2hhbmdlZCB0aGUgdmFsdWUgb2YKKyAgICAvLyBwcmV2aWV3RnBzLCBjb21wYXJlIGFnYWluc3QgdGhlaXIgbGFzdC1zZXQgcHJldmlldyBGUFMuCisgICAgaWYgKCFmcHNSYW5nZUNoYW5nZWQpIHsKICAgICAgICAgaW50IHByZXZpZXdGcHMgPSBuZXdQYXJhbXMuZ2V0UHJldmlld0ZyYW1lUmF0ZSgpOwotICAgICAgICBBTE9HVigiJXM6IFByZXZpZXcgRlBTIHNpbmdsZSB2YWx1ZSByZXF1ZXN0ZWQ6ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcmV2aWV3RnBzKTsKLSAgICAgICAgeworICAgICAgICBpbnQgbGFzdFNldFByZXZpZXdGcHMgPSBwYXJhbXMuZ2V0UHJldmlld0ZyYW1lUmF0ZSgpOworICAgICAgICBpZiAocHJldmlld0ZwcyAhPSBsYXN0U2V0UHJldmlld0ZwcyB8fCByZWNvcmRpbmdIaW50Q2hhbmdlZCkgewogICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRnJhbWVSYXRlcyA9CiAgICAgICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfQUVfQVZBSUxBQkxFX1RBUkdFVF9GUFNfUkFOR0VTKTsKICAgICAgICAgICAgIC8qKgpAQCAtMTMyMywzNSArMTI3Niw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBVcGRhdGUgUHJldmlldyBGUFMgYW5kIFByZXZpZXcgRlBTIHJhbmdlcyBiYXNlZCBvbgotICAgICAqIHdoYXQgd2UgYWN0dWFsbHkgc2V0LgotICAgICAqCi0gICAgICogVGhpcyB1cGRhdGVzIHRoZSBBUEktdmlzaWJsZSAoQ2FtZXJhLlBhcmFtZXRlcnMjZ2V0UGFyYW1ldGVycykgdmFsdWVzIG9mCi0gICAgICogdGhlIEZQUyBmaWVsZHMsIG5vdCBvbmx5IHRoZSBpbnRlcm5hbCB2ZXJzaW9ucy4KLSAgICAgKgotICAgICAqIE9yZGVyIG1hdHRlcnM6IFRoZSB2YWx1ZSB0aGF0IHdhcyBzZXQgbGFzdCB0YWtlcyBwcmVjZWRlbmNlLgotICAgICAqIC0gSWYgdGhlIGNsaWVudCBkb2VzIGEgc2V0UGFyYW1ldGVycyhnZXRQYXJhbWV0ZXJzKCkpIHdlIHJldGFpbgotICAgICAqICAgdGhlIHNhbWUgb3JkZXIgZm9yIHByZXZpZXcgRlBTLgotICAgICAqLwotICAgIGlmICghZnBzVXNlU2luZ2xlVmFsdWUpIHsKLSAgICAgICAgLy8gU2V0IGZwcyBzaW5nbGUsIHRoZW4gZnBzIHJhbmdlIChyYW5nZSB3aW5zKQotICAgICAgICBuZXdQYXJhbXMuc2V0UHJldmlld0ZyYW1lUmF0ZSgKLSAgICAgICAgICAgICAgICBmcHNGcm9tUmFuZ2UoLyptaW4qL3ZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3RnBzUmFuZ2VbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4Ki92YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zwc1JhbmdlWzFdKSk7Ci0gICAgICAgIG5ld1BhcmFtcy5zZXRQcmV2aWV3RnBzUmFuZ2UoCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGcHNSYW5nZVswXSAqIGtGcHNUb0FwaVNjYWxlLAotICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3RnBzUmFuZ2VbMV0gKiBrRnBzVG9BcGlTY2FsZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gU2V0IGZwcyByYW5nZSwgdGhlbiBmcHMgc2luZ2xlIChzaW5nbGUgd2lucykKLSAgICAgICAgbmV3UGFyYW1zLnNldFByZXZpZXdGcHNSYW5nZSgKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zwc1JhbmdlWzBdICoga0Zwc1RvQXBpU2NhbGUsCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGcHNSYW5nZVsxXSAqIGtGcHNUb0FwaVNjYWxlKTsKLSAgICAgICAgLy8gU2V0IHRoaXMgdG8gdGhlIHNhbWUgdmFsdWUsIGJ1dCB3aXRoIGhpZ2hlciBwcmlvcml0eQotICAgICAgICBuZXdQYXJhbXMuc2V0UHJldmlld0ZyYW1lUmF0ZSgKLSAgICAgICAgICAgICAgICBuZXdQYXJhbXMuZ2V0UHJldmlld0ZyYW1lUmF0ZSgpKTsKLSAgICB9Ci0KICAgICAvLyBQSUNUVVJFX1NJWkUKICAgICBuZXdQYXJhbXMuZ2V0UGljdHVyZVNpemUoJnZhbGlkYXRlZFBhcmFtcy5waWN0dXJlV2lkdGgsCiAgICAgICAgICAgICAmdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQpOwpAQCAtMTUyMiw3ICsxNDQ2LDcgQEAKICAgICAgICAgbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU0NFTkVfTU9ERSkgKTsKICAgICBpZiAodmFsaWRhdGVkUGFyYW1zLnNjZW5lTW9kZSAhPSBzY2VuZU1vZGUgJiYKICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5zY2VuZU1vZGUgIT0KLSAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEKSB7CisgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRCkgewogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTY2VuZU1vZGVzID0KICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9TQ0VORV9NT0RFUyk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVTY2VuZU1vZGVzLmNvdW50OyBpKyspIHsKQEAgLTE1MzcsNyArMTQ2MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgYm9vbCBzY2VuZU1vZGVTZXQgPQotICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnNjZW5lTW9kZSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5zY2VuZU1vZGUgIT0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ7CiAKICAgICAvLyBGTEFTSF9NT0RFCiAgICAgaWYgKHNjZW5lTW9kZVNldCkgewpAQCAtMTY2NywxMCArMTU5MSwxMSBAQAogICAgIC8vIEZPQ1VTX0FSRUFTCiAgICAgcmVzID0gcGFyc2VBcmVhcyhuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19BUkVBUyksCiAgICAgICAgICAgICAmdmFsaWRhdGVkUGFyYW1zLmZvY3VzaW5nQXJlYXMpOwotICAgIHNpemVfdCBtYXgzYVJlZ2lvbnMgPQotICAgICAgICAoc2l6ZV90KXN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLCAxLCAxKS5kYXRhLmkzMlswXTsKKyAgICBzaXplX3QgbWF4QWZSZWdpb25zID0gKHNpemVfdClzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTikuCisgICAgICAgICAgICAgIGRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRl07CiAgICAgaWYgKHJlcyA9PSBPSykgcmVzID0gdmFsaWRhdGVBcmVhcyh2YWxpZGF0ZWRQYXJhbXMuZm9jdXNpbmdBcmVhcywKLSAgICAgICAgICAgIG1heDNhUmVnaW9ucywgQVJFQV9LSU5EX0ZPQ1VTKTsKKyAgICAgICAgICAgIG1heEFmUmVnaW9ucywgQVJFQV9LSU5EX0ZPQ1VTKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIGZvY3VzIGFyZWFzIGFyZSBtYWxmb3JtZWQ6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0FSRUFTKSk7CkBAIC0xNzAwLDEwICsxNjI1LDEzIEBACiAgICAgICAgIG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0FVVE9fV0hJVEVCQUxBTkNFX0xPQ0spKTsKIAogICAgIC8vIE1FVEVSSU5HX0FSRUFTCisgICAgc2l6ZV90IG1heEFlUmVnaW9ucyA9IChzaXplX3Qpc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsCisgICAgICAgICAgICBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OLCBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKS4KKyAgICAgICAgICAgIGRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRV07CiAgICAgcmVzID0gcGFyc2VBcmVhcyhuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NRVRFUklOR19BUkVBUyksCiAgICAgICAgICAgICAmdmFsaWRhdGVkUGFyYW1zLm1ldGVyaW5nQXJlYXMpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgcmVzID0gdmFsaWRhdGVBcmVhcyh2YWxpZGF0ZWRQYXJhbXMubWV0ZXJpbmdBcmVhcywgbWF4M2FSZWdpb25zLAorICAgICAgICByZXMgPSB2YWxpZGF0ZUFyZWFzKHZhbGlkYXRlZFBhcmFtcy5tZXRlcmluZ0FyZWFzLCBtYXhBZVJlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJFQV9LSU5EX01FVEVSSU5HKTsKICAgICB9CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMTg1Miw3ICsxNzgwLDcgQEAKICAgICAvLyAoZmFjZSBkZXRlY3Rpb24gc3RhdGlzdGljcyBhbmQgZmFjZSBwcmlvcml0eSBzY2VuZSBtb2RlKS4gTWFwIGZyb20gb3RoZXIKICAgICAvLyB0byB0aGUgb3RoZXIuCiAgICAgYm9vbCBzY2VuZU1vZGVBY3RpdmUgPQotICAgICAgICAgICAgc2NlbmVNb2RlICE9ICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgc2NlbmVNb2RlICE9ICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOwogICAgIHVpbnQ4X3QgcmVxQ29udHJvbE1vZGUgPSBBTkRST0lEX0NPTlRST0xfTU9ERV9BVVRPOwogICAgIGlmIChlbmFibGVGYWNlRGV0ZWN0IHx8IHNjZW5lTW9kZUFjdGl2ZSkgewogICAgICAgICByZXFDb250cm9sTW9kZSA9IEFORFJPSURfQ09OVFJPTF9NT0RFX1VTRV9TQ0VORV9NT0RFOwpAQCAtMTg2NCw3ICsxNzkyLDcgQEAKICAgICB1aW50OF90IHJlcVNjZW5lTW9kZSA9CiAgICAgICAgICAgICBzY2VuZU1vZGVBY3RpdmUgPyBzY2VuZU1vZGUgOgogICAgICAgICAgICAgZW5hYmxlRmFjZURldGVjdCA/ICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0ZBQ0VfUFJJT1JJVFkgOgotICAgICAgICAgICAgKHVpbnQ4X3QpQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAodWludDhfdClBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDsKICAgICByZXMgPSByZXF1ZXN0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREUsCiAgICAgICAgICAgICAmcmVxU2NlbmVNb2RlLCAxKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwpAQCAtMTk4NSw2ICsxOTEzLDIzIEBACiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzLCByZXFNZXRlcmluZ0FyZWFzU2l6ZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAorICAgIC8vIFNldCBhd2IgcmVnaW9ucyB0byBiZSB0aGUgc2FtZSBhcyB0aGUgbWV0ZXJpbmcgcmVnaW9ucyBpZiBhbGxvd2VkCisgICAgc2l6ZV90IG1heEF3YlJlZ2lvbnMgPSAoc2l6ZV90KXN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAorICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTikuCisgICAgICAgICAgICBkYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQVdCXTsKKyAgICBpZiAobWF4QXdiUmVnaW9ucyA+IDApIHsKKyAgICAgICAgaWYgKG1heEF3YlJlZ2lvbnMgPj0gbWV0ZXJpbmdBcmVhcy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVdCX1JFR0lPTlMsCisgICAgICAgICAgICAgICAgICAgIHJlcU1ldGVyaW5nQXJlYXMsIHJlcU1ldGVyaW5nQXJlYXNTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgYXdiIHJlZ2lvbnMgYXJlIHplcm9lZCBpZiB0aGUgcmVnaW9uIGNvdW50IGlzIHRvbyBoaWdoLgorICAgICAgICAgICAgaW50MzJfdCB6ZXJvZWRBd2JBcmVhc1s1XSA9IHswLCAwLCAwLCAwLCAwfTsKKyAgICAgICAgICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVdCX1JFR0lPTlMsCisgICAgICAgICAgICAgICAgICAgIHplcm9lZEF3YkFyZWFzLCBzaXplb2YoemVyb2VkQXdiQXJlYXMpL3NpemVvZihpbnQzMl90KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBkZWxldGVbXSByZXFNZXRlcmluZ0FyZWFzOwogCiAgICAgLyogZG9uJ3QgaW5jbHVkZSBqcGVnIHRodW1ibmFpbCBzaXplIC0gaXQncyB2YWxpZCBmb3IKQEAgLTIyMjUsOSArMjE3MCw5IEBACiBpbnQgUGFyYW1ldGVyczo6c2NlbmVNb2RlU3RyaW5nVG9FbnVtKGNvbnN0IGNoYXIgKnNjZW5lTW9kZSkgewogICAgIHJldHVybgogICAgICAgICAhc2NlbmVNb2RlID8KLSAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEIDoKKyAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEIDoKICAgICAgICAgIXN0cmNtcChzY2VuZU1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OlNDRU5FX01PREVfQVVUTykgPwotICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQgOgorICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQgOgogICAgICAgICAhc3RyY21wKHNjZW5lTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9BQ1RJT04pID8KICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0FDVElPTiA6CiAgICAgICAgICFzdHJjbXAoc2NlbmVNb2RlLCBDYW1lcmFQYXJhbWV0ZXJzOjpTQ0VORV9NT0RFX1BPUlRSQUlUKSA/CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAppbmRleCBkYTA3Y2NmLi42MGM0Njg3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTMzLDcgKzMyLDcgQEAKIAogLyoqCiAgKiBDdXJyZW50IGNhbWVyYSBzdGF0ZTsgdGhpcyBpcyB0aGUgZnVsbCBzdGF0ZSBvZiB0aGUgQ2FtZXJhIHVuZGVyIHRoZSBvbGQKLSAqIGNhbWVyYSBBUEkgKGNvbnRlbnRzIG9mIHRoZSBDYW1lcmFQYXJhbWV0ZXJzMiBvYmplY3QgaW4gYSBtb3JlLWVmZmljaWVudAorICogY2FtZXJhIEFQSSAoY29udGVudHMgb2YgdGhlIENhbWVyYVBhcmFtZXRlcnMgb2JqZWN0IGluIGEgbW9yZS1lZmZpY2llbnQKICAqIGZvcm1hdCwgcGx1cyBvdGhlciBzdGF0ZSkuIFRoZSBlbnVtIHZhbHVlcyBhcmUgbW9zdGx5IGJhc2VkIG9mZiB0aGUKICAqIGNvcnJlc3BvbmRpbmcgY2FtZXJhMiBlbnVtcywgbm90IHRoZSBjYW1lcmExIHN0cmluZ3MuIEEgZmV3IGFyZSBkZWZpbmVkIGhlcmUKICAqIGlmIHRoZXkgZG9uJ3QgY2xlYW5seSBtYXAgdG8gY2FtZXJhMiB2YWx1ZXMuCkBAIC0xMTQsNiArMTEzLDE0IEBACiAgICAgYm9vbCBhdXRvRXhwb3N1cmVMb2NrOwogICAgIGJvb2wgYXV0b1doaXRlQmFsYW5jZUxvY2s7CiAKKyAgICAvLyAzQSByZWdpb24gdHlwZXMsIGZvciB1c2Ugd2l0aCBBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMKKyAgICBlbnVtIHJlZ2lvbl90IHsKKyAgICAgICAgUkVHSU9OX0FFID0gMCwKKyAgICAgICAgUkVHSU9OX0FXQiwKKyAgICAgICAgUkVHSU9OX0FGLAorICAgICAgICBOVU1fUkVHSU9OIC8vIE51bWJlciBvZiByZWdpb24gdHlwZXMKKyAgICB9IHJlZ2lvbjsKKwogICAgIFZlY3RvcjxBcmVhPiBtZXRlcmluZ0FyZWFzOwogCiAgICAgaW50IHpvb207CkBAIC0xMjksNyArMTM2LDcgQEAKICAgICAgICAgTElHSFRGWF9IRFIKICAgICB9IGxpZ2h0Rng7CiAKLSAgICBDYW1lcmFQYXJhbWV0ZXJzMiBwYXJhbXM7CisgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXM7CiAgICAgU3RyaW5nOCBwYXJhbXNGbGF0dGVuZWQ7CiAKICAgICAvLyBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBhbHNvIHBhcnQgb2YgdGhlIGNhbWVyYSBBUEktdmlzaWJsZSBzdGF0ZSwgYnV0IG5vdApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAppbmRleCA3N2FlN2VjLi4yMDY0ZTJjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcApAQCAtMzE5LDEzICszMTksMTUgQEAKICAgICAgICAgLy8gQ3JlYXRlIENQVSBidWZmZXIgcXVldWUgZW5kcG9pbnQuIFdlIG5lZWQgb25lIG1vcmUgYnVmZmVyIGhlcmUgc28gdGhhdCB3ZSBjYW4KICAgICAgICAgLy8gYWx3YXlzIGFjcXVpcmUgYW5kIGZyZWUgYSBidWZmZXIgd2hlbiB0aGUgaGVhcCBpcyBmdWxsOyBvdGhlcndpc2UgdGhlIGNvbnN1bWVyCiAgICAgICAgIC8vIHdpbGwgaGF2ZSBidWZmZXJzIGluIGZsaWdodCB3ZSdsbCBuZXZlciBjbGVhciBvdXQuCi0gICAgICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGJxLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgIG1SZWNvcmRpbmdDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsCiAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAogICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwQ291bnQgKyAxKTsKICAgICAgICAgbVJlY29yZGluZ0NvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMi1SZWNvcmRpbmdDb25zdW1lciIpKTsKLSAgICAgICAgbVJlY29yZGluZ1dpbmRvdyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgbVJlY29yZGluZ1dpbmRvdyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKICAgICAgICAgbmV3Q29uc3VtZXIgPSB0cnVlOwogICAgICAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgbGF0ZXIsIHNpbmNlIHdlIGRvbid0IGtub3cgYnVmZmVyIHNpemUgdW50aWwgcmVjZWlwdAogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKaW5kZXggMTMwZjgxYS4uMmEyYTVhZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKQEAgLTczLDE4ICs3MywxOSBAQAogICAgIH0KIH0KIAotdm9pZCBac2xQcm9jZXNzb3I6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCAvKnJlcXVlc3RJZCovLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUpIHsKK3ZvaWQgWnNsUHJvY2Vzc29yOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczoiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKKyAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgIG5zZWNzX3QgdGltZXN0YW1wID0gZW50cnkuZGF0YS5pNjRbMF07CiAgICAgKHZvaWQpdGltZXN0YW1wOwogICAgIEFMT0dWVigiR290IHByZXZpZXcgZnJhbWUgZm9yIHRpbWVzdGFtcCAlIiBQUklkNjQsIHRpbWVzdGFtcCk7CiAKICAgICBpZiAobVN0YXRlICE9IFJVTk5JTkcpIHJldHVybjsKIAotICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSBmcmFtZTsKKyAgICBtRnJhbWVMaXN0LmVkaXRJdGVtQXQobUZyYW1lTGlzdEhlYWQpID0gcmVzdWx0Lm1NZXRhZGF0YTsKICAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUga0ZyYW1lTGlzdERlcHRoOwogCiAgICAgZmluZE1hdGNoZXNMb2NrZWQoKTsKQEAgLTEzMCwxMyArMTMxLDE1IEBACiAKICAgICBpZiAobVpzbENvbnN1bWVyID09IDApIHsKICAgICAgICAgLy8gQ3JlYXRlIENQVSBidWZmZXIgcXVldWUgZW5kcG9pbnQKLSAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgIG1ac2xDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoYnEsCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbVpzbENvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihjb25zdW1lciwKICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCwKICAgICAgICAgICAgIGtac2xCdWZmZXJEZXB0aCk7CiAgICAgICAgIG1ac2xDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbVpzbENvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTJDbGllbnQ6OlpzbENvbnN1bWVyIikpOwotICAgICAgICBtWnNsV2luZG93ID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICBtWnNsV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogICAgIH0KIAogICAgIGlmIChtWnNsU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKaW5kZXggNmQzY2I4NS4uZjRjZjBjOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgiCkBAIC01NCw3ICs1NSw3IEBACiAgICAgLy8gRnJvbSBtWnNsQ29uc3VtZXIKICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpOwogICAgIC8vIEZyb20gRnJhbWVQcm9jZXNzb3IKLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGJ1ZmZlcl9oYW5kbGVfdCAqaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwCmluZGV4IDJmY2UyYjYuLjFkY2I3MTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAKQEAgLTYzLDE4ICs2MywxOSBAQAogICAgIGRlbGV0ZVN0cmVhbSgpOwogfQogCi12b2lkIFpzbFByb2Nlc3NvcjM6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCAvKnJlcXVlc3RJZCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSkgewordm9pZCBac2xQcm9jZXNzb3IzOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczoiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKKyAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgIG5zZWNzX3QgdGltZXN0YW1wID0gZW50cnkuZGF0YS5pNjRbMF07CiAgICAgKHZvaWQpdGltZXN0YW1wOwogICAgIEFMT0dWVigiR290IHByZXZpZXcgbWV0YWRhdGEgZm9yIHRpbWVzdGFtcCAlIiBQUklkNjQsIHRpbWVzdGFtcCk7CiAKICAgICBpZiAobVN0YXRlICE9IFJVTk5JTkcpIHJldHVybjsKIAotICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSBmcmFtZTsKKyAgICBtRnJhbWVMaXN0LmVkaXRJdGVtQXQobUZyYW1lTGlzdEhlYWQpID0gcmVzdWx0Lm1NZXRhZGF0YTsKICAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUga0ZyYW1lTGlzdERlcHRoOwogfQogCkBAIC0yNzUsNiArMjc2LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIAorICAgICAgICAvLyBGbHVzaCBkZXZpY2UgdG8gY2xlYXIgb3V0IGFsbCBpbi1mbGlnaHQgcmVxdWVzdHMgcGVuZGluZyBpbiBIQUwuCisgICAgICAgIHJlcyA9IGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCktPmZsdXNoKCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBGYWlsZWQgdG8gZmx1c2ggZGV2aWNlOiAiCisgICAgICAgICAgICAgICAgIiVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2xpZW50LT5nZXRDYW1lcmFJZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKwogICAgICAgICAvLyBVcGRhdGUgSlBFRyBzZXR0aW5ncwogICAgICAgICB7CiAgICAgICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmgKaW5kZXggZDJmODMyMi4uNGM1MmE2NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5oCkBAIC01MCw4ICs1MCw4IEBACiAgICAgWnNsUHJvY2Vzc29yMyhzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQsIHdwPENhcHR1cmVTZXF1ZW5jZXI+IHNlcXVlbmNlcik7CiAgICAgflpzbFByb2Nlc3NvcjMoKTsKIAotICAgIC8vIEZyb20gRnJhbWVQcm9jZXNzb3IKLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKTsKKyAgICAvLyBGcm9tIEZyYW1lUHJvY2Vzc29yOjpGaWx0ZXJlZExpc3RlbmVyCisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCk7CiAKICAgICAvKioKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IDE0MmRhOWUuLjVhNDhhNjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFEZXZpY2VDbGllbnQiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtOTEsNzkgKzkxLDEwMSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlcikgeworICAgIExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdExpc3Q7CisgICAgcmVxdWVzdExpc3QucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgc3RyZWFtaW5nLCBsYXN0RnJhbWVOdW1iZXIpOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLCBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQUxPR1YoIiVzLXN0YXJ0IG9mIGZ1bmN0aW9uLiBSZXF1ZXN0IGxpc3Qgc2l6ZSAlZCIsIF9fRlVOQ1RJT05fXywgcmVxdWVzdHMuc2l6ZSgpKTsKIAogICAgIHN0YXR1c190IHJlczsKLQogICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCi0gICAgaWYgKHJlcXVlc3QgPT0gMCkgeworICAgIGlmIChyZXF1ZXN0cy5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBTZW50IG51bGwgcmVxdWVzdC4gUmVqZWN0aW5nIHJlcXVlc3QuIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKHJlcXVlc3QtPm1NZXRhZGF0YSk7CisgICAgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gbWV0YWRhdGFSZXF1ZXN0TGlzdDsKKyAgICBpbnQzMl90IHJlcXVlc3RJZCA9IG1SZXF1ZXN0SWRDb3VudGVyOworICAgIHVpbnQzMl90IGxvb3BDb3VudGVyID0gMDsKIAotICAgIGlmIChtZXRhZGF0YS5pc0VtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNlbnQgZW1wdHkgbWV0YWRhdGEgcGFja2V0LiBSZWplY3RpbmcgcmVxdWVzdC4iLAotICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAocmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBSZXF1ZXN0cyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN1cmZhY2UgdGFyZ2V0LiAiCi0gICAgICAgICAgICAgICJSZWplY3RpbmcgcmVxdWVzdC4iLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKCFlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKG1ldGFkYXRhKSkgewotICAgICAgICAvLyBDYWxsZWUgbG9ncwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgaW4gdGhlIG91dHB1dCBzdHJlYW0gSURzIHdoaWNoIHdlIGNhbGN1bGF0ZSBmcm9tCi0gICAgICogdGhlIGNhcHR1cmUgcmVxdWVzdCdzIGxpc3Qgb2Ygc3VyZmFjZSB0YXJnZXRzCi0gICAgICovCi0gICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbUlkczsKLSAgICBvdXRwdXRTdHJlYW1JZHMuc2V0Q2FwYWNpdHkocmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0LT5tU3VyZmFjZUxpc3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IHJlcXVlc3QtPm1TdXJmYWNlTGlzdFtpXTsKLQotICAgICAgICBpZiAoc3VyZmFjZSA9PSAwKSBjb250aW51ZTsKLQotICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYnAgPSBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7Ci0gICAgICAgIGludCBpZHggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoZ2JwLT5hc0JpbmRlcigpKTsKLQotICAgICAgICAvLyBUcnlpbmcgdG8gc3VibWl0IHJlcXVlc3Qgd2l0aCBzdXJmYWNlIHRoYXQgd2Fzbid0IGNyZWF0ZWQKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFRyaWVkIHRvIHN1Ym1pdCBhIHJlcXVlc3Qgd2l0aCBhIHN1cmZhY2UgdGhhdCIKLSAgICAgICAgICAgICAgICAgICIgd2UgaGF2ZSBub3QgY2FsbGVkIGNyZWF0ZVN0cmVhbSBvbiIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgZm9yIChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+OjppdGVyYXRvciBpdCA9IHJlcXVlc3RzLmJlZ2luKCk7IGl0ICE9IHJlcXVlc3RzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gKml0OworICAgICAgICBpZiAocmVxdWVzdCA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2VudCBudWxsIHJlcXVlc3QuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBzdHJlYW1JZCA9IG1TdHJlYW1NYXAudmFsdWVBdChpZHgpOwotICAgICAgICBvdXRwdXRTdHJlYW1JZHMucHVzaF9iYWNrKHN0cmVhbUlkKTsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFwcGVuZGluZyBvdXRwdXQgc3RyZWFtICVkIHRvIHJlcXVlc3QiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOworICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YShyZXF1ZXN0LT5tTWV0YWRhdGEpOworICAgICAgICBpZiAobWV0YWRhdGEuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2VudCBlbXB0eSBtZXRhZGF0YSBwYWNrZXQuIFJlamVjdGluZyByZXF1ZXN0LiIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LT5tU3VyZmFjZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogUmVxdWVzdHMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdXJmYWNlIHRhcmdldC4gIgorICAgICAgICAgICAgICAgICAgIlJlamVjdGluZyByZXF1ZXN0LiIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMobWV0YWRhdGEpKSB7CisgICAgICAgICAgICAvLyBDYWxsZWUgbG9ncworICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIGluIHRoZSBvdXRwdXQgc3RyZWFtIElEcyB3aGljaCB3ZSBjYWxjdWxhdGUgZnJvbQorICAgICAgICAgKiB0aGUgY2FwdHVyZSByZXF1ZXN0J3MgbGlzdCBvZiBzdXJmYWNlIHRhcmdldHMKKyAgICAgICAgICovCisgICAgICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy5zZXRDYXBhY2l0eShyZXF1ZXN0LT5tU3VyZmFjZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0LT5tU3VyZmFjZUxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSByZXF1ZXN0LT5tU3VyZmFjZUxpc3RbaV07CisgICAgICAgICAgICBpZiAoc3VyZmFjZSA9PSAwKSBjb250aW51ZTsKKworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwID0gc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgICAgICAgICAgaW50IGlkeCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShnYnAtPmFzQmluZGVyKCkpOworCisgICAgICAgICAgICAvLyBUcnlpbmcgdG8gc3VibWl0IHJlcXVlc3Qgd2l0aCBzdXJmYWNlIHRoYXQgd2Fzbid0IGNyZWF0ZWQKKyAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVHJpZWQgdG8gc3VibWl0IGEgcmVxdWVzdCB3aXRoIGEgc3VyZmFjZSB0aGF0IgorICAgICAgICAgICAgICAgICAgICAgICIgd2UgaGF2ZSBub3QgY2FsbGVkIGNyZWF0ZVN0cmVhbSBvbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IG1TdHJlYW1NYXAudmFsdWVBdChpZHgpOworICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnB1c2hfYmFjayhzdHJlYW1JZCk7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQXBwZW5kaW5nIG91dHB1dCBzdHJlYW0gJWQgdG8gcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOworICAgICAgICB9CisKKyAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywgJm91dHB1dFN0cmVhbUlkc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcy5zaXplKCkpOworCisgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsICZyZXF1ZXN0SWQsIC8qc2l6ZSovMSk7CisgICAgICAgIGxvb3BDb3VudGVyKys7IC8vIGxvb3BDb3VudGVyIHN0YXJ0cyBmcm9tIDEKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlcXVlc3Qgd2l0aCBJRCAlZCAoJWQgb2YgJWQpIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHJlcXVlc3RJZCwgbG9vcENvdW50ZXIsIHJlcXVlc3RzLnNpemUoKSk7CisKKyAgICAgICAgbWV0YWRhdGFSZXF1ZXN0TGlzdC5wdXNoX2JhY2sobWV0YWRhdGEpOwogICAgIH0KLQotICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsICZvdXRwdXRTdHJlYW1JZHNbMF0sCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcy5zaXplKCkpOwotCi0gICAgaW50MzJfdCByZXF1ZXN0SWQgPSBtUmVxdWVzdElkQ291bnRlcisrOwotICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsICZyZXF1ZXN0SWQsIC8qc2l6ZSovMSk7Ci0gICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN1Ym1pdHRpbmcgcmVxdWVzdCB3aXRoIElEICVkIiwKLSAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVxdWVzdElkKTsKKyAgICBtUmVxdWVzdElkQ291bnRlcisrOwogCiAgICAgaWYgKHN0cmVhbWluZykgewotICAgICAgICByZXMgPSBtRGV2aWNlLT5zZXRTdHJlYW1pbmdSZXF1ZXN0KG1ldGFkYXRhKTsKKyAgICAgICAgcmVzID0gbURldmljZS0+c2V0U3RyZWFtaW5nUmVxdWVzdExpc3QobWV0YWRhdGFSZXF1ZXN0TGlzdCwgbGFzdEZyYW1lTnVtYmVyKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6ICBHb3QgZXJyb3IgJWQgYWZ0ZXIgdHJ5aW5nIHRvIHNldCBzdHJlYW1pbmcgIgogICAgICAgICAgICAgICAgICAgInJlcXVlc3QiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVzKTsKQEAgLTE3MSwxMSArMTkzLDEyIEBACiAgICAgICAgICAgICBtU3RyZWFtaW5nUmVxdWVzdExpc3QucHVzaF9iYWNrKHJlcXVlc3RJZCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBtRGV2aWNlLT5jYXB0dXJlKG1ldGFkYXRhKTsKKyAgICAgICAgcmVzID0gbURldmljZS0+Y2FwdHVyZUxpc3QobWV0YWRhdGFSZXF1ZXN0TGlzdCwgbGFzdEZyYW1lTnVtYmVyKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEdvdCBlcnJvciAlZCBhZnRlciB0cnlpbmcgdG8gc2V0IGNhcHR1cmUiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHJlcyk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHJlcyk7CiAgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzOiByZXF1ZXN0SWQgPSAlZCAiLCBfX0ZVTkNUSU9OX18sIHJlcXVlc3RJZCk7CiAgICAgfQogCiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEVuZCBvZiBmdW5jdGlvbiIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKQEAgLTE4Niw3ICsyMDksNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Y2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkKSB7CitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCwgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMsIHJlcXVlc3RJZCA9ICVkIiwgX19GVU5DVElPTl9fLCByZXF1ZXN0SWQpOwogCkBAIC0yMTIsNyArMjM1LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICByZXMgPSBtRGV2aWNlLT5jbGVhclN0cmVhbWluZ1JlcXVlc3QoKTsKKyAgICByZXMgPSBtRGV2aWNlLT5jbGVhclN0cmVhbWluZ1JlcXVlc3QobGFzdEZyYW1lTnVtYmVyKTsKIAogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN1Y2Nlc3NmdWxseSBjbGVhcmVkIHN0cmVhbWluZyByZXF1ZXN0IiwKQEAgLTI1OSw4ICsyODIsNiBAQAogICAgIH0gZWxzZSBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIG1TdHJlYW1NYXAucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN1Y2Nlc3NmdWxseSBkZWxldGVkIHN0cmVhbSBJRCAoJWQpIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtNDY1LDcgKzQ4Niw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpmbHVzaCgpIHsKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Zmx1c2goaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC00NzYsNyArNDk3LDggQEAKIAogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCi0gICAgcmV0dXJuIG1EZXZpY2UtPmZsdXNoKCk7CisgICAgbVN0cmVhbWluZ1JlcXVlc3RMaXN0LmNsZWFyKCk7CisgICAgcmV0dXJuIG1EZXZpY2UtPmZsdXNoKGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKQEAgLTQ5MywxMyArNTE1LDEzIEBACiAgICAgcmV0dXJuIGR1bXBEZXZpY2UoZmQsIGFyZ3MpOwogfQogCi0KLXZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlFcnJvcigpIHsKK3ZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogICAgIC8vIFRocmVhZCBzYWZlLiBEb24ndCBib3RoZXIgbG9ja2luZy4KICAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CiAKICAgICBpZiAocmVtb3RlQ2IgIT0gMCkgewotICAgICAgICByZW1vdGVDYi0+b25EZXZpY2VFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlRXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOwogICAgIH0KIH0KIApAQCAtNTEyLDEyICs1MzQsMTIgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlTaHV0dGVyKGludCByZXF1ZXN0SWQsCit2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CiAgICAgLy8gVGhyZWFkIHNhZmUuIERvbid0IGJvdGhlciBsb2NraW5nLgogICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKICAgICBpZiAocmVtb3RlQ2IgIT0gMCkgewotICAgICAgICByZW1vdGVDYi0+b25DYXB0dXJlU3RhcnRlZChyZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CisgICAgICAgIHJlbW90ZUNiLT5vbkNhcHR1cmVTdGFydGVkKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKICAgICB9CiB9CiAKQEAgLTU1MiwxNiArNTc0LDE0IEBACiB9CiAKIC8qKiBEZXZpY2UtcmVsYXRlZCBtZXRob2RzICovCi12b2lkIENhbWVyYURldmljZUNsaWVudDo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGZyYW1lKSB7Cit2b2lkIENhbWVyYURldmljZUNsaWVudDo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgLy8gVGhyZWFkLXNhZmUuIE5vIGxvY2sgbmVjZXNzYXJ5LgogICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gbVJlbW90ZUNhbGxiYWNrOwogICAgIGlmIChyZW1vdGVDYiAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCIlczogZnJhbWUgPSAlcCAiLCBfX0ZVTkNUSU9OX18sICZmcmFtZSk7Ci0gICAgICAgIHJlbW90ZUNiLT5vblJlc3VsdFJlY2VpdmVkKHJlcXVlc3RJZCwgZnJhbWUpOworICAgICAgICByZW1vdGVDYi0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubU1ldGFkYXRhLCByZXN1bHQubVJlc3VsdEV4dHJhcyk7CiAgICAgfQogfQogCkBAIC02MzUsMjYgKzY1NSw1NiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlGYWNpbmcgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0ZBQ0lORyk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgYW5kcm9pZC5sZW5zLmZhY2luZyBpbiAiCisgICAgICAgICAgICAgICAgInN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICBpbnQzMl90JiBmbGFncyA9ICp0cmFuc2Zvcm07CiAKKyAgICBib29sIG1pcnJvciA9IChlbnRyeUZhY2luZy5kYXRhLnU4WzBdID09IEFORFJPSURfTEVOU19GQUNJTkdfRlJPTlQpOwogICAgIGludCBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOwotICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZmxhZ3MgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF85MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzE4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzI3MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEhBTCBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiB2YWx1ZTogJWQiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKCFtaXJyb3IpIHsKKyAgICAgICAgc3dpdGNoIChvcmllbnRhdGlvbikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfOTA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8xODA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8yNzA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBIQUwgYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24gdmFsdWU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBIQUxfVFJBTlNGT1JNX0ZMSVBfSDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBIQUxfVFJBTlNGT1JNX0ZMSVBfSCB8IEhBTF9UUkFOU0ZPUk1fUk9UXzkwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBIQUxfVFJBTlNGT1JNX0ZMSVBfVjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAgICAgICAgIGZsYWdzID0gSEFMX1RSQU5TRk9STV9GTElQX1YgfCBIQUxfVFJBTlNGT1JNX1JPVF85MDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEhBTCBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiB2YWx1ZTogJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb3JpZW50YXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAppbmRleCBiOWMxNmFhLi4wYjM3Nzg0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKQEAgLTYzLDkgKzYzLDE4IEBACiAgICAgICovCiAKICAgICAvLyBOb3RlIHRoYXQgdGhlIGNhbGxlZSBnZXRzIGEgY29weSBvZiB0aGUgbWV0YWRhdGEuCi0gICAgdmlydHVhbCBpbnQgICAgICAgICAgIHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgc3VibWl0UmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICAvLyBMaXN0IG9mIHJlcXVlc3RzIGFyZSBjb3BpZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgc3VibWl0UmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgIC8vIFJldHVybnMgLUVCVVNZIGlmIGRldmljZSBpcyBub3QgaWRsZQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKTsKQEAgLTg5LDcgKzk4LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgd2FpdFVudGlsSWRsZSgpOwogCiAgICAgLy8gRmx1c2ggYWxsIGFjdGl2ZSBhbmQgcGVuZGluZyByZXF1ZXN0cyBhcyBmYXN0IGFzIHBvc3NpYmxlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGZsdXNoKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGZsdXNoKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCkBAIC0xMTQsMTYgKzEyNCwxNiBAQAogICAgICAqLwogCiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUlkbGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBpbmRlcGVuZGVudCBjb21wb25lbnRzIG9mIENhbWVyYURldmljZUNsaWVudC4KICAgICAgKi8KIHByb3RlY3RlZDoKICAgICAvKiogRmlsdGVyZWRMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZnJhbWUpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBkZXRhY2hEZXZpY2UoKTsKIAogICAgIC8vIENhbGN1bGF0ZSB0aGUgQU5hdGl2ZVdpbmRvdyB0cmFuc2Zvcm0gZnJvbSBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggMWE3YTdhNy4uMGY2ZDI3OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwCkBAIC0zNzMsOSArMzczLDcgQEAKICAgICBDYW1lcmEyQ2xpZW50QmFzZTo6ZGV0YWNoRGV2aWNlKCk7CiB9CiAKLS8qKiBEZXZpY2UtcmVsYXRlZCBtZXRob2RzICovCi12b2lkIFByb0NhbWVyYTJDbGllbnQ6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGZyYW1lKSB7Cit2b2lkIFByb0NhbWVyYTJDbGllbnQ6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMzgzLDEzICszODEsMTIgQEAKICAgICBTaGFyZWRDYW1lcmFDYWxsYmFja3M6OkxvY2sgbChtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKTsKIAogICAgIGlmIChtUmVtb3RlQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSB0bXAoZnJhbWUpOworICAgICAgICBDYW1lcmFNZXRhZGF0YSB0bXAocmVzdWx0Lm1NZXRhZGF0YSk7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBtZXRhID0gdG1wLnJlbGVhc2UoKTsKICAgICAgICAgQUxPR1YoIiVzOiBtZXRhID0gJXAgIiwgX19GVU5DVElPTl9fLCBtZXRhKTsKLSAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vblJlc3VsdFJlY2VpdmVkKHJlcXVlc3RJZCwgbWV0YSk7CisgICAgICAgIG1SZW1vdGVDYWxsYmFjay0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIG1ldGEpOwogICAgICAgICB0bXAuYWNxdWlyZShtZXRhKTsKICAgICB9Ci0KIH0KIAogYm9vbCBQcm9DYW1lcmEyQ2xpZW50OjplbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaAppbmRleCA4YTBmNTQ3Li45ZDgzMTIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCIKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCIKICNpbmNsdWRlICJkZXZpY2UyL0NhbWVyYTJEZXZpY2UuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTk3LDggKzk4LDggQEAKIAogcHJvdGVjdGVkOgogICAgIC8qKiBGaWx0ZXJlZExpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBmcmFtZSk7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCk7CisKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgZGV0YWNoRGV2aWNlKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCA2YTg4Yzg3Li4xOWVmZDMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTIyMSwxMCArMjIxLDExIEBACiAvKiogRGV2aWNlLXJlbGF0ZWQgbWV0aG9kcyAqLwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Ci12b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5RXJyb3IoaW50IGVycm9yQ29kZSwgaW50IGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZzIpIHsKLSAgICBBTE9HRSgiRXJyb3IgY29uZGl0aW9uICVkIHJlcG9ydGVkIGJ5IEhBTCwgYXJndW1lbnRzICVkLCAlZCIsIGVycm9yQ29kZSwKLSAgICAgICAgICBhcmcxLCBhcmcyKTsKK3ZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlFcnJvcigKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgQUxPR0UoIkVycm9yIGNvbmRpdGlvbiAlZCByZXBvcnRlZCBieSBIQUwsIHJlcXVlc3RJZCAlIiBQUklkMzIsIGVycm9yQ29kZSwKKyAgICAgICAgICByZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtMjMzLDEzICsyMzQsMTMgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgotdm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeVNodXR0ZXIoaW50IHJlcXVlc3RJZCwKK3ZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7Ci0gICAgKHZvaWQpcmVxdWVzdElkOworICAgICh2b2lkKXJlc3VsdEV4dHJhczsKICAgICAodm9pZCl0aW1lc3RhbXA7CiAKLSAgICBBTE9HVigiJXM6IFNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciByZXF1ZXN0IGlkICVkIGF0IHRpbWUgJSIgUFJJZDY0LAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CisgICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlIiBQUklkMzIgIiBhdCB0aW1lICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgdGltZXN0YW1wKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCA2MWU0NGYwLi45ZmVjYTkzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTJDTElFTlRfQkFTRV9ICiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjEsOSArNjIsMTEgQEAKICAgICAgKiBDYW1lcmFEZXZpY2VCYXNlOjpOb3RpZmljYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgogICAgICAqLwogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIGludCBhcmcxLCBpbnQgYXJnMik7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUlkbGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5QXV0b0ZvY3VzKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UodWludDhfdCBuZXdTdGF0ZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCmluZGV4IGU4MGFiZjEuLjc1OTdiMTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaApAQCAtMjIsOSArMjIsMTIgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEyLmgiCiAjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NCw3ICs0Nyw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpID0gMDsKIAogICAgIC8qKgogICAgICAqIFRoZSBkZXZpY2UncyBzdGF0aWMgY2hhcmFjdGVyaXN0aWNzIG1ldGFkYXRhIGJ1ZmZlcgpAQCAtNTQsMTkgKzU3LDM3IEBACiAgICAgLyoqCiAgICAgICogU3VibWl0IHJlcXVlc3QgZm9yIGNhcHR1cmUuIFRoZSBDYW1lcmFEZXZpY2UgdGFrZXMgb3duZXJzaGlwIG9mIHRoZQogICAgICAqIHBhc3NlZC1pbiBidWZmZXIuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgZXhwZWN0ZWQgZnJhbWUgbnVtYmVyIG9mIHRoaXMgcmVxdWVzdC4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKKworICAgIC8qKgorICAgICAqIFN1Ym1pdCBhIGxpc3Qgb2YgcmVxdWVzdHMuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgZXhwZWN0ZWQgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIGxpc3Qgb2YgcmVxdWVzdHMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBTdWJtaXQgcmVxdWVzdCBmb3Igc3RyZWFtaW5nLiBUaGUgQ2FtZXJhRGV2aWNlIG1ha2VzIGEgY29weSBvZiB0aGUKICAgICAgKiBwYXNzZWQtaW4gYnVmZmVyIGFuZCB0aGUgY2FsbGVyIHJldGFpbnMgb3duZXJzaGlwLgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBzdHJlYW1pbmcgcmVxdWVzdC4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKKworICAgIC8qKgorICAgICAqIFN1Ym1pdCBhIGxpc3Qgb2YgcmVxdWVzdHMgZm9yIHN0cmVhbWluZy4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgc3RyZWFtaW5nIHJlcXVlc3QuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBDbGVhciB0aGUgc3RyZWFtaW5nIHJlcXVlc3Qgc2xvdC4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgc3RyZWFtaW5nIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogV2FpdCB1bnRpbCBhIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gSUQgaGFzIGJlZW4gZGVxdWV1ZWQgYnkgdGhlCkBAIC0xNDIsMTEgKzE2MywxMiBAQAogICAgICAgICAvLyBBUEkxIGFuZCBBUEkyLgogCiAgICAgICAgIC8vIFJlcXVpcmVkIGZvciBBUEkgMSBhbmQgMgotICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoaW50IGVycm9yQ29kZSwgaW50IGFyZzEsIGludCBhcmcyKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzKSA9IDA7CiAKICAgICAgICAgLy8gUmVxdWlyZWQgb25seSBmb3IgQVBJMgogICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZSgpID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoaW50IHJlcXVlc3RJZCwKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSA9IDA7CiAKICAgICAgICAgLy8gUmVxdWlyZWQgb25seSBmb3IgQVBJMQpAQCAtMTc5LDExICsyMDEsMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRGb3JOZXh0RnJhbWUobnNlY3NfdCB0aW1lb3V0KSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBHZXQgbmV4dCBtZXRhZGF0YSBmcmFtZSBmcm9tIHRoZSBmcmFtZSBxdWV1ZS4gUmV0dXJucyBOVUxMIGlmIHRoZSBxdWV1ZQotICAgICAqIGlzIGVtcHR5OyBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIuCi0gICAgICogTWF5IGJlIGNhbGxlZCBjb25jdXJyZW50bHkgdG8gbW9zdCBtZXRob2RzLCBleGNlcHQgZm9yIHdhaXRGb3JOZXh0RnJhbWUKKyAgICAgKiBHZXQgbmV4dCBjYXB0dXJlIHJlc3VsdCBmcmFtZSBmcm9tIHRoZSByZXN1bHQgcXVldWUuIFJldHVybnMgTk9UX0VOT1VHSF9EQVRBCisgICAgICogaWYgdGhlIHF1ZXVlIGlzIGVtcHR5OyBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIgaW5zaWRlCisgICAgICogdGhlIGNhcHR1cmUgcmVzdWx0IG9iamVjdCdzIG1ldGFkYXRhIGZpZWxkLgorICAgICAqIE1heSBiZSBjYWxsZWQgY29uY3VycmVudGx5IHRvIG1vc3QgbWV0aG9kcywgZXhjZXB0IGZvciB3YWl0Rm9yTmV4dEZyYW1lLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFJlc3VsdChDYXB0dXJlUmVzdWx0ICpmcmFtZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogVHJpZ2dlciBhdXRvLWZvY3VzLiBUaGUgbGF0ZXN0IElEIHVzZWQgaW4gYSB0cmlnZ2VyIGF1dG9mb2N1cyBvciBjYW5jZWwKQEAgLTIyNCw4ICsyNDcsOSBAQAogICAgIC8qKgogICAgICAqIEZsdXNoIGFsbCBwZW5kaW5nIGFuZCBpbi1mbGlnaHQgcmVxdWVzdHMuIEJsb2NrcyB1bnRpbCBmbHVzaCBpcwogICAgICAqIGNvbXBsZXRlLgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBzdHJlYW1pbmcgcmVxdWVzdC4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCmluZGV4IDRkMzE2NjcuLmY2YTk3MWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCkBAIC05OSwxNSArOTksMTcgQEAKIHZvaWQgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzTmV3RnJhbWVzKGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBDYW1lcmFNZXRhZGF0YSBmcmFtZTsKKyAgICBDYXB0dXJlUmVzdWx0IHJlc3VsdDsKIAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBQcm9jZXNzIG5ldyBmcmFtZXMiLCBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CiAKLSAgICB3aGlsZSAoIChyZXMgPSBkZXZpY2UtPmdldE5leHRGcmFtZSgmZnJhbWUpKSA9PSBPSykgeworICAgIHdoaWxlICggKHJlcyA9IGRldmljZS0+Z2V0TmV4dFJlc3VsdCgmcmVzdWx0KSkgPT0gT0spIHsKIAorICAgICAgICAvLyBUT0RPOiBpbnN0ZWFkIG9mIGdldHRpbmcgZnJhbWUgbnVtYmVyIGZyb20gbWV0YWRhdGEsIHdlIHNob3VsZCByZWFkCisgICAgICAgIC8vIHRoaXMgZnJvbSByZXN1bHQubVJlc3VsdEV4dHJhcyB3aGVuIENhbWVyYURldmljZUJhc2UgaW50ZXJmYWNlIGlzIGZpeGVkLgogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKIAotICAgICAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5UKTsKKyAgICAgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5UKTsKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciByZWFkaW5nIGZyYW1lIG51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKQEAgLTExNSwxMyArMTE3LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgQVRSQUNFX0lOVCgiY2FtMl9mcmFtZSIsIGVudHJ5LmRhdGEuaTMyWzBdKTsKIAotICAgICAgICBpZiAoIXByb2Nlc3NTaW5nbGVGcmFtZShmcmFtZSwgZGV2aWNlKSkgeworICAgICAgICBpZiAoIXByb2Nlc3NTaW5nbGVGcmFtZShyZXN1bHQsIGRldmljZSkpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFmcmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFyZXN1bHQubU1ldGFkYXRhLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1MYXN0RnJhbWVNdXRleCk7Ci0gICAgICAgICAgICBtTGFzdEZyYW1lLmFjcXVpcmUoZnJhbWUpOworICAgICAgICAgICAgbUxhc3RGcmFtZS5hY3F1aXJlKHJlc3VsdC5tTWV0YWRhdGEpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXMgIT0gTk9UX0VOT1VHSF9EQVRBKSB7CkBAIC0xMzMsMjEgKzEzNSwyMiBAQAogICAgIHJldHVybjsKIH0KIAotYm9vbCBGcmFtZVByb2Nlc3NvckJhc2U6OnByb2Nlc3NTaW5nbGVGcmFtZShDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSkgeworYm9vbCBGcmFtZVByb2Nlc3NvckJhc2U6OnByb2Nlc3NTaW5nbGVGcmFtZShDYXB0dXJlUmVzdWx0ICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogUHJvY2VzcyBzaW5nbGUgZnJhbWUgKGlzIGVtcHR5PyAlZCkiLAotICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpLCBmcmFtZS5pc0VtcHR5KCkpOwotICAgIHJldHVybiBwcm9jZXNzTGlzdGVuZXJzKGZyYW1lLCBkZXZpY2UpID09IE9LOworICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpLCByZXN1bHQubU1ldGFkYXRhLmlzRW1wdHkoKSk7CisgICAgcmV0dXJuIHByb2Nlc3NMaXN0ZW5lcnMocmVzdWx0LCBkZXZpY2UpID09IE9LOwogfQogCi1zdGF0dXNfdCBGcmFtZVByb2Nlc3NvckJhc2U6OnByb2Nlc3NMaXN0ZW5lcnMoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorc3RhdHVzX3QgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzTGlzdGVuZXJzKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCwKICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CisKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKIAogICAgIC8vIFF1aXJrczogRG9uJ3QgZGVsaXZlciBwYXJ0aWFsIHJlc3VsdHMgdG8gbGlzdGVuZXJzIHRoYXQgZG9uJ3Qgd2FudCB0aGVtCiAgICAgYm9vbCBxdWlya0lzUGFydGlhbCA9IGZhbHNlOwotICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCk7CisgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOwogICAgIGlmIChlbnRyeS5jb3VudCAhPSAwICYmCiAgICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID09IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IE5vdCBmb3J3YXJkaW5nIHBhcnRpYWwgcmVzdWx0IHRvIGxpc3RlbmVycyIsCkBAIC0xNTUsMTAgKzE1OCwxMyBAQAogICAgICAgICBxdWlya0lzUGFydGlhbCA9IHRydWU7CiAgICAgfQogCi0gICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUkVRVUVTVF9JRCk7CisgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBnZXR0aW5nIHJlcXVlc3RJRCBmcm9tIENhbWVyYU1ldGFkYXRhLCB3ZSBzaG91bGQgZ2V0IGl0CisgICAgLy8gZnJvbSBDYXB0dXJlUmVzdWx0RXh0cmFzLiBUaGlzIHdpbGwgcmVxdWlyZSBjaGFuZ2luZyBDYW1lcmEyRGV2aWNlLgorICAgIC8vIEN1cnJlbnRseSBDYW1lcmEyRGV2aWNlIHVzZXMgTWV0YWRhdGFRdWV1ZSB0byBzdG9yZSByZXN1bHRzLCB3aGljaCBkb2VzIG5vdAorICAgIC8vIGluY2x1ZGUgQ2FwdHVyZVJlc3VsdEV4dHJhcy4KKyAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfSUQpOwogICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciByZWFkaW5nIGZyYW1lIGlkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciByZWFkaW5nIGZyYW1lIGlkIiwgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGVudHJ5LmRhdGEuaTMyWzBdOwpAQCAtMTY5LDkgKzE3NSw4IEBACiAKICAgICAgICAgTGlzdDxSYW5nZUxpc3RlbmVyPjo6aXRlcmF0b3IgaXRlbSA9IG1SYW5nZUxpc3RlbmVycy5iZWdpbigpOwogICAgICAgICB3aGlsZSAoaXRlbSAhPSBtUmFuZ2VMaXN0ZW5lcnMuZW5kKCkpIHsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgPj0gaXRlbS0+bWluSWQgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkIDwgaXRlbS0+bWF4SWQgJiYKLSAgICAgICAgICAgICAgICAgICAgKCFxdWlya0lzUGFydGlhbCB8fCBpdGVtLT5xdWlya1NlbmRQYXJ0aWFscykgKSB7CisgICAgICAgICAgICBpZiAocmVxdWVzdElkID49IGl0ZW0tPm1pbklkICYmIHJlcXVlc3RJZCA8IGl0ZW0tPm1heElkICYmCisgICAgICAgICAgICAgICAgICAgICghcXVpcmtJc1BhcnRpYWwgfHwgaXRlbS0+cXVpcmtTZW5kUGFydGlhbHMpKSB7CiAgICAgICAgICAgICAgICAgc3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBpdGVtLT5saXN0ZW5lci5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG1SYW5nZUxpc3RlbmVycy5lcmFzZShpdGVtKTsKQEAgLTE4MywxMCArMTg4LDEyIEBACiAgICAgICAgICAgICBpdGVtKys7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR1YoIkdvdCAlenUgcmFuZ2UgbGlzdGVuZXJzIG91dCBvZiAlenUiLCBsaXN0ZW5lcnMuc2l6ZSgpLCBtUmFuZ2VMaXN0ZW5lcnMuc2l6ZSgpKTsKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogR290ICV6dSByYW5nZSBsaXN0ZW5lcnMgb3V0IG9mICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICBkZXZpY2UtPmdldElkKCksIGxpc3RlbmVycy5zaXplKCksIG1SYW5nZUxpc3RlbmVycy5zaXplKCkpOworCiAgICAgTGlzdDxzcDxGaWx0ZXJlZExpc3RlbmVyPiA+OjppdGVyYXRvciBpdGVtID0gbGlzdGVuZXJzLmJlZ2luKCk7CiAgICAgZm9yICg7IGl0ZW0gIT0gbGlzdGVuZXJzLmVuZCgpOyBpdGVtKyspIHsKLSAgICAgICAgKCppdGVtKS0+b25GcmFtZUF2YWlsYWJsZShyZXF1ZXN0SWQsIGZyYW1lKTsKKyAgICAgICAgKCppdGVtKS0+b25SZXN1bHRBdmFpbGFibGUocmVzdWx0KTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oCmluZGV4IDg5YjYwOGEuLjE1YTAxNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM5LDggKzQwLDcgQEAKICAgICB2aXJ0dWFsIH5GcmFtZVByb2Nlc3NvckJhc2UoKTsKIAogICAgIHN0cnVjdCBGaWx0ZXJlZExpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlIHsKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KSA9IDA7CiAgICAgfTsKIAogICAgIC8vIFJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yIGEgcmFuZ2Ugb2YgSURzIFttaW5JZCwgbWF4SWQpLiBNdWx0aXBsZSBsaXN0ZW5lcnMKQEAgLTcyLDEwICs3MiwxMCBAQAogCiAgICAgdm9pZCBwcm9jZXNzTmV3RnJhbWVzKGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpOwogCi0gICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCisgICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYXB0dXJlUmVzdWx0ICZyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKTsKIAotICAgIHN0YXR1c190IHByb2Nlc3NMaXN0ZW5lcnMoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorICAgIHN0YXR1c190IHByb2Nlc3NMaXN0ZW5lcnMoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSk7CiAKICAgICBDYW1lcmFNZXRhZGF0YSBtTGFzdEZyYW1lOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAKaW5kZXggMjk2NmQ4Mi4uYzMzYzE2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwCkBAIC0xMTIsMjAgKzExMiw2IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgcmVzID0gZGV2aWNlLT5vcHMtPmdldF9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcyhkZXZpY2UsICZtVmVuZG9yVGFnT3BzKTsKLSAgICBpZiAocmVzICE9IE9LICkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHJldHJpZXZlIHRhZyBvcHMgZnJvbSBkZXZpY2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcmVzID0gc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcyhtVmVuZG9yVGFnT3BzKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gc2V0IHRhZyBvcHM6ICVzICglZCkiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICBkZXZpY2UtPmNvbW1vbi5jbG9zZSgmZGV2aWNlLT5jb21tb24pOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KICAgICByZXMgPSBkZXZpY2UtPm9wcy0+c2V0X25vdGlmeV9jYWxsYmFjayhkZXZpY2UsIG5vdGlmaWNhdGlvbkNhbGxiYWNrLAogICAgICAgICAgICAgTlVMTCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjEzLDcgKzE5OSw3IEBACiAgICAgcmV0dXJuIG1EZXZpY2VJbmZvOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0yMjEsMTUgKzIwNywyOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBDYW1lcmEyRGV2aWNlIGJ1cnN0IGNhcHR1cmUgbm90IGltcGxlbWVudGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgQ2FtZXJhTWV0YWRhdGEgc3RyZWFtUmVxdWVzdChyZXF1ZXN0KTsKICAgICByZXR1cm4gbVJlcXVlc3RRdWV1ZS5zZXRTdHJlYW1TbG90KHN0cmVhbVJlcXVlc3QucmVsZWFzZSgpKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzLCBDYW1lcmEyRGV2aWNlIHN0cmVhbWluZyBidXJzdCBub3QgaW1wbGVtZW50ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHJldHVybiBtUmVxdWVzdFF1ZXVlLnNldFN0cmVhbVNsb3QoTlVMTCk7CiB9CkBAIC00NjIsNyArNDYyLDEzIEBACiAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkgewogICAgICAgICAgICAgY2FzZSBDQU1FUkEyX01TR19FUlJPUjoKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoZXh0MSwgZXh0MiwgZXh0Myk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBuZWVkcyB0byBiZSBmaXhlZC4gZXh0MiBhbmQgZXh0MyBuZWVkIHRvIGJlIGNvbnNpZGVyZWQuCisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgKChleHQxID09IENBTUVSQTJfTVNHX0VSUk9SX0RFVklDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChleHQxID09IENBTUVSQTJfTVNHX0VSUk9SX0hBUkRXQVJFKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDQU1FUkEyX01TR19TSFVUVEVSOiB7CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogT25seSBuZWVkZWQgZm9yIGNhbWVyYTIgQVBJLCB3aGljaCBpcyB1bnN1cHBvcnRlZApAQCAtNDkxLDE2ICs0OTcsMjIgQEAKICAgICByZXR1cm4gbUZyYW1lUXVldWUud2FpdEZvckJ1ZmZlcih0aW1lb3V0KTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Z2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Z2V0TmV4dFJlc3VsdChDYXB0dXJlUmVzdWx0ICpyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogZ2V0IENhcHR1cmVSZXN1bHQiLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHJlc3VsdCBwb2ludGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICBzdGF0dXNfdCByZXM7CiAgICAgY2FtZXJhX21ldGFkYXRhX3QgKnJhd0ZyYW1lOwogICAgIHJlcyA9IG1GcmFtZVF1ZXVlLmRlcXVldWUoJnJhd0ZyYW1lKTsKLSAgICBpZiAocmF3RnJhbWUgID09IE5VTEwpIHsKKyAgICBpZiAocmF3RnJhbWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0gZWxzZSBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIGZyYW1lLT5hY3F1aXJlKHJhd0ZyYW1lKTsKKyAgICAgICAgcmVzdWx0LT5tTWV0YWRhdGEuYWNxdWlyZShyYXdGcmFtZSk7CiAgICAgfQorCiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtNTcwLDcgKzU4Miw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Zmx1c2goKSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpmbHVzaChpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIG1SZXF1ZXN0UXVldWUuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgKaW5kZXggMWY1M2M1Ni4uMjJhMTNhYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgKQEAgLTQ3LDkgKzQ3LDE0IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdmlydHVhbCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbygpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0VW50aWxSZXF1ZXN0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsIG5zZWNzX3QgdGltZW91dCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwKQEAgLTY1LDIwICs3MCwxOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Tm90aWZ5Q2FsbGJhY2soTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKICAgICB2aXJ0dWFsIGJvb2wgICAgIHdpbGxOb3RpZnkzQSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdEZvck5leHRGcmFtZShuc2Vjc190IHRpbWVvdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0UmVzdWx0KENhcHR1cmVSZXN1bHQgKmZyYW1lKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJBdXRvZm9jdXModWludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdHJpZ2dlckNhbmNlbEF1dG9mb2N1cyh1aW50MzJfdCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB0cmlnZ2VyUHJlY2FwdHVyZU1ldGVyaW5nKHVpbnQzMl90IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHB1c2hSZXByb2Nlc3NCdWZmZXIoaW50IHJlcHJvY2Vzc1N0cmVhbUlkLAogICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHdwPEJ1ZmZlclJlbGVhc2VkTGlzdGVuZXI+IGxpc3RlbmVyKTsKICAgICAvLyBGbHVzaCBpbXBsZW1lbnRlZCBhcyBqdXN0IGEgd2FpdAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogICBwcml2YXRlOgogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgY2FtZXJhMl9kZXZpY2VfdCAqbUhhbDJEZXZpY2U7CiAKICAgICBDYW1lcmFNZXRhZGF0YSBtRGV2aWNlSW5mbzsKLSAgICB2ZW5kb3JfdGFnX3F1ZXJ5X29wc190ICptVmVuZG9yVGFnT3BzOwogCiAgICAgLyoqCiAgICAgICogUXVldWUgY2xhc3MgZm9yIGJvdGggc2VuZGluZyByZXF1ZXN0cyB0byBhIGNhbWVyYTIgZGV2aWNlLCBhbmQgZm9yCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAppbmRleCAxZDQ3NjhjLi4yZjg3NGY1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKQEAgLTEwMiw4ICsxMDIsMTAgQEAKIAogICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZTsKIAorICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+b3BlbiIpOwogICAgIHJlcyA9IG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oJm1vZHVsZS0+Y29tbW9uLCBkZXZpY2VOYW1lLnN0cmluZygpLAogICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSk7CisgICAgQVRSQUNFX0VORCgpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCBvcGVuIGNhbWVyYTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTEyLDkgKzExNCw5IEBACiAKICAgICAvKiogQ3Jvc3MtY2hlY2sgZGV2aWNlIHZlcnNpb24gKi8KIAotICAgIGlmIChkZXZpY2UtPmNvbW1vbi52ZXJzaW9uICE9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgaWYgKGRldmljZS0+Y29tbW9uLnZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewogICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCBvcGVuIGNhbWVyYTogIgotICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIGlzIG5vdCB2ZXJzaW9uICV4LCByZXBvcnRzICV4IGluc3RlYWQiLAorICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIHNob3VsZCBiZSBhdCBsZWFzdCAleCwgcmVwb3J0cyAleCBpbnN0ZWFkIiwKICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCwKICAgICAgICAgICAgICAgICBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKICAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKQEAgLTEyOCw3ICsxMzAsNyBAQAogICAgIGlmIChpbmZvLmRldmljZV92ZXJzaW9uICE9IGRldmljZS0+Y29tbW9uLnZlcnNpb24pIHsKICAgICAgICAgU0VUX0VSUl9MKCJIQUwgcmVwb3J0aW5nIG1pc21hdGNoZWQgY2FtZXJhX2luZm8gdmVyc2lvbiAoJXgpIgogICAgICAgICAgICAgICAgICIgYW5kIGRldmljZSB2ZXJzaW9uICgleCkuIiwKLSAgICAgICAgICAgICAgICBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uLCBpbmZvLmRldmljZV92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBpbmZvLmRldmljZV92ZXJzaW9uLCBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKICAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0xNDYsMjQgKzE0OCw2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLyoqIEdldCB2ZW5kb3IgbWV0YWRhdGEgdGFncyAqLwotCi0gICAgbVZlbmRvclRhZ09wcy5nZXRfY2FtZXJhX3ZlbmRvcl9zZWN0aW9uX25hbWUgPSBOVUxMOwotCi0gICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMiKTsKLSAgICBkZXZpY2UtPm9wcy0+Z2V0X21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzKGRldmljZSwgJm1WZW5kb3JUYWdPcHMpOwotICAgIEFUUkFDRV9FTkQoKTsKLQotICAgIGlmIChtVmVuZG9yVGFnT3BzLmdldF9jYW1lcmFfdmVuZG9yX3NlY3Rpb25fbmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlcyA9IHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMoJm1WZW5kb3JUYWdPcHMpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzZXQgdGFnIG9wczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKiogU3RhcnQgdXAgc3RhdHVzIHRyYWNrZXIgdGhyZWFkICovCiAgICAgbVN0YXR1c1RyYWNrZXIgPSBuZXcgU3RhdHVzVHJhY2tlcih0aGlzKTsKICAgICByZXMgPSBtU3RhdHVzVHJhY2tlci0+cnVuKFN0cmluZzg6OmZvcm1hdCgiQzNEZXYtJWQtU3RhdHVzIiwgbUlkKS5zdHJpbmcoKSk7CkBAIC0yNzEsNyArMjU1LDkgQEAKICAgICAgICAgbVN0YXR1c1RyYWNrZXIuY2xlYXIoKTsKIAogICAgICAgICBpZiAobUhhbDNEZXZpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5jbG9zZSIpOwogICAgICAgICAgICAgbUhhbDNEZXZpY2UtPmNvbW1vbi5jbG9zZSgmbUhhbDNEZXZpY2UtPmNvbW1vbik7CisgICAgICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgICAgICBtSGFsM0RldmljZSA9IE5VTEw7CiAgICAgICAgIH0KIApAQCAtMjk4LDYgKzI4NCw1MyBAQAogICAgIHJldHVybiBnb3RMb2NrOwogfQogCitzc2l6ZV90IENhbWVyYTNEZXZpY2U6OmdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiByZXBsYWNlIGJlbG93IHdpdGggYXZhaWxhYmxlU3RyZWFtQ29uZmlndXJhdGlvbiBmb3IgSEFMMy4yKy4KKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgYXZhaWxhYmxlSnBlZ1NpemVzID0KKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfU0laRVMpOworICAgIGlmIChhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQgPT0gMCB8fCBhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQgJSAyICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgZmluZCB2YWxpZCBhdmFpbGFibGUganBlZyBzaXplcyBpbiBzdGF0aWMgbWV0YWRhdGEhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkuCisgICAgaW50MzJfdCBtYXhKcGVnV2lkdGggPSAwLCBtYXhKcGVnSGVpZ2h0ID0gMDsKKyAgICBib29sIGZvdW5kTWF4ID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQ7IGkgKz0gMikgeworICAgICAgICBpZiAoKGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpXSAqIGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgMV0pCisgICAgICAgICAgICAgICAgPiAobWF4SnBlZ1dpZHRoICogbWF4SnBlZ0hlaWdodCkpIHsKKyAgICAgICAgICAgIG1heEpwZWdXaWR0aCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpXTsKKyAgICAgICAgICAgIG1heEpwZWdIZWlnaHQgPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSArIDFdOworICAgICAgICAgICAgZm91bmRNYXggPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmICghZm91bmRNYXgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBHZXQgbWF4IGpwZWcgYnVmZmVyIHNpemUKKyAgICBzc2l6ZV90IG1heEpwZWdCdWZmZXJTaXplID0gMDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkganBlZ01heFNpemUgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7CisgICAgaWYgKGpwZWdNYXhTaXplLmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgbWF4aW11bSBKUEVHIHNpemUgaW4gc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbWF4SnBlZ0J1ZmZlclNpemUgPSBqcGVnTWF4U2l6ZS5kYXRhLmkzMlswXTsKKworICAgIC8vIENhbGN1bGF0ZSBmaW5hbCBqcGVnIGJ1ZmZlciBzaXplIGZvciB0aGUgZ2l2ZW4gcmVzb2x1dGlvbi4KKyAgICBmbG9hdCBzY2FsZUZhY3RvciA9ICgoZmxvYXQpICh3aWR0aCAqIGhlaWdodCkpIC8gKG1heEpwZWdXaWR0aCAqIG1heEpwZWdIZWlnaHQpOworICAgIHNzaXplX3QganBlZ0J1ZmZlclNpemUgPSBzY2FsZUZhY3RvciAqIG1heEpwZWdCdWZmZXJTaXplOworICAgIC8vIEJvdW5kIHRoZSBidWZmZXIgc2l6ZSB0byBbTUlOX0pQRUdfQlVGRkVSX1NJWkUsIG1heEpwZWdCdWZmZXJTaXplXS4KKyAgICBpZiAoanBlZ0J1ZmZlclNpemUgPiBtYXhKcGVnQnVmZmVyU2l6ZSkgeworICAgICAgICBqcGVnQnVmZmVyU2l6ZSA9IG1heEpwZWdCdWZmZXJTaXplOworICAgIH0gZWxzZSBpZiAoanBlZ0J1ZmZlclNpemUgPCBrTWluSnBlZ0J1ZmZlclNpemUpIHsKKyAgICAgICAganBlZ0J1ZmZlclNpemUgPSBrTWluSnBlZ0J1ZmZlclNpemU7CisgICAgfQorCisgICAgcmV0dXJuIGpwZWdCdWZmZXJTaXplOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgKHZvaWQpYXJnczsKQEAgLTM4NiwxNCArNDE5LDcgQEAKICAgICByZXR1cm4gbURldmljZUluZm87CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIHN0YXR1c190IHJlczsKLSAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwotICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLQotICAgIC8vIFRPRE86IHRha2Ugb3duZXJzaGlwIG9mIHRoZSByZXF1ZXN0Ci0KK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNoZWNrU3RhdHVzT2tUb0NhcHR1cmVMb2NrZWQoKSB7CiAgICAgc3dpdGNoIChtU3RhdHVzKSB7CiAgICAgICAgIGNhc2UgU1RBVFVTX0VSUk9SOgogICAgICAgICAgICAgQ0xPR0UoIkRldmljZSBoYXMgZW5jb3VudGVyZWQgYSBzZXJpb3VzIGVycm9yIik7CkBAIC00MDIsNyArNDI4LDYgQEAKICAgICAgICAgICAgIENMT0dFKCJEZXZpY2Ugbm90IGluaXRpYWxpemVkIik7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIGNhc2UgU1RBVFVTX1VOQ09ORklHVVJFRDoKLSAgICAgICAgICAgIC8vIE1heSBiZSBsYXppbHkgY29uZmlndXJpbmcgc3RyZWFtcywgd2lsbCBjaGVjayBkdXJpbmcgc2V0dXAKICAgICAgICAgY2FzZSBTVEFUVVNfQ09ORklHVVJFRDoKICAgICAgICAgY2FzZSBTVEFUVVNfQUNUSVZFOgogICAgICAgICAgICAgLy8gT0sKQEAgLTQxMSw3MSArNDM2LDExOSBAQAogICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmV4cGVjdGVkIHN0YXR1czogJWQiLCBtU3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CisgICAgcmV0dXJuIE9LOworfQogCi0gICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IG5ld1JlcXVlc3QgPSBzZXRVcFJlcXVlc3RMb2NrZWQocmVxdWVzdCk7Ci0gICAgaWYgKG5ld1JlcXVlc3QgPT0gTlVMTCkgewotICAgICAgICBDTE9HRSgiQ2FuJ3QgY3JlYXRlIGNhcHR1cmUgcmVxdWVzdCIpOworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQoCisgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZtZXRhZGF0YUxpc3QsIFJlcXVlc3RMaXN0ICpyZXF1ZXN0TGlzdCkgeworICAgIGlmIChyZXF1ZXN0TGlzdCA9PSBOVUxMKSB7CisgICAgICAgIENMT0dFKCJyZXF1ZXN0TGlzdCBjYW5ub3QgYmUgTlVMTC4iKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+cXVldWVSZXF1ZXN0KG5ld1JlcXVlc3QpOwotICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKC8qYWN0aXZlKi8gdHJ1ZSwga0FjdGl2ZVRpbWVvdXQpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBTRVRfRVJSX0woIkNhbid0IHRyYW5zaXRpb24gdG8gYWN0aXZlIGluICVmIHNlY29uZHMhIiwKLSAgICAgICAgICAgICAgICAgICAga0FjdGl2ZVRpbWVvdXQvMWU5KTsKKyAgICBpbnQzMl90IGJ1cnN0SWQgPSAwOworICAgIGZvciAoTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWV0YWRhdGFMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBtZXRhZGF0YUxpc3QuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IG5ld1JlcXVlc3QgPSBzZXRVcFJlcXVlc3RMb2NrZWQoKml0KTsKKyAgICAgICAgaWYgKG5ld1JlcXVlc3QgPT0gMCkgeworICAgICAgICAgICAgQ0xPR0UoIkNhbid0IGNyZWF0ZSBjYXB0dXJlIHJlcXVlc3QiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkNhbWVyYSAlZDogQ2FwdHVyZSByZXF1ZXN0IGVucXVldWVkIiwgbUlkKTsKKworICAgICAgICAvLyBTZXR1cCBidXJzdCBJZCBhbmQgcmVxdWVzdCBJZAorICAgICAgICBuZXdSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQgPSBidXJzdElkKys7CisgICAgICAgIGlmIChpdC0+ZXhpc3RzKEFORFJPSURfUkVRVUVTVF9JRCkpIHsKKyAgICAgICAgICAgIGlmIChpdC0+ZmluZChBTkRST0lEX1JFUVVFU1RfSUQpLmNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdElEIGVudHJ5IGV4aXN0czsgYnV0IG11c3Qgbm90IGJlIGVtcHR5IGluIG1ldGFkYXRhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkID0gaXQtPmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lEKS5kYXRhLmkzMlswXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0SUQgZG9lcyBub3QgZXhpc3QgaW4gbWV0YWRhdGEiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICByZXF1ZXN0TGlzdC0+cHVzaF9iYWNrKG5ld1JlcXVlc3QpOworCisgICAgICAgIEFMT0dWKCIlczogcmVxdWVzdElkID0gJSIgUFJJZDMyLCBfX0ZVTkNUSU9OX18sIG5ld1JlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKICAgICB9Ci0gICAgcmV0dXJuIHJlczsKKyAgICByZXR1cm4gT0s7CiB9CiAKLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgc3RhdHVzX3QgcmVzOworCisgICAgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gcmVxdWVzdHM7CisgICAgcmVxdWVzdHMucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIHJldHVybiBjYXB0dXJlTGlzdChyZXF1ZXN0cywgLypsYXN0RnJhbWVOdW1iZXIqL05VTEwpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzdWJtaXRSZXF1ZXN0c0hlbHBlcigKKyAgICAgICAgY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLCBib29sIHJlcGVhdGluZywKKyAgICAgICAgLypvdXQqLworICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3dpdGNoIChtU3RhdHVzKSB7Ci0gICAgICAgIGNhc2UgU1RBVFVTX0VSUk9SOgotICAgICAgICAgICAgQ0xPR0UoIkRldmljZSBoYXMgZW5jb3VudGVyZWQgYSBzZXJpb3VzIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgU1RBVFVTX1VOSU5JVElBTElaRUQ6Ci0gICAgICAgICAgICBDTE9HRSgiRGV2aWNlIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFNUQVRVU19VTkNPTkZJR1VSRUQ6Ci0gICAgICAgICAgICAvLyBNYXkgYmUgbGF6aWx5IGNvbmZpZ3VyaW5nIHN0cmVhbXMsIHdpbGwgY2hlY2sgZHVyaW5nIHNldHVwCi0gICAgICAgIGNhc2UgU1RBVFVTX0NPTkZJR1VSRUQ6Ci0gICAgICAgIGNhc2UgU1RBVFVTX0FDVElWRToKLSAgICAgICAgICAgIC8vIE9LCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5leHBlY3RlZCBzdGF0dXM6ICVkIiwgbVN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gY2hlY2tTdGF0dXNPa1RvQ2FwdHVyZUxvY2tlZCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gZXJyb3IgbG9nZ2VkIGJ5IHByZXZpb3VzIGNhbGwKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbmV3UmVwZWF0aW5nUmVxdWVzdCA9IHNldFVwUmVxdWVzdExvY2tlZChyZXF1ZXN0KTsKLSAgICBpZiAobmV3UmVwZWF0aW5nUmVxdWVzdCA9PSBOVUxMKSB7Ci0gICAgICAgIENMT0dFKCJDYW4ndCBjcmVhdGUgcmVwZWF0aW5nIHJlcXVlc3QiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBSZXF1ZXN0TGlzdCByZXF1ZXN0TGlzdDsKKworICAgIHJlcyA9IGNvbnZlcnRNZXRhZGF0YUxpc3RUb1JlcXVlc3RMaXN0TG9ja2VkKHJlcXVlc3RzLCAvKm91dCovJnJlcXVlc3RMaXN0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIC8vIGVycm9yIGxvZ2dlZCBieSBwcmV2aW91cyBjYWxsCisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgUmVxdWVzdExpc3QgbmV3UmVwZWF0aW5nUmVxdWVzdHM7Ci0gICAgbmV3UmVwZWF0aW5nUmVxdWVzdHMucHVzaF9iYWNrKG5ld1JlcGVhdGluZ1JlcXVlc3QpOworICAgIGlmIChyZXBlYXRpbmcpIHsKKyAgICAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnNldFJlcGVhdGluZ1JlcXVlc3RzKHJlcXVlc3RMaXN0LCBsYXN0RnJhbWVOdW1iZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBsYXN0RnJhbWVOdW1iZXIpOworICAgIH0KIAotICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5zZXRSZXBlYXRpbmdSZXF1ZXN0cyhuZXdSZXBlYXRpbmdSZXF1ZXN0cyk7CiAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqLyB0cnVlLCBrQWN0aXZlVGltZW91dCk7CisgICAgICAgIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovdHJ1ZSwga0FjdGl2ZVRpbWVvdXQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBTRVRfRVJSX0woIkNhbid0IHRyYW5zaXRpb24gdG8gYWN0aXZlIGluICVmIHNlY29uZHMhIiwKICAgICAgICAgICAgICAgICAgICAga0FjdGl2ZVRpbWVvdXQvMWU5KTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiBSZXBlYXRpbmcgcmVxdWVzdCBzZXQiLCBtSWQpOworICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiBDYXB0dXJlIHJlcXVlc3QgJSIgUFJJZDMyICIgZW5xdWV1ZWQiLCBtSWQsCisgICAgICAgICAgICAgICgqKHJlcXVlc3RMaXN0LmJlZ2luKCkpKS0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIENMT0dFKCJDYW5ub3QgcXVldWUgcmVxdWVzdC4gSW1wb3NzaWJsZS4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzSGVscGVyKHJlcXVlc3RzLCAvKnJlcGVhdGluZyovZmFsc2UsIGxhc3RGcmFtZU51bWJlcik7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gcmVxdWVzdHM7CisgICAgcmVxdWVzdHMucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIHJldHVybiBzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChyZXF1ZXN0cywgLypsYXN0RnJhbWVOdW1iZXIqL05VTEwpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzSGVscGVyKHJlcXVlc3RzLCAvKnJlcGVhdGluZyovdHJ1ZSwgbGFzdEZyYW1lTnVtYmVyKTsKK30KIAogc3A8Q2FtZXJhM0RldmljZTo6Q2FwdHVyZVJlcXVlc3Q+IENhbWVyYTNEZXZpY2U6OnNldFVwUmVxdWVzdExvY2tlZCgKICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIHsKQEAgLTQ5Nyw3ICs1NzAsNyBAQAogICAgIHJldHVybiBuZXdSZXF1ZXN0OwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjbGVhclN0cmVhbWluZ1JlcXVlc3QoKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTUxOSw3ICs1OTIsOCBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBBTE9HVigiQ2FtZXJhICVkOiBDbGVhcmluZyByZXBlYXRpbmcgcmVxdWVzdCIsIG1JZCk7Ci0gICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5jbGVhclJlcGVhdGluZ1JlcXVlc3RzKCk7CisKKyAgICByZXR1cm4gbVJlcXVlc3RUaHJlYWQtPmNsZWFyUmVwZWF0aW5nUmVxdWVzdHMobGFzdEZyYW1lTnVtYmVyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6d2FpdFVudGlsUmVxdWVzdFJlY2VpdmVkKGludDMyX3QgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVvdXQpIHsKQEAgLTcxNCw4ICs3ODgsMTcgQEAKIAogICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW0+IG5ld1N0cmVhbTsKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICBzc2l6ZV90IGpwZWdCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChqcGVnQnVmZmVyU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogT3ZlcndyaXRlIEpwZWcgb3V0cHV0IGJ1ZmZlciBzaXplIGZyb20gJXp1IHRvICV6dSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2l6ZSwganBlZ0J1ZmZlclNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwganBlZ0J1ZmZlclNpemUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHNpemUsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwganBlZ0J1ZmZlclNpemUsIGZvcm1hdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXIsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKQEAgLTg0MCwxNiArOTIzLDIwIEBACiAgICAgfQogCiAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKKyAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKICAgICAgICAgZGVsZXRlZFN0cmVhbSA9IG1JbnB1dFN0cmVhbTsKICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwgaWQpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICB9CisKKyAgICAvLyBEZWxldGUgb3V0cHV0IHN0cmVhbSBvciB0aGUgb3V0cHV0IHBhcnQgb2YgYSBiaS1kaXJlY3Rpb25hbCBzdHJlYW0uCisgICAgaWYgKG91dHB1dFN0cmVhbUlkeCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKICAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbShpZCk7CiAgICAgfQogCkBAIC05MTgsNiArMTAwNSwxMCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCisgICAgcmV0dXJuIHdhaXRVbnRpbERyYWluZWRMb2NrZWQoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6d2FpdFVudGlsRHJhaW5lZExvY2tlZCgpIHsKICAgICBzd2l0Y2ggKG1TdGF0dXMpIHsKICAgICAgICAgY2FzZSBTVEFUVVNfVU5JTklUSUFMSVpFRDoKICAgICAgICAgY2FzZSBTVEFUVVNfVU5DT05GSUdVUkVEOgpAQCAtMTAzMCw3ICsxMTIxLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldE5leHRGcmFtZShDYW1lcmFNZXRhZGF0YSAqZnJhbWUpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqZnJhbWUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKIApAQCAtMTAzOCw4ICsxMTI5LDE0IEBACiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfQogCi0gICAgQ2FtZXJhTWV0YWRhdGEgJnJlc3VsdCA9ICoobVJlc3VsdFF1ZXVlLmJlZ2luKCkpOwotICAgIGZyYW1lLT5hY3F1aXJlKHJlc3VsdCk7CisgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBhcmd1bWVudCBjYW5ub3QgYmUgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0ID0gKihtUmVzdWx0UXVldWUuYmVnaW4oKSk7CisgICAgZnJhbWUtPm1SZXN1bHRFeHRyYXMgPSByZXN1bHQubVJlc3VsdEV4dHJhczsKKyAgICBmcmFtZS0+bU1ldGFkYXRhLmFjcXVpcmUocmVzdWx0Lm1NZXRhZGF0YSk7CiAgICAgbVJlc3VsdFF1ZXVlLmVyYXNlKG1SZXN1bHRRdWV1ZS5iZWdpbigpKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTExMTcsMTQgKzEyMTQsMjUgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmZsdXNoKCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Zmx1c2goaW50NjRfdCAqZnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBGbHVzaGluZyBhbGwgcmVxdWVzdHMiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXIoKTsKLSAgICByZXR1cm4gbUhhbDNEZXZpY2UtPm9wcy0+Zmx1c2gobUhhbDNEZXZpY2UpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXIoLypvdXQqL2ZyYW1lTnVtYmVyKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKG1IYWwzRGV2aWNlLT5jb21tb24udmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMSkgeworICAgICAgICByZXMgPSBtSGFsM0RldmljZS0+b3BzLT5mbHVzaChtSGFsM0RldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICByZXMgPSB3YWl0VW50aWxEcmFpbmVkTG9ja2VkKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKIH0KIAogLyoqCkBAIC0xMzkyLDEzICsxNTAwLDEzIEBACiAgKiBJbi1mbGlnaHQgcmVxdWVzdCBtYW5hZ2VtZW50CiAgKi8KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVnaXN0ZXJJbkZsaWdodChpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCwgaW50MzJfdCBudW1CdWZmZXJzKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwotICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChyZXF1ZXN0SWQsIG51bUJ1ZmZlcnMpKTsKKyAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzKSk7CiAgICAgaWYgKHJlcyA8IDApIHJldHVybiByZXM7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xNDEwLDggKzE1MTgsOCBAQAogICogdG8gdGhlIG91dHB1dCBmcmFtZSBxdWV1ZQogICovCiBib29sIENhbWVyYTNEZXZpY2U6OnByb2Nlc3NQYXJ0aWFsM0FRdWlyaygKLSAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBwYXJ0aWFsKSB7CisgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcGFydGlhbCwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CiAKICAgICAvLyBDaGVjayBpZiBhbGwgM0Egc3RhdGVzIGFyZSBwcmVzZW50CiAgICAgLy8gVGhlIGZ1bGwgbGlzdCBvZiBmaWVsZHMgaXMKQEAgLTE0NjAsNyArMTU2OCw3IEBACiAgICAgQUxPR1ZWKCIlczogQ2FtZXJhICVkOiBGcmFtZSAlZCwgUmVxdWVzdCBJRCAlZDogQUYgbW9kZSAlZCwgQVdCIG1vZGUgJWQsICIKICAgICAgICAgIkFGIHN0YXRlICVkLCBBRSBzdGF0ZSAlZCwgQVdCIHN0YXRlICVkLCAiCiAgICAgICAgICJBRiB0cmlnZ2VyICVkLCBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgJWQiLAotICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgZnJhbWVOdW1iZXIsIHJlcXVlc3RJZCwKKyAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIGZyYW1lTnVtYmVyLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLAogICAgICAgICBhZk1vZGUsIGF3Yk1vZGUsCiAgICAgICAgIGFmU3RhdGUsIGFlU3RhdGUsIGF3YlN0YXRlLAogICAgICAgICBhZlRyaWdnZXJJZCwgYWVUcmlnZ2VySWQpOwpAQCAtMTQ3NSw1OCArMTU4Myw2MyBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOwogCi0gICAgQ2FtZXJhTWV0YWRhdGEmIG1pbjNBUmVzdWx0ID0KLSAgICAgICAgICAgICptUmVzdWx0UXVldWUuaW5zZXJ0KAotICAgICAgICAgICAgICAgIG1SZXN1bHRRdWV1ZS5lbmQoKSwKLSAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YShrTWluaW1hbDNBUmVzdWx0RW50cmllcywgLypkYXRhQ2FwYWNpdHkqLyAwKSk7CisgICAgQ2FwdHVyZVJlc3VsdCBjYXB0dXJlUmVzdWx0OworICAgIGNhcHR1cmVSZXN1bHQubVJlc3VsdEV4dHJhcyA9IHJlc3VsdEV4dHJhczsKKyAgICBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSA9IENhbWVyYU1ldGFkYXRhKGtNaW5pbWFsM0FSZXN1bHRFbnRyaWVzLCAvKmRhdGFDYXBhY2l0eSovIDApOworICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIHRvIHNwPENhcHR1cmVSZXN1bHQ+LiBUaGlzIHdpbGwgbmVlZCBvdGhlciBjaGFuZ2VzLCBpbmNsdWRpbmcsCisgICAgLy8gYnV0IG5vdCBsaW1pdGVkIHRvIENhbWVyYURldmljZUJhc2U6OmdldE5leHRSZXN1bHQKKyAgICBDYXB0dXJlUmVzdWx0JiBtaW4zQVJlc3VsdCA9CisgICAgICAgICAgICAqbVJlc3VsdFF1ZXVlLmluc2VydChtUmVzdWx0UXVldWUuZW5kKCksIGNhcHR1cmVSZXN1bHQpOwogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5ULAotICAgICAgICAgICAgJmZyYW1lTnVtYmVyLCBmcmFtZU51bWJlcikpIHsKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5ULAorICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBpcyBwcm9ibGVtYXRpYyBjYXN0aW5nLiBOZWVkIHRvIGZpeCBDYW1lcmFNZXRhZGF0YS4KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZmcmFtZU51bWJlciksIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9SRVFVRVNUX0lELAorICAgIGludDMyX3QgcmVxdWVzdElkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9SRVFVRVNUX0lELAogICAgICAgICAgICAgJnJlcXVlc3RJZCwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBwYXJ0aWFsUmVzdWx0ID0gQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTDsKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQsCiAgICAgICAgICAgICAmcGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICAgICAmYWZNb2RlLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAogICAgICAgICAgICAgJmF3Yk1vZGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAorICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmYWVTdGF0ZSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKICAgICAgICAgICAgICZhZlN0YXRlLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCiAgICAgICAgICAgICAmYXdiU3RhdGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAogICAgICAgICAgICAgJmFmVHJpZ2dlcklkLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lELAorICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKICAgICAgICAgICAgICZhZVRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xNTM4LDcgKzE2NTEsNyBAQAogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogYm9vbCBDYW1lcmEzRGV2aWNlOjpnZXQzQVJlc3VsdChjb25zdCBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0LCBpbnQzMl90IHRhZywKLSAgICAgICAgVCogdmFsdWUsIGludDMyX3QgZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgVCogdmFsdWUsIHVpbnQzMl90IGZyYW1lTnVtYmVyKSB7CiAgICAgKHZvaWQpIGZyYW1lTnVtYmVyOwogCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnk7CkBAIC0xNTYzLDcgKzE2NzYsNyBAQAogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogYm9vbCBDYW1lcmEzRGV2aWNlOjppbnNlcnQzQVJlc3VsdChDYW1lcmFNZXRhZGF0YSYgcmVzdWx0LCBpbnQzMl90IHRhZywKLSAgICAgICAgY29uc3QgVCogdmFsdWUsIGludDMyX3QgZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgY29uc3QgVCogdmFsdWUsIHVpbnQzMl90IGZyYW1lTnVtYmVyKSB7CiAgICAgaWYgKHJlc3VsdC51cGRhdGUodGFnLCB2YWx1ZSwgMSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgbVJlc3VsdFF1ZXVlLmVyYXNlKC0tbVJlc3VsdFF1ZXVlLmVuZCgpLCBtUmVzdWx0UXVldWUuZW5kKCkpOwogICAgICAgICBTRVRfRVJSKCJGcmFtZSAlZDogRmFpbGVkIHRvIHNldCAlcyBpbiBwYXJ0aWFsIG1ldGFkYXRhIiwKQEAgLTE1OTAsMTEgKzE3MDMsMTIgQEAKICAgICB9CiAgICAgYm9vbCBwYXJ0aWFsUmVzdWx0UXVpcmsgPSBmYWxzZTsKICAgICBDYW1lcmFNZXRhZGF0YSBjb2xsZWN0ZWRRdWlya1Jlc3VsdDsKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKIAotICAgIC8vIEdldCBjYXB0dXJlIHRpbWVzdGFtcCBmcm9tIGxpc3Qgb2YgaW4tZmxpZ2h0IHJlcXVlc3RzLCB3aGVyZSBpdCB3YXMgYWRkZWQKLSAgICAvLyBieSB0aGUgc2h1dHRlciBub3RpZmljYXRpb24gZm9yIHRoaXMgZnJhbWUuIFRoZW4gdXBkYXRlIHRoZSBpbi1mbGlnaHQKLSAgICAvLyBzdGF0dXMgYW5kIHJlbW92ZSB0aGUgaW4tZmxpZ2h0IGVudHJ5IGlmIGFsbCByZXN1bHQgZGF0YSBoYXMgYmVlbgotICAgIC8vIHJlY2VpdmVkLgorICAgIC8vIEdldCBjYXB0dXJlIHRpbWVzdGFtcCBhbmQgcmVzdWx0RXh0cmFzIGZyb20gbGlzdCBvZiBpbi1mbGlnaHQgcmVxdWVzdHMsCisgICAgLy8gd2hlcmUgaXQgd2FzIGFkZGVkIGJ5IHRoZSBzaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgdGhpcyBmcmFtZS4KKyAgICAvLyBUaGVuIHVwZGF0ZSB0aGUgaW4tZmxpZ2h0IHN0YXR1cyBhbmQgcmVtb3ZlIHRoZSBpbi1mbGlnaHQgZW50cnkgaWYKKyAgICAvLyBhbGwgcmVzdWx0IGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQuCiAgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSAwOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CkBAIC0xNjA1LDYgKzE3MTksMTAgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnJlcXVlc3QgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICAgICAgQUxPR1ZWKCIlczogZ290IEluRmxpZ2h0UmVxdWVzdCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKKyAgICAgICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxdWVzdC5yZXN1bHRFeHRyYXMucmVxdWVzdElkLCByZXF1ZXN0LnJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcy5idXJzdElkKTsKIAogICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHJlc3VsdCBjYXJyaWVzIG9ubHkgcGFydGlhbCBtZXRhZGF0YQogICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHRRdWlyayAmJiByZXN1bHQtPnJlc3VsdCAhPSBOVUxMKSB7CkBAIC0xNjI2LDEzICsxNzQ0LDE1IEBACiAgICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5oYXZlU2VudDNBKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmhhdmVTZW50M0EgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJ0aWFsM0FRdWlyayhmcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0UXVpcmsuY29sbGVjdGVkUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0RXh0cmFzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB0aW1lc3RhbXAgPSByZXF1ZXN0LmNhcHR1cmVUaW1lc3RhbXA7CisgICAgICAgIHJlc3VsdEV4dHJhcyA9IHJlcXVlc3QucmVzdWx0RXh0cmFzOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBPbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGhhcHBlbiBiZWZvcmUgaXQncyBsZWdhbCB0byBjYWxsIHByb2Nlc3NfY2FwdHVyZV9yZXN1bHQsCiAgICAgICAgICAqIHVubGVzcyBwYXJ0aWFsIG1ldGFkYXRhIGlzIGJlaW5nIHByb3ZpZGVkOgpAQCAtMTY2OCw4ICsxNzg4LDEwIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBDaGVjayBpZiBldmVyeXRoaW5nIGhhcyBhcnJpdmVkIGZvciB0aGlzIHJlc3VsdCAoYnVmZmVycyBhbmQgbWV0YWRhdGEpCi0gICAgICAgIGlmIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSAmJiByZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDApIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgZXZlcnl0aGluZyBoYXMgYXJyaXZlZCBmb3IgdGhpcyByZXN1bHQgKGJ1ZmZlcnMgYW5kIG1ldGFkYXRhKSwgcmVtb3ZlIGl0IGZyb20KKyAgICAgICAgLy8gSW5GbGlnaHRNYXAgaWYgYm90aCBhcnJpdmVkIG9yIEhBTCByZXBvcnRzIGVycm9yIGZvciB0aGlzIHJlcXVlc3QgKGkuZS4gZHVyaW5nIGZsdXNoKS4KKyAgICAgICAgaWYgKChyZXF1ZXN0LnJlcXVlc3RTdGF0dXMgIT0gT0spIHx8CisgICAgICAgICAgICAgICAgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhICYmIHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgPT0gMCkpIHsKICAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoImZyYW1lIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICBtSW5GbGlnaHRNYXAucmVtb3ZlSXRlbXNBdChpZHgsIDEpOwogICAgICAgICB9CkBAIC0xNjg5LDE5ICsxODExLDIxIEBACiAKICAgICAgICAgZ290UmVzdWx0ID0gdHJ1ZTsKIAotICAgICAgICBpZiAoZnJhbWVOdW1iZXIgIT0gbU5leHRSZXN1bHRGcmFtZU51bWJlcikgeworICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIHRyYWNrIGVycm9ycyBmb3IgdGlnaHRlciBib3VuZHMgb24gZXhwZWN0ZWQgZnJhbWUgbnVtYmVyCisgICAgICAgIGlmIChmcmFtZU51bWJlciA8IG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpIHsKICAgICAgICAgICAgIFNFVF9FUlIoIk91dC1vZi1vcmRlciBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBzdWJtaXR0ZWQhICIKICAgICAgICAgICAgICAgICAgICAgIihnb3QgZnJhbWUgbnVtYmVyICVkLCBleHBlY3RpbmcgJWQpIiwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIrKzsKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyICsgMTsKIAotICAgICAgICBDYW1lcmFNZXRhZGF0YSBjYXB0dXJlUmVzdWx0OwotICAgICAgICBjYXB0dXJlUmVzdWx0ID0gcmVzdWx0LT5yZXN1bHQ7CisgICAgICAgIENhcHR1cmVSZXN1bHQgY2FwdHVyZVJlc3VsdDsKKyAgICAgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOworICAgICAgICBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogCi0gICAgICAgIGlmIChjYXB0dXJlUmVzdWx0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJmZyYW1lTnVtYmVyLCAxKSAhPSBPSykgeworICAgICAgICBpZiAoY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCwKKyAgICAgICAgICAgICAgICAoaW50MzJfdCopJmZyYW1lTnVtYmVyLCAxKSAhPSBPSykgewogICAgICAgICAgICAgU0VUX0VSUigiRmFpbGVkIHRvIHNldCBmcmFtZSMgaW4gbWV0YWRhdGEgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIGdvdFJlc3VsdCA9IGZhbHNlOwpAQCAtMTcxMiwxNSArMTgzNiwxNSBAQAogCiAgICAgICAgIC8vIEFwcGVuZCBhbnkgcHJldmlvdXMgcGFydGlhbHMgdG8gZm9ybSBhIGNvbXBsZXRlIHJlc3VsdAogICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHRRdWlyayAmJiAhY29sbGVjdGVkUXVpcmtSZXN1bHQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBjYXB0dXJlUmVzdWx0LmFwcGVuZChjb2xsZWN0ZWRRdWlya1Jlc3VsdCk7CisgICAgICAgICAgICBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YS5hcHBlbmQoY29sbGVjdGVkUXVpcmtSZXN1bHQpOwogICAgICAgICB9CiAKLSAgICAgICAgY2FwdHVyZVJlc3VsdC5zb3J0KCk7CisgICAgICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLnNvcnQoKTsKIAogICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlJ3MgYSB0aW1lc3RhbXAgaW4gdGhlIHJlc3VsdCBtZXRhZGF0YQogCiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVJlc3VsdC5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewogICAgICAgICAgICAgU0VUX0VSUigiTm8gdGltZXN0YW1wIHByb3ZpZGVkIGJ5IEhBTCBmb3IgZnJhbWUgJWQhIiwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIpOwpAQCAtMTczNCw5ICsxODU4LDEzIEBACiAKICAgICAgICAgaWYgKGdvdFJlc3VsdCkgewogICAgICAgICAgICAgLy8gVmFsaWQgcmVzdWx0LCBpbnNlcnQgaW50byBxdWV1ZQotICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIHF1ZXVlZFJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgKm1SZXN1bHRRdWV1ZS5pbnNlcnQobVJlc3VsdFF1ZXVlLmVuZCgpLCBDYW1lcmFNZXRhZGF0YSgpKTsKLSAgICAgICAgICAgIHF1ZXVlZFJlc3VsdC5zd2FwKGNhcHR1cmVSZXN1bHQpOworICAgICAgICAgICAgTGlzdDxDYXB0dXJlUmVzdWx0Pjo6aXRlcmF0b3IgcXVldWVkUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgbVJlc3VsdFF1ZXVlLmluc2VydChtUmVzdWx0UXVldWUuZW5kKCksIENhcHR1cmVSZXN1bHQoY2FwdHVyZVJlc3VsdCkpOworICAgICAgICAgICAgQUxPR1ZWKCIlczogcmVzdWx0IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiAiLCBmcmFtZU51bWJlciA9ICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICBxdWV1ZWRSZXN1bHQtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLAorICAgICAgICAgICAgICAgICAgIHF1ZXVlZFJlc3VsdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICBxdWV1ZWRSZXN1bHQtPm1SZXN1bHRFeHRyYXMuYnVyc3RJZCk7CiAgICAgICAgIH0KICAgICB9IC8vIHNjb3BlIGZvciBtT3V0cHV0TG9jawogCkBAIC0xNzYyLDggKzE4OTAsNiBAQAogCiB9CiAKLQotCiB2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeShjb25zdCBjYW1lcmEzX25vdGlmeV9tc2cgKm1zZykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyOwpAQCAtMTc5MCwxOCArMTkxNiwzMiBAQAogICAgICAgICAgICAgICAgICAgICBtSWQsIF9fRlVOQ1RJT05fXywgbXNnLT5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIG1zZy0+bWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlKTsKIAorICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7CiAgICAgICAgICAgICAvLyBTZXQgcmVxdWVzdCBlcnJvciBzdGF0dXMgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKICAgICAgICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG1zZy0+bWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIpOwogICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KS5yZXF1ZXN0U3RhdHVzID0gbXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGU7CisgICAgICAgICAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCAmciA9IG1JbkZsaWdodE1hcC5lZGl0VmFsdWVBdChpZHgpOworICAgICAgICAgICAgICAgICAgICByLnJlcXVlc3RTdGF0dXMgPSBtc2ctPm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzID0gci5yZXN1bHRFeHRyYXM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyID0gbXNnLT5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlZDogJXM6IGNhbm5vdCBmaW5kIGluLWZsaWdodCByZXF1ZXN0IG9uIGZyYW1lICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAiIGVycm9yIiwgbUlkLCBfX0ZVTkNUSU9OX18sIHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihtc2ctPm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+bWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPT0gQ0FNRVJBM19NU0dfRVJST1JfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlZDogJXM6IG5vIGxpc3RlbmVyIGF2YWlsYWJsZSIsIG1JZCwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xODEyLDE2ICsxOTUyLDE3IEBACiAgICAgICAgICAgICAvLyBWZXJpZnkgb3JkZXJpbmcgb2Ygc2h1dHRlciBub3RpZmljYXRpb25zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOwotICAgICAgICAgICAgICAgIGlmIChmcmFtZU51bWJlciAhPSBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IG5lZWQgdG8gdHJhY2sgZXJyb3JzIGZvciB0aWdodGVyIGJvdW5kcyBvbiBleHBlY3RlZCBmcmFtZSBudW1iZXIuCisgICAgICAgICAgICAgICAgaWYgKGZyYW1lTnVtYmVyIDwgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIpIHsKICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiU2h1dHRlciBub3RpZmljYXRpb24gb3V0LW9mLW9yZGVyLiBFeHBlY3RlZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbiBmb3IgZnJhbWUgJWQsIGdvdCBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyKys7CisgICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlciArIDE7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdElkID0gLTE7CisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKIAogICAgICAgICAgICAgLy8gU2V0IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCB0cmFja2luZwogICAgICAgICAgICAgLy8gYW5kIGdldCB0aGUgcmVxdWVzdCBJRCB0byBzZW5kIHVwc3RyZWFtCkBAIC0xODMxLDcgKzE5NzIsNyBAQAogICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKICAgICAgICAgICAgICAgICAgICAgci5jYXB0dXJlVGltZXN0YW1wID0gdGltZXN0YW1wOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPSByLnJlcXVlc3RJZDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzID0gci5yZXN1bHRFeHRyYXM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGlkeCA8IDApIHsKQEAgLTE4NDAsMTAgKzE5ODEsMTAgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWVigiQ2FtZXJhICVkOiAlczogU2h1dHRlciBmaXJlZCBmb3IgZnJhbWUgJWQgKGlkICVkKSBhdCAlIiBQUklkNjQsCi0gICAgICAgICAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlciwgcmVxdWVzdElkLCB0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICBtSWQsIF9fRlVOQ1RJT05fXywgZnJhbWVOdW1iZXIsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CiAgICAgICAgICAgICAvLyBDYWxsIGxpc3RlbmVyLCBpZiBhbnkKICAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeVNodXR0ZXIocmVxdWVzdElkLCB0aW1lc3RhbXApOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlTaHV0dGVyKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xODY1LDYgKzIwMDYsNyBAQAogICAgIHJldHVybiByZXRWYWw7CiB9CiAKKwogLyoqCiAgKiBSZXF1ZXN0VGhyZWFkIGlubmVyIGNsYXNzIG1ldGhvZHMKICAqLwpAQCAtMTg4MSw3ICsyMDIzLDggQEAKICAgICAgICAgbURvUGF1c2UoZmFsc2UpLAogICAgICAgICBtUGF1c2VkKHRydWUpLAogICAgICAgICBtRnJhbWVOdW1iZXIoMCksCi0gICAgICAgIG1MYXRlc3RSZXF1ZXN0SWQoTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgbUxhdGVzdFJlcXVlc3RJZChOQU1FX05PVF9GT1VORCksCisgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIoTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVMpIHsKICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIH0KIApAQCAtMTg5MCwxMCArMjAzMywyMiBAQAogICAgIG1SZWNvbmZpZ3VyZWQgPSB0cnVlOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpxdWV1ZVJlcXVlc3QoCi0gICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6cXVldWVSZXF1ZXN0TGlzdCgKKyAgICAgICAgTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiAmcmVxdWVzdHMsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKLSAgICBtUmVxdWVzdFF1ZXVlLnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICBmb3IgKExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID46Oml0ZXJhdG9yIGl0ID0gcmVxdWVzdHMuYmVnaW4oKTsgaXQgIT0gcmVxdWVzdHMuZW5kKCk7CisgICAgICAgICAgICArK2l0KSB7CisgICAgICAgIG1SZXF1ZXN0UXVldWUucHVzaF9iYWNrKCppdCk7CisgICAgfQorCisgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICpsYXN0RnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXIgKyBtUmVxdWVzdFF1ZXVlLnNpemUoKSAtIDE7CisgICAgICAgIEFMT0dWKCIlczogcmVxdWVzdElkICVkLCBtRnJhbWVOdW1iZXIgJSIgUFJJZDMyICIsIGxhc3RGcmFtZU51bWJlciAlIiBQUklkNjQgIi4iLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICgqKHJlcXVlc3RzLmJlZ2luKCkpKS0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIG1GcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgKmxhc3RGcmFtZU51bWJlcik7CisgICAgfQogCiAgICAgdW5wYXVzZUZvck5ld1JlcXVlc3RzKCk7CiAKQEAgLTE5NTcsMjggKzIxMTIsNDMgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0UmVwZWF0aW5nUmVxdWVzdHMoCi0gICAgICAgIGNvbnN0IFJlcXVlc3RMaXN0ICZyZXF1ZXN0cykgeworICAgICAgICBjb25zdCBSZXF1ZXN0TGlzdCAmcmVxdWVzdHMsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CisgICAgfQogICAgIG1SZXBlYXRpbmdSZXF1ZXN0cy5jbGVhcigpOwogICAgIG1SZXBlYXRpbmdSZXF1ZXN0cy5pbnNlcnQobVJlcGVhdGluZ1JlcXVlc3RzLmJlZ2luKCksCiAgICAgICAgICAgICByZXF1ZXN0cy5iZWdpbigpLCByZXF1ZXN0cy5lbmQoKSk7CiAKICAgICB1bnBhdXNlRm9yTmV3UmVxdWVzdHMoKTsKIAorICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUzsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhclJlcGVhdGluZ1JlcXVlc3RzKC8qb3V0Ki9pbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwogICAgIG1SZXBlYXRpbmdSZXF1ZXN0cy5jbGVhcigpOworICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKKyAgICB9CisgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlciA9IE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXIoKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhcigvKm91dCovaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICBBTE9HVigiUmVxdWVzdFRocmVhZDo6JXM6IiwgX19GVU5DVElPTl9fKTsKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuY2xlYXIoKTsKICAgICBtUmVxdWVzdFF1ZXVlLmNsZWFyKCk7CiAgICAgbVRyaWdnZXJNYXAuY2xlYXIoKTsKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CisgICAgfQorICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUzsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIwMzAsNiArMjIwMCw3IEBACiAKICAgICAvLyBDcmVhdGUgcmVxdWVzdCB0byBIQUwKICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90IHJlcXVlc3QgPSBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KCk7CisgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIgPSBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnM7CiAKICAgICAvLyBHZXQgdGhlIHJlcXVlc3QgSUQsIGlmIGFueQpAQCAtMjA1MCw3ICsyMjIxLDcgQEAKICAgICBpZiAocmVzIDwgMCkgewogICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IHRyaWdnZXJzICIKICAgICAgICAgICAgICAgICAiKGNhcHR1cmUgcmVxdWVzdCAlZCwgSEFMIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgKG1GcmFtZU51bWJlcisxKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yMDY4LDcgKzIyMzksNyBAQAogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IGR1bW15IHRyaWdnZXIgSURzICIKICAgICAgICAgICAgICAgICAgICAgIihjYXB0dXJlIHJlcXVlc3QgJWQsIEhBTCBkZXZpY2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAobUZyYW1lTnVtYmVyKzEpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3QocmVxdWVzdCwgbmV4dFJlcXVlc3QsIG91dHB1dEJ1ZmZlcnMpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yMDkyLDcgKzIyNjMsNyBAQAogICAgICAgICAgICAgaWYgKGUuY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0IChmcmFtZSBudW0gJWQpIGhhZCBBRiB0cmlnZ2VyIDB4JXgiLAogICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVOdW1iZXIrMSwKKyAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICAgICAgICBlLmRhdGEudThbMF0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMTM0LDggKzIzMDUsNiBAQAogICAgICAgICByZXF1ZXN0Lm51bV9vdXRwdXRfYnVmZmVycysrOwogICAgIH0KIAotICAgIHJlcXVlc3QuZnJhbWVfbnVtYmVyID0gbUZyYW1lTnVtYmVyKys7Ci0KICAgICAvLyBMb2cgcmVxdWVzdCBpbiB0aGUgaW4tZmxpZ2h0IHF1ZXVlCiAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CiAgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CkBAIC0yMTQ0LDggKzIzMTMsMTMgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChyZXF1ZXN0LmZyYW1lX251bWJlciwgcmVxdWVzdElkLAotICAgICAgICAgICAgcmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnMpOworICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChyZXF1ZXN0LmZyYW1lX251bWJlciwKKyAgICAgICAgICAgIHJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzLCBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcyk7CisgICAgQUxPR1ZWKCIlczogcmVnaXN0ZXJlZCBpbiBmbGlnaHQgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CisgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLCBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHJlZ2lzdGVyIG5ldyBpbi1mbGlnaHQgcmVxdWVzdDoiCiAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0yMjIyLDYgKzIzOTYsNyBAQAogICAgIHJldHVybiBtTGF0ZXN0UmVxdWVzdDsKIH0KIAorCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFuVXBGYWlsZWRSZXF1ZXN0KAogICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICZyZXF1ZXN0LAogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gJm5leHRSZXF1ZXN0LApAQCAtMjI2Myw2ICsyNDM4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgKytmaXJzdFJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzLmVuZCgpKTsKICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gd2FpdCBhbnkgbG9uZ2VyCisKKyAgICAgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXIgKyByZXF1ZXN0cy5zaXplKCkgLSAxOworCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMzE0LDYgKzI0OTIsOSBAQAogICAgICAgICBtUmVjb25maWd1cmVkID0gZmFsc2U7CiAgICAgfQogCisgICAgaWYgKG5leHRSZXF1ZXN0ICE9IE5VTEwpIHsKKyAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXIrKzsKKyAgICB9CiAgICAgcmV0dXJuIG5leHRSZXF1ZXN0OwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCmluZGV4IDQ2OGY2NDEuLjAwYWU3NzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuaCIKQEAgLTU0LDcgKzU2LDcgQEAKIH0KIAogLyoqCi0gKiBDYW1lcmFEZXZpY2UgZm9yIEhBTCBkZXZpY2VzIHdpdGggdmVyc2lvbiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMAorICogQ2FtZXJhRGV2aWNlIGZvciBIQUwgZGV2aWNlcyB3aXRoIHZlcnNpb24gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzAgb3IgaGlnaGVyLgogICovCiBjbGFzcyBDYW1lcmEzRGV2aWNlIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFEZXZpY2VCYXNlLApAQCAtNzgsMTUgKzgwLDIxIEBACiAKICAgICAvLyBDYXB0dXJlIGFuZCBzZXRTdHJlYW1pbmdSZXF1ZXN0IHdpbGwgY29uZmlndXJlIHN0cmVhbXMgaWYgY3VycmVudGx5IGluCiAgICAgLy8gaWRsZSBzdGF0ZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KTsKIAogICAgIC8vIEFjdHVhbCBzdHJlYW0gY3JlYXRpb24vZGVsZXRpb24gaXMgZGVsYXllZCB1bnRpbCBmaXJzdCByZXF1ZXN0IGlzIHN1Ym1pdHRlZAogICAgIC8vIElmIGFkZGluZyBzdHJlYW1zIHdoaWxlIGFjdGl2ZWx5IGNhcHR1cmluZywgd2lsbCBwYXVzZSBkZXZpY2UgYmVmb3JlIGFkZGluZwotICAgIC8vIHN0cmVhbSwgcmVjb25maWd1cmluZyBkZXZpY2UsIGFuZCB1bnBhdXNpbmcuCisgICAgLy8gc3RyZWFtLCByZWNvbmZpZ3VyaW5nIGRldmljZSwgYW5kIHVucGF1c2luZy4gTm90ZSB0aGF0LCBmb3IgSlBFRyBzdHJlYW0sIHRoZQorICAgIC8vIGJ1ZmZlciBzaXplIG1heSBiZSBvdmVyd3JpdHRlbiBieSBhbiBtb3JlIGFjY3VyYXRlIHZhbHVlIGNhbGN1bGF0ZWQgYnkgQ2FtZXJhM0RldmljZS4KICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLAogICAgICAgICAgICAgaW50ICppZCk7CkBAIC0xMTYsNyArMTI0LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE5vdGlmeUNhbGxiYWNrKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CiAgICAgdmlydHVhbCBib29sICAgICB3aWxsTm90aWZ5M0EoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRGb3JOZXh0RnJhbWUobnNlY3NfdCB0aW1lb3V0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRGcmFtZShDYW1lcmFNZXRhZGF0YSAqZnJhbWUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFJlc3VsdChDYXB0dXJlUmVzdWx0ICpmcmFtZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJBdXRvZm9jdXModWludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdHJpZ2dlckNhbmNlbEF1dG9mb2N1cyh1aW50MzJfdCBpZCk7CkBAIC0xMjUsNyArMTMzLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHB1c2hSZXByb2Nlc3NCdWZmZXIoaW50IHJlcHJvY2Vzc1N0cmVhbUlkLAogICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHdwPEJ1ZmZlclJlbGVhc2VkTGlzdGVuZXI+IGxpc3RlbmVyKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCiAgICAgLy8gTWV0aG9kcyBjYWxsZWQgYnkgc3ViY2xhc3NlcwogICAgIHZvaWQgICAgICAgICAgICAgbm90aWZ5U3RhdHVzKGJvb2wgaWRsZSk7IC8vIHVwZGF0ZXMgZnJvbSBTdGF0dXNUcmFja2VyCkBAIC0xMzcsNiArMTQ1LDggQEAKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrU2h1dGRvd25UaW1lb3V0ICAgPSA1MDAwMDAwMDAwOyAvLyA1IHNlYwogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtBY3RpdmVUaW1lb3V0ICAgICA9IDUwMDAwMDAwMDsgIC8vIDUwMCBtcwogICAgIHN0cnVjdCAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RUcmlnZ2VyOworICAgIC8vIG1pbmltYWwganBlZyBidWZmZXIgc2l6ZTogMjU2S0IgKyBibG9iIGhlYWRlcgorICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90ICAgICAgIGtNaW5KcGVnQnVmZmVyU2l6ZSA9IDI1NiAqIDEwMjQgKyBzaXplb2YoY2FtZXJhM19qcGVnX2Jsb2IpOwogCiAgICAgLy8gQSBsb2NrIHRvIGVuZm9yY2Ugc2VyaWFsaXphdGlvbiBvbiB0aGUgaW5wdXQvY29uZmlndXJlIHNpZGUKICAgICAvLyBvZiB0aGUgcHVibGljIGludGVyZmFjZS4KQEAgLTE1Nyw3ICsxNjcsNiBAQAogICAgIGNhbWVyYTNfZGV2aWNlX3QgICAgICAgICAgKm1IYWwzRGV2aWNlOwogCiAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICAgbURldmljZUluZm87Ci0gICAgdmVuZG9yX3RhZ19xdWVyeV9vcHNfdCAgICAgbVZlbmRvclRhZ09wczsKIAogICAgIGVudW0gU3RhdHVzIHsKICAgICAgICAgU1RBVFVTX0VSUk9SLApAQCAtMTk5LDkgKzIwOCwyMCBAQAogICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiAgICAgICAgICBtSW5wdXRTdHJlYW07CiAgICAgICAgIFZlY3RvcjxzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zOworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzICAgICAgICAgICAgICAgICBtUmVzdWx0RXh0cmFzOwogICAgIH07CiAgICAgdHlwZWRlZiBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IFJlcXVlc3RMaXN0OwogCisgICAgc3RhdHVzX3QgY2hlY2tTdGF0dXNPa1RvQ2FwdHVyZUxvY2tlZCgpOworCisgICAgc3RhdHVzX3QgY29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmbWV0YWRhdGFMaXN0LAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KTsKKworICAgIHN0YXR1c190IHN1Ym1pdFJlcXVlc3RzSGVscGVyKGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywgYm9vbCByZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGxhc3QgcmVxdWVzdCBzdWJtaXR0ZWQgdG8gdGhlIGhhbCBieSB0aGUgcmVxdWVzdCB0aHJlYWQuCiAgICAgICoKQEAgLTIzNyw2ICsyNTcsMTMgQEAKICAgICBzdGF0dXNfdCB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soYm9vbCBhY3RpdmUsIG5zZWNzX3QgdGltZW91dCk7CiAKICAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB3YWl0VW50aWxEcmFpbmVkLiBPbiBzdWNjZXNzLCB3aWxsIHRyYW5zaXRpb24gdG8gSURMRSBzdGF0ZS4KKyAgICAgKgorICAgICAqIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggbUxvY2sgYW5kIG1JbnRlcmZhY2VMb2NrIGhlbGQuCisgICAgICovCisgICAgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZExvY2tlZCgpOworCisgICAgLyoqCiAgICAgICogRG8gY29tbW9uIHdvcmsgZm9yIHNldHRpbmcgdXAgYSBzdHJlYW1pbmcgb3Igc2luZ2xlIGNhcHR1cmUgcmVxdWVzdC4KICAgICAgKiBPbiBzdWNjZXNzLCB3aWxsIHRyYW5zaXRpb24gdG8gQUNUSVZFIGlmIGluIElETEUuCiAgICAgICovCkBAIC0yNzAsNiArMjk3LDEyIEBACiAgICAgICovCiAgICAgYm9vbCAgICAgICAgICAgICAgIHRyeUxvY2tTcGluUmlnaHRSb3VuZChNdXRleCYgbG9jayk7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgSnBlZyBidWZmZXIgc2l6ZSBmb3IgYSBnaXZlbiBqcGVnIHJlc29sdXRpb24uCisgICAgICogTmVnYXRpdmUgdmFsdWVzIGFyZSBlcnJvciBjb2Rlcy4KKyAgICAgKi8KKyAgICBzc2l6ZV90ICAgICAgICAgICAgIGdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0OworCiAgICAgc3RydWN0IFJlcXVlc3RUcmlnZ2VyIHsKICAgICAgICAgLy8gTWV0YWRhdGEgdGFnIG51bWJlciwgZS5nLiBhbmRyb2lkLmNvbnRyb2wuYWVQcmVjYXB0dXJlVHJpZ2dlcgogICAgICAgICB1aW50MzJfdCBtZXRhZGF0YVRhZzsKQEAgLTMwOCwxNSArMzQxLDIxIEBACiAgICAgICAgICAqIG9uIGVpdGhlci4gVXNlIHdhaXRVbnRpbFBhdXNlZCB0byB3YWl0IHVudGlsIHJlcXVlc3QgcXVldWUKICAgICAgICAgICogaGFzIGVtcHRpZWQgb3V0LgogICAgICAgICAgKi8KLSAgICAgICAgc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHMoY29uc3QgUmVxdWVzdExpc3QmIHJlcXVlc3RzKTsKLSAgICAgICAgc3RhdHVzX3QgY2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygpOworICAgICAgICBzdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0cyhjb25zdCBSZXF1ZXN0TGlzdCYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IGNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCi0gICAgICAgIHN0YXR1c190IHF1ZXVlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCk7CisgICAgICAgIHN0YXR1c190IHF1ZXVlUmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZW1vdmUgYWxsIHF1ZXVlZCBhbmQgcmVwZWF0aW5nIHJlcXVlc3RzLCBhbmQgcGVuZGluZyB0cmlnZ2VycwogICAgICAgICAgKi8KLSAgICAgICAgc3RhdHVzX3QgY2xlYXIoKTsKKyAgICAgICAgc3RhdHVzX3QgY2xlYXIoLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUXVldWUgYSB0cmlnZ2VyIHRvIGJlIGRpc3BhdGNoZWQgd2l0aCB0aGUgbmV4dCBvdXRnb2luZwpAQCAtNDI5LDYgKzQ2OCw4IEBACiAgICAgICAgIFRyaWdnZXJNYXAgICAgICAgICBtVHJpZ2dlck1hcDsKICAgICAgICAgVHJpZ2dlck1hcCAgICAgICAgIG1UcmlnZ2VyUmVtb3ZlZE1hcDsKICAgICAgICAgVHJpZ2dlck1hcCAgICAgICAgIG1UcmlnZ2VyUmVwbGFjZWRNYXA7CisKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtNDM3LDggKzQ3OCw2IEBACiAgICAgICovCiAKICAgICBzdHJ1Y3QgSW5GbGlnaHRSZXF1ZXN0IHsKLSAgICAgICAgLy8gYW5kcm9pZC5yZXF1ZXN0LmlkIGZvciB0aGUgcmVxdWVzdAotICAgICAgICBpbnQgICAgIHJlcXVlc3RJZDsKICAgICAgICAgLy8gU2V0IGJ5IG5vdGlmeSgpIFNIVVRURVIgY2FsbC4KICAgICAgICAgbnNlY3NfdCBjYXB0dXJlVGltZXN0YW1wOwogICAgICAgICBpbnQgICAgIHJlcXVlc3RTdGF0dXM7CkBAIC00NDcsNiArNDg2LDcgQEAKICAgICAgICAgLy8gRGVjcmVtZW50ZWQgYnkgY2FsbHMgdG8gcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCB3aXRoIHZhbGlkIG91dHB1dAogICAgICAgICAvLyBidWZmZXJzCiAgICAgICAgIGludCAgICAgbnVtQnVmZmVyc0xlZnQ7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOwogCiAgICAgICAgIC8vIEZpZWxkcyB1c2VkIGJ5IHRoZSBwYXJ0aWFsIHJlc3VsdCBxdWlyayBvbmx5CiAgICAgICAgIHN0cnVjdCBQYXJ0aWFsUmVzdWx0UXVpcmtJbkZsaWdodCB7CkBAIC00NjIsMjAgKzUwMiwyNiBAQAogCiAgICAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJ5IEtleWVkVmVjdG9yCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCgpIDoKLSAgICAgICAgICAgICAgICByZXF1ZXN0SWQoMCksCiAgICAgICAgICAgICAgICAgY2FwdHVyZVRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKICAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAogICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KDApIHsKICAgICAgICAgfQogCi0gICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgaWQsIGludCBudW1CdWZmZXJzKSA6Ci0gICAgICAgICAgICAgICAgcmVxdWVzdElkKGlkKSwKKyAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzKSA6CiAgICAgICAgICAgICAgICAgY2FwdHVyZVRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKICAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAogICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpIHsKICAgICAgICAgfQorCisgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMpIDoKKyAgICAgICAgICAgICAgICBjYXB0dXJlVGltZXN0YW1wKDApLAorICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLAorICAgICAgICAgICAgICAgIGhhdmVSZXN1bHRNZXRhZGF0YShmYWxzZSksCisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycyksCisgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzKGV4dHJhcykgeworICAgICAgICB9CiAgICAgfTsKICAgICAvLyBNYXAgZnJvbSBmcmFtZSBudW1iZXIgdG8gdGhlIGluLWZsaWdodCByZXF1ZXN0IHN0YXRlCiAgICAgdHlwZWRlZiBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW5GbGlnaHRSZXF1ZXN0PiBJbkZsaWdodE1hcDsKQEAgLTQ4MywyNSArNTI5LDI1IEBACiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICBtSW5GbGlnaHRMb2NrOyAvLyBQcm90ZWN0cyBtSW5GbGlnaHRNYXAKICAgICBJbkZsaWdodE1hcCAgICAgICAgICAgIG1JbkZsaWdodE1hcDsKIAotICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMpOworICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzKTsKIAogICAgIC8qKgogICAgICAqIEZvciB0aGUgcGFydGlhbCByZXN1bHQgcXVpcmssIGNoZWNrIGlmIGFsbCAzQSBzdGF0ZSBmaWVsZHMgYXJlIGF2YWlsYWJsZQogICAgICAqIGFuZCBpZiBzbywgcXVldWUgdXAgM0Etb25seSByZXN1bHQgdG8gdGhlIGNsaWVudC4gUmV0dXJucyB0cnVlIGlmIDNBCiAgICAgICogaXMgc2VudC4KICAgICAgKi8KLSAgICBib29sIHByb2Nlc3NQYXJ0aWFsM0FRdWlyayhpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBwYXJ0aWFsKTsKKyAgICBib29sIHByb2Nlc3NQYXJ0aWFsM0FRdWlyayh1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBwYXJ0aWFsLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwogCiAgICAgLy8gSGVscGVycyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAzQSBtZXRhZGF0YSBpbnRvIHRvL2Zyb20gcGFydGlhbCByZXN1bHRzCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICBib29sIGdldDNBUmVzdWx0KGNvbnN0IENhbWVyYU1ldGFkYXRhJiByZXN1bHQsIGludDMyX3QgdGFnLAotICAgICAgICAgICAgVCogdmFsdWUsIGludDMyX3QgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgVCogdmFsdWUsIHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgYm9vbCBpbnNlcnQzQVJlc3VsdChDYW1lcmFNZXRhZGF0YSAmcmVzdWx0LCBpbnQzMl90IHRhZywgY29uc3QgVCogdmFsdWUsCi0gICAgICAgICAgICBpbnQzMl90IGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKICAgICAvKioKICAgICAgKiBUcmFja2luZyBmb3IgaWRsZSBkZXRlY3Rpb24KICAgICAgKi8KQEAgLTUxOCw3ICs1NjQsNyBAQAogCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXI7Ci0gICAgTGlzdDxDYW1lcmFNZXRhZGF0YT4gICBtUmVzdWx0UXVldWU7CisgICAgTGlzdDxDYXB0dXJlUmVzdWx0PiAgIG1SZXN1bHRRdWV1ZTsKICAgICBDb25kaXRpb24gICAgICAgICAgICAgIG1SZXN1bHRTaWduYWw7CiAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgICptTGlzdGVuZXI7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCmluZGV4IGQ2NjJjYzIuLjUwYTJjMTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcApAQCAtMzQsNyArMzQsOCBAQAogICAgICAgICBDYW1lcmEzU3RyZWFtKGlkLCB0eXBlLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIG1heFNpemUsIGZvcm1hdCksCiAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KDApLAotICAgICAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCgwKSwKKyAgICAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50KDApLAorICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50KDApLAogICAgICAgICBtRnJhbWVDb3VudCgwKSwKICAgICAgICAgbUxhc3RUaW1lc3RhbXAoMCkgewogCkBAIC01NSw4ICs1Niw4IEBACiAgICAgbnNlY3NfdCBzaWduYWxUaW1lID0gbUNvbWJpbmVkRmVuY2UtPmdldFNpZ25hbFRpbWUoKTsKICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZDogSGFzICV6dSBvdXRzdGFuZGluZyBidWZmZXJzLCIKICAgICAgICAgICAgICIgYnVmZmVyIHNpZ25hbCB0aW1lIGlzICUiIFBSSWQ2NCwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtRGVxdWV1ZWRCdWZmZXJDb3VudCwgc2lnbmFsVGltZSk7Ci0gICAgaWYgKG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID4gMCB8fCBzaWduYWxUaW1lID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCwgc2lnbmFsVGltZSk7CisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA+IDAgfHwgc2lnbmFsVGltZSA9PSBJTlQ2NF9NQVgpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKQEAgLTc1LDcgKzc2LDcgQEAKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlIiBQUklkNjQgIiBuc1xuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBUb3RhbCBidWZmZXJzOiAlenUsIGN1cnJlbnRseSBkZXF1ZXVlZDogJXp1XG4iLAotICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQsIG1EZXF1ZXVlZEJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50LCBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQpOwogICAgIHdyaXRlKGZkLCBsaW5lcy5zdHJpbmcoKSwgbGluZXMuc2l6ZSgpKTsKIH0KIApAQCAtMTA0LDYgKzEwNSwxNCBAQAogICAgIHJldHVybiBtVG90YWxCdWZmZXJDb3VudDsKIH0KIAorc2l6ZV90IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIHsKKyAgICByZXR1cm4gbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudDsKK30KKworc2l6ZV90IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgeworICAgIHJldHVybiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50IC0gbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCk7Cit9CisKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OmRpc2Nvbm5lY3RMb2NrZWQoKSB7CiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBTVEFURV9JTl9SRUNPTkZJRzoKQEAgLTExNyw5ICsxMjYsOSBAQAogICAgICAgICAgICAgcmV0dXJuIC1FTk9UQ09OTjsKICAgICB9CiAKLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPiAwKSB7CisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA+IDApIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBkaXNjb25uZWN0IHdpdGggJXp1IGJ1ZmZlcnMgc3RpbGwgZGVxdWV1ZWQhIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1EZXF1ZXVlZEJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTEzMCw3ICsxMzksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3F1aXJlRmVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbGVhc2VGZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvdXRwdXQpIHsKICAgICAvKioKICAgICAgKiBOb3RlIHRoYXQgYWxsIGZlbmNlcyBhcmUgbm93IG93bmVkIGJ5IEhBTC4KICAgICAgKi8KQEAgLTE0NCwxNCArMTU0LDI1IEBACiAgICAgYnVmZmVyLnN0YXR1cyA9IHN0YXR1czsKIAogICAgIC8vIEluZm9ybSB0cmFja2VyIGFib3V0IGJlY29taW5nIGJ1c3kKLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKICAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRykgeworICAgICAgICAvKioKKyAgICAgICAgICogQXZvaWQgYSBzcHVyaW91cyBJRExFLT5BQ1RJVkUtPklETEUgdHJhbnNpdGlvbiB3aGVuIHVzaW5nIGJ1ZmZlcnMKKyAgICAgICAgICogYmVmb3JlL2FmdGVyIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGR1cmluZyBpbml0aWFsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogb3IgcmUtY29uZmlndXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVE9ETzogSU5fQ09ORklHIGFuZCBJTl9SRUNPTkZJRyBjaGVja3Mgb25seSBtYWtlIHNlbnNlIGZvciA8SEFMMy4yCisgICAgICAgICAqLwogICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1TdGF0dXNJZCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbURlcXVldWVkQnVmZmVyQ291bnQrKzsKKyAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQrKzsKKworICAgIGlmIChvdXRwdXQpIHsKKyAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCsrOworICAgIH0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdCB7CkBAIC0xNjUsNyArMTg2LDcgQEAKIAogICAgIC8vIE9ubHkgbGltaXQgZGVxdWV1ZSBhbW91bnQgd2hlbiBmdWxseSBjb25maWd1cmVkCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEICYmCi0gICAgICAgICAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKKyAgICAgICAgICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEFscmVhZHkgZGVxdWV1ZWQgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIgogICAgICAgICAgICAgICAgICIgYnVmZmVycyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCiAgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKQEAgLTE4Myw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBObyBidWZmZXJzIG91dHN0YW5kaW5nIHRvIHJldHVybiIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBtSWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yMjEsOSArMjQyLDIwIEBACiAgICAgICAgIG1Db21iaW5lZEZlbmNlID0gRmVuY2U6Om1lcmdlKG1OYW1lLCBtQ29tYmluZWRGZW5jZSwgcmVsZWFzZUZlbmNlKTsKICAgICB9CiAKLSAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudC0tOwotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQtLTsKKyAgICB9CisKKyAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQtLTsKKyAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID09IDAgJiYgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJgogICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBdm9pZCBhIHNwdXJpb3VzIElETEUtPkFDVElWRS0+SURMRSB0cmFuc2l0aW9uIHdoZW4gdXNpbmcgYnVmZmVycworICAgICAgICAgKiBiZWZvcmUvYWZ0ZXIgcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgZHVyaW5nIGluaXRpYWwgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBvciByZS1jb25maWd1cmF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPOiBJTl9DT05GSUcgYW5kIElOX1JFQ09ORklHIGNoZWNrcyBvbmx5IG1ha2Ugc2Vuc2UgZm9yIDxIQUwzLjIKKyAgICAgICAgICovCiAgICAgICAgIEFMT0dWKCIlczogU3RyZWFtICVkOiBBbGwgYnVmZmVycyByZXR1cm5lZDsgbm93IGlkbGUiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgbUlkKTsKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKaW5kZXggZmNiOWQwNC4uYTM1YzI5MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKQEAgLTQ4LDcgKzQ4LDEwIEBACiAgIHByb3RlY3RlZDoKICAgICBzaXplX3QgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudDsKICAgICAvLyBzdW0gb2YgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3F1aXJlZCBieSBIQUwKLSAgICBzaXplX3QgICAgICAgICAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudDsKKyAgICBzaXplX3QgICAgICAgICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQ7CisgICAgLy8gbnVtYmVyIG9mIG91dHB1dCBidWZmZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3F1aXJlZCBieSBIQUwuIFRoaXMgd2lsbCBiZQorICAgIC8vIFJlZHVuZGFudCB3aGVuIGNhbWVyYTMgc3RyZWFtcyBhcmUgbm8gbG9uZ2VyIGJpZGlyZWN0aW9uYWwgc3RyZWFtcy4KKyAgICBzaXplX3QgICAgICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OwogICAgIENvbmRpdGlvbiAgICAgICAgIG1CdWZmZXJSZXR1cm5lZFNpZ25hbDsKICAgICB1aW50MzJfdCAgICAgICAgICBtRnJhbWVDb3VudDsKICAgICAvLyBMYXN0IHJlY2VpdmVkIG91dHB1dCBidWZmZXIncyB0aW1lc3RhbXAKQEAgLTc2LDYgKzc5LDEwIEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworCisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgPSAwOwogCiAgICAgc3RhdHVzX3QgZ2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdDsKQEAgLTkyLDcgKzk5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3F1aXJlX2ZlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVsZWFzZV9mZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG91dHB1dCk7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNJT1N0cmVhbUJhc2UKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IDVhYTlhM2UuLjMxOWJlMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgKiBpbiB3aGljaCBjYXNlIHdlIHJlYXNzaWduIGl0IHRvIGFjcXVpcmVfZmVuY2UKICAgICAgKi8KICAgICBoYW5kb3V0QnVmZmVyTG9ja2VkKCpidWZmZXIsICYoYW5iLT5oYW5kbGUpLCAvKmFjcXVpcmVGZW5jZSovZmVuY2VGZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovZmFsc2UpOwogICAgIG1CdWZmZXJzSW5GbGlnaHQucHVzaF9iYWNrKGJ1ZmZlckl0ZW0pOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTk5LDE0ICsxOTksMzYgQEAKICAgICBhc3NlcnQobU1heFNpemUgPT0gMCk7CiAgICAgYXNzZXJ0KGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKIAotICAgIG1Ub3RhbEJ1ZmZlckNvdW50ID0gQnVmZmVyUXVldWU6Ok1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgKwotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzOwotICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPSAwOwogICAgIG1GcmFtZUNvdW50ID0gMDsKIAogICAgIGlmIChtQ29uc3VtZXIuZ2V0KCkgPT0gMCkgewotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbUNvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihicSwgY2FtZXJhM19zdHJlYW06OnVzYWdlLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisKKyAgICAgICAgaW50IG1pblVuZGVxdWV1ZWRCdWZmZXJzID0gMDsKKyAgICAgICAgcmVzID0gcHJvZHVjZXItPnF1ZXJ5KE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSyB8fCBtaW5VbmRlcXVldWVkQnVmZmVycyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDb3VsZCBub3QgcXVlcnkgbWluIHVuZGVxdWV1ZWQgYnVmZmVycyAoZXJyb3IgJWQsIGJ1ZkNvdW50ICVkKSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgcmVzLCBtaW5VbmRlcXVldWVkQnVmZmVycyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBtaW5CdWZzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtaW5VbmRlcXVldWVkQnVmZmVycyk7CisgICAgICAgIC8qCisgICAgICAgICAqIFdlIHByb21pc2UgbmV2ZXIgdG8gJ2FjcXVpcmUnIG1vcmUgdGhhbiBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMKKyAgICAgICAgICogYXQgYW55IG9uZSB0aW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBCb29zdCB0aGUgbnVtYmVyIHVwIHRvIG1lZXQgdGhlIG1pbmltdW0gcmVxdWlyZWQgYnVmZmVyIGNvdW50LgorICAgICAgICAgKgorICAgICAgICAgKiAoTm90ZSB0aGF0IHRoaXMgc2V0cyBjb25zdW1lci1zaWRlIGJ1ZmZlciBjb3VudCBvbmx5LAorICAgICAgICAgKiBhbmQgbm90IHRoZSBzdW0gb2YgcHJvZHVjZXIrY29uc3VtZXIgc2lkZSBhcyBpbiBvdGhlciBjYW1lcmEgc3RyZWFtcykuCisgICAgICAgICAqLworICAgICAgICBtVG90YWxCdWZmZXJDb3VudCA9IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA+IG1pbkJ1ZnMgPworICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzIDogbWluQnVmczsKKyAgICAgICAgLy8gVE9ETzogc29tZWhvdyBzZXQgdGhlIHRvdGFsIGJ1ZmZlciBjb3VudCB3aGVuIHByb2R1Y2VyIGNvbm5lY3RzPworCisgICAgICAgIG1Db25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudCk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0TmFtZShTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYTMtSW5wdXRTdHJlYW0tJWQiLCBtSWQpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCA2ODFkNjg0Li5hZTQ5NDY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTQ0LDYgKzQ0LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OwogCisgICAgLy8gVE9ETzogZXhwb3NlIGFuIGludGVyZmFjZSB0byBnZXQgdGhlIElHcmFwaGljQnVmZmVyUHJvZHVjZXIKKwogICBwcml2YXRlOgogCiAgICAgdHlwZWRlZiBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0gQnVmZmVySXRlbTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDY4Mjc1NWQuLjdlYzY0OWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcApAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL3RydWUpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMzI0LDcgKzMyNCw3IEBACiAgICAgfQogCiAgICAgbVRvdGFsQnVmZmVyQ291bnQgPSBtYXhDb25zdW1lckJ1ZmZlcnMgKyBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnM7Ci0gICAgbURlcXVldWVkQnVmZmVyQ291bnQgPSAwOworICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9IDA7CiAgICAgbUZyYW1lQ291bnQgPSAwOwogICAgIG1MYXN0VGltZXN0YW1wID0gMDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggNzA0MDZmMS4uYWJmYjYwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmgiCiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKQEAgLTEzNyw2ICsxMzksNyBAQAogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQ09OU1RSVUNURUQpIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5fQ09ORklHOwogICAgIH0gZWxzZSB7IC8vIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVECisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQsICJJbnZhbGlkIHN0YXRlOiAweCV4IiwgbVN0YXRlKTsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5fUkVDT05GSUc7CiAgICAgfQogCkBAIC0yMDksOCArMjEyLDMwIEBACiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIHN0YXR1c190IHJlcyA9IGdldEJ1ZmZlckxvY2tlZChidWZmZXIpOworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjb25maWd1cmVkIGFscmVhZHkuCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgYnVmZmVycyBpZiBzdHJlYW0gaXMgbm90IGluIENPTkZJR1VSRUQgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gV2FpdCBmb3IgbmV3IGJ1ZmZlciByZXR1cm5lZCBiYWNrIGlmIHdlIGFyZSBydW5uaW5nIGludG8gdGhlIGxpbWl0LgorICAgIGlmIChnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBBbHJlYWR5IGRlcXVldWVkIG1heCBvdXRwdXQgYnVmZmVycyAoJWQpLCB3YWl0IGZvciBuZXh0IHJldHVybmVkIG9uZS4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICAgICAgcmVzID0gbU91dHB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLndhaXRSZWxhdGl2ZShtTG9jaywga1dhaXRGb3JCdWZmZXJEdXJhdGlvbik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB3YWl0IGZvciBvdXRwdXQgYnVmZmVyIHJldHVybiB0aW1lZCBvdXQgYWZ0ZXIgJWxsZG1zIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiAvIDEwMDAwMDBMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gZ2V0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKCpidWZmZXIsIC8qYWNxdWlyZWQqL3RydWUsIC8qb3V0cHV0Ki90cnVlKTsKICAgICB9CkBAIC0yMjMsOSArMjQ4LDE4IEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKKyAgICAvKioKKyAgICAgKiBUT0RPOiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBpcyB2YWxpZCBmaXJzdC4KKyAgICAgKgorICAgICAqIDxIQUwzLjIgSU5fQ09ORklHIGFuZCBJTl9SRUNPTkZJRyBpbiBhZGRpdGlvbiB0byBDT05GSUdVUkVELgorICAgICAqID49IEhBTDMuMiBDT05GSUdVUkVEIG9ubHkKKyAgICAgKgorICAgICAqIERvIHRoaXMgZm9yIGdldEJ1ZmZlciBhcyB3ZWxsLgorICAgICAqLwogICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCk7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGJ1ZmZlciwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki90cnVlKTsKKyAgICAgICAgbU91dHB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLnNpZ25hbCgpOwogICAgIH0KIAogICAgIHJldHVybiByZXM7CkBAIC0yMzQsOCArMjY4LDMwIEBACiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRJbnB1dEJ1ZmZlcihjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgc3RhdHVzX3QgcmVzID0gZ2V0SW5wdXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgY29uZmlndXJlZCBhbHJlYWR5LgorICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZ2V0IGlucHV0IGJ1ZmZlcnMgaWYgc3RyZWFtIGlzIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFdhaXQgZm9yIG5ldyBidWZmZXIgcmV0dXJuZWQgYmFjayBpZiB3ZSBhcmUgcnVubmluZyBpbnRvIHRoZSBsaW1pdC4KKyAgICBpZiAoZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBBbHJlYWR5IGRlcXVldWVkIG1heCBpbnB1dCBidWZmZXJzICglZCksIHdhaXQgZm9yIG5leHQgcmV0dXJuZWQgb25lLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgICAgICByZXMgPSBtSW5wdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC53YWl0UmVsYXRpdmUobUxvY2ssIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogd2FpdCBmb3IgaW5wdXQgYnVmZmVyIHJldHVybiB0aW1lZCBvdXQgYWZ0ZXIgJWxsZG1zIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiAvIDEwMDAwMDBMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gZ2V0SW5wdXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoKmJ1ZmZlciwgLyphY3F1aXJlZCovdHJ1ZSwgLypvdXRwdXQqL2ZhbHNlKTsKICAgICB9CkBAIC0yNTAsNiArMzA2LDcgQEAKICAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZChidWZmZXIpOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChidWZmZXIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovZmFsc2UpOworICAgICAgICBtSW5wdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC5zaWduYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTMxNCwxMiArMzcxLDQ2IEBACiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJlZ2lzdGVyQnVmZmVyc0xvY2tlZChjYW1lcmEzX2RldmljZSAqaGFsM0RldmljZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvKioKKyAgICAgKiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgKgorICAgICAqIGNhbWVyYTNfZGV2aWNlX3QtPm9wcy0+cmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMoKSBpcyBub3QgY2FsbGVkIGFuZCBtdXN0CisgICAgICogYmUgTlVMTC4KKyAgICAgKi8KKyAgICBpZiAoaGFsM0RldmljZS0+Y29tbW9uLnZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgQUxPR1YoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyB1bnVzZWQgYXMgb2YgSEFMMy4yIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2tpcCB0aGUgTlVMTCBjaGVjayBpZiBjYW1lcmEuZGV2LnJlZ2lzdGVyX3N0cmVhbSBpcyAxLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgZGV2ZWxvcG1lbnQtdmFsaWRhdGlvbiBwdXJwb3NlcyBvbmx5LgorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPOiBSZW1vdmUgdGhlIHByb3BlcnR5IGNoZWNrIGJlZm9yZSBzaGlwcGluZyBMIChiLzEzOTE0MjUxKS4KKyAgICAgICAgICovCisgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHsgJ1wwJywgfTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJjYW1lcmEuZGV2LnJlZ2lzdGVyX3N0cmVhbSIsIHZhbHVlLCAiMCIpOworICAgICAgICBpbnQgcHJvcEludCA9IGF0b2kodmFsdWUpOworCisgICAgICAgIGlmIChwcm9wSW50ID09IDAgJiYgaGFsM0RldmljZS0+b3BzLT5yZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyAhPSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGlzIGRlcHJlY2F0ZWQgaW4gSEFMMy4yOyAiCisgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHNldCB0byBOVUxMIGluIGNhbWVyYTNfZGV2aWNlOjpvcHMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIiVzOiBTa2lwcGluZyBOVUxMIGNoZWNrIGZvciBkZXByZWNhdGVkIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyB1c2luZyBkZXByZWNhdGVkIGNvZGUgcGF0aCIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgc2l6ZV90IGJ1ZmZlckNvdW50ID0gZ2V0QnVmZmVyQ291bnRMb2NrZWQoKTsKIAogICAgIFZlY3RvcjxidWZmZXJfaGFuZGxlX3QqPiBidWZmZXJzOwotICAgIGJ1ZmZlcnMuaW5zZXJ0QXQoTlVMTCwgMCwgYnVmZmVyQ291bnQpOworICAgIGJ1ZmZlcnMuaW5zZXJ0QXQoLypwcm90b3R5cGVfaXRlbSovTlVMTCwgLyppbmRleCovMCwgYnVmZmVyQ291bnQpOwogCiAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3NldCBidWZmZXJTZXQgPSBjYW1lcmEzX3N0cmVhbV9idWZmZXJfc2V0KCk7CiAgICAgYnVmZmVyU2V0LnN0cmVhbSA9IHRoaXM7CkBAIC0zMjcsNyArNDE4LDcgQEAKICAgICBidWZmZXJTZXQuYnVmZmVycyA9IGJ1ZmZlcnMuZWRpdEFycmF5KCk7CiAKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IHN0cmVhbUJ1ZmZlcnM7Ci0gICAgc3RyZWFtQnVmZmVycy5pbnNlcnRBdChjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCgpLCAwLCBidWZmZXJDb3VudCk7CisgICAgc3RyZWFtQnVmZmVycy5pbnNlcnRBdChjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCgpLCAvKmluZGV4Ki8wLCBidWZmZXJDb3VudCk7CiAKICAgICAvLyBSZWdpc3RlciBhbGwgYnVmZmVycyB3aXRoIHRoZSBIQUwuIFRoaXMgbWVhbnMgZ2V0dGluZyBhbGwgdGhlIGJ1ZmZlcnMKICAgICAvLyBmcm9tIHRoZSBzdHJlYW0sIHByb3ZpZGluZyB0aGVtIHRvIHRoZSBIQUwgd2l0aCB0aGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggNmVlYjcyMS4uMTRmNTM4NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTgyLDYgKzgyLDIzIEBACiAgKiAgICBTVEFURV9DT05GSUdVUkVEICAgICA9PiBTVEFURV9DT05TVFJVQ1RFRDoKICAqICAgICAgICBXaGVuIGRpc2Nvbm5lY3QoKSBpcyBjYWxsZWQgYWZ0ZXIgbWFraW5nIHN1cmUgc3RyZWFtIGlzIGlkbGUgd2l0aAogICogICAgICAgIHdhaXRVbnRpbElkbGUoKS4KKyAqCisgKiBTdGF0dXMgVHJhY2tpbmc6CisgKiAgICBFYWNoIHN0cmVhbSBpcyB0cmFja2VkIGJ5IFN0YXR1c1RyYWNrZXIgYXMgYSBzZXBhcmF0ZSBjb21wb25lbnQsCisgKiAgICBkZXBlbmRpbmcgb24gdGhlIGhhbmRlZCBvdXQgYnVmZmVyIGNvdW50LiBUaGUgc3RhdGUgbXVzdCBiZSBTVEFURV9DT05GSUdVUkVECisgKiAgICBpbiBvcmRlciBmb3IgdGhlIGNvbXBvbmVudCB0byBiZSBtYXJrZWQuCisgKgorICogICAgSXQncyBtYXJrZWQgaW4gb25lIG9mIHR3byB3YXlzOgorICoKKyAqICAgIC0gQUNUSVZFOiBPbmUgb3IgbW9yZSBidWZmZXJzIGhhdmUgYmVlbiBoYW5kZWQgb3V0ICh3aXRoICNnZXRCdWZmZXIpLgorICogICAgLSBJRExFOiBBbGwgYnVmZmVycyBoYXZlIGJlZW4gcmV0dXJuZWQgKHdpdGggI3JldHVybkJ1ZmZlciksIGFuZCB0aGVpcgorICogICAgICAgICAgcmVzcGVjdGl2ZSByZWxlYXNlX2ZlbmNlKHMpIGhhdmUgYmVlbiBzaWduYWxlZC4KKyAqCisgKiAgICBBIHR5cGljYWwgdXNlIGNhc2UgaXMgb3V0cHV0IHN0cmVhbXMuIFdoZW4gdGhlIEhBTCBoYXMgYW55IGJ1ZmZlcnMKKyAqICAgIGRlcXVldWVkLCB0aGUgc3RyZWFtIGlzIG1hcmtlZCBBQ1RJVkUuIFdoZW4gdGhlIEhBTCByZXR1cm5zIGFsbCBidWZmZXJzCisgKiAgICAoZS5nLiBpZiBubyBjYXB0dXJlIHJlcXVlc3RzIGFyZSBhY3RpdmUpLCB0aGUgc3RyZWFtIGlzIG1hcmtlZCBJRExFLgorICogICAgSW4gdGhpcyB1c2UgY2FzZSwgdGhlIGFwcCBjb25zdW1lciBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBvbmVudCBzdGF0dXMuCisgKgogICovCiBjbGFzcyBDYW1lcmEzU3RyZWFtIDoKICAgICAgICAgcHJvdGVjdGVkIGNhbWVyYTNfc3RyZWFtLApAQCAtMjYyLDYgKzI3OSwxMiBAQAogICAgIC8vIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlIHF1ZXVlCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKIAorICAgIC8vIEdldCBoYW5kb3V0IG91dHB1dCBidWZmZXIgY291bnQuCisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CisKKyAgICAvLyBHZXQgaGFuZG91dCBpbnB1dCBidWZmZXIgY291bnQuCisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKKwogICAgIC8vIEdldCB0aGUgdXNhZ2UgZmxhZ3MgZm9yIHRoZSBvdGhlciBlbmRwb2ludCwgb3IgcmV0dXJuCiAgICAgLy8gSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhleSBjYW5ub3QgYmUgb2J0YWluZWQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgPSAwOwpAQCAtMjc0LDYgKzI5Nyw5IEBACiAgIHByaXZhdGU6CiAgICAgdWludDMyX3Qgb2xkVXNhZ2U7CiAgICAgdWludDMyX3Qgb2xkTWF4QnVmZmVyczsKKyAgICBDb25kaXRpb24gbU91dHB1dEJ1ZmZlclJldHVybmVkU2lnbmFsOworICAgIENvbmRpdGlvbiBtSW5wdXRCdWZmZXJSZXR1cm5lZFNpZ25hbDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uID0gMzAwMDAwMDAwMExMOyAvLyAzMDAwIG1zCiAKICAgICAvLyBHZXRzIGFsbCBidWZmZXJzIGZyb20gZW5kcG9pbnQgYW5kIHJlZ2lzdGVycyB0aGVtIHdpdGggdGhlIEhBTC4KICAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcnNMb2NrZWQoY2FtZXJhM19kZXZpY2UgKmhhbDNEZXZpY2UpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAKaW5kZXggNDRkODE4OC4uMDViM2QxZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwCkBAIC0xMTEsMTUgKzExMSwxNyBAQAogfSAvLyBuYW1lc3BhY2UgYW5vbnltb3VzCiAKIENhbWVyYTNac2xTdHJlYW06OkNhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICBpbnQgZGVwdGgpIDoKKyAgICAgICAgaW50IGJ1ZmZlckNvdW50KSA6CiAgICAgICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaWQsIENBTUVSQTNfU1RSRUFNX0JJRElSRUNUSU9OQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpLAotICAgICAgICBtRGVwdGgoZGVwdGgpIHsKKyAgICAgICAgbURlcHRoKGJ1ZmZlckNvdW50KSB7CiAKLSAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBtUHJvZHVjZXIgPSBuZXcgUmluZ0J1ZmZlckNvbnN1bWVyKGJxLCBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wsIGRlcHRoKTsKLSAgICBtQ29uc3VtZXIgPSBuZXcgU3VyZmFjZShicSk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBtUHJvZHVjZXIgPSBuZXcgUmluZ0J1ZmZlckNvbnN1bWVyKGNvbnN1bWVyLCBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wsIGJ1ZmZlckNvdW50KTsKKyAgICBtQ29uc3VtZXIgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiB9CiAKIENhbWVyYTNac2xTdHJlYW06On5DYW1lcmEzWnNsU3RyZWFtKCkgewpAQCAtMTc0LDcgKzE3Niw3IEBACiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLypyZWxlYXNlRmVuY2UqLy0xLCBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0spOworICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovZmFsc2UpOwogCiAgICAgbUJ1ZmZlcnNJbkZsaWdodC5wdXNoX2JhY2soYnVmZmVySXRlbSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKaW5kZXggYzdmNDQ5MC4uNjcyMTgzMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKQEAgLTM3LDEwICszNywxMCBAQAogICAgICAgICBwdWJsaWMgQ2FtZXJhM091dHB1dFN0cmVhbSB7CiAgIHB1YmxpYzoKICAgICAvKioKLSAgICAgKiBTZXQgdXAgYSBaU0wgc3RyZWFtIG9mIGEgZ2l2ZW4gcmVzb2x1dGlvbi4gRGVwdGggaXMgdGhlIG51bWJlciBvZiBidWZmZXJzCisgICAgICogU2V0IHVwIGEgWlNMIHN0cmVhbSBvZiBhIGdpdmVuIHJlc29sdXRpb24uIGJ1ZmZlckNvdW50IGlzIHRoZSBudW1iZXIgb2YgYnVmZmVycwogICAgICAqIGNhY2hlZCB3aXRoaW4gdGhlIHN0cmVhbSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZm9yIGlucHV0LgogICAgICAqLwotICAgIENhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZGVwdGgpOworICAgIENhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgYnVmZmVyQ291bnQpOwogICAgIH5DYW1lcmEzWnNsU3RyZWFtKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaAppbmRleCBiNGFkODI0Li5hMDM3MzZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCkBAIC02NCw3ICs2NCw3IEBACiAgICAgLy8gYnVmZmVyQ291bnQgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbWFueSBidWZmZXJzIGNhbiBiZSBwaW5uZWQgZm9yIHVzZXIKICAgICAvLyBhY2Nlc3MgYXQgdGhlIHNhbWUgdGltZS4KICAgICBSaW5nQnVmZmVyQ29uc3VtZXIoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4mIGNvbnN1bWVyLCB1aW50MzJfdCBjb25zdW1lclVzYWdlLAotICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50ID0gQnVmZmVyUXVldWU6Ok1JTl9VTkRFUVVFVUVEX0JVRkZFUlMpOworICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50KTsKIAogICAgIHZpcnR1YWwgflJpbmdCdWZmZXJDb25zdW1lcigpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCA2ODNmZGYzLi4wYzdmYmJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKQEAgLTU0LDcgKzU0LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1lZGlhTG9nU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCitzdGF0dXNfdCBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIC8vIEZJWE1FIG1lcmdlIHdpdGggc2ltaWxhciBidXQgbm90IGlkZW50aWNhbCBjb2RlIGF0IHNlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKaW5kZXggOGM4YTRlYS4uNjJlZGRjYSAxMDA2NDQKLS0tIGEvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKKysrIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKQEAgLTIwLDE1ICsyMCwyNSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi1zdGF0aWMgZG91YmxlIHNpbmMoZG91YmxlIHgpIHsKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNpbmMoZG91YmxlIHgpIHsKICAgICBpZiAoZmFicyh4KSA9PSAwLjBmKSByZXR1cm4gMS4wZjsKICAgICByZXR1cm4gc2luKHgpIC8geDsKIH0KIAotc3RhdGljIGRvdWJsZSBzcXIoZG91YmxlIHgpIHsKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNxcihkb3VibGUgeCkgewogICAgIHJldHVybiB4Kng7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCB0b2ludChkb3VibGUgeCwgaW50NjRfdCBtYXh2YWwpIHsKKyAgICBpbnQ2NF90IHY7CisKKyAgICB2ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZmxvb3IoeCAqIG1heHZhbCArIDAuNSkpOworICAgIGlmICh2ID49IG1heHZhbCkgeworICAgICAgICByZXR1cm4gbWF4dmFsIC0gMTsgLy8gZXJyb3IhCisgICAgfQorICAgIHJldHVybiB2OworfQorCiBzdGF0aWMgZG91YmxlIEkwKGRvdWJsZSB4KSB7CiAgICAgLy8gZnJvbSB0aGUgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQyBwLiAyMzcKICAgICBkb3VibGUgYXgsYW5zLHk7CkBAIC01NCwxMSArNjQsMTIgQEAKICAgICByZXR1cm4gSTAoYmV0YSAqIHNxcnQoMS4wIC0gc3FyKCgyLjAqaykvTiAtIDEuMCkpKSAvIEkwKGJldGEpOwogfQogCi0KIHN0YXRpYyB2b2lkIHVzYWdlKGNoYXIqIG5hbWUpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICJ1c2FnZTogJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10gWy1mIHtmbG9hdHxmaXhlZH1dIFstYiBiZXRhXSBbLXYgZEJGU10gWy1sIGxlcnBdXG4iCi0gICAgICAgICAgICAiICAgICAgICVzIFstaF0gWy1kXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIFstZiB7ZmxvYXR8Zml4ZWR9XSBbLWIgYmV0YV0gWy12IGRCRlNdIC1wIE0vTlxuIgorICAgICAgICAgICAgInVzYWdlOiAlcyBbLWhdIFstZF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSIKKyAgICAgICAgICAgICIgWy1mIHtmbG9hdHxmaXhlZHxmaXhlZDE2fV0gWy1iIGJldGFdIFstdiBkQkZTXSBbLWwgbGVycF1cbiIKKyAgICAgICAgICAgICIgICAgICAgJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10iCisgICAgICAgICAgICAiIFstZiB7ZmxvYXR8Zml4ZWR8Zml4ZWQxNn1dIFstYiBiZXRhXSBbLXYgZEJGU10gLXAgTS9OXG4iCiAgICAgICAgICAgICAiICAgIC1oICAgIHRoaXMgaGVscCBtZXNzYWdlXG4iCiAgICAgICAgICAgICAiICAgIC1kICAgIGRlYnVnLCBwcmludCBjb21tYS1zZXBhcmF0ZWQgY29lZmZpY2llbnQgdGFibGVcbiIKICAgICAgICAgICAgICIgICAgLXAgICAgZ2VuZXJhdGUgcG9seS1waGFzZSBmaWx0ZXIgY29lZmZpY2llbnRzLCB3aXRoIHNhbXBsZSBpbmNyZW1lbnQgTS9OXG4iCkBAIC02Niw2ICs3Nyw3IEBACiAgICAgICAgICAgICAiICAgIC1jICAgIGN1dC1vZmYgZnJlcXVlbmN5ICgyMDQ3OClcbiIKICAgICAgICAgICAgICIgICAgLW4gICAgbnVtYmVyIG9mIHplcm8tY3Jvc3NpbmdzIG9uIG9uZSBzaWRlICg4KVxuIgogICAgICAgICAgICAgIiAgICAtbCAgICBudW1iZXIgb2YgbGVycGluZyBiaXRzICg0KVxuIgorICAgICAgICAgICAgIiAgICAtbSAgICBudW1iZXIgb2YgcG9seXBoYXNlcyAocmVsYXRlZCB0byAtbCwgZGVmYXVsdCAxNilcbiIKICAgICAgICAgICAgICIgICAgLWYgICAgb3V0cHV0IGZvcm1hdCwgY2FuIGJlIGZpeGVkLXBvaW50IG9yIGZsb2F0aW5nLXBvaW50IChmaXhlZClcbiIKICAgICAgICAgICAgICIgICAgLWIgICAga2Fpc2VyIHdpbmRvdyBwYXJhbWV0ZXIgYmV0YSAoNy44NjUgWy04MGRCXSlcbiIKICAgICAgICAgICAgICIgICAgLXYgICAgYXR0ZW51YXRpb24gaW4gZEJGUyAoMClcbiIsCkBAIC03Nyw4ICs4OSw3IEBACiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCiB7CiAgICAgLy8gbmMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRvIHN0b3JlIHRoZSBjb2VmZmljaWVudHMKLSAgICBjb25zdCBpbnQgbmMgPSAzMjsKLQorICAgIGludCBuYyA9IDMyOwogICAgIGJvb2wgcG9seXBoYXNlID0gZmFsc2U7CiAgICAgdW5zaWduZWQgaW50IHBvbHlNID0gMTYwOwogICAgIHVuc2lnbmVkIGludCBwb2x5TiA9IDE0NzsKQEAgLTg4LDcgKzk5LDYgQEAKICAgICBkb3VibGUgYXR0ZW4gPSAxOwogICAgIGludCBmb3JtYXQgPSAwOwogCi0KICAgICAvLyBpbiBvcmRlciB0byBrZWVwIHRoZSBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lYXIKICAgICAvLyBpbnRlcnBvbGF0aW9uIG9mIHRoZSBjb2VmZmljaWVudHMgYmVsb3cgdGhlIHF1YW50aXphdGlvbiBlcnJvcgogICAgIC8vIHdlIG11c3Qgc2F0aXNmeToKQEAgLTEwNCw3ICsxMTQsNiBAQAogICAgIC8vIFNtaXRoLCBKLk8uIERpZ2l0YWwgQXVkaW8gUmVzYW1wbGluZyBIb21lIFBhZ2UKICAgICAvLyBodHRwczovL2Njcm1hLnN0YW5mb3JkLmVkdS9+am9zL3Jlc2FtcGxlLywgMjAxMS0wMy0yOQogICAgIC8vCi0gICAgaW50IG56ID0gNDsKIAogICAgIC8vICAgICAgICAgfCAwLjExMDIqKEEgLSA4LjcpICAgICAgICAgICAgICAgICAgICAgICAgIEEgPiA1MAogICAgIC8vICBiZXRhID0gfCAwLjU4NDIqKEEgLSAyMSleMC40ICsgMC4wNzg4NiooQSAtIDIxKSAgIDIxIDw9IEEgPD0gNTAKQEAgLTEyMywzMyArMTMyLDMzIEBACiAgICAgLy8gICAxMDAgZEIgICAxMC4wNTYKICAgICBkb3VibGUgYmV0YSA9IDcuODY1OwogCi0KICAgICAvLyAyKm56YyA9IChBIC0gOCkgLyAoMi4yODUgKiBkdykKICAgICAvLyAgICAgIHdpdGggZHcgdGhlIHRyYW5zaXRpb24gd2lkdGggPSAyKnBpKmRGL0ZzCiAgICAgLy8KICAgICBpbnQgbnpjID0gODsKIAotICAgIC8vCi0gICAgLy8gRXhhbXBsZToKLSAgICAvLyA0NC4xIEtIeiB0byA0OCBLSHogcmVzYW1wbGluZwotICAgIC8vIDEwMCBkQiByZWplY3Rpb24gYWJvdmUgMjggS0h6Ci0gICAgLy8gICAodGhlIHNwZWN0cnVtIHdpbGwgZm9sZCBhcm91bmQgMjQgS0h6IGFuZCB3ZSB3YW50IDEwMCBkQiByZWplY3Rpb24KLSAgICAvLyAgICBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGZvbGRpbmcgcmVhY2hlcyAyMCBLSHopCi0gICAgLy8gIC4uLl9fX3xfX19fXwotICAgIC8vICAgICAgICB8ICAgICBcfAotICAgIC8vICAgICAgICB8IF9fX18vfFxfX19fCi0gICAgLy8gICAgICAgIHwvYWxpYXN8ICAgICBcCi0gICAgLy8gIC0tLS0tLS8tLS0tLS0rLS0tLS0tXC0tLS0tLS0tLT4gS0h6Ci0gICAgLy8gICAgICAgMjAgICAgIDI0ICAgICAyOAorICAgIC8qCisgICAgICogRXhhbXBsZToKKyAgICAgKiA0NC4xIEtIeiB0byA0OCBLSHogcmVzYW1wbGluZworICAgICAqIDEwMCBkQiByZWplY3Rpb24gYWJvdmUgMjggS0h6CisgICAgICogICAodGhlIHNwZWN0cnVtIHdpbGwgZm9sZCBhcm91bmQgMjQgS0h6IGFuZCB3ZSB3YW50IDEwMCBkQiByZWplY3Rpb24KKyAgICAgKiAgICBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGZvbGRpbmcgcmVhY2hlcyAyMCBLSHopCisgICAgICogIC4uLl9fX3xfX19fXworICAgICAqICAgICAgICB8ICAgICBcfAorICAgICAqICAgICAgICB8IF9fX18vfFxfX19fCisgICAgICogICAgICAgIHwvYWxpYXN8ICAgICBcCisgICAgICogIC0tLS0tLS8tLS0tLS0rLS0tLS0tXC0tLS0tLS0tLT4gS0h6CisgICAgICogICAgICAgMjAgICAgIDI0ICAgICAyOAorICAgICAqCisgICAgICogVHJhbnNpdGlvbiBiYW5kIDggS0h6LCBvciBkdyA9IDEuMDQ3MgorICAgICAqCisgICAgICogYmV0YSA9IDEwLjA1NgorICAgICAqIG56YyAgPSAyMAorICAgICAqLwogCi0gICAgLy8gVHJhbnNpdGlvbiBiYW5kIDggS0h6LCBvciBkdyA9IDEuMDQ3MgotICAgIC8vCi0gICAgLy8gYmV0YSA9IDEwLjA1NgotICAgIC8vIG56YyAgPSAyMAotICAgIC8vCi0KKyAgICBpbnQgTSA9IDEgPDwgNDsgLy8gbnVtYmVyIG9mIHBoYXNlcyBmb3IgaW50ZXJwb2xhdGlvbgogICAgIGludCBjaDsKLSAgICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICI6aGRzOmM6bjpmOmw6YjpwOnY6IikpICE9IC0xKSB7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiOmhkczpjOm46ZjpsOm06YjpwOnY6ejoiKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgZGVidWcgPSB0cnVlOwpAQCAtMTY5LDEzICsxNzgsMjYgQEAKICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgIG56YyA9IGF0b2kob3B0YXJnKTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICAgIE0gPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICBueiA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBNID0gMSA8PCBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsImZpeGVkIikpIGZvcm1hdCA9IDA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsImZsb2F0IikpIGZvcm1hdCA9IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsICJmaXhlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZml4ZWQxNiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5jID0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZmxvYXQiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgICAgICAgYmV0YSA9IGF0b2Yob3B0YXJnKTsKQEAgLTE5MywxMSArMjE1LDE0IEBACiAgICAgLy8gY3V0IG9mZiBmcmVxdWVuY3kgcmF0aW8gRmMvRnMKICAgICBkb3VibGUgRmNyID0gRmMgLyBGczsKIAotCiAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyAob25lIHNpZGUpCi0gICAgY29uc3QgaW50IE0gPSAoMSA8PCBueik7CisKICAgICBjb25zdCBpbnQgTiA9IE0gKiBuemM7CiAKKyAgICAvLyBsZXJwICh3aGljaCBpcyBtb3N0IHVzZWZ1bCBpZiBNIGlzIGEgcG93ZXIgb2YgMikKKworICAgIGludCBueiA9IDA7IC8vIHJlY2FsY3VsYXRlIG56IGFzIHRoZSBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgTQorICAgIGZvciAoaW50IGkgPSBNLTEgOyBpOyBpPj49MSwgbnorKyk7CiAgICAgLy8gZ2VuZXJhdGUgdGhlIHJpZ2h0IGhhbGYgb2YgdGhlIGZpbHRlcgogICAgIGlmICghZGVidWcpIHsKICAgICAgICAgcHJpbnRmKCIvLyBjbWQtbGluZTogIik7CkBAIC0yMDcsNyArMjMyLDcgQEAKICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICBpZiAoIXBvbHlwaGFzZSkgewogICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9TSVpFICAgICAgICAgICA9ICVkO1xuIiwgTik7Ci0gICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX0xFUlBfSU5UX0JJVFMgID0gJWQ7XG4iLCBueik7CisgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX0lOVF9QSEFTRVMgICAgID0gJWQ7XG4iLCBNKTsKICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfTlVNX0NPRUYgICAgICAgPSAlZDtcbiIsIG56Yyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX1NJWkUgICAgICAgICAgID0gJWQ7XG4iLCAyKm56Yypwb2x5Tik7CkBAIC0yMjQsNyArMjQ5LDcgQEAKICAgICAgICAgZm9yIChpbnQgaT0wIDsgaTw9TSA7IGkrKykgeyAvLyBhbiBleHRyYSBzZXQgb2YgY29lZnMgZm9yIGludGVycG9sYXRpb24KICAgICAgICAgICAgIGZvciAoaW50IGo9MCA7IGo8bnpjIDsgaisrKSB7CiAgICAgICAgICAgICAgICAgaW50IGl4ID0gaipNICsgaTsKLSAgICAgICAgICAgICAgICBkb3VibGUgeCA9ICgyLjAgKiBNX1BJICogaXggKiBGY3IpIC8gKDEgPDwgbnopOworICAgICAgICAgICAgICAgIGRvdWJsZSB4ID0gKDIuMCAqIE1fUEkgKiBpeCAqIEZjcikgLyBNOwogICAgICAgICAgICAgICAgIGRvdWJsZSB5ID0ga2Fpc2VyKGl4K04sIDIqTiwgYmV0YSkgKiBzaW5jKHgpICogMi4wICogRmNyOwogICAgICAgICAgICAgICAgIHkgKj0gYXR0ZW47CiAKQEAgLTIzMiwxMSArMjU3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuICAgICIpOwogICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGlmICghZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSBmbG9vcih5ICogKCgxVUxMPDwobmMtMSkpKSArIDAuNSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh5aSA+PSAoMUxMPDwobmMtMSkpKSB5aSA9ICgxTEw8PChuYy0xKSktMTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsICIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB5aSA9IHRvaW50KHksIDFVTEw8PChuYy0xKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYyA+IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCwgIiwgaW50MzJfdCh5aSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwNHgsICIsIGludDMyX3QoeWkpJjB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUuOWclcyAiLCB5LCBkZWJ1ZyA/ICIsIiA6ICJmLCIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI1NCw5ICsyODEsMTIgQEAKICAgICAgICAgICAgICAgICBkb3VibGUgeSA9IGthaXNlcihpK04sIDIqTiwgYmV0YSkgKiBzaW5jKHgpICogMi4wICogRmNyOzsKICAgICAgICAgICAgICAgICB5ICo9IGF0dGVuOwogICAgICAgICAgICAgICAgIGlmICghZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSBmbG9vcih5ICogKCgxVUxMPDwobmMtMSkpKSArIDAuNSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh5aSA+PSAoMUxMPDwobmMtMSkpKSB5aSA9ICgxTEw8PChuYy0xKSktMTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgiLCBpbnQzMl90KHlpKSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSB0b2ludCh5LCAxVUxMPDwobmMtMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAobmMgPiAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsICIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDR4LCAiLCBpbnQzMl90KHlpKSYweGZmZmYpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLjlnJXMiLCB5LCBkZWJ1ZyA/ICIiIDogImYiKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNzcsNSArMzA3LDMgQEAKIH0KIAogLy8gaHR0cDovL3d3dy5jc2VlLnVtYmMuZWR1L2hlbHAvc291bmQvQUZzcC1WMlIxL2h0bWwvYXVkaW8vUmVzYW1wQXVkaW8uaHRtbAotCi0K